C语⾔实现贪吃蛇⼩游戏(详解)
⽬录
⼀、程序实现的原理:
1、构造蛇⾝:定义⼀个坐标数组,存放的是蛇的每⼀节蛇⾝所在的坐标位置。这样就将移动蛇⾝的操作转换为移动数组的操作,将吃⾷物增加蛇⾝体长度的操作转换为在数组后⾯追加元素的操作。
2、移动效果:每次移动时,将每⼀节蛇⾝(蛇头除外)依次往前移动⼀节,然后擦去蛇的最后⼀节,最后确定蛇头的⽅向,再绘制⼀个蛇头。这样就会显⽰⼀个移动效果。
3、⾝体增加效果:每次移动时候,判断蛇头是否碰到了⾷物,如果碰到了⾷物,则吃掉它,并且只进⾏前移蛇⾝和增加蛇头的操作,不进⾏擦除蛇尾的操作(可以⽤⼀个标记变量判断是否吃掉了⾷物,然后在擦除蛇尾那⾥判断是否需要擦除蛇尾),这就会显⽰蛇⾝体增加的效果。
⼆、预备知识
1、控制台窗⼝
控制台窗⼝每⼀个位置都有它的坐标,且坐标系如下图所⽰(随箭头⽅向坐标逐渐增⼤)
2、通过代码将光标移动到控制台指定位置
这⾥⽤到了c语⾔windows编程中句柄的概念,不知道的可以百度。实在不会也没关系,可以当做⼀个函数模板来使⽤,⽆需做太多了解。
//将光标移动到控制台的(x,y)坐标点处
void gotoxy(int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); }
int main()
{
gotoxy(50,15);//将光标移动到控制台的(50,15)处
printf("Hello World\n");
system("pause");
return 0;
}
从运⾏结果可以看到,程序在指定位置输出了待输出的内容。
三、程序框架
1、定义相关头⽂件
2、定义函数结构以及相关属性
3、完成各代码块
四、具体操作
1、定义相关头⽂件
本程序所⽤到的头⽂件如下所⽰
#include <Windows.h>//windows编程头⽂件
#include <time.h>
#include <conio.h>//控制台输⼊输出头⽂件
2、定义函数结构以及相关属性
⾸先需要确定游戏的边框⼤⼩
#define SNAKESIZE 100//蛇的⾝体最⼤节数
#define MAPWIDTH 118 //宽度
#define MAPHEIGHT 29//⾼度
其次要定义⾷物的坐标,以及 蛇⾃⾝的相关属性
//⾷物的坐标
struct {
int x;
int y;
}food;
//蛇的相关属性
struct {
int speed;//蛇移动的速度
int len;//蛇的长度
int x[SNAKESIZE];//组成蛇⾝的每⼀个⼩⽅块中x的坐标
int y[SNAKESIZE];//组成蛇⾝的每⼀个⼩⽅块中y的坐标
}snake;
这⾥蛇的⾝体由⼀节⼀节的⼩⽅块■组成, 将蛇的⾝体每⼀节的⼩⽅块所在的位置⽤⼀个数组来存储起来,⽅便以后操作。 确定游戏所⽤到的⼏个函数块。
//绘制游戏边框
void drawMap();
//随机⽣成⾷物
void createFood();
//按键操作
void keyDown();
//蛇的状态
bool snakeStatus();
//从控制台移动光标
void gotoxy(int x, int y);
最后定义⼏个全局变量
int key = 72;//表⽰蛇移动的⽅向,72为按下“↑”所代表的数字
//⽤来判断蛇是否吃掉了⾷物,这⼀步很重要,涉及到是否会有蛇⾝移动的效果以及蛇⾝增长的效果
int changeFlag = 0;
int sorce = 0;//记录玩家的得分
五、完成各代码块
1、实现将光标移到指定位置的操作
//将控制台光标移到(x,y)处
void gotoxy(int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
2、打印游戏边框以及游戏初始画⾯
⼀个⼩⽅块字符■在x⽅向上占⽤两个位置,在y⽅向上占⽤⼀个位置。每⼀节蛇⾝由⼀个⼩⽅块构成。
void drawMap()
{
//打印上下边框
for (int i = 0; i <= MAPWIDTH; i += 2)//i+=2是因为横向占⽤的是两个位置
{
//将光标移动依次到(i,0)处打印上边框
gotoxy(i, 0);
printf("■");
//将光标移动依次到(i,MAPHEIGHT)处打印下边框
gotoxy(i, MAPHEIGHT);
printf("■");
}
//打印左右边框
for (int i = 1; i < MAPHEIGHT; i++)
{
//将光标移动依次到(0,i)处打印左边框
gotoxy(0, i);
printf("■");
//将光标移动依次到(MAPWIDTH, i)处打印左边框
gotoxy(MAPWIDTH, i);
printf("■");
}
/
/随机⽣成初试⾷物
while (1)
{
srand((unsigned int)time(NULL));
food.x = rand() % (MAPWIDTH - 4) + 2;
food.y = rand() % (MAPHEIGHT - 2) + 1;
//⽣成的⾷物横坐标的奇偶必须和初试时蛇头所在坐标的奇偶⼀致,因为⼀个字符占两个字节位置,若不⼀致 //会导致吃⾷物的时候只吃到⼀半
if (food.x % 2 == 0)
break;
}
//将光标移到⾷物的坐标处打印⾷物
gotoxy(food.x, food.y);
printf("★");
//初始化蛇的属性
snake.len = 3;
snake.speed = 200;
//在屏幕中间⽣成蛇头
snake.x[0] = MAPWIDTH / 2 + 1;//x坐标为偶数
snake.y[0] = MAPHEIGHT / 2;
贪吃蛇的编程代码//打印蛇头
gotoxy(snake.x[0], snake.y[0]);
printf("■");
/
/⽣成初试的蛇⾝
for (int i = 1; i < snake.len; i++)
{
//蛇⾝的打印,纵坐标不变,横坐标为上⼀节蛇⾝的坐标值+2
snake.x[i] = snake.x[i - 1] + 2;
snake.y[i] = snake.y[i - 1];
gotoxy(snake.x[i], snake.y[i]);
printf("■");
}
//打印完蛇⾝后将光标移到屏幕最上⽅,避免光标在蛇⾝处⼀直闪烁
gotoxy(MAPWIDTH - 2, 0);
return;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论