用c语言做贪吃蛇的窗口,用C语言做一个贪吃蛇小游戏

本文介绍了使用C++实现的一款经典游戏——蛇,涉及了初始化、蛇的移动、方向控制、食物生成与碰撞检测,以及游戏结束条件。通过代码展示了如何通过键盘输入控制蛇的移动,以及如何通过随机生成和碰撞检查实现蛇吃食物的成长机制。
摘要由CSDN通过智能技术生成

#include

#include //图形界面头文件

#include

#include

#include

#pragma comment(lib,"winmm.lib")

#define N 1000 //蛇的最大节数

#define SIZE 20//蛇的大小

struct Coor //坐标

{

int x;

int y;

};

enum Ch{ up = 72, down = 80, left = 75, right = 77 }; //上下左右四个方向

//一条蛇 N节 数组

struct Snake

{

int n; //当前蛇的节数

Coor scr[N];//100节蛇的坐标数组

Ch ch;//蛇的方向

}snake;

struct Food

{

Coor fsr; //食物坐标

int flag; //标志,食物有没有被吃掉,1代表没有

}food;

void GameInit(); //初始化游戏

void SnakePaint(IMAGE touyou, IMAGE touzuo, IMAGE touup, IMAGE toudown, IMAGE she);

void SnakeMove(); //蛇移动

void ChangeSnakeCh(); //改变蛇的方向

void FoodCoor(); //食物坐标

void FoodPaint(IMAGE shiwu);//绘制食物

void EatFood(); //吃食物

void GameBreak(); //判断游戏退出

void OverGame(); //游戏结束标志

IMAGE touup, she, toudown, touzuo, touyou, shiwu;

//主函数

int main()

{

GameInit(); //初始化的函数.

mciSendString("open res/甩葱歌.mp3 alias scg", 0, 0, 0);

mciSendString("play scg repeat", 0, 0, 0);

while (1)

{

while (!kbhit()) //kbhit(检测键盘是否有消息)

{

if (food.flag == 0)//没有食物

FoodCoor(); //生成一个食物坐标

cleardevice(); //刷新

FoodPaint(shiwu); //绘制食物

SnakeMove(); //蛇移动

SnakePaint(touyou, touzuo, touup, toudown, she);

Sleep(200); //蛇的移动速度

EatFood(); //吃食物

GameBreak(); //判断游戏是否结束

}

ChangeSnakeCh();

}

while (1);

return 0;

}

//游戏初始化

void GameInit()

{

//打开一个窗口

initgraph(640, 480);

setbkcolor(WHITE);

cleardevice(); //使用设置好的背景颜色刷新屏幕

loadimage(&touyou, "./res/蛇头右.jpg", SIZE, SIZE);

loadimage(&touup, "./res/蛇头上.jpg", SIZE, SIZE);

loadimage(&toudown, "./res/蛇头下.jpg", SIZE, SIZE);

loadimage(&touzuo, "./res/蛇头左.jpg", SIZE, SIZE);

loadimage(&she, "./res/蛇身.jpg", SIZE, SIZE);

loadimage(&shiwu, "./res/草莓.jpg", SIZE, SIZE);

//蛇初始化

snake.scr[0].x = 0;//蛇头的x,y初始化为0

snake.scr[0].y = 0;

snake.n = 1;//当前有一节蛇

snake.ch = right;//方向往下

food.flag = 0; //初始化没有食物

}

//绘制蛇

void SnakePaint(IMAGE touyou, IMAGE touzuo, IMAGE touup, IMAGE toudown, IMAGE she)

{

switch (snake.ch)

{

case up:

putimage(snake.scr[0].x, snake.scr[0].y, &touup);

break;

case down:

putimage(snake.scr[0].x, snake.scr[0].y, &toudown);

break;

case left:

putimage(snake.scr[0].x, snake.scr[0].y, &touzuo);

break;

case right:

putimage(snake.scr[0].x, snake.scr[0].y, &touyou);

break;

default:

break;

}

//n节蛇 最大的下标是多少? n-1 100

for (int i = snake.n - 1; i > 0; i--)

{

putimage(snake.scr[i].x, snake.scr[i].y, &she);

}

}

//蛇移动

void SnakeMove()

{

for (int i = snake.n - 1; i > 0; i--)

{

snake.scr[i].x = snake.scr[i - 1].x;

snake.scr[i].y = snake.scr[i - 1].y;

}

switch (snake.ch)

{

case up:

snake.scr[0].y -= SIZE;

break;

case down:

snake.scr[0].y += SIZE;

break;

case left:

snake.scr[0].x -= SIZE;

break;

case right:

snake.scr[0].x += SIZE;

break;

}

}

//人来控制 检测到按键getchar getch

//通过不同的按键(分支结构 switch if)

// 改变蛇的方向

void ChangeSnakeCh()

{

switch (getch())

{

case 72: //up

if (snake.ch != down)

snake.ch = up;

break;

case 80: //down

if (snake.ch != up)

snake.ch = down;

break;

case 75:

if (snake.ch != right)

snake.ch = left;

break;

case 77:

if (snake.ch != left)

snake.ch = right;

break;

}

}

void FoodCoor() //食物坐标

{

srand((unsigned int)time(NULL));

food.fsr.x = (rand() % 31 + 1) * SIZE; //0 10 20 30 40 50 ... 630 0-63 *10

food.fsr.y = (rand() % 23 + 1) * SIZE; //0 10 20 30... 470 0-47 *10

food.flag = 1; //食物没有被吃

}

void FoodPaint(IMAGE shiwu)//绘制食物

{

putimage(food.fsr.x, food.fsr.y, &shiwu);

}

void EatFood()//吃食物

{

if (snake.scr[0].x == food.fsr.x&&snake.scr[0].y == food.fsr.y)

{

snake.n++;

food.flag = 0;

}

}

//判断游戏退出

void GameBreak()

{

//撞墙

if (snake.scr[0].y < -1 || snake.scr[0].y>471 || snake.scr[0].x < -1 || snake.scr[0].x>631)

{

//退出

OverGame();

}

for (int i = snake.n - 1; i > 0; i--)

{

if (snake.scr[0].x == snake.scr[i].x&&snake.scr[0].y == snake.scr[i].y)

{

//退出

OverGame();

}

}

}

void OverGame()

{

cleardevice();

settextcolor(GREEN);

settextstyle(50, 0, "黑体");

outtextxy(200, 200, "game over");

Sleep(2000);

exit(0);

}

ba04f49062fa30d394a58fe1ab997979.gif

人打赏

1人 点赞

主帖获得的天涯分:0

举报 |

楼主

|

楼主发言:2次 发图:2张 | 添加到话题 |

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值