C零基础视频-41-使用结构体封装游戏角色

目录

  • 关于游戏封装的思考
  • 封装后代码

关于游戏封装的思考

原代码:

#include <windows.h>
#include <conio.h>
#include <stdio.h>

void MoveCursorTo(int nRow, int nCol)
{
    COORD crdLocation;
    crdLocation.X = 2 * nCol;
    crdLocation.Y = nRow;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), crdLocation);
}

char g_chBackground[20][20] = { 0 };

void InitBackground()
{
    for (size_t nRow = 0; nRow < 20; nRow++)
    {
        for (size_t nCol = 0; nCol < 20; nCol++)
        {
            if (nRow == 0
                || nCol == 0
                || nRow == 19
                || nCol == 19)
            {
                g_chBackground[nRow][nCol] = 1;
            }
            else
            {
                g_chBackground[nRow][nCol] = 0;
            }
        }
    }
}

void ShowBackGround()
{
    for (size_t nRow = 0; nRow < 20; nRow++)
    {
        for (size_t nCol = 0; nCol < 20; nCol++)
        {
            if (g_chBackground[nRow][nCol] == 1)
            {
                MoveCursorTo(nRow, nCol);
                printf("■");
            }
            else
            {

            }
        }
    }
}

void ClearPlayer(int nRow, int nCol)
{
    MoveCursorTo(nRow, nCol);
    printf(" ");
}

void ShowPlayer(int nRow, int nCol)
{
    MoveCursorTo(nRow, nCol);
    printf("×");
}

int IsCanMove(int nToRow, int nToCol)
{
    if (g_chBackground[nToRow][nToCol] == 1)
    {
        return 0; //不能移动
    }
    else
    {
        return 1; //可以移动
    }
}

int main(int argc, char* argv[])
{
    char chInput = 0;
    InitBackground();
    ShowBackGround();

    int nRow = 10;
    int nCol = 10;

    ShowPlayer(nRow, nCol);

    while (1)
    {
        if (_kbhit() != 0)
        {
            chInput = _getch();
            switch (chInput)
            {
            case 'a':
                if (IsCanMove(nRow, nCol - 1))
                {
                    ClearPlayer(nRow, nCol);
                    nCol -= 1;
                    ShowPlayer(nRow, nCol);
                }
                break;
            case 'w':
                if (IsCanMove(nRow - 1, nCol))
                {
                    ClearPlayer(nRow, nCol);
                    nRow -= 1;
                    ShowPlayer(nRow, nCol);
                }
                break;
            case 's':
                if (IsCanMove(nRow + 1, nCol))
                {
                    ClearPlayer(nRow, nCol);
                    nRow += 1;
                    ShowPlayer(nRow, nCol);
                }
                break;
            case 'd':
                if (IsCanMove(nRow, nCol + 1))
                {
                    ClearPlayer(nRow, nCol);
                    //改变坐标并移动、打印
                    nCol += 1;
                    ShowPlayer(nRow, nCol);
                }
                break;
            default:
                break;
            }
        }

    }
    return 0;
}

我们选择封装玩家,将行、列坐标封装到player结构体中。

封装后代码

#include <windows.h>
#include <conio.h>
#include <stdio.h>

struct tagPlayer{
    int nRow;
    int nCol;
};

void MoveCursorTo(int nRow, int nCol)
{
    COORD crdLocation;
    crdLocation.X = 2 * nCol;
    crdLocation.Y = nRow;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), crdLocation);
}

char g_chBackground[20][20] = { 0 };

void InitBackground()
{
    for (size_t nRow = 0; nRow < 20; nRow++)
    {
        for (size_t nCol = 0; nCol < 20; nCol++)
        {
            if (nRow == 0
                || nCol == 0
                || nRow == 19
                || nCol == 19)
            {
                g_chBackground[nRow][nCol] = 1;
            }
            else
            {
                g_chBackground[nRow][nCol] = 0;
            }
        }
    }
}

void ShowBackGround()
{
    for (size_t nRow = 0; nRow < 20; nRow++)
    {
        for (size_t nCol = 0; nCol < 20; nCol++)
        {
            if (g_chBackground[nRow][nCol] == 1)
            {
                MoveCursorTo(nRow, nCol);
                printf("■");
            }
            else
            {

            }
        }
    }
}

void ClearPlayer(tagPlayer *pPlayer)
{
    MoveCursorTo(pPlayer->nRow, pPlayer->nCol);
    printf(" ");
}

void ShowPlayer(tagPlayer *pPlayer)
{
    MoveCursorTo(pPlayer->nRow, pPlayer->nCol);
    printf("×");
}

int IsCanMove(int nRow, int nCol)
{
    if (g_chBackground[nRow][nCol] == 1)
    {
        return 0; //不能移动
    }
    else
    {
        return 1; //可以移动
    }
}

int main(int argc, char* argv[])
{
    char chInput = 0;
    InitBackground();
    ShowBackGround();

    tagPlayer player = { 10, 10 };

    ShowPlayer(&player);

    while (1)
    {
        if (_kbhit() != 0)
        {
            chInput = _getch();
            switch (chInput)
            {
            case 'a':
                if (IsCanMove(player.nRow, player.nCol - 1))
                {
                    ClearPlayer(&player);
                    player.nCol -= 1;
                    ShowPlayer(&player);
                }
                break;
            case 'w':
                if (IsCanMove(player.nRow - 1, player.nCol))
                {
                    ClearPlayer(&player);
                    player.nRow -= 1;
                    ShowPlayer(&player);
                }
                break;
            case 's':
                if (IsCanMove(player.nRow + 1, player.nCol))
                {
                    ClearPlayer(&player);
                    player.nRow += 1;
                    ShowPlayer(&player);
                }
                break;
            case 'd':
                if (IsCanMove(player.nRow, player.nCol + 1))
                {
                    ClearPlayer(&player);
                    //改变坐标并移动、打印
                    player.nCol += 1;
                    ShowPlayer(&player);
                }
                break;
            default:
                break;
            }
        }

    }
    return 0;
}

原文地址:https://www.cnblogs.com/shellmad/p/11695657.html

时间: 2024-08-29 18:55:41

C零基础视频-41-使用结构体封装游戏角色的相关文章

C零基础视频-31-二维数组应用之游戏中的碰撞检测

目录 没有碰撞检测的版本 碰撞检测 没有碰撞检测的版本 #include <windows.h> #include <conio.h> #include <stdio.h> void MoveCursorTo(int nRow, int nCol) { COORD crdLocation; crdLocation.X = 2*nCol; crdLocation.Y = nRow; SetConsoleCursorPosition(GetStdHandle(STD_OUT

程序设计基石与实践系列之失落的C语言结构体封装艺术

英文来源于 Eric S. Raymond-- The Lost Art of C Structure Packing 谁该阅读这篇文章 本文是关于削减C语言程序内存占用空间的一项技术--为了减小内存大小而手工重新封装C结构体声明.你需要C语言的基本知识来读懂本文. 如果你要为内存有限制的嵌入式系统.或者操作系统内核写代码,那么你需要懂这项技术.如果你在处理极大的应用程序数据集,以至于你的程序常常达到内存的界限时,这项技术是有帮助的.在任何你真的真的需要关注将高速缓存行未命中降到最低的应用程序里

(转)失落的C语言结构体封装艺术

目录1. 谁该阅读这篇文章 2. 我为什么写这篇文章 3.对齐要求 4.填充 5.结构体对齐及填充 6.结构体重排序 7.难以处理的标量的情况 8.可读性和缓存局部性 9.其他封装的技术 10.工具 11.证明及例外 12.版本履历 1. 谁该阅读这篇文章 本文是关于削减C语言程序内存占用空间的一项技术——为了减小内存大小而手工重新封装C结构体声明.你需要C语言的基本知识来读懂本文. 如果你要为内存有限制的嵌入式系统.或者操作系统内核写代码,那么你需要懂这项技术.如果你在处理极大的应用程序数据集

C零基础视频-39-结构体的定义与使用

目录 为什么要使用结构体 结构体的定义与使用 结构体的定义 定义结构体变量 引用结构体中的成员 为什么要使用结构体 生活中的事物,往往有多种属性,我们为了记录和表示他们,需要围绕一个事物,记录多中数据. 如一只宠物狗,他可能有:姓名.颜色.体重. 我们可以使用三个不同的变量记录它: #include <stdio.h> int main(int argc, char* argv[]) { char szName[20] = { "旺财" }; char szColor[20

C零基础视频-42-共用体

目录 共用体的定义与使用 共用体与结构体的比较 共用体的定义与使用 共用体的关键字是union,共用体是非基本数据类型,同结构体类似,我们需要先声明共用体类型,再利用自定义的类型去定义变量. #include <stdio.h> #include <string.h> union MyUnion { double dbWeight; int nID; char szName[8]; }; int main(int argc, char* argv[]) { MyUnion unio

C零基础视频-40-结构体指针

目录 结构体指针的定义 使用结构体指针引用结构体成员 结构体指针作为函数参数传递 结构体指针的定义 结构体指针的定义与基本数据结构的指针类似,使用"*"符号即可: #include <stdio.h> struct tagPetDog{ char szName[20]; char szColor[20]; char nWeight; }; int main(int argc, char* argv[]) { tagPetDog dog = { "旺财",

C语言基础知识----联合 &amp;&amp; 枚举 &amp;&amp; 结构体

结构体 struct 结构体标签(可选) { 类型1 标识符1: 类型2 标识符2: ....... }(变量定义可选); 联合 union 可选的标签 { 类型1 标识符1: 类型2 标识符2: ........ }可选的变量定义: 联合与结构体相似,但内存布局上存在关键性的区别.结构体中每个成员顺序存储:而在联合中,所有的成员都是从偏移量为零处开始存储(位置是重叠的),并且在某一时刻,只有一个成员真正存储于改地址. 枚举(它用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为

【C语言】基础(十)结构体

结构体 面向对象里 类(高级的封装) 封装数据是什么 封装数据做什么 函数:逻辑的封装: 结构体:数据模型的封装: 枚举{1,2,3} 联合体{int char double}:选其中任一种类型 变量定义 struct student{ int age; //成员列表:类型说明 标识符: char name[20]; double mathscore; }A,B,C: struct student A: struct student B: 初始化 struct student A={15,"A&

蓝鸥Unity开发基础二——课时2 结构体

一.定义结构体类型 结构体相当于一个复合型的容器 结构体是由一系列不同类型的数据构成的集合 Struct结构体名{ 访问修饰符 类型 变量命: 访问修饰符 类型 变量命: -- 访问修饰符 类型 变量命: } 结构体声明和使用举例: using System; namespace Lesson_02{    class MainClass    { //定义一个结构体        struct Peraon{            public string name;