贪吃蛇游戏开发的心得体会(用C语言实现经典游戏——贪吃蛇)

2023-10-21 03:26:00 来源 : haohaofanwen.com 投稿人 : admin

下面是好好范文网小编收集整理的贪吃蛇游戏开发的心得体会(用C语言实现经典游戏——贪吃蛇),仅供参考,欢迎大家阅读!

贪吃蛇游戏开发的心得体会

该项目适合刚学完C语言结构体,有一定C语言基础的练习,该小项目可以帮助自己锻练的面向对象编程思想。

封装一个函数 完成蛇的初始,蛇的初始大小为2,分别表示蛇身和蛇头

void initSnake(void)	{		snake.size = 2;		snake.body[0].X = WIDE/2;		// 初始化好了蛇头		snake.body[0].Y = HiGH/2;		snake.body[1].X = WIDE/2 - 1;		// 初始化一节蛇身		snake.body[1].Y = HIGH/2;	}

(5)初始化食物

void initFood(void)	{			food.X = rand() % WIDE;  // 0-59		food.Y = rand() % HIGH;  // 0-59		return;	}

(6)修改控制台光标位置

COORD coord;		// COORD  --> 结构体, 有两个成员变量:x,y 坐标	coord.X = snake.body[0].X;	coord.Y = snake.body[0].Y;	setConsoleCursorPositon(GetStdHandle(STD_OUTPUT_HANDLE), coord);

(7)画出蛇和食物

“@”表示蛇头,“*”表示蛇身。“#”表示食物

封装函数, initUI()	COORD coord = {0};					// 光标移动的位置。	// 画蛇	for (size_t i = 0; i < snake.size; i++)	{		coord.X = snake.body[i].X;		coord.Y = snake.body[i].Y;		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);		if (i == 0)			putchar('@');		else			putchar('*');	}	// 画食物	coord.X = food.X;	coord.Y = food.Y;	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);	putchar('#');

(8)蛇的移动控制

键盘输入

W:(0, -1)  --> 影响蛇头。     s:(0, +1)     A:(-1, 0)     D:(+1, 0)

不回显:可以让键盘打的asdw不显示在输入界面

getch()    接收用户输入。             char key = getch();         编译时出错,尝试使用 _getch();

不阻塞:可以让输入的小蛇光标不阻塞

kbhit(); 不阻塞判断用户输入。         有用户输入,返回 “真”, 否则返回“假”值。         编译时出错,尝试使用 _kbhit();

(9)开始游戏 

void playGame(void)	{		char key = 'd'; // 默认蛇向右移动		// 蛇头和墙壁的碰撞:		while ( 判断是否撞墙 ) {			// 重画蛇身 intiUI			// 接收用户键盘输入。				在全局 添加:kx, ky --》 根据 asdw 按键得不同坐标,影响蛇头			// 蛇头和身体的碰撞			// 蛇与食物的碰撞						// 蛇身体移动 : 前一节给后一节赋值,蛇头收 kx ky 的影响。			system("cls");  清屏 -- 去除蛇尾。		}	}

蛇头和墙壁的碰撞

判断条件

snake.body[0].X > 0 && snake.body[0].X < WIDE 		&&		  snake.body[0].Y > 0 && snake.body[0].Y < HIGH

蛇头和身体的碰撞

蛇头的坐标 和 任意一节身体的坐标 完全一致。

for(i = 1; i < snake.size; i++)		{			if (snake.body[0].X == snake.body[i].X && snake.body[0].Y == snake.body[i].Y )			{				终止游戏。				return ;			}		}

蛇头和食物的碰撞

if (snake.body[0].X == food.X && snake.body[0].Y == food.Y)		{			蛇身增长: snake.size++;			食物消失:(产生一个新食物)initFood			加分:score += 10;			加速:sleepSecond -= 20;		}

(10)蛇移动

前一节身体给后一节身体赋值。 蛇头按照 aswd 换算的坐标值 进行变换。

for (size_t i = snake.size-1; i > 0; i--)        {            snake.body[i].X = snake.body[i - 1].X;            snake.body[i].Y = snake.body[i - 1].Y;        }        snake.body[0].X += kx;        // 蛇头坐标根据用户按键,修改。        snake.body[0].Y += ky;

(11)画墙

void initWall(void){	for (size_t i = 0; i <= HIGH; i++)	// 多行	{		for (size_t j = 0; j <= WIDE; j++)			// 一行中的多列		{			if (j == WIDE)			{				printf("|");			}			else if (i == HIGH)			{				printf("_");			}			else			{				printf(" ");			}		}		printf("n");	}}

(12)去除蛇尾

蛇移动之前保存蛇尾坐标。

定义全局变量 :lastX, lastY;

lastX = snake.body[snake.size-1].X ;     lastY = snake.body[snake.size-1].Y ;

在initUI中, 将蛇尾 替换为 ' '

coord.X = lastX;		coord.Y = lastY;		setConsoleCursorPosition(GetSTDHandler(STD_OUTPUT_HANDLE), coord);		putchar(' ');

(13)去除光标

取消显示的光标:请按任意位置继续,使得界面更美观

 {    		DWORD  dwSize;		// 大小    		BOOL   bVisible;	// 是否可见;	定义结构体变量:  cci;		cci.dwSize = sizeof(cci);		cci.bVisible = FALSE; //  0 假 --- 不可见	设置光标不可见生效:		setConsoleCursorInfo(GetSTDHandler(STD_OUTPUT_HANDLE), &cci);	在main函数中,调用一次即可生效。

(14)显示分数

playGame调用结束时,打印 全局score 值。

(15)加速

全局定义变量: sleepSecond = 400;

Sleep(sleepSecond);

成功吃食物,    sleepSecond -= 20;

2.游戏实现代码和头文件

下图是代码实现后

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。

原始发表:2023-10-11,


相关文章

专题分类