C++实现贪吃蛇游戏的详细步骤及实战演示
1. 概述
贪吃蛇游戏是一款经典小游戏,也是C++初学者学习编程的常见项目之一。在这个项目中,我们需要掌握C++基本语法以及窗口界面编程。本文将详细介绍如何使用C++语言实现一个简单的贪吃蛇游戏。
2. 开发环境
本文使用的开发环境为Visual Studio 2019。在新建项目时,选择Win32控制台应用程序,项目类型选择Empty Project。
3. 游戏设计
3.1 游戏规则
贪吃蛇游戏的规则如下:
蛇的身体由一串相邻的正方形组成,初始状态下身体长度为3.
蛇的头部及其身体只能沿着屏幕上下左右四个方向移动,不能斜着走。
每当蛇吃到一颗食物,蛇的身体长度增加1.
当蛇头碰到屏幕边缘或者自己的身体,游戏结束。
3.2 界面设计
游戏的界面需要涉及到以下组件:
一个方格化的游戏区域,贪吃蛇在其中运动。
一个分数计数器,显示当前玩家的得分。
食物,用于蛇吃的对象。
4. 代码实现
4.1 初始化
在程序运行时,需要初始化窗口、游戏界面、游戏的主要变量等。代码如下:
#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;
#define width 25 //宽度
#define height 25 //高度
#define up 1 //定义上下左右,并且为了方程序做出变量名
#define down 2
#define left 3
#define right 4
int score, m, n; //分数,行数和列数
int x[100], y[100], fx, fy, dir; //记录蛇的移动,食物的坐标,蛇的移动方向
bool b[width][height]; //标记网格上的点是否被蛇占用
void Gotoxy(int x, int y) //光标跳转函数,用于调整输出位置
{
HANDLE hout;
COORD cor;
hout = GetStdHandle(STD_OUTPUT_HANDLE);
cor.X = x;
cor.Y = y;
SetConsoleCursorPosition(hout, cor);
}
void startup() //初始化函数
{
score = 0;
m = height - 2;
n = width - 1;
fx = rand() % n + 1;
fy = rand() % m + 1;
x[1] = n / 2;
y[1] = m / 2;
b[x[1]][y[1]] = true;
dir = left;
Gotoxy(x[1], y[1]);
cout << "#"; //输出蛇的头部
Gotoxy(fx, fy);
cout << "$"; //输出食物
Gotoxy(n + 2, 1);
cout << "分数:" << score;
Gotoxy(n + 2, 2);
cout << "操作说明:\n 上:w\n左s 右d\n 下:x\n";
}
4.2 蛇的移动
实现蛇的移动主要需要处理蛇的头部和身体的移动,蛇头移动的方向由键盘控制。处理蛇的头部移动时,只需改变蛇头的坐标,再在新的位置输出蛇头即可。处理蛇身体的移动时,将蛇尾置为空格,将前面的身体拷贝到尾部,再改变蛇身体的坐标即可。
代码如下:
void bodymove(int fx, int fy) //处理蛇身体的移动函数
{
for (int i = 1; i <= score + 1; i++)
if (i == 1)
{
Gotoxy(x[i], y[i]);
cout << "#"; //输出蛇头
}
else
{
Gotoxy(x[i], y[i]);
cout << "*"; //输出蛇身体
x[i - 1] = x[i];
y[i - 1] = y[i];
}
b[x[score + 1]][y[score + 1]] = false;
}
void move() //处理蛇头移动的函数
{
int i;
if (_kbhit()) //判断键盘是否按下
{
switch (_getch())
{
case 'w':
if (dir != down) dir = up;
break;
case 's':
if (dir != up) dir = down;
break;
case 'a':
if (dir != right) dir = left;
break;
case 'd':
if (dir != left) dir = right;
break;
} //根据键盘上下左右键改变蛇的方向
}
switch (dir)
{
case up: y[1]--; break;
case down: y[1]++; break;
case left: x[1]--; break;
case right: x[1]++; break; //根据蛇的方向改变其坐标
}
if (x[1] == 0 || x[1] == n + 1 || y[1] == 0 || y[1] == m + 1)
{
Gotoxy(n / 2 - 4, m / 2);
cout << "游戏结束";
exit(0);
} //当蛇头撞墙时游戏结束
if (b[x[1]][y[1]]) //当蛇头撞上蛇身时游戏结束
{
Gotoxy(n / 2 - 4, m / 2);
cout << "游戏结束";
exit(0);
}
if (fx == x[1] && fy == y[1])
{
score++; //吃到食物,分数加1
Gotoxy(n + 2, 1);
cout << "分数:" << score; //刷新分数
do //随机生成食物的位置
{
fx = rand() % n + 1;
fy = rand() % m + 1;
} while (b[fx][fy]); //判断食物位置是否被蛇占用
Gotoxy(fx, fy);
cout << "$"; //输出食物
}
else bodymove(fx, fy); //蛇未吃到食物,身体移动
b[x[1]][y[1]] = true; //标记蛇的位置
Gotoxy(x[2], y[2]);
cout << "*"; //将蛇尾输出为空格
}
4.3 游戏循环
主要通过循环来处理蛇的移动和游戏结束等情况。在每一次循环中,先判断蛇是否吃到食物,再处理蛇的移动。循环中加入了一个sleep函数,用于控制蛇的移动速度。
代码如下:
void main()
{
startup(); //初始化
while (1)
{
move(); //处理蛇的移动
Sleep(150); //控制蛇的移动速度
}
}
5. 实际效果
通过上述代码的实现,可以得到一个简单的贪吃蛇游戏。下图为该游戏的实际效果:
6. 总结
本文介绍了C++实现贪吃蛇游戏的详细步骤和实现过程。在实现过程中,我们需要处理蛇的移动、食物的随机刷新、游戏结束等情况。希望本文的介绍能够对C++编程初学者有所帮助。