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