01 初始化工作-游戏设置
游戏设置和相关初始化放在了一个类里面,并进行了静态声明。主要设置了游戏窗口的长和款。并在GameInit()函数里面设置了窗口大小,隐藏光标,初始化随机数种子等。代码如下:
1//游戏设置相关模块,把函数都放到一个类里面了。函数定义为static静态成员,不生成实体也可以直接调用 2class GameSetting 3{ 4public: 5 //游戏窗口的长宽 6 static const int window_height = 40; 7 static const int window_width = 80; 8public: 9 static void GameInit() 10 { 11 //设置游戏窗口大小 12 char buffer[32]; 13 sprintf_s(buffer, "mode con cols=%d lines=%d",window_width, window_height); 14 system(buffer); 15 16 //隐藏光标 17 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); 18 CONSOLE_CURSOR_INFO CursorInfo; 19 GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息 20 CursorInfo.bVisible = false; //隐藏控制台光标 21 SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态 22 //初始化随机数种子 23 srand((unsigned int)time(0)); 24 } 25};
用到了几个相关的Windows API,本文不做过多介绍,大家百度即可。
02 打印信息类
该类主要是用来打印一些游戏相关信息的。该类大体如下:
下面挑几个重点的来讲:
2.1 画地图边界
这个函数主要是根据上面所给的游戏窗口长宽来打印地图边界的。其中还划分了几个区域,主要用来放不同的信息的。
1//画地图边界 2static void DrawMap() 3{ 4 system("cls"); 5 int i, j; 6 for (i = 0; i < GameSetting::window_width; i++) 7 cout << "#"; 8 cout << endl; 9 for (i = 0; i < GameSetting::window_height-2; i++) 10 { 11 for (j = 0; j < GameSetting::window_width; j++) 12 { 13 if (i == 13 && j >= GameSetting::window_width - 29) 14 { 15 cout << "#"; 16 continue; 17 } 18 19 if (j == 0 || j == GameSetting::window_width - 29 || j == GameSetting::window_width-1) 20 { 21 cout << "#"; 22 } 23 else 24 cout << " "; 25 26 } 27 cout << endl; 28 } 29 for (i = 0; i < GameSetting::window_width; i++) 30 cout << "#"; 31 32}
划分区域如下图,#就是边框了:
2.2 画出分数和模式
该函数主要是在右上角画出成绩和游戏模式的,在绘制之前会进行刷新处理。先清除,再重新打印。用到了一个gotoxy()函数。这个函数主要是移动光标到(x, y)坐标处的。关于(x, y)的位置,根据实际情况调整即可。
1//画分数 2static void DrawScore(int score) 3{ 4 gotoxy(GameSetting::window_width - 22+14, 6); 5 cout << " "; 6 gotoxy(GameSetting::window_width - 22+14, 4); 7 cout << " "; 8 9 gotoxy(GameSetting::window_width - 22, 6); 10 cout << "当前玩家分数: " << score << endl; 11 gotoxy(GameSetting::window_width - 22, 4); 12 cout << "当前游戏速度: " << 10 - speed / 25 << endl; 13 14}
03 食物类
食物类定义了食物的坐标,随机生成规则,和画出食物等一系列操作。其中食物坐标我们用了一个结构体:
1typedef struct 2{ 3 int x; 4 int y; 5}COORDINATE;
该结构体两个成员,分别保存坐标的(x, y)。蛇身的坐标也会用到这个结构体。
有关食物类的大体如下:
下面我们还是挑几个重点来讲。
3.1 随机生成食物
随机生成食物,原则上不允许食物出现在蛇身的位置上,如果有。我们重新生成。注意地图的范围,就是区域左边一块。实际情况根据自身的地图范围来调整食物坐标的范围,注意不要越界。用rand()函数获得随机坐标。代码如下:
1void RandomXY(vector<COORDINATE> & coord) 2{ 3 m_coordinate.x = rand() % (GameSetting::window_width - 30) + 1; 4 m_coordinate.y = rand() % (GameSetting::window_height - 2) + 1; 5 unsigned int i; 6 //原则上不允许食物出现在蛇的位置上,如果有,重新生成 7 for (i = 0; i < coord.size(); i++) 8 { 9 //食物出现在蛇身的位置上。重新生成 10 if (coord[i].x == m_coordinate.x && coord[i].y == m_coordinate.y) 11 { 12 m_coordinate.x = rand() % (GameSetting::window_width - 30) + 1; 13 m_coordinate.y = rand() % (GameSetting::window_height - 2) + 1; 14 i = 0; 15 } 16 } 17}
然后,在构造函数里面传入蛇身的坐标。即可生成食物。
3.2 画出食物
画出食物比较简单了,gotoxy到随机生成的坐标之后,cout就行。我们在这还设置了一个食物颜色为红色。代码如下:
1void DrawFood() 2{ 3 setColor(12, 0); 4 gotoxy(m_coordinate.x, m_coordinate.y); 5 cout << "@"; 6 setColor(7, 0); 7}