贪吃蛇游戏
前段时间自己试着做的小游戏,很简陋。制作过程中,既要考虑到蛇的移动,食物的生成坐标,还要考虑蛇在移动过程中会发生的各种情况,以及结束界面的的生成。
背景音乐凭自己喜好添加,不建议网易云下载的音乐,有时候会播放不出来。可以在别的音乐平台下载,音质不要太好,也不要太差。
最重要的一点,就是要结合图形库Easxy。
图形库下载链接:https://easyx.cn/
话不多说,请看如下代码:
/* 文件名称:main.cp[p 程序名称: 贪吃蛇 作者:muyiyueniao 时间:2019,6.8 */ #include<stdio.h> #include<graphics.h> //图形库的头文件 #include<mmsystem.h> //多媒体设备接口 音乐视频 麦克风 #pragma comment(lib,"winmm.lib") #include<time.h> #include<windows.h> #include<conio.h> #define SNAKELENGTH 100 //蛇的最大长度 #define SNAKESIZE 10 //定义宏 ,蛇的大小 void InitSnake(); void DrawSnake(); void MoveSnake(); void ChangeSnake(); void DrawFood(); void CoorFood(); int EatFood(); void BeakSnake(); void OverSnake(); typedef enum ch { up = 72, down=80, left=75, right=77 }CH; //定义坐标的结构体 struct Coor { int x; int y; }COOR; //定义蛇的结构体 struct Snake { Coor szb[SNAKELENGTH];//蛇每一节的坐标 int n; //蛇的当前长度 CH ch; //蛇的方向 }SNAKE; //定义食物的结构体 struct food { Coor Fzb; int flag; //标志 flag=0 代表食物没有被吃, flag=1表示食物被吃 }FOOD; //主函数 int main() { int flag=0; InitSnake(); while (1) { while (!_kbhit()) { if (flag == 0) { CoorFood(); } DrawFood(); BeakSnake(); MoveSnake(); flag = EatFood(); Sleep(100); //延时100毫秒 } ChangeSnake(); } return 0; } //初始化函数 void InitSnake() { initgraph(640, 480); //初始化窗口 //circle(320,240,160); //圆 //rectangle(160,80,480,400); //矩形 mciSendString(L"open Horizon.mp3 alias bk",0,0,0); mciSendString(L"play bk repeat",0,0,0); setbkcolor(RGB(220, 120, 150)); //设置背景颜色 cleardevice(); //刷新 //画图 rectangle(0, 0, 10, 10); //初始化一条蛇 //蛇的坐标 SNAKE.szb[0].x = 0; //第一节蛇的坐标 SNAKE.szb[0].y = 0; SNAKE.n = 1; //蛇的初始结束 SNAKE.ch = right; //蛇初始向右 FOOD.flag = 0; } //在界面上画蛇 void DrawSnake() //n 10 n-1 n-2 n-4.....1直到第一节 { for (int i = SNAKE.n-1; i >= 0; i--) { rectangle(SNAKE.szb[i].x, SNAKE.szb[i].y, SNAKE.szb[i].x + SNAKESIZE, SNAKE.szb[i].y + SNAKESIZE); } setcolor(RGB(220, 120, 150)); //走过的路径与背景色相同,故看不见 rectangle(SNAKE.szb[SNAKE.n].x, SNAKE.szb[SNAKE.n].y, SNAKE.szb[SNAKE.n].x + SNAKESIZE, SNAKE.szb[SNAKE.n].y + SNAKESIZE); setcolor(RGB(255, 255, 255)); //蛇的第一节 rectangle(SNAKE.szb[SNAKE.n-1].x, SNAKE.szb[SNAKE.n-1].y, SNAKE.szb[SNAKE.n-1 ].x + SNAKESIZE, SNAKE.szb[SNAKE.n-1 ].y + SNAKESIZE); } //让蛇移动起来 void MoveSnake() { for (int i = SNAKE.n; i > 0; i--) //蛇移动后它的节数位置互换 { SNAKE.szb[i].x = SNAKE.szb[i - 1].x; SNAKE.szb[i].y = SNAKE.szb[i - 1].y; } switch (SNAKE.ch) //方向 { case up: //不是按键 是方向 在蛇往上下左右的过程中一个处理的数据 SNAKE.szb[0].y -= SNAKESIZE; break; case down: SNAKE.szb[0].y += SNAKESIZE; break; case left: SNAKE.szb[0].x -= SNAKESIZE; break; case right: SNAKE.szb[0].x += SNAKESIZE; break; } DrawSnake(); } //接受键盘信息 void ChangeSnake() //控制蛇的方向 { int move; //getchar() getch() getchar()需要按下回车键,getch()不需要按回车键,直接接收到键盘输入的信息 move = _getch(); switch (move) //move是整型变量,用来接收键盘信息。 { case up: //向上键 if (SNAKE.ch != down) { SNAKE.ch = up; } break; case down: //向下键 if (SNAKE.ch !=up ) { SNAKE.ch = down; } break; case left: //向左键 if (SNAKE.ch != right ) { SNAKE.ch = left; } break; case right: //向右键 if (SNAKE.ch != left) { SNAKE.ch = right; } break; } } //放食物 void DrawFood() { setcolor(WHITE); roundrect(FOOD.Fzb.x, FOOD.Fzb.y, FOOD.Fzb.x + SNAKESIZE, FOOD.Fzb.y + SNAKESIZE,10,10); } //计算食物的坐标 void CoorFood() { srand(unsigned(time(NULL))); FOOD.Fzb.x = rand() % (640 / SNAKESIZE) * SNAKESIZE; FOOD.Fzb.y = rand() % (480 / SNAKESIZE) * SNAKESIZE; FOOD.flag = 1;//食物没有被吃掉 } //吃食物 int EatFood() { if (SNAKE.szb[0].x == FOOD.Fzb.x && SNAKE.szb[0].y == FOOD.Fzb.y) { SNAKE.n++; setcolor(RGB(220,120,150)); roundrect(FOOD.Fzb.x, FOOD.Fzb.y, FOOD.Fzb.x + SNAKESIZE, FOOD.Fzb.y + SNAKESIZE, 10, 10); setcolor(WHITE); FOOD.flag = 0; return FOOD.flag; } return 1; } //判断是否撞到墙 自己 void BeakSnake() { if (SNAKE.szb[0].x < 0 || SNAKE.szb[0].x>640 || SNAKE.szb[0].y < 0 || SNAKE.szb[0].y>480) //撞到墙 { mciSendString(L"close bk", 0, 0, 0); OverSnake(); } for (int i = SNAKE.n-2; i >0; i--) { if (SNAKE.szb[0].x == SNAKE.szb[i].x && SNAKE.szb[0].y == SNAKE.szb[i].y) { mciSendString(L"close bk", 0, 0, 0); OverSnake(); } } } void OverSnake() { cleardevice(); setcolor(BLACK); settextstyle(50,0,L"楷体"); outtextxy(100,70, L"上士闻道,勤而行之"); outtextxy(100,120,L"中士闻道,若存若亡"); outtextxy(100,170,L"下士闻道,吾大笑之"); Sleep(1000); closegraph(); }