用C语言实现经典游戏——贪吃蛇

这篇具有很好参考价值的文章主要介绍了用C语言实现经典游戏——贪吃蛇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.游戏实现思想

(1)定义蛇对象

(2)食物对象

(3)分数: 

(4)初始化蛇

(5)初始化食物

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

(7)画出蛇和食物

(8)蛇的移动控制

(9)开始游戏 

(10)蛇移动

(11)画墙

(12)去除蛇尾

(13)去除光标

(14)显示分数

(15)加速

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


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

1.游戏实现思想

要想实现贪吃蛇游戏,根据面向对象的思想,要实现出以下几个模块

1. 定义蛇对象、食物对象

2. 初始化蛇、初始化食物

3. 控制流程:

        1) 蛇头和墙壁的碰撞

        2) 蛇头和蛇身体的碰撞

        3) 蛇头和食物的碰撞

            1> 蛇身增长

            2> 食物消失 -- 新食物产生

            3> 分数累加

            4> 移动速度增大

      4)蛇的移动

            自动移动

            手动控制移动: ASWD --- 左下上右

       5)显示分数

            排行榜 

  4. 图形界面。


(1)定义蛇对象

蛇对象实现方式原理是坐标,而设置X,Y分别表示横坐标与纵坐标,身体使用数组方式表示可以body[0],表示蛇头,其他表示蛇身,蛇的大小会根据吃的食物个数而增加。

struct BODY {

		int x;

		int Y;
	};

	struct SNAKE {

		struct BODY body[20*60];	// 蛇身 。 body[0] -- 蛇头

		int size;			// 蛇的大小
	}snake;

 

(2)食物对象

食物对象实现和蛇对象实现同理

struct FOOD {

		int X;

		int Y;
	}food;

(3)分数: 
 

    int score;

(4)初始化蛇

封装一个函数 完成蛇的初始,蛇的初始大小为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)修改控制台光标位置

会将光标位置,定位到 初始化好的蛇头位置(WIDE/2, HIGH/2). 屏幕中间 。注意实现下面代码要用到头文件:#include <conio.h>,#include <Windows.h>

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)去除光标

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

typedef struct _CONSOLE_CURSOR_INFO {
    		DWORD  dwSize;		// 大小
    		BOOL   bVisible;	// 是否可见。
	} CONSOLE_CURSOR_INFO;

	定义结构体变量:

		CONSOLE_CURSOR_INFO  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.游戏实现代码和头文件

游戏使用建议使用VS编辑器,不建议初学者使用dev编辑器,下面有完整代码和实现好的exe文件,感兴趣的可以打包带走。

下图是代码实现后

用C语言实现经典游戏——贪吃蛇

 


 文章来源地址https://www.toymoban.com/news/detail-501387.html

到了这里,关于用C语言实现经典游戏——贪吃蛇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言经典小游戏之扫雷(超详解释+源码)

    “少年气,是历尽千帆举重若轻的沉淀,也是乐观淡然笑对生活的豁达!” 今天我们学习一下扫雷游戏怎么用C语言来实现! 一个扫雷盘面由许多方格(cell)组成,方格中随机分布着一定数量的雷(mine),一个格子中至多只有1雷。胜利条件是打开所有安全格(非雷格,saf

    2024年02月12日
    浏览(25)
  • C语言经典小游戏之三子棋(超详解释+源码)

    “纵有疾风来,人生不言弃,风乍起,合当奋意向此生。” 今天我们一起来学习一下三子棋小游戏用C语言怎么写出来? 《三子棋》是一款古老的民间传统游戏,又被称为黑白棋、圈圈叉叉棋、井字棋、一条龙、九宫棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子

    2024年02月14日
    浏览(21)
  • html实现经典赛车小游戏

    作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/130580123 html实现经典赛车小游戏源码 html实现经典赛车小游戏源码,1.通过键盘的 上左右 键,控制汽车行走。2.通过canvas进行公路图形绘制。 实现功能: 1.进入游戏界面,通过控制键盘的 上下左右 四个键,让汽

    2024年02月04日
    浏览(24)
  • 【用unity实现100个游戏之11】复刻经典消消乐游戏

    参考原视频链接 :https://www.bilibili.com/video/BV1ST4y1y7Jc 注意 :本文为学习笔记记录,推荐支持原作者,去看原视频自己手敲代码理解更加深入,因为文章涉及源码,所以上锁了 免责声明 :https://xiangyu.blog.csdn.net/article/details/134935682

    2024年02月09日
    浏览(23)
  • html实现经典捕鱼达人小游戏

    作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/130638634 html实现经典捕鱼达人小游戏源码 ,99.99%的还原实物,起始分数为10000,每次出网扣除一分,捕捉到鱼获取一定分(根据不同的鱼,获取不同的积分)。场景大小可自由调整,游戏手感极佳,流畅度高。

    2024年02月04日
    浏览(24)
  • 微信小程序实现window经典的扫雷游戏

    打开手机游戏列表发现了一款经典的扫雷游戏,在玩的过程中发现游戏逻辑应该不难,想着是不是能自己写写这个游戏,后来用了1天实现了整体游戏开发,于是有了这篇文章来总结整体的游戏开发思路。 1、游戏为在10*10或其它排序组合网格中找雷 2、网格中隐藏着一定数量的

    2024年02月09日
    浏览(25)
  • 【用unity实现100个游戏之2】复刻实现经典2d平台跳跃游戏《蔚蓝 Celeste》(附工程源码)

    【视频】:https://www.youtube.com/channel/UCLyVUwlB_Hahir_VsKkGPIA 注意 :本文为学习笔记记录,推荐支持原作者,去看原视频自己手敲代码理解更加深入

    2024年02月08日
    浏览(23)
  • 【用unity实现100个游戏之10】复刻经典俄罗斯方块游戏(附项目源码)

    【视频】:https://www.bilibili.com/video/BV1Fr4y1x7mx 注意 :本文为学习笔记记录,推荐支持原作者,去看原视频自己手敲代码理解更加深入

    2024年02月04日
    浏览(34)
  • 【用unity实现100个游戏之11】复刻经典mirror消消乐游戏(附项目源码)

    参考原视频链接 :https://www.bilibili.com/video/BV1ST4y1y7Jc 注意 :本文为学习笔记记录,推荐支持原作者,去看原视频自己手敲代码理解更加深入,因为文章涉及源码,所以上锁了 免责声明 :https://xiangyu.blog.csdn.net/article/details/134935682

    2024年02月03日
    浏览(24)
  • python毕设分享 经典魔塔游戏设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 经典魔塔游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取: htt

    2024年02月04日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包