贪吃蛇(c实现)(真的超级超级简单)

1.代码请看贪吃蛇c实现 · 王赫辰/c语言 - 码云 - 开源中国 (gitee.com)

2.本项目宗旨:

1.不引入复杂的库函数(其他博主的全是陌生库函数看不懂?看我就对了!◕‿◕)

2.不使用c++语法 (都说了c实现,嘿嘿ᕙ(`▿´)ᕗ)

3.不使用函数,结构体和指针 (除非题目需要。不要折磨自己(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ ))

3.实现者要求:具备较强逻辑能力,具有灵活运用二维数组的能力,熟练运用循环与选择。

4.如果你准备好了,那么我们开始吧!❛‿˂̵✧

项目整体架构

1.规则:贪吃蛇移动的每一步都需要重新打印,贪吃蛇不能碰到自己和边框,贪吃蛇吃到食物加分,且食物随机生成。

2.二维数组使用方法:根据不同对象(边框,蛇,食物)的属性赋值,再根据值进行打印。

3.在每次移动的时候,蛇身要继承蛇头或者前面蛇身的位置,最后的蛇身需要被清理。

生成随机食物

1.来看看方法的来源利用时钟值来实现数组的真正随机 · 王赫辰/c语言 - 码云 - 开源中国 (gitee.com)

2.当我们选择生成四个食物时,需要对食物的横纵坐标分别随机赋值,但范围要使其不出现在蛇或者在边框上(别忘了头文件stdlib.h和time.h)

cpp 复制代码
srand(time(NULL));
int a1 = rand() % 8 + 2;
int b1 = rand() % 16 + 2;
int a2 = rand() % 16 + 2;
int b2 = rand() % 9 + 2;
int a3 = rand() % 16 + 2;
int b3 = rand() % 17 + 2;
int a4 = rand() % 3 + 2;
int b4 = rand() % 16 + 2;

初始化变量

(这个应该都懂吧?〃•ω‹〃)(将四个食物坐标赋值以便打印)

cpp 复制代码
	int map[20][20] = { 0 };
	map[a1][b1] = 4;
	map[a2][b2] = 4;
	map[a3][b3] = 4;
	map[a4][b4] = 4;
	int count = 0;
	int e = 11;
	int f = 11;
	int g = 12;
	int h = 13;
	int i = 10;
	int l = 11;
	int m = 11;
	int z = 1;

控制移动

cpp 复制代码
	int a = 0;
	int b = 0;

	int j;
	scanf_s("%d", &j);
	if (j == 0)
	{
		e = 11;
		f = 11;
		g = 12;
		h = 13;
		i = 10;

		l = 11;
		m = 11;
		count = 0;
	}
	if (j == 1)
	{
		if (map[l - 1][i] == 4)
		{
			count++;
		}
		if (e != l - 1&&l!=1)
		{
			int n = l;
			int o = i;
			int p = e;
			int q = f;
			map[m][g] = 0;
			l--;
			e = n;
			f = o;
			m = p;
			g = q;
		}
		if (e == l - 1||l==1)
		{
			printf("你输了\n");
			break;
		}
		
	}
	if (j == 2)
	{
		if (map[l + 1][i] == 4)
		{
			count++;
		}
		if (e != l + 1&&l!=18)
		{
			int n = l;
			int o = i;
			int p = e;
			int q = f;
			map[m][g] = 0;
			l++;
			e = n;
			f = o;
			m = p;
			g = q;
		}
		if (e == l + 1||l==18)
		{
			printf("你输了\n");
			break;
		}
	}
	if (j == 3)
	{
		if (map[l][i-1] == 4)
		{
			count++;
		}
		if (f != i - 1&&i!=1)
		{
			int n = l;
			int o = i;
			int p = e;
			int q = f;
			map[m][g] = 0;
			i--;
			e = n;
			f = o;
			m = p;
			g = q;
		}
		if (f == i - 1||i==1)
		{
			printf("你输了\n");
			break;
		}
	}
	if (j == 4)
	{
		if (map[l][i+1] == 4)
		{
			count++;
		}
		if (f != i + 1&&i!=18)
		{
			int n = l;
			int o = i;
			int p = e;
			int q = f;
			map[m][g] = 0;
			i++;
			e = n;
			f = o;
			m = p;
			g = q;
		}
		if (f == i + 1||i==18)
		{
			printf("你输了\n");
			break;
		}
	}

1.输入1234控制蛇上下左右移动,而笔者选择在控制中加入输赢判定,当碰到蛇身或墙壁的时候游戏失败,当碰到食物的时候加分

2.逻辑解惑:当我们控制蛇向上移动时,如果蛇身或者边框在蛇头上面,那么是不是移动后就输了?而如果食物在上面,是不是移动就加分了?所以我们可以在赋值操作前进行判断对不对?

3.继承逻辑:当蛇头自定义运行时,第一段蛇身到原来蛇头位置,第二段蛇身到原来第一段蛇身的位置,而原先的第二段蛇身需要赋值为0以便打印空格。

赋值操作

cpp 复制代码
		for (a = 0; a < 20; a++)
		{
			for (b = 0; b < 20; b++)
			{
				if (map[a][b] == 0)
				{
					if (a == 0 || b == 0 || a == 19 || b == 19)
					{
						map[a][b] = 1;
					}
					if ((a == e && b == f) || (a == m && b == g))
					{
						map[a][b] = 2;
					}
					if (a == l && b == i)
					{
						map[a][b] = 3;
					}
				
				}
			}
		}

1.由于打印内容的不同,我们将边框的值赋为一类,而蛇头,蛇身同理而前面食物的赋值也是这个思路

打印游戏界面

cpp 复制代码
	int c = 0;
	int d = 0;
	for (c = 0; c < 20; c++)
	{
		for (d = 0; d < 20; d++)
		{
		
			if (map[c][d] == 1)
			{
				printf("* ");
			}
			if (map[c][d] == 0)
			{
				printf("  ");
			}
			if (map[c][d] == 2)
			{
				printf("* ");

			}
			if (map[c][d] == 3)
			{
				printf("@ ");
			}
			if (map[c][d] == 4)
			{
				printf("$ ");
			}
		


		}

		printf("\n");
	}
	printf("得分为%d\n", count);

}

1.分别依据二维数组的值打印不同的内容,注意空格的打印,这样游戏界面就是方的了。

ps:小彩蛋,蛇会慢慢蜕皮哦,去玩两把吧!੭ ᐕ)੭*⁾⁾

相关推荐
张晓~1833994812115 分钟前
碰一碰发视频 系统源码 /PHP 语言开发方案
开发语言·线性代数·矩阵·aigc·php·音视频·文心一言
代码不停17 分钟前
Java前缀和算法题目练习
java·开发语言·算法
豆沙沙包?17 分钟前
2025年--Lc200- 414. 第三大的数(大根堆)--Java版
java·开发语言
一念&24 分钟前
每日一个C语言知识:C 指针
c语言·开发语言
涤生z25 分钟前
list.
开发语言·数据结构·c++·学习·算法·list
xxxxxxllllllshi28 分钟前
Java中Elasticsearch完全指南:从零基础到实战应用
java·开发语言·elasticsearch·面试·职场和发展·jenkins
wu_jing_sheng042 分钟前
Python中使用HTTP 206状态码实现大文件下载的完整指南
开发语言·前端·python
励志不掉头发的内向程序员1 小时前
【Linux系列】掌控 Linux 的脉搏:深入理解进程控制
linux·运维·服务器·开发语言·学习
梵得儿SHI1 小时前
Java 反射机制深度解析:从对象创建到私有成员操作
java·开发语言·class对象·java反射机制·操作类成员·三大典型·反射的核心api
沐知全栈开发1 小时前
Foundation 折叠列表
开发语言