C++小游戏之贪吃蛇

    xiaoxiao2021-03-25  91

    先奉上完整的项目源码:http://pan.baidu.com/s/1slxvMWl

    用的是easy x 图形库,没有的话可以去官网下载最新 版本,用vs2015选择win32控制台应用程序->空项目就可以了。

    开始界面有游戏界面都是 640x480大小。效果如下:

    鼠标移动到英文上,字母的颜色会发生改变,单击就可以进入,同时有背景音乐播放。

    代码:

    void StartWindow() { mciSendString(L"open ./风动草.mp3 alias bgm",0,0,0); mciSendString(L"play bgm repeat", 0, 0, 0); loadimage(&backImg, L"./image/1.jpg", 640, 480); //将图片加载到backImg loadimage(&gbkImg, L"./image/bk.jpg", 640, 480); loadimage(&foodImg,L"./image/apple.jpg",10,10); loadimage(&about, L"./image/about.jpg", 640, 480); loadimage(&lose, L"./image/lose.jpg", 640, 480); loadimage(&food2, L"./image/food2.jpg", 10, 10); putimage(0, 0, &backImg); MOUSEMSG msg = { 0 }; setbkmode(TRANSPARENT); //设置背景风格 透明 settextstyle(40, 18, L"Ravie");//设置字体风格 while (1) { msg = GetMouseMsg(); if (msg.x >= 450 && msg.x <= 550 && msg.y >= 205 && msg.y <= 245) { settextcolor(RGB(255, 0, 0));//设置字体颜色 outtextxy(450, 205, L"Start"); } else if (msg.x >= 450 && msg.x <= 550 && msg.y >= 305 && msg.y <= 345) { settextcolor(RGB(255, 0, 0));//设置字体颜色 outtextxy(450, 305, L"About"); } else if (msg.x >= 450 && msg.x <= 550 && msg.y >= 405 && msg.y <= 445) { settextcolor(RGB(255, 0, 0));//设置字体颜色 outtextxy(450, 405, L"End"); } else { settextcolor(RGB(137, 57, 196));//设置字体颜色 outtextxy(450, 205, L"Start"); outtextxy(450, 305, L"About"); outtextxy(450, 405, L"End"); } switch (msg.uMsg) { case WM_LBUTTONDOWN: if (msg.x >= 450 && msg.x <= 550 && msg.y >= 205 && msg.y <= 245) { return; } else if (msg.x >= 450 && msg.x <= 550 && msg.y >= 405 && msg.y <= 445) { exit(0); } else if (msg.x >= 450 && msg.x <= 550 && msg.y >= 305 && msg.y <= 345) { AboutWindow(); StartWindow(); body(); } break; } } }About是游戏说明,里面有关于游戏的介绍和操作说明,点击back就可以返回到开始界面。效果如下:

    代码:

    void AboutWindow() { cleardevice(); putimage(0, 0, &about); while (1) { MOUSEMSG msg = { 0 }; setbkmode(TRANSPARENT); //设置背景风格 透明 settextstyle(40, 18, L"Ravie");//设置字体风格 msg = GetMouseMsg(); if (msg.x >= 450 && msg.x <= 550 && msg.y >= 425 && msg.y <= 465) { settextcolor(RGB(255, 0, 0));//设置字体颜色 outtextxy(450, 425, L"Back"); } else { settextcolor(RGB(137, 57, 196));//设置字体颜色 outtextxy(450, 425, L"Back"); } switch (msg.uMsg) { case WM_LBUTTONDOWN: if (msg.x >= 450 && msg.x <= 550 && msg.y >= 425 && msg.y <= 465) { return; } break; } } }单击start进入游戏,效果如下:

    代码:

    typedef struct coor //蛇的坐标 { int x; int y; }Coor; typedef struct snake { Coor sCoor[MAXSIZE]; //蛇每一节的坐标 int n; //蛇的当前节数 int ch; //蛇的方向 }SNAKE; struct Food { Coor foodc; //坐标 int flag; //状态 有没有被吃 int type; //两种类型 一个苹果,一个虫子 }food; SNAKE snake; IMAGE backImg; IMAGE gbkImg; IMAGE foodImg; IMAGE about; IMAGE lose; IMAGE food2; void GameInit() { srand((unsigned int)time(NULL)); //随机数种子 putimage(0, 0, &gbkImg); setlinecolor(RED); setfillcolor(YELLOW); fillrectangle(0, 0, 10, 10); //初始化数据 snake.sCoor[0].x = 0; snake.sCoor[0].y = 0; snake.n = 1; snake.ch = 77; //上72 下 80 左 75 右77 food.flag = 0; food.type = 0; } void move() { for (int i = snake.n - 1; i > 0; i--) { snake.sCoor[i].x = snake.sCoor[i - 1].x; snake.sCoor[i].y = snake.sCoor[i - 1].y; } switch(snake.ch) { case 72: snake.sCoor[0].y -= 10; break; case 80: snake.sCoor[0].y += 10; break; case 75: snake.sCoor[0].x -= 10; break; case 77: snake.sCoor[0].x += 10; break; } setfillcolor(YELLOW); for (int i = snake.n - 1; i >= 0; i--) { fillrectangle(snake.sCoor[i].x, snake.sCoor[i].y, snake.sCoor[i].x + 10, snake.sCoor[i].y + 10); } } void changeDirection() { int movech;//方向 有键盘输入 movech = getch(); switch (movech) { case 72: if(snake.ch!=80) snake.ch = 72; break; case 80: if (snake.ch != 72) snake.ch = 80; break; case 75: if (snake.ch != 77) snake.ch = 75; break; case 77: if (snake.ch != 75) snake.ch = 77; break; } } void foodCoor() { //食物的坐标 food.foodc.x = rand() % 64 * 10; food.foodc.y = rand() % 48 * 10; food.flag = 1; food.type = rand() % 10 < 1 ? 1 : 0; } void drawfood() { if (food.type==1) { putimage(food.foodc.x, food.foodc.y, &food2); } else { putimage(food.foodc.x, food.foodc.y, &foodImg); } } void eatfood() { if (snake.sCoor[0].x == food.foodc.x && snake.sCoor[0].y == food.foodc.y) { if (food.type == 1) { snake.n += 2; } else { snake.n++; } food.flag = 0; } } void killsnake() { //撞墙 if (snake.sCoor[0].x < 0 || snake.sCoor[0].x>640 || snake.sCoor[0].y < 0 || snake.sCoor[0].y>480) { gameLose(); } else{ //撞自己 for (int i = snake.n - 1; i > 0; i--) { if (snake.sCoor[i].x == snake.sCoor[0].x && snake.sCoor[i].y == snake.sCoor[0].y) { gameLose(); } } } } void body() { GameInit(); while (1) { while (!kbhit()) { putimage(0, 0, &gbkImg); move(); if (food.flag == 0) { foodCoor(); } drawfood(); eatfood(); killsnake(); Sleep(100); cleardevice(); } changeDirection(); } } void main() { initgraph(WINDOW_WIDTH,WINDOW_HEIGHT); //初始化窗口 StartWindow(); body(); getchar(); closegraph(); }失败界面如下:

    代码:

    void gameLose() { cleardevice(); putimage(0, 0, &lose); while (1) { MOUSEMSG msg = { 0 }; setbkmode(TRANSPARENT); //设置背景风格 透明 settextstyle(40, 18, L"Ravie");//设置字体风格 msg = GetMouseMsg(); if (msg.x >= 420 && msg.x <= 520 && msg.y >= 305 && msg.y <= 345) { settextcolor(RGB(255, 0, 0));//设置字体颜色 outtextxy(420, 305, L"Back"); } else if (msg.x >= 200 && msg.x <= 300 && msg.y >= 305 && msg.y <= 345) { settextcolor(RGB(255, 0, 0));//设置字体颜色 outtextxy(200, 305, L"again"); }else { settextcolor(RGB(137, 57, 196));//设置字体颜色 outtextxy(420, 305, L"Back"); outtextxy(200, 305, L"again"); } switch (msg.uMsg) { case WM_LBUTTONDOWN: if (msg.x >= 420 && msg.x <= 520 && msg.y >= 305 && msg.y <= 345) { cleardevice(); StartWindow(); body(); }else if (msg.x >= 200 && msg.x <= 300 && msg.y >= 305 && msg.y <= 345) { body(); } break; } } }完整的代码:

    #include<iostream> #include<graphics.h> #include<time.h> #include<stdlib.h> #include<conio.h> #include<mmsystem.h> //多媒体设备接口 音视频 #pragma comment(lib,"winmm.lib") #define WINDOW_WIDTH 640 //窗口宽度 #define WINDOW_HEIGHT 480 //窗口高度 #define MAXSIZE 1000 //蛇的最大节数 using namespace std; typedef struct coor //蛇的坐标 { int x; int y; }Coor; typedef struct snake { Coor sCoor[MAXSIZE]; //蛇每一节的坐标 int n; //蛇的当前节数 int ch; //蛇的方向 }SNAKE; struct Food { Coor foodc; //坐标 int flag; //状态 有没有被吃 int type; //两种类型 一个苹果,一个虫子 }food; SNAKE snake; IMAGE backImg; IMAGE gbkImg; IMAGE foodImg; IMAGE about; IMAGE lose; IMAGE food2; void StartWindow(); //开始界面 void GameInit(); //游戏初始化 void move(); //蛇移动 void changeDirection(); //改变方向 void foodCoor(); //食物的坐标 void drawfood(); //画食物 void eatfood(); //吃食物 void AboutWindow(); //说明界面 void gameLose(); //失败界面 void killsnake(); //判断蛇死亡 void body(); //主体函数 void main() { initgraph(WINDOW_WIDTH,WINDOW_HEIGHT); //初始化窗口 StartWindow(); body(); getchar(); closegraph(); } void StartWindow() { mciSendString(L"open ./风动草.mp3 alias bgm",0,0,0); mciSendString(L"play bgm repeat", 0, 0, 0); loadimage(&backImg, L"./image/1.jpg", 640, 480); //将图片加载到backImg loadimage(&gbkImg, L"./image/bk.jpg", 640, 480); loadimage(&foodImg,L"./image/apple.jpg",10,10); loadimage(&about, L"./image/about.jpg", 640, 480); loadimage(&lose, L"./image/lose.jpg", 640, 480); loadimage(&food2, L"./image/food2.jpg", 10, 10); putimage(0, 0, &backImg); MOUSEMSG msg = { 0 }; setbkmode(TRANSPARENT); //设置背景风格 透明 settextstyle(40, 18, L"Ravie");//设置字体风格 while (1) { msg = GetMouseMsg(); if (msg.x >= 450 && msg.x <= 550 && msg.y >= 205 && msg.y <= 245) { settextcolor(RGB(255, 0, 0));//设置字体颜色 outtextxy(450, 205, L"Start"); } else if (msg.x >= 450 && msg.x <= 550 && msg.y >= 305 && msg.y <= 345) { settextcolor(RGB(255, 0, 0));//设置字体颜色 outtextxy(450, 305, L"About"); } else if (msg.x >= 450 && msg.x <= 550 && msg.y >= 405 && msg.y <= 445) { settextcolor(RGB(255, 0, 0));//设置字体颜色 outtextxy(450, 405, L"End"); } else { settextcolor(RGB(137, 57, 196));//设置字体颜色 outtextxy(450, 205, L"Start"); outtextxy(450, 305, L"About"); outtextxy(450, 405, L"End"); } switch (msg.uMsg) { case WM_LBUTTONDOWN: if (msg.x >= 450 && msg.x <= 550 && msg.y >= 205 && msg.y <= 245) { return; } else if (msg.x >= 450 && msg.x <= 550 && msg.y >= 405 && msg.y <= 445) { exit(0); } else if (msg.x >= 450 && msg.x <= 550 && msg.y >= 305 && msg.y <= 345) { AboutWindow(); StartWindow(); body(); } break; } } } void GameInit() { srand((unsigned int)time(NULL)); //随机数种子 putimage(0, 0, &gbkImg); setlinecolor(RED); setfillcolor(YELLOW); fillrectangle(0, 0, 10, 10); //初始化数据 snake.sCoor[0].x = 0; snake.sCoor[0].y = 0; snake.n = 1; snake.ch = 77; //上72 下 80 左 75 右77 food.flag = 0; food.type = 0; } void move() { for (int i = snake.n - 1; i > 0; i--) { snake.sCoor[i].x = snake.sCoor[i - 1].x; snake.sCoor[i].y = snake.sCoor[i - 1].y; } switch(snake.ch) { case 72: snake.sCoor[0].y -= 10; break; case 80: snake.sCoor[0].y += 10; break; case 75: snake.sCoor[0].x -= 10; break; case 77: snake.sCoor[0].x += 10; break; } setfillcolor(YELLOW); for (int i = snake.n - 1; i >= 0; i--) { fillrectangle(snake.sCoor[i].x, snake.sCoor[i].y, snake.sCoor[i].x + 10, snake.sCoor[i].y + 10); } } void changeDirection() { int movech;//方向 有键盘输入 movech = getch(); switch (movech) { case 72: if(snake.ch!=80) snake.ch = 72; break; case 80: if (snake.ch != 72) snake.ch = 80; break; case 75: if (snake.ch != 77) snake.ch = 75; break; case 77: if (snake.ch != 75) snake.ch = 77; break; } } void foodCoor() { //食物的坐标 food.foodc.x = rand() % 64 * 10; food.foodc.y = rand() % 48 * 10; food.flag = 1; food.type = rand() % 10 < 1 ? 1 : 0; } void drawfood() { if (food.type==1) { putimage(food.foodc.x, food.foodc.y, &food2); } else { putimage(food.foodc.x, food.foodc.y, &foodImg); } } void eatfood() { if (snake.sCoor[0].x == food.foodc.x && snake.sCoor[0].y == food.foodc.y) { if (food.type == 1) { snake.n += 2; } else { snake.n++; } food.flag = 0; } } void killsnake() { //撞墙 if (snake.sCoor[0].x < 0 || snake.sCoor[0].x>640 || snake.sCoor[0].y < 0 || snake.sCoor[0].y>480) { gameLose(); } else{ //撞自己 for (int i = snake.n - 1; i > 0; i--) { if (snake.sCoor[i].x == snake.sCoor[0].x && snake.sCoor[i].y == snake.sCoor[0].y) { gameLose(); } } } } void AboutWindow() { cleardevice(); putimage(0, 0, &about); while (1) { MOUSEMSG msg = { 0 }; setbkmode(TRANSPARENT); //设置背景风格 透明 settextstyle(40, 18, L"Ravie");//设置字体风格 msg = GetMouseMsg(); if (msg.x >= 450 && msg.x <= 550 && msg.y >= 425 && msg.y <= 465) { settextcolor(RGB(255, 0, 0));//设置字体颜色 outtextxy(450, 425, L"Back"); } else { settextcolor(RGB(137, 57, 196));//设置字体颜色 outtextxy(450, 425, L"Back"); } switch (msg.uMsg) { case WM_LBUTTONDOWN: if (msg.x >= 450 && msg.x <= 550 && msg.y >= 425 && msg.y <= 465) { return; } break; } } } void gameLose() { cleardevice(); putimage(0, 0, &lose); while (1) { MOUSEMSG msg = { 0 }; setbkmode(TRANSPARENT); //设置背景风格 透明 settextstyle(40, 18, L"Ravie");//设置字体风格 msg = GetMouseMsg(); if (msg.x >= 420 && msg.x <= 520 && msg.y >= 305 && msg.y <= 345) { settextcolor(RGB(255, 0, 0));//设置字体颜色 outtextxy(420, 305, L"Back"); } else if (msg.x >= 200 && msg.x <= 300 && msg.y >= 305 && msg.y <= 345) { settextcolor(RGB(255, 0, 0));//设置字体颜色 outtextxy(200, 305, L"again"); }else { settextcolor(RGB(137, 57, 196));//设置字体颜色 outtextxy(420, 305, L"Back"); outtextxy(200, 305, L"again"); } switch (msg.uMsg) { case WM_LBUTTONDOWN: if (msg.x >= 420 && msg.x <= 520 && msg.y >= 305 && msg.y <= 345) { cleardevice(); StartWindow(); body(); }else if (msg.x >= 200 && msg.x <= 300 && msg.y >= 305 && msg.y <= 345) { body(); } break; } } } void body() { GameInit(); while (1) { while (!kbhit()) { putimage(0, 0, &gbkImg); move(); if (food.flag == 0) { foodCoor(); } drawfood(); eatfood(); killsnake(); Sleep(100); cleardevice(); } changeDirection(); } }

    转载请注明原文地址: https://ju.6miu.com/read-34119.html

    最新回复(0)