贪吃蛇(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:小彩蛋,蛇会慢慢蜕皮哦,去玩两把吧!੭ ᐕ)੭*⁾⁾

相关推荐
晨曦_子画7 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
Black_Friend15 分钟前
关于在VS中使用Qt不同版本报错的问题
开发语言·qt
希言JY39 分钟前
C字符串 | 字符串处理函数 | 使用 | 原理 | 实现
c语言·开发语言
残月只会敲键盘40 分钟前
php代码审计--常见函数整理
开发语言·php
xianwu54340 分钟前
反向代理模块
linux·开发语言·网络·git
午言若41 分钟前
C语言比较两个字符串是否相同
c语言
ktkiko111 小时前
Java中的远程方法调用——RPC详解
java·开发语言·rpc
y5236481 小时前
Javascript监控元素样式变化
开发语言·javascript·ecmascript
IT技术分享社区2 小时前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
极客代码2 小时前
【Python TensorFlow】入门到精通
开发语言·人工智能·python·深度学习·tensorflow