实验二.贪吃蛇(实验日志+源码)

本文详细介绍了实现贪吃蛇游戏的实验过程,包括游戏内容和要求,游戏框架构建,如隐藏光标、光标跳转、初始化界面、颜色设置、初始化蛇、随机生成食物、打印蛇与覆盖蛇、移动蛇等功能的实现。同时,文章提供了游戏主体逻辑函数的执行流程,以及键盘控制、得分与游戏结束的判断。此外,还涵盖了从文件读取和更新最高分的处理。通过源码解析,帮助读者理解贪吃蛇游戏的完整开发流程。
摘要由CSDN通过智能技术生成

一.实验内容: 

1)实现贪吃蛇游戏基本功能,屏幕上随机出现一个食物称为豆子。玩家能利用上下左右控制“蛇”的移动,“蛇”吃到“豆子”身体加长一节,得分增加,“碰到边界蛇头与蛇身相撞“蛇”死亡,游戏结束。

2)进行交互界面的设计,要有开始键、暂停键和停止退出的选项,能够控制游戏进程。对蛇吃到豆子进行分值计算,可以设置游戏速度,游戏音乐等拓展元素。 

实验要求:

1.右控制“蛇”的移动,吃到“豆子”以后“蛇”的身体加长一点。 “蛇”碰到边界或蛇头与蛇身相撞,蛇死亡,游戏结束。

2.为游戏设计友好的交互界面;例如欢迎界面,游戏界面,游戏结束界实现贪吃蛇游戏基本功能,屏幕上随机出现一个“食物”,称为豆子,上下左面。

3.要有开始键、暂停键和停止退出的选项。

4.对蛇吃到豆子进行分值计算,可以设置游戏速度,游戏音乐    等拓展元素。

游戏说明:
游戏界面当中没有打印相关的按键说明,这里先逐一列出,贪吃蛇游戏按键说明:

按方向键上下左右,可以实现蛇移动方向的改变。
短时间长按方向键上下左右其中之一,可实现蛇向该方向的短时间加速移动。
按空格键可实现暂停,暂停后按任意键继续游戏。
按Esc键可直接退出游戏。
按R键可重新开始游戏。
除此之外,本游戏还拥有计分系统,可保存玩家的历史最高记录。
 

二.游戏效果展示

在这里插入图片描述

三.实验过程详解

游戏框架构建

首先定义游戏界面的大小,定义游戏区行数和列数。

#define ROW 22 //游戏区行数
#define COL 42 //游戏区列数
这里将蛇活动的区域称为游戏区,将分数提示的区域称为提示区(提示区占一行)。

在这里插入图片描述

此外,我们还需要两个结构体用于表示蛇头和蛇身。蛇头结构体当中存储着当前蛇身的长度以及蛇头的位置坐标。

//蛇头
struct Snake
{
	int len; //记录蛇身长度
	int x; //蛇头横坐标
	int y; //蛇头纵坐标
}snake;

 蛇身结构体当中存储着该段蛇身的位置坐标。

//蛇身
struct Body
{
	int x; //蛇身横坐标
	int y; //蛇身纵坐标
}body[ROW*COL]; //开辟足以存储蛇身的结构体数组

同时我们需要一个二维数组来标记游戏区各个位置的状态(空、墙、食物、蛇头以及蛇身)。

int face[ROW][COL]; //标记游戏区各个位置的状态

为了增加代码的可读性,最好运用宏来定义各个位置的状态,而不是在代码中用干巴巴的数字对各个位置的状态进行切换。

#define KONG 0 //标记空(什么也没有)
#define WALL 1 //标记墙
#define FOOD 2 //标记食物
#define HEAD 3 //标记蛇头
#define BODY 4 //标记蛇身

当然,为了代码的可读性,我们最好也将需要用到的按键的键值用宏进行定义。

#define UP 72 //方向键:上
#define DOWN 80 //方向键:下
#define LEFT 75 //方向键:左
#define RIGHT 77 //方向键:右
#define SPACE 32 //暂停
#define ESC 27 //退出

隐藏光标

隐藏光标比较简单,定义一个光标信息的结构体变量,然后对光标信息进行赋值,最后用这个光标信息的结构体变量进行光标信息设置即可。

//隐藏光标
void HideCursor()
{
	CONSOLE_CURSOR_INFO curInfo; //定义光标信息的结构体变量
	curInfo.dwSize = 1; //如果没赋值的话,光标隐藏无效
	curInfo.bVisible = FALSE; //将光标设置为不可见
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄
	SetConsoleCursorInfo(handle, &curInfo); //设置光标信息
}

光标跳转

光标跳转,也就是让光标跳转到指定位置进行输出。与隐藏光标的操作步骤类似,先定义一个光标位置的结构体变量,然后设置光标的横纵坐标,最后用这个光标位置的结构体变量进行光标位置设置即可。

//光标跳转
void CursorJump(int x, int y)
{
	COORD pos; //定义光标位置的结构体变量
	pos.X = x; //横坐标
	pos.Y = y; //纵坐标
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄
	SetConsoleCursorPosition(handle, pos); //设置光标位置
}

初始化界面

初始化界面完成游戏区“墙”的打印,和提示区的打印即可。

在打印过程中需要注意两点:

在cmd窗口中一个小方块占两个单位的横坐标,一个单位的纵坐标。
光标跳转函数CursorJump接收的是光标将要跳至位置的横纵坐标。
例如,要用CursorJump函数跳转至 i 行 j 列(以一个小方块为一个单位),就等价于让光标跳转至坐标(2*j,i)处。

注意: 在初始化界面的同时,记得对游戏区相应位置的状态进行标记。

//初始化界面
void InitInterface()
{
	color(6); //颜色设置为土黄色
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			if (j == 0 || j == COL - 1)
			{
				face[i][j] = WALL; //标记该位置为墙
				CursorJump(2 * j, i);
				printf("■");
			}
			else if (i == 0 || i == ROW - 1)
			{
				face[i][j] = WALL; //标记该位置为墙
				printf("■");
			}
			else
			{
				face[i][j] = KONG; //标记该位置为空
			}
		}
	}
	color(7); //颜色设置为白色
	CursorJump(0, ROW);
	printf("当前得分:%d", grade);
	CursorJump(COL, ROW);
	printf("历史最高得分:%d", max);
}

颜色设置

颜色设置函数的作用是,将此后输出的内容颜色都更为所指定的颜色,接收的参数c是颜色代码,十进制颜色代码表如下:

//颜色设置
void color(int c)
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //颜色设置
	//注:SetConsoleTextAttribute是一个API(应用程序编程接口)
}

 设置颜色函数在其头文件当中的声明如下:在这里插入图片描述

初始化蛇

初始化蛇时将蛇身的长度初始化为2,蛇头的起始位置在游戏区的中央,蛇头向右依次是第0个蛇身、第1个蛇身。

在这里插入图片描述

在初始化蛇的信息后,记得对游戏区该位置的状态进行标记。

//初始化蛇
void InitSnake()
{
	snake.len = 2; //蛇的身体长度初始化为2
	snake.x = COL / 2; //蛇头位置的横坐标
	snake.y = ROW / 2; //蛇头位置的纵坐标
	//蛇身坐标的初始化
	body[0].x = COL / 2 - 1;
	body[0].y = ROW / 2;
	body[1].x = COL / 2 - 2;
	body[1].y = ROW / 2;
	//将蛇头和蛇身位置进行标记
	face[snake.y][snake.x] = HEAD;
	face[body[0].y][body[0].x] = BODY;
	face[body[1].y][body[1].x] = BODY;
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值