(一)背景介绍
1、贪吃蛇,又称贪食蛇、章鱼君,是一款由学生借鉴贪吃蛇的原理而制作的一款游戏,从 1976 年推出以来,受到了众多玩家的喜爱。2、贪吃蛇的游戏带来的乐趣在于游戏难度较低,而又需要技巧和策略。3、贪吃蛇游戏中由贪吃蛇需要去寻找和吃食物,以此达到其身体不断延长的目的,并且需要尽可能躲避碰到墙壁或者自己的身体,否则游戏就结束了。
(二)程序要求:
1、游戏由一个初始状态界面开始,由玩家选择开始游戏还是退出游戏;
2、游戏界面由一定大小的格子构成,贪吃蛇的位置随机出现,食物的位置也在格子中随机出现;3、当贪吃蛇吃到食物时,身体长度加 1,游戏中会出现多种道具,当贪吃蛇使用道具时,会得到不同效果;
4、当贪吃蛇吃到了毒草时,游戏会结束;5、当贪吃蛇触及到墙壁或者自己的身体时,游戏也会结束。
(三)程序设计:
1、在游戏开始前,需要设置游戏的界面大小以及其中一些初始设置;
2、接下来需要在游戏界面内生成一条贪吃蛇,并且设置一个生成的位置,贪吃蛇的方向要根据用户设定随机生成,并且可以设置贪吃蛇的初始长度;3、接着需要在游戏界面中随机生成食物,食物可以是定时生成,也可以随机生成;
4、游戏界面需要设置墙壁、道具及毒草,墙壁可以固定其位置,而道具和毒草也可以随机生成,也可以在游戏开始前设置;
5、最后需要设立规则,当贪吃蛇触及到墙壁或者自己的身体时,游戏将自动结束;当贪吃蛇碰到道具时,会得到不同的效果;当贪吃蛇吃到毒草时,游戏也将结束。
一、声明头文件
1. 导入需要用到的头文件,并声明常量以及定义函数
#include
#include
#include
#define WALL #//定义墙(#号)
#define SNAKE *//定义贪吃蛇(*号)
#define FOOD O//定义食物(O号)
#define INIT_LEN 5 //定义蛇的初始长度
#define INIT_POS_X 20 //定义蛇起始X坐标
#define INIT_POS_Y 8 //定义蛇起始Y坐标
#define MAX_WIDTH 100 //定义地图的最大宽度
#define MAX_HEIGHT 15 //定义地图的最大高度
int Snake[MAX_HEIGHT][MAX_WIDTH] = { 0 }; //定义Snake数组记录蛇的位置
int X = INIT_POS_X;
int Y = INIT_POS_Y;
int foodX, foodY; //定义食物的当前位置
//新建函数
void HideCursor(); //隐藏光标
//绘制边框
void Border();
//绘制贪吃蛇
void DrawSnake();
//贪吃蛇移动
void MoveSnake();
//随机产生食物
void RandFood();
//判断蛇是否死亡
bool IsDie();
二、定义函数
1、隐藏光标
//函数:隐藏控制台光标
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
2、绘制边框
//函数:绘制边框
void Border()
{
for (int j = 0; j< MAX_WIDTH; j++)
{
printf(\"%c\", WALL);
}
printf(\"\
\");
//绘制中间部分
for (int i = 1; i< MAX_HEIGHT - 1; i++)
{
for (int j = 0; j< MAX_WIDTH; j++)
{
if (j == 0 || j == MAX_WIDTH - 1)
{
printf(\"%c\", WALL);
}
else
{
printf(\" \");
}
}
printf(\"\
\");
}
//绘制底部
for (int j = 0; j< MAX_WIDTH; j++)
{
printf(\"%c\", WALL);
}
printf(\"\
\");
}
3、绘制贪吃蛇
//函数:根据贪吃蛇的位置,把蛇绘制到地图中
void DrawSnake()
{
for (int i = 0; i< MAX_HEIGHT; i++)
{
for (int j = 0; j< MAX_WIDTH; j++)
{
if (Snake[i][j] == 1)
{
printf(\"%c\", SNAKE);
}
else
{
printf(\" \");
}
}
printf(\"\
\");
}
}
4、贪吃蛇移动
void MoveSnake(){
//定义当前贪吃蛇的移动方向
char dirc;
//定义上一步是否移动成功
bool succ;
//判断游戏是否结束
while (!IsDie())
{
succ = true;
//输入按键,获取蛇的移动方向
if (GetAsyncKeyState(VK_UP) && dirc != s)
{
dirc = w;
}
else if (GetAsyncKeyState(VK_DOWN) && dirc != w)
{
dirc = s;
}
else if (GetAsyncKeyState(VK_LEFT) && dirc != d)
{
dirc = a;
}
else if (GetAsyncKeyState(VK_RIGHT) && dirc != a)
{
dirc = d;
}
else
succ = false;
//根据蛇的行进方向移动贪吃蛇
if (succ)
{
switch (dirc)
{
case w:
Y--;
break;
case s:
Y++;
break;
case a:
X--;
break;
case d:
X++;
break;
default:
break;
}
}
//判断蛇头是否位于墙上,如果是则直接游戏结束
if (X == 0 || X == MAX_WIDTH - 1 || Y == 0 || Y == MAX_HEIGHT - 1)
{
break;
}
//判断蛇头是否位于食物上,如果是,则重新随机产生食物
if (X == foodX && Y == foodY)
{
RandFood();
}
else
{
//把最后一个贪吃蛇(尾巴)清零(从地图上移除)
Snake[Snake[0][0]][Snake[0][1]] = 0;
//把蛇放到它头部的位置(这段代码是为了把头部的位置放到原来尾巴的位置上)
for (int i = 0; i< MAX_HEIGHT; i++)
{
for (int j = 0; j< MAX_WIDTH; j++)
{
if (Snake[i][j] == 2)
{
Snake[i][j] = 1;
}
}
}
}
//把蛇放到新位置
Snake[Y][X] = 2;
//绘制地图
system(\"cls\");
Border();
DrawSnake();
//延时
Sleep(200);
}
}
5、随机产生食物
//函数:随机产生食物