1.首先看下制作效果:
1.
2.
3 .
4 .
2.接下来展示代码:
#include"windows.h"
#include"stdlib.h"
#include<conio.h>
#include"time.h"
int fenshu = 1;
int k = 0;
int ksyx = 0;
void color(short x)//颜色函数
{
if (x >= 0 && x <= 15)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);
}
#include"stdio.h"
char bian[40][90] = {};
enum DIR//上下左右
{
UP,
DOWN,
LEFT,
RIGHT,
};
void kuanjia()//建设框架
{
int i, j;
for (i = 1; i < 39; i++)
for (j = 0; j < 89; j++)
{
bian[i][j] = '@';
}
for (i = 2; i < 38; i++)
for (j = 1; j < 88; j++)
{
bian[i][j] = ' ';
}
}
void shedy()//打印框架和蛇的位置
{
if (ksyx == 1)
{
printf("\t当前为简单模式:可穿墙");
printf("\t\t\t\t\t当前分数:%d", fenshu);
}
else if (ksyx == 2)
{
printf("\t当前为困难模式:不可穿墙");
printf("\t\t\t\t\t当前分数:%d", fenshu);
}
int i, j;
for (i = 0; i < 39; i++)
{
for (j = 0; j < 89; j++)
{
color(6);
printf("%c", bian[i][j]);
}
printf("\n");
}
}
void shecs()//蛇的初始位置
{
bian[3][3] = '=';
}
struct snake
{
int dir;
int heng[1000];
int zong[1000];
}snake;
void snak()//判断按键输入
{
if (_kbhit())
{
switch (_getch())
{
case 'w':
case 'W':
case 72://数字是wasd的键值
if (snake.dir != DOWN)
snake.dir = UP;
break;
case 's':
case 'S':
case 80:
if (snake.dir != UP)
snake.dir = DOWN;
break;
case 'a':
case 'A':
case 75:
if (snake.dir != RIGHT)
snake.dir = LEFT;
break;
case 'd':
case 'D':
case 77:
if (snake.dir != LEFT)
snake.dir = RIGHT;
break;
}
}
}
void sna()//判断方向
{
switch (snake.dir)//方向;
{
case UP:
snake.heng[1]--;
bian[snake.heng[1]][snake.zong[1]] = '=';
break;
case DOWN:
snake.heng[1]++;
bian[snake.heng[1]][snake.zong[1]] = '=';
break;
case LEFT:
snake.zong[1]--;
bian[snake.heng[1]][snake.zong[1]] = '=';
break;
case RIGHT:
snake.zong[1]++;
bian[snake.heng[1]][snake.zong[1]] = '=';
break;
}
}
int snakepd(int zhenshu)//判断蛇头是否和蛇身重叠
{
for (k = 2; k <= fenshu; k++)
{
if (snake.heng[1] == snake.heng[k] && snake.zong[1] == snake.zong[k])
{
zhenshu = 10000;
}
}
return zhenshu;
}
struct snakeswwz//食物结构体
{
int heng1;
int zong1;
}snakeswwz;
void snakeswcs()//食物的初始位置
{
srand(time(NULL));
snakeswwz.heng1 = rand() % 27 + 1;
snakeswwz.zong1 = rand() % 87 + 1;
bian[snakeswwz.heng1][snakeswwz.zong1] = '$';
}
void snakesw()//食物的刷新位置
{
srand(time(NULL));
if (snake.heng[1] == snakeswwz.heng1 && snake.zong[1] == snakeswwz.zong1)
{
snakeswwz.heng1 = rand() % 23 +3;
snakeswwz.zong1 = rand() % 83 +3;
bian[snakeswwz.heng1][snakeswwz.zong1] = '$';
fenshu++;
}
else if (snake.heng[1] != snakeswwz.heng1 || snake.zong[1] != snakeswwz.zong1)
{
bian[snakeswwz.heng1][snakeswwz.zong1] = '$';
}
}
void snakest()//蛇的身体
{
if (fenshu > 1)
{
for (k = 1; k < fenshu; k++)
{
bian[snake.heng[k]][snake.zong[k]] = '+';
}
for (k = fenshu; k > 1; k--)
{
snake.heng[k] = snake.heng[k - 1];
snake.zong[k] = snake.zong[k - 1];
}
}
}
void snakehw()//简单模式可穿墙
{
if (snake.heng[1] == 38)
{
snake.heng[1] = 2;
}
else if (snake.heng[1] == 2)
{
snake.heng[1] = 37;
}
else if (snake.zong[1] == 1)
{
snake.zong[1] = 87;
}
else if (snake.zong[1] == 88)
{
snake.zong[1] = 1;
}
}
int snakepd1(int zhenshu)//困难模式不可穿墙
{
for (k = 2; k <= fenshu; k++)
{
if (snake.heng[1] == snake.heng[k] && snake.zong[1] == snake.zong[k])
{
zhenshu = 10000;
}
}
if (snake.heng[1] == 1 || snake.heng[1] == 39 || snake.zong[1] == 0 || snake.zong[1] == 89)
zhenshu = 10000;
return zhenshu;
}
void welcome()//打印菜单
{
color(6);
printf("\t\t\t\t\t=======欢迎来到贪吃蛇=======\t\t\t\t\n\n");
printf("\t\t\t\t\t=======请选择游戏模式=======\t\t\t\t\n\n");
printf("\t\t\t\t\t======= 简单模式 =======\t\t\t\t\n");
printf("\t\t\t\t\t======= 困难模式 =======\t\t\t\t\n\n");
printf("\t\t\t\t\t简单模式可穿墙,困难模式不能\t\t\t\t\n");
printf("\t\t\t\t\t简单模式输入1,困难模式输入2\t\t\t\t\n");
printf("\t\t\t\t\t");
scanf_s("%d", &ksyx);
while (ksyx != 1 && ksyx != 2)
{
printf("输入错误,请重新输入Y或X:");
scanf_s("%d", &ksyx);
}
system("cls");
}
int main()
{
welcome();
int zhenshu;
char kaishi;
snake.heng[1] = 4;
snake.zong[1] = 4;
kuanjia();
shecs();
snakeswcs();
shedy();
color(2);
snake.dir = RIGHT;
getchar();
printf("开始游戏按: Y\n");
printf("退出游戏按: X\n");
scanf_s("%c", &kaishi);
while (kaishi != 'Y' && kaishi != 'X')
{
printf("输入错误,请重新输入Y或X:");
scanf_s("%c", &kaishi);
}
bian[3][3] = ' ';
system("cls");
if (ksyx == 1)简单模式,可穿墙
{
if (kaishi == 'Y')
{
for (zhenshu = 0; zhenshu < 10000; zhenshu++)
{
snakest();
snak();
sna();
snakesw();
shedy();
snakehw();
kuanjia();
system("cls");
setvbuf(stdout, NULL, _IOFBF, 4096); // 1:修改刷新模式为手动刷新
//然后画你要画的东西
fflush(stdout); // 2:清空并输出缓冲区的内容
setvbuf(stdout, NULL, _IOLBF, 4096); // 3:刷新模式改回去
if (snake.dir == RIGHT || snake.dir == LEFT)
Sleep(5);
else if (snake.dir == UP || snake.dir == DOWN)
Sleep(40);
zhenshu = snakepd(zhenshu);
}
color(4);
printf("你死了!!");
}
}
if (ksyx == 2)///困难模式,不可穿墙
{
if (kaishi == 'Y')
{
for (zhenshu = 0; zhenshu < 10000; zhenshu++)
{
snakest();
snak();
sna();
snakesw();
shedy();
kuanjia();
system("cls");
setvbuf(stdout, NULL, _IOFBF, 4096); // 1:修改刷新模式为手动刷新
//然后画你要画的东西
fflush(stdout); // 2:清空并输出缓冲区的内容
setvbuf(stdout, NULL, _IOLBF, 4096); // 3:刷新模式改回去
if (snake.dir == RIGHT || snake.dir == LEFT)
Sleep(5);
else if (snake.dir == UP || snake.dir == DOWN)
Sleep(40);
zhenshu = snakepd1(zhenshu);
}
color(4);
printf("你死了!!");
}
}
else if (kaishi == 'X')
{
printf("你已经退出游戏");
}
return 0;
}
若有不好的地方,欢迎大家评论,我会及时参考和改正。:>