c语言加EasyX写的简易贪吃蛇小游戏
按下空格后开始游戏, WSAD键控制蛇的上下左右,吃到食物身体加长,蛇头碰到蛇身提示游戏失败。
蛇身体的实现用的是结构体数组没有用链表,应该用双向链表会更合适一点,但是我不会-o-
#include<easyx.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
struct SnakeBody {
int x;
int y;
};
//游戏状态
int state = 0;//0未开始,1开始游戏,2游戏暂停,3游戏继续,4,游戏失败,5游戏通关
int num = 5;//得分为num时通关;
int main()
{
initgraph(650, 500);//EX_SHOWCONSOLE显示控制台
int fen = 0;//记录得分
int x = 50, y = 0;//蛇头初始位置
int bodyx=0, bodyy = 0;//记录新身体的位置
//[0,19]*25
int foodx = (rand() % 20) * 25;
int foody = (rand() % 20) * 25;
//图片
IMAGE head, food, down, up, right, left,bodyimg;
loadimage(&food, L"./img\\food.png", 25, 25);
loadimage(&up, L"./img\\up.png", 25, 25);
loadimage(&down, L"./img\\down.png", 25, 25);
loadimage(&left, L"./img\\left.png", 25, 25);
loadimage(&right, L"./img\\right.png", 25, 25);
loadimage(&bodyimg, L"./img\\body.png", 25, 25);
head = right;//初始向右
//初始化蛇身结点
SnakeBody* body[100];
for (int i = 0; i < 100; i++) {
body[i] = new SnakeBody{ 0,0 };//给所有结点赋初值
}
body[0]->x = x - 25;
body[0]->y = y;
body[1]->x = x - 50;
body[1]->y = y;
char key;//状态
while (1)
{
//双缓冲绘图,需要放在绘图代码之前和之后
BeginBatchDraw();
//设置背景颜色
setbkcolor(RGB(103, 103, 103));//背景颜色
cleardevice();//清屏
for (int i = 0; i <= 20; i++) {
line(25 * i, 0, 25 * i, 500);
line(0, 25 * i, 500, 25 * i);
}
settextcolor(WHITE);
settextstyle(26, 0, L"楷体");
setbkmode(TRANSPARENT);//文字背景透明
outtextxy(510, 50, L"得分:");//char
if (fen > 9) {
outtextxy(580, 50, (fen / 10) + 48);//char
}
outtextxy(595, 50, (fen % 10) + 48);//char
putimage(foodx, foody, &food);//绘制食物
putimage(x, y, &head);//绘制蛇头
//绘制蛇身
for (int i = 0; i < fen+2; i++) {
putimage(body[i]->x, body[i]->y,&bodyimg);
}
EndBatchDraw();//结束双缓冲
if (state == 0) {
settextcolor(YELLOW);
settextstyle(35, 0, L"楷体");
outtextxy(100, 200, L"按下空格键,开始游戏");//char
while (state != 1) {
key = _getch();
if (key == 32) {
state = 1;
}
}
}
if (fen == num) {
settextcolor(YELLOW);
settextstyle(50, 0, L"楷体");
outtextxy(100, 200, L"游戏通关");//char
_getch();
}
for (int i = 0; i <= fen + 1; i++) {
if (x == body[i]->x && y == body[i]->y) {
//碰到自己的身体了,游戏结束
settextcolor(YELLOW);
settextstyle(50, 0, L"楷体");
outtextxy(100, 200, L"游戏失败");//char
_getch();
}
}
if (_kbhit()) //判断是否有鼠标按下
{
char c = _getch(); //阻塞
switch (c)
{
case 'W':
case 'w':
head = up;
y -= 25;
//更新各蛇身体的位置
for (int i = fen + 1; i >= 1; i--) {
body[i]->x = body[i - 1]->x;
body[i]->y = body[i - 1]->y;
}
body[0]->x = x;
body[0]->y = y + 25;
bodyx = body[fen + 1]->x;
bodyy = body[fen + 1]->y + 25;
if (y < 0) {
y = 475;
}
break;
case 'S':
case 's':
head = down;
y += 25;
//更新各蛇身体的位置
for (int i = fen + 1; i >= 1; i--) {
body[i]->x = body[i - 1]->x;
body[i]->y = body[i - 1]->y;
}
body[0]->x = x;
body[0]->y = y - 25;
bodyx = body[fen + 1]->x;
bodyy = body[fen + 1]->y - 25;
if (y >= 500) {
y = 0;
}
break;
case 'A':
case 'a':
head = left;
x -= 25;
//更新各蛇身体的位置
for (int i = fen + 1; i >= 1; i--) {
body[i]->x = body[i - 1]->x;
body[i]->y = body[i - 1]->y;
}
body[0]->x = x + 25;
body[0]->y = y;
bodyx = body[fen + 1]->x+25;
bodyy = body[fen + 1]->y;
if (x < 0) {
x = 475;
}
break;
case 'D':
case 'd':
head = right;
x += 25;
//更新各蛇身体的位置
for (int i = fen + 1; i >= 1; i--) {
body[i]->x = body[i - 1]->x;
body[i]->y = body[i - 1]->y;
}
body[0]->x = x - 25;
body[0]->y = y;
bodyx = body[fen + 1]->x-25;
bodyy = body[fen + 1]->y ;
if (x >= 500) {
x = 0;
}
break;
}
if (x == foodx && y == foody)
{
printf("蛇吃到食物");
foodx = (rand() % 20) * 25;
foody = (rand() % 20) * 25;
fen++;
//蛇吃到食物,就加一个身体
body[fen+1] = new SnakeBody{ bodyx,bodyy};//fen=11时,加上初始的0、1、此为2
}
}
}
closegraph();//关闭绘图窗体
return 0;
}
如果对你有帮助的话,那就点个赞吧

浙公网安备 33010602011771号