以下 头文件上的这串代码是因为解决VS2022认为getch()和scanf是不安全的函数,也可以直接写入属性预编译里面,低版本也可以直接不加也没有关系
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_NONSTDC_NO_DEPRECATE
以下是C完整代码直接CV工程师就可以了
main.c
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_NONSTDC_NO_DEPRECATE
#include <stdio.h>
#include <Windows.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
//设置字体颜色
void color(const unsigned short textColor)
{
if (textColor >= 0 && textColor <= 15)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), textColor);
else
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
//展示规则
int Show_Role()
{
char back = 0;
system("cls");
printf("按住w键即可控制贪吃蛇向上移动\n");
printf("按住a键即可控制贪吃蛇向左移动\n");
printf("按住s键即可控制贪吃蛇向下移动\n");
printf("按住d键即可控制贪吃蛇向右移动\n");
printf("\n按下l键即可返回上级菜单\n");
printf("按下任意键可以继续开始游戏\n");
back = getch();
if (back == 'l'||back=='L')
{
return 1;//按下l键返回菜单
}
else
{
return 0;//按下任意键继续游戏
}
}
//判断蛇是否死亡
int Die(int snack[100][2])
{
char y = 0;
int s = 0;
for(s=1;s<100;s++)
{
if (snack[0][0] == 0 || snack[0][0] == 49 || snack[0][1] == 0 || snack[0][1] == 99 || (snack[0][0] == snack[s][0] && snack[0][1] == snack[s][1]))
{
system("cls");
printf("Game Over!!!\n");
printf("\n按下r键重新开始游戏\n");
printf("按下其它任意键退出游戏\n");
y = getch();
if (y == 'r' || y == 'R')
{
return 1;
}
else
{
exit(0);
}
}
else
{
return 0;
}
}
}
//控制蛇身体
void ControlSnack_body(int snack[100][2], int k, int last[500][2])
{
int p = 0;
if(k>0)
{
for(p=1;p<k+1;p++)//蛇的每个部位等于蛇的上个部位位置
{
snack[p][0] = last[p-1][0];
snack[p][1] = last[p-1][1];
}
}
}
//判断蛇头走向并且是否重新开始
int ControlSnack_head(int snack[100][2])
{
char control = 0;
control = getch();
if (control == 'W' || control == 'w')
{
snack[0][0] -= 1;
}
else if (control == 'A' || control == 'a')
{
snack[0][1] -= 1;
}
else if (control == 'S' || control == 's')
{
snack[0][0] += 1;
}
else if (control == 'D' || control == 'd')
{
snack[0][1] += 1;
}
else if (control == 'r'||control=='R')
{
return 1;
}
return 0;
}
//创造贪吃蛇路径
void BackGround(int background[50][100], int snack[100][2], int food[1][2], int k)
{
int i = 0, j = 0, n = 1;
for (i = 0; i < 50; i++)
{
for (j = 0; j < 100; j++)
{
if (i == food[0][0] && j == food[0][1])
{
background[i][j] = 1;//食物
}
else if (i == snack[0][0] && j == snack[0][1])
{
background[i][j] = 2;//蛇头
}
else
{
background[i][j] = 0;//背景
}
for (n = 1; n < k + 1; n++)
{
if(i==snack[n][0]&&j==snack[n][1])
{
background[i][j] = 3;
}
}
}
}
}
//判断蛇是否吃到零食
int SnackEat(int background[50][100],int snack[100][2],int food[1][2],int last[500][2], int k)
{
if ((food[0][0] == snack[0][0]) && (food[0][1] == snack[0][1]))
{
//记录新身体的位置
snack[k + 1][0] = last[k][0];
snack[k + 1][1] = last[k][1];
background[snack[0][0]][snack[0][1]] = 2;//蛇头和零食重合,只画蛇头
background[last[k][0]][last[k][1]] = 3;//蛇头迟到零食,前一个蛇头的位置生成一个身体
srand(time(NULL) + 3);//如果零食被吃掉则重新在生成一个零食
food[0][0] = rand() % 48 + 1;
food[0][1] = rand() % 98 + 1;
return 1;
}
else
{
return 0;
}
}
//根据路径将位置画出
void Paint(int background[50][100], int snack[100][2], int food[1][2])
{
system("cls");
int i = 0, j = 0;
for (i = 0; i < 50; i++)
{
for (j = 0; j < 100; j++)
{
switch (background[i][j])
{
case 0:
if(i==0||j==0||j==99||i==49)
{
color(4);
printf("□");
}
else
{
color(16);
printf("□");
}
break;
case 1:
color(6);
printf("▲");
break;
case 2:
color(2);
printf("★");
break;
default:
color(2);
printf("■");
}
}
printf("\n");
}
}
//最高级菜单
int Menu()
{
system("cls");
char get_key = 0;
color(4);
printf(" -----------------------------贪吃蛇-----------------------------\n\n");
printf(" 1、WASD控制上左下右方向\n\n");
printf(" 2、按下2键开始游戏\n\n");
printf(" 3、退出游戏\n\n");
printf(" 4、游戏中按下r键即可重新开始游戏\n\n");
printf(" -----------------------------------------------------------------\n\n");
get_key = getch();
if (get_key == '1')
{
return 1;
}
else if (get_key == '2')
{
return 2;
}
else if (get_key == '3')
{
exit(0);
}
}
int main()
{
while(1)
{
int i = 0;
int food[1][2] = { 0 };//食物的坐标
int snack[100][2] = { 0 };//蛇的大小
int background[50][100] = { 0 };//地图
int last[500][2] = { 0 };//记录蛇每个身体经过的坐标
static int k = 0;//记录蛇身体长度
srand(time(NULL) + 1);//游戏开始,随机生成蛇头位置
snack[0][0] = rand() % 50;
snack[0][1] = rand() % 100;
srand(time(NULL) + 2);//游戏开始,随机生成零食位置
food[0][0] = rand() % 48 + 1;
food[0][1] = rand() % 98 + 1;
switch (Menu())//选择菜单
{
case 1:
if (Show_Role())
{
continue;
}
case 2:
BackGround(background, snack, food, k);
SnackEat(background, snack, food, last, k);
Paint(background, snack, food);
while (1)
{
for (i = 0; i <= k; i++)
{
last[i][0] = snack[i][0];
last[i][1] = snack[i][1];
}
if (ControlSnack_head(snack))//控制蛇头
{
break;
}
if (Die(snack))//蛇是否死亡
{
break;
}
ControlSnack_body(snack, k, last);//控制蛇身体
BackGround(background, snack, food, k);//规划路径
if (SnackEat(background, snack, food, last, k) == 1)//如果蛇头到零食
{
k += 1;//身体+1
}
Paint(background, snack, food);//将画面绘制
}
continue;
}
}
return 0;//程序结束
}
以上就是所有代码并没有用到结构体,大家也可以自己试试缩减代码,或者也可以将小蛇和零食用结构体写或许会更简单!
如果代码上有问题,大家也可以发出来,作者会看尽力帮助解决。
记得点赞啊!!!