C语言零基础项目:吃豆人小游戏!详细思路+源码分享
每天一个C语言小项目,提升你的编程能力!
《吃豆游戏》是一款休闲小游戏,和贪吃蛇,球球大作战吃食物都是有差不多的游戏逻辑。
效果展示:
这个游戏本身很简单,一共3关,吃掉画面上全部小豆子就过关,被敌人碰到就over。吃大豆子可以让敌人暂时能被你吃,但是后面关卡,敌人恢复时间很短,敌人速度也很快。
当然现在你用代码自己开发的话,设置多少关卡,什么样的难度都看你自己咯!
游戏中使用了图片【https://codebus.cn/f/a/0/0/135/boxman.zip】
本项目编译环境:Visual Studio 2019/2022,EasyX插件
代码展示:
#include <stdio.h.h>
#include <graphics.h>
#include <time.h>
#include <conio.h>#define M 640 //开屏大小
#define N 480
#define rank 1 //游戏等级 int g_sum = 0; //统计吃豆的个数
int g_score = 0; //分数统计
bool g_win = true; //成败的标志
IMAGE image[5]; //装载图片
enum {LEFT=1, RIGHT, UP, DOWN}; //方向的控制
struct figure //人物属性
{int x; //人物图纸坐标 int y;int x1; //人物方向移动int y1;int x2; //人物物理坐标int y2;
}you,enemy[5]; /*0豆子,1可以移动地方,2墙壁,3自己,4敌人*/
int a[15][20]= {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,1,0,0,0,0,1,0,1,0,0,0,1,1,1,1,1,1,0,2, 2,1,2,2,2,1,1,2,1,1,0,0,0,1,1,4,1,1,0,2, 2,1,1,0,2,1,1,2,0,1,1,2,2,2,2,2,0,0,0,2, 2,4,1,0,2,1,1,2,1,1,1,0,1,1,1,1,0,1,1,2, 2,1,2,1,2,1,1,2,1,3,2,2,1,1,1,1,2,2,1,2, 2,1,2,1,2,1,1,1,1,1,1,1,1,0,0,0,1,1,1,2, 2,1,2,1,0,1,1,1,1,2,1,0,1,2,2,2,1,1,1,2, 2,1,0,1,0,1,2,1,1,2,1,0,1,2,1,1,4,1,1,2, 2,1,0,2,0,1,2,1,1,2,1,0,1,2,1,1,1,1,1,2, 2,1,0,2,1,1,2,1,1,2,1,0,2,2,1,0,0,0,1,2, 2,1,1,2,1,1,2,1,1,2,1,0,2,1,1,2,2,1,1,2, 2,1,2,2,1,2,2,1,1,1,1,0,1,4,1,2,0,0,1,2, 2,1,0,0,0,0,0,4,0,1,1,0,1,1,1,1,0,0,1,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};/*数组就是地图*/ int b[15][20]= {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,1,0,0,0,0,1,0,1,0,0,0,1,1,1,1,1,1,0,2, 2,1,2,2,2,1,1,2,1,1,0,0,0,1,1,4,1,1,0,2, 2,1,1,0,2,1,1,2,0,1,1,2,2,2,2,2,0,0,0,2, 2,4,1,0,2,1,1,2,1,1,1,0,1,1,1,1,0,1,1,2, 2,1,2,1,2,1,1,2,1,3,2,2,1,1,1,1,2,2,1,2, 2,1,2,1,2,1,1,1,1,1,1,1,1,0,0,0,1,1,1,2, 2,1,2,1,0,1,1,1,1,2,1,0,1,2,2,2,1,1,1,2, 2,1,0,1,0,1,2,1,1,2,1,0,1,2,1,1,4,1,1,2, 2,1,0,2,0,1,2,1,1,2,1,0,1,2,1,1,1,1,1,2, 2,1,0,2,1,1,2,1,1,2,1,0,2,2,1,0,0,0,1,2, 2,1,1,2,1,1,2,1,1,2,1,0,2,1,1,2,2,1,1,2, 2,1,2,2,1,2,2,1,1,1,1,0,1,4,1,2,0,0,1,2, 2,1,0,0,0,0,0,4,0,1,1,0,1,1,1,1,0,0,1,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};/*数组就是地图*/ 函数声明/
void Init_begin(); //初始化开始界面
void Initia(); //初始化界面
void Init_score(); //记分板
void Init_loss(); //失败的界面
void Init_win(); //成功的界面
void Init_leave(); //离开的界面
void Init_copy(); //图形复制
void enemymove(); //敌人运动
void randdire(struct figure *sth); //使方向随即改变
bool judgemeet(); //相遇判断
void youmove(int k ,int speed) ; //对自己进行移动
void mobile(); //自己移动
void eatbean(); //判断是否吃小黄点
void play(); //开始游戏
int sjs(int a,int b); //产生a,b之间的数
void enemymeetroad(int i); //敌人与路
void enemymeetbean(int i) ; //敌人遇豆子
void load_image(); //加载图片
void Game_levels(); //游戏等级设定 /void Init_begin() //初始化开始界面
{setbkcolor(BLACK);char init[20] = "吃豆子游戏";int x = M/2 - 250,y = 100;setcolor(CYAN);setfont(100, 0,"楷体",0,0,FW_DEMIBOLD,false,false,false);outtextxy(x,y,init);Sleep(400);RECT r = {x + 50, 250, 540, 460};setfont(24, 0, "宋体");setcolor(BROWN);outtextxy(x + 50, 250,"吃豆子游戏规则:");setfont(18, 0, "宋体");drawtext("\n\n1:游戏中,操作者可以通过方向键(上、下、左、右)或字母键(‘w’、‘s’、‘a’、‘d’)来调整方向 \n2:游戏中途可以按‘空格键’来暂停游戏 \n3:按‘ESC’推出游戏",&r, DT_WORDBREAK);setfont(24, 0,"楷体");setcolor(DARKGRAY);outtextxy(M/2 - 107,y + 300, "按");setcolor(RED);outtextxy(M/2 - 80, y + 300, "回车键");setcolor(DARKGRAY);outtextxy(M/2 , y + 300, "开始游戏");char put ;put = getch();while(put != 13)put = getch();
}/*0豆子,1可以移动地方,2墙壁,3自己,4敌人*/
void Initia() //初始化界面
{cleardevice();setbkcolor(RGB(72,12,12));for( int i = 0;i < 15;i++) for(int j = 0;j < 20;j++)putimage(100+j*20,100+i*20,&image[a[i][j]]);you.x=9; you.y=5; //敌人和自己的初始图纸坐标 enemy[0].x=15; enemy[0].y=2; enemy[1].x=1; enemy[1].y=4; enemy[2].x=16; enemy[2].y=8; enemy[3].x=13; enemy[3].y=12; enemy[4].x=7; enemy[4].y=13; you.x2 = you.x * 20 + 100; //图纸坐标转化为屏幕坐标you.y2 = you.y * 20 + 100;for(i=0;i<5;i++){enemy[i].x2 = enemy[i].x * 20 + 100; enemy[i].y2 = enemy[i].y * 20 + 100;enemy[i].x1 = 0; enemy[i].y1 = 1;}Init_score();
}void load_image() //加载图片
{loadimage(&image[0],"IMAGE", "0.jpg");loadimage(&image[1],"IMAGE", "1.jpg");loadimage(&image[2],"IMAGE", "2.jpg");loadimage(&image[3],"IMAGE", "3.jpg");loadimage(&image[4],"IMAGE", "4.jpg");
}void Init_score() //记分板
{setbkcolor(RGB(72,12,12));char infor[10];itoa(g_score,infor,10);setcolor(CYAN);setfont(28,0,"Arial");outtextxy(M - 140,90,"当前分数为");setfillstyle(RGB(72,12,12));bar(M - 40,140,M - 20,170);outtextxy(M - 80,140,infor);
}int sjs(int a,int b) //产生a,b之间的数
{return a+rand()%(b-a+1);
}void Init_copy() //图形复制
{ for(int i = 0;i < 15;i++)for(int j = 0;j < 20;j++)a[i][j] = b[i][j];
}void enemymeetbean(int i) //敌人遇豆子
{int x = enemy[i].x2 ;int y = enemy[i].y2 ;for(int j = 0;j<20;j++){putimage(x,y,&image[0]);enemy[i].x2 += enemy[i].x1;enemy[i].y2 += enemy[i].y1;putimage(enemy[i].x2,enemy[i].y2,&image[4]);}
}void enemymeetroad(int i) //敌人遇路
{int x = enemy[i].x2 ;int y = enemy[i].y2 ;for( int j = 0;j < 20;j++){putimage(x,y,&image[1]);enemy[i].x2 += enemy[i].x1;enemy[i].y2 += enemy[i].y1;putimage(enemy[i].x2,enemy[i].y2,&image[4]);}
}void enemymove() //敌人运动
{ Game_levels();for(int i = 0;i < 5;i++) //判断是否与墙壁相遇,如果相遇,随即改变方向{if(a[enemy[i].y+enemy[i].y1][enemy[i].x+enemy[i].x1] == 2 || abs(enemy[i].y1) == abs(enemy[i].x1)) randdire(&enemy[i]);}for(i = 0;i < 5;i++){if(a[enemy[i].y ][enemy[i].x] == 0)enemymeetbean(i);else enemymeetroad(i);enemy[i].x+=enemy[i].x1;enemy[i].y+=enemy[i].y1;if(judgemeet()) break;}Sleep(180);
}void Game_levels() //游戏等级设定
{if( sjs (1,rank) == 1){int t = rand() % 5;enemy[t].x1 = enemy[t].x - you.x > 0 ? -1 : 1; enemy[t].y1 = enemy[t].y - you.y > 0 ? -1 : 1;}for(int i = 0;i < 5;i++){if(enemy[i].x == you.x && enemy[i].y + 1 == you.y){enemy[i].x1 = 0 ; enemy[i].y1 = 1;}if(enemy[i].x == you.x && enemy[i].y - 1 == you.y){enemy[i].x1 = 0 ; enemy[i].y1 = -1;}if(enemy[i].x + 1 == you.x && enemy[i].y == you.y){enemy[i].x1 = 1 ; enemy[i].y1 = 0;}if(enemy[i].x - 1 == you.x && enemy[i].y == you.y){enemy[i].x1 = -1 ; enemy[i].y1 = 1;}}
}void randdire( struct figure *sth) //使方向随即改变
{int b=1;int x,y;while(b){x =sjs(-1,1);y=sjs(-1,1);if(a[sth->y + y][sth->x + x] != 2 && abs(y) != abs(x)){b = 0;sth->x1 = x;sth->y1 = y;}else b = 1;}
}bool judgemeet () //相遇判断
{for(int i = 0;i < 5;i++){if(enemy[i].x == you.x && enemy[i].y == you.y ){g_win = false;Init_loss();return true;break;}}return false;
}void eatbean() //判断是否吃小黄点
{if(a[you.y][you.x] == 0){a[you.y][you.x] = 1;g_sum++;g_score += 10;Init_score();a[you.y][you.x] = 1;}
}void youmove(int k) //对自己进行移动
{switch(k){case LEFT:you.x1 = -1;you.y1 = 0;break;case RIGHT:you.x1 = 1;you.y1 = 0;break;case DOWN:you.x1 = 0;you.y1 = 1;break;case UP:you.x1 = 0;you.y1 = -1;break;}if(a[you.y + you.y1][you.x + you.x1] != 2){int x = you.x2 ;int y = you.y2 ;for(int j = 0 ;j < 10;j++){putimage(x,y,&image[1]);you.x2 += you.x1 * 2;you.y2 += you.y1 * 2;putimage(you.x2,you.y2,&image[3]);}you.x += you.x1;you.y += you.y1;eatbean();}}void Init_loss() //失败的界面
{cleardevice();char str[] = "挑战失败,还需继续努力呀!";LOGFONT f;getfont(&f);f.lfHeight = 48;strcpy(f.lfFaceName , "楷体");f.lfQuality = ANTIALIASED_QUALITY;f.lfWeight = FW_NORMAL;setcolor(LIGHTGREEN);setfont(&f);outtextxy(20,200,str);char tryagain[] = "是否想继续挑战?(Y/N)";f.lfHeight = 28;setfont(&f);setcolor(BROWN);outtextxy(90,300,tryagain);char yesorno ;int keep = 1 ;while(keep){yesorno = getch();if(yesorno == 'Y' || yesorno == 'y' || yesorno == 'N' || yesorno == 'n')keep = 0;}if(yesorno == 'Y'|| yesorno == 'y'){g_win = true;g_score = 0;g_sum = 0;cleardevice();Init_copy();Initia();}else Init_leave();
}void Init_leave()
{cleardevice();char str[] = "下次继续努力吧!";LOGFONT f;getfont(&f);f.lfHeight = 48;strcpy(f.lfFaceName , "楷体");f.lfQuality = ANTIALIASED_QUALITY;f.lfWeight = FW_NORMAL;setcolor(LIGHTGREEN);setfont(&f);outtextxy(150,200,str);Sleep(2000);exit(0);
}void Init_win() //成功的界面
{cleardevice();char str[] = "恭喜你通过了游戏!!!";LOGFONT f;getfont(&f);f.lfHeight = 48;strcpy(f.lfFaceName , "楷体");f.lfQuality = ANTIALIASED_QUALITY;f.lfWeight = FW_NORMAL;setcolor(LIGHTGREEN);setfont(&f);outtextxy(50,200,str);Sleep(4000);char tryagain[] = "是否想再次挑战?(Y/N)";f.lfHeight = 28;setfont(&f);setcolor(BROWN);outtextxy(70,300,tryagain);char yesorno ;yesorno = getch();if(yesorno == 'y' || yesorno == 'Y'){g_win = true;g_score = 0;g_sum = 0;cleardevice();Init_copy();Initia(); }else exit(0);
}void stop() //游戏暂停
{char key = 'a';char stop[] = "游戏暂停中";setcolor(RED);setfont(28,0,"楷体");outtextxy(230,50,stop);Sleep(100);while(key != ' ')key = getch();setcolor(RGB(72,12,12));outtextxy(230,50,stop);
}void play()
{setbkcolor(RGB(72,12,12));char key; //获取字母int t; //记录方向while(g_win){enemymove();judgemeet();while(kbhit()){key = getch();switch(key){case 'a':case 75: t = LEFT; youmove(t ); break;case 'd':case 77: t = RIGHT; ; youmove(t ); break;case 's':case 80: t = DOWN; youmove(t ); break;case 'w':case 72: t = UP; youmove(t ); break;case 27: Init_leave(); break;case 32: stop(); break;default : break;}}if(g_sum == 50) Init_win();}
}void main()
{initgraph(M,N);load_image();Init_begin();setbkcolor(RGB(72,12,12));srand((unsigned)time(NULL));Initia(); play();closegraph();
}
大家赶紧去动手试试吧!
此外,我也给大家分享我收集的其他资源,从最零基础开始的教程到C语言C++项目案例,帮助大家在学习C语言的道路上披荆斩棘!
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)最重要的是你可以在群里面交流提问编程问题哦!
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!(↓↓↓↓↓↓)
C语言零基础项目:吃豆人小游戏!详细思路+源码分享相关推荐
- C语言实现吃豆人小游戏(转载)
c语言实现吃豆人小游戏(转载) 游戏内还有一些bug,凑活着来玩一玩吧! #include <stdio.h> #include <iostream> #include < ...
- 基于C++控制台(Windows平台)的一个吃豆人小游戏
PacManX --南京大学2019秋季学期 "高级程序设计 "课程设计一 基于C++控制台(Windows平台)的一个吃豆人小游戏 已实现的目标: 地图支持自定义编辑(可编辑地图 ...
- 整活~使用webAI做一个网页AR吃豆人小游戏
一个好习惯,先给结论 使用网页端深度学习框架识别人脸,做一个AR吃豆人小游戏.吃豆人会随着人脸在镜头内的移动而移动,吃完全部豆子即为获胜. 在线体验地址:点我预览 代码地址:点我github 本文首发 ...
- 可怜的博主跟小豆人杠起来啦!Python制作的吃豆人小游戏,快来围观!!
相关文件 关注小编,私信小编领取哟! 当然别忘了一件三连哟~~ 对了大家可以关注小编的公众号哟~~ Python日志 开发环境 Python版本:3.6.4 相关模块: pygame模块: 以及一些P ...
- 用JAVA实现吃豆人小游戏
用JAVA实现吃豆人小游戏 游戏运行效果 Model.java Pacman.java 完整的游戏代码及资源文件 游戏运行效果 Model.java package pacman;import jav ...
- JS实现简单的吃豆人小游戏
吃豆人小游戏 今天练习了一下JS,写了一个吃豆人的小demo Html以及CSS部分 首先定义一个div,用来存放吃豆人的一些元素,我们给他加一个id="game",然后我们在这d ...
- python 吃豆人_pacman 人工智能编程 吃豆人小游戏 可实现智能寻路 吃豆 通关 - 下载 - 搜珍网...
Berkeley人工智能吃豆人作业-Python/ Berkeley人工智能吃豆人作业-Python/再附带一份完整工程源码吧/ Berkeley人工智能吃豆人作业-Python/再附带一份完整工程源 ...
- 前端实现简易吃豆人小游戏
1.首先先将html文件里的初始代码设置完毕 2.规定范围 规定人物的活动范围,豆子的起始位置,人物的大小,并且逐次进行样式的编写 技术范围:css.html. 难点:需要在脑海中构思下一步的操作. ...
- Dev-C++5.11游戏创作之吃豆人小游戏(转载)
Hi!大家好,我是你们的编程小王子!今天为大家转载了一个小游戏, 蒟蒻一枚https://blog.csdn.net/yueyuedog原创 代码我不过多解释,还是比较"简单"的 ...
最新文章
- c#百度排名点击器编写 及webser 填表.
- MNIST数据集实现手写数字识别(基于tensorflow)
- android 之 使用显示意图和隐式意图完成Activity的跳转
- 经典的cnn model
- java前后端数据交互_前后端数据交互(示例代码)
- 解除单个文件的与svn服务器的关联
- Leetcode 每日算法一题*****#495. 提莫攻击
- python小白从哪来开始-国外大牛解析:小白如何从零基础开始学习python编程语言...
- Kettle资源库-元数据
- 计算机办公软件应用操作,基于计算机Word办公软件的使用及操作流程
- Android 使用gson完成Json转map,json转单个对象,json转数组
- 联想计算机型号吧,lenovo全系列联想笔记本电脑型号对照表
- css3 呼吸的莲花_心肾呼吸法—莲花能量冥想*
- 华为HCIE证书含金量
- 简单的PHP登陆页面和登陆成功页面代码
- 读书笔记--项亮《推荐系统实践》第四章
- dvt高危患者的护理措施_DVT的预防措施
- auto.js教程:找图函数,图片内随机点击
- html做app代码模板,App单页面html5模板
- Maven创建第一个java项目(官方教程)