关于贪吃蛇计分板
1、先看效果图
1.1
1.2
2、代码展示
#include"stdio.h"
#include"graphics.h"
#include"stdlib.h"
#include"conio.h"
#include"time.h"
int end;//表示结束条件
int snakebody = 1;//蛇的身体
int howlong = 1;//表示长度
char num[5] = { 0 };
int g;
enum DIR
{
UP,
DOWN,
LEFT,
RIGHT,
};
struct snake
{
int x[2];//横坐标
int y[2];//纵坐标
int foodx;
int foody;
int dir;
}snake[100];
void snakecswz()//蛇的初始位置
{
snake[1].x[0] = 40;
snake[1].x[1] = 60;
snake[1].y[0] = 40;
snake[1].y[1] = 60;
}
void snakeyd()//判断按键输入
{
if (_kbhit())
{
switch (_getch())
{
case 'w':
case 'W':
case 72://数字是wasd的键值
if (snake[1].dir != DOWN)
snake[1].dir = UP;
break;
case 's':
case 'S':
case 80:
if (snake[1].dir != UP)
snake[1].dir = DOWN;
break;
case 'a':
case 'A':
case 75:
if (snake[1].dir != RIGHT)
snake[1].dir = LEFT;
break;
case 'd':
case 'D':
case 77:
if (snake[1].dir != LEFT)
snake[1].dir = RIGHT;
break;
}
}
}
int snakemode(int mode)//选择游戏模式
{
ExMessage msg;
while (true)//鼠标左键在特定位置点击
{
if (peekmessage(&msg, EM_MOUSE))
{
switch (msg.message)
{
case WM_LBUTTONDOWN:
if (msg.x >= 100 && msg.x <= 220 && msg.y >= 200 && msg.y <= 230)
{
mode = 1;
return mode;
}
else if (msg.x >= 400 && msg.x <= 520 && msg.y >= 200 && msg.y <= 230)
{
mode = 2;
return mode;
}
break;
}
}
}
}
void snakedirection()//判断方向
{
switch (snake[1].dir)//方向;
{
case UP:
snake[1].y[0] = snake[1].y[0] - 20;
snake[1].y[1] = snake[1].y[1] - 20;
break;
case DOWN:
snake[1].y[0] = snake[1].y[0] + 20;
snake[1].y[1] = snake[1].y[1] + 20;
break;
case LEFT:
snake[1].x[0] = snake[1].x[0] - 20;
snake[1].x[1] = snake[1].x[1] - 20;
break;
case RIGHT:
snake[1].x[0] = snake[1].x[0] + 20;
snake[1].x[1] = snake[1].x[1] + 20;
break;
}
}
void snakefood()//食物随机刷新
{
srand(time(NULL));
snake[1].foodx = (rand() % 28) * 20 + 40;
snake[1].foody = (rand() % 27) * 20 ;
}
int snakedie1(int end)//碰到自身死亡
{
int m=4;
for (m = 4; m <= howlong; m++)
{
if (snake[1].x[0] == snake[m].x[0] && snake[1].y[0] == snake[m].y[0])
{
end = 10000;
}
}
return end;
}
int snakedie2(int end)//困难模式下撞墙死亡
{
if (snake[1].x[1] == 0)
{
end = 10000;
return end;
}
else if (snake[1].x[0] == 640)
{
end = 10000;
return end;
}
else if (snake[1].y[1] == 0)
{
end = 10000;
return end;
}
else if (snake[1].y[0] == 640)
{
end = 10000;
return end;
}
return end;
}
void snakeexchange()//简单模式下可实现穿墙
{
if (snake[1].x[1] == 0)
{
snake[1].x[0] = 620;
snake[1].x[1] = 640;
}
else if (snake[1].x[0] == 640)
{
snake[1].x[0] = 0;
snake[1].x[1] = 20;
}
else if (snake[1].y[1] == 0)
{
snake[1].y[0] = 620;
snake[1].y[1] = 640;
}
else if (snake[1].y[0] == 640)
{
snake[1].y[0] = 0;
snake[1].y[1] = 20;
}
}
int main()
{
snakefood();
int mode=0;
int m=0;
int k=0;
snake[1].dir = RIGHT;
snakecswz();
initgraph(640, 640,SHOWCONSOLE);
setbkcolor(YELLOW);
cleardevice();//清屏
setfillcolor(BLUE);
settextcolor(RED);
setbkmode(TRANSPARENT);
solidrectangle(snake[1].x[0], snake[1].y[0], snake[1].x[1], snake[1].y[1]);
setlinecolor(GREEN);
setlinestyle(PS_SOLID, 5);
rectangle(100, 200, 220, 230);
rectangle(400, 200, 520, 230);
settextstyle(30, 0, TEXT("楷体"));
outtextxy(250, 50, TEXT("开始游戏"));
outtextxy(200, 100, L"请选择游戏模式");
outtextxy(400, 200, L"困难模式");
outtextxy(100, 200, L"简单模式");
settextstyle(200, 0, TEXT("楷体"));
outtextxy(230, 300, L"🐍");
solidrectangle(snake[1].foodx, snake[1].foody, snake[1].foodx + 20, snake[1].foody + 20);
mode=snakemode(mode);
if (mode == 1)//简单模式
{
cleardevice();//清屏
settextstyle(60, 0, TEXT("楷体"));
outtextxy(200, 100, L"游戏声明");
settextstyle(30, 0, TEXT("楷体"));
outtextxy(50, 200, L"当前为简单模式,可以穿墙,祝游玩开心");
settextstyle(40, 0, TEXT("楷体"));
outtextxy(500, 500, L"确认");
setlinestyle(PS_SOLID, 5);
rectangle(500,500,580,540);
ExMessage msg;
while (true)
{
if (peekmessage(&msg, EM_MOUSE))
{
switch (msg.message)
{
case WM_LBUTTONDOWN:
if (msg.x >= 500 && msg.x <= 580 && msg.y >= 500 && msg.y <= 540)
{
k = 1;
}
break;
}
}
if(k==1)
break;
}
for (end = 0; end <= 10000; end++)
{
printf("分数为:%d", howlong);
cleardevice();//清屏
settextstyle(30, 0, TEXT("楷体"));
outtextxy(205, 0, L"当前为简单模式");
settextstyle(20, 0, TEXT("楷体"));
outtextxy(460, 0, L"当前分数:");
sprintf(num, "%d", howlong);
outtextxy(580, 0, *num);
snakeyd();
snakedirection();
snakeexchange();
solidrectangle(snake[1].x[0], snake[1].y[0], snake[1].x[1], snake[1].y[1]);
for (snakebody = 2; snakebody <= howlong; snakebody++)
{
setlinestyle(PS_SOLID, 4);
rectangle(snake[snakebody].x[0], snake[snakebody].y[0], snake[snakebody].x[1], snake[snakebody].y[1]);
}
solidrectangle(snake[1].foodx, snake[1].foody, snake[1].foodx + 20, snake[1].foody + 20);
if (snake[1].x[0] == snake[1].foodx && snake[1].y[0] == snake[1].foody)
{
snakefood();
solidrectangle(snake[1].foodx, snake[1].foody, snake[1].foodx + 20, snake[1].foody + 20);
howlong++;
}
for (m = howlong; m > 1; m--)//蛇的身体,前后位置交换实现长度增加
{
snake[m].x[0] = snake[m - 1].x[0];
snake[m].y[0] = snake[m - 1].y[0];
snake[m].x[1] = snake[m].x[0] + 20;
snake[m].y[1] = snake[m].y[0] + 20;
}
end = snakedie1(end);
Sleep(100);
system("cls");
}
settextstyle(40, 0, TEXT("楷体"));
outtextxy(200, 200, L"你已经死了");
}
else if (mode == 2)//困难模式,无法穿墙
{
cleardevice();//清屏
settextstyle(60, 0, TEXT("楷体"));
outtextxy(200, 100, L"游戏声明");
settextstyle(30, 0, TEXT("楷体"));
outtextxy(50, 200, L"当前为困难模式,不可穿墙,祝游玩开心");
settextstyle(40, 0, TEXT("楷体"));
outtextxy(500, 500, L"确认");
setlinestyle(PS_SOLID, 5);
rectangle(500, 500, 580, 540);
ExMessage msg;
while (true)//若鼠标左键点击特点地方就跳出循环
{
if (peekmessage(&msg, EM_MOUSE))
{
switch (msg.message)
{
case WM_LBUTTONDOWN:
if (msg.x >= 500 && msg.x <= 580 && msg.y >= 500 && msg.y <= 540)
{
k = 1;
}
break;
}
}
if (k == 1)
break;
}
for (end = 0; end <= 1000; end++)
{
printf("分数为:%d", howlong);
cleardevice();//清屏
settextstyle(30, 0, TEXT("楷体"));
outtextxy(205, 0, L"当前为困难模式");
settextstyle(20, 0, TEXT("楷体"));
outtextxy(460, 0, L"当前分数:");
sprintf(num, "%d", howlong);
outtextxy(580,0,*num);
snakeyd();
snakedirection();
end = snakedie2(end);
solidrectangle(snake[1].x[0], snake[1].y[0], snake[1].x[1], snake[1].y[1]);
for (snakebody = 2; snakebody <= howlong; snakebody++)
{
setlinestyle(PS_SOLID, 4);//线条宽度
rectangle(snake[snakebody].x[0], snake[snakebody].y[0], snake[snakebody].x[1], snake[snakebody].y[1]);
}
solidrectangle(snake[1].foodx, snake[1].foody, snake[1].foodx + 20, snake[1].foody + 20);//食物
if (snake[1].x[0] == snake[1].foodx && snake[1].y[0] == snake[1].foody)
{
snakefood();
solidrectangle(snake[1].foodx, snake[1].foody, snake[1].foodx + 20, snake[1].foody + 20);
howlong++;
}
for (m = howlong; m > 1; m--)//蛇的身体,前后位置交换实现长度增加
{
snake[m].x[0] = snake[m - 1].x[0];
snake[m].y[0] = snake[m - 1].y[0];
snake[m].x[1] = snake[m].x[0] + 20;
snake[m].y[1] = snake[m].y[0] + 20;
}
end = snakedie1(end);
Sleep(100);
system("cls");
}
settextstyle(40, 0, TEXT("楷体"));
outtextxy(200, 200, L"你已经死了");
}
printf("最后分数为:%d", howlong);
g=getchar();
return 0;
}
希望大家能够多多支持,有不好的地方我会积极采纳!!!