C语言_写简易吃豆人小游戏
简易参考这个视频:听一遍就懂:
https://www.bilibili.com/video/BV1SB4y1u7gp?t=1185
需要用到easyx库,文档:
https://docs.easyx.cn/zh-cn/intro
大致能实现:生成豆子,躲避敌人,计分(有一点问题)
我自己加上了豆子和吃豆子的部分:
豆子很简单,随机生成就行,吃豆子要看边界条件
代码比较长,没有分流到其他头文件
环境:visual studio 2019
注意看 项目 -> 属性:有几个地方要调:注意平台是win32
1.使用多字节字符集
2.C/C++里面 SDL检查设置为否
应该就这些了,其他没问题
图片自己找
写了更详细的文档,有需要的私信
#include <stdio.h>
#include <easyx.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <graphics.h>/*****************************定义*********************************************/
//定义数据
#define WIDTH 960
#define HEIGHT 630 //初始化窗口
#define ENEMY_NUM 4 //敌人数量
#define BEAN_NUM 15 //豆子数量
#define R 10int price = 0; //初始化得分
int end=2; //结束方式:0成功,1失败, 2正常 IMAGE mapImg; //定义背景图片
unsigned long tt1, tt2;//定义玩家
struct Player
{int x, y;int dirx, diry; //玩家的方向IMAGE player_photo; //玩家图片unsigned long t1, t2, dt; //dt=t2-t1
};
//玩家
Player player;//定义怪兽
Player enemy[ENEMY_NUM];//定义豆子
struct bean
{int x,y,r;bool exist; //豆子是否存在
};bean beans[BEAN_NUM]; //定义豆子数量/********************************初始化数据界面******************************************/void GameInit()
{srand(time(0));//初始化游戏窗口:宽度和高度initgraph(WIDTH, HEIGHT);//初始化游戏界面,欢迎界面while (!_kbhit()){settextcolor(RED);settextstyle(50, 30, _T("宋体"));outtextxy(130, 50, "欢迎来到吃豆人小游戏!");settextstyle(40, 20, _T("楷体"));outtextxy(400, 130, "游戏规则");settextcolor(GREEN);settextstyle(40, 20, _T("楷体"));outtextxy(300, 200, "1.请吃完所有的豆子");outtextxy(300, 270, "2.请躲避红色的敌人");outtextxy(260, 340, "3.上下左右键控制吃豆人移动");outtextxy(300, 410, "4.按空格键暂停游戏");int a = 255;while (!_kbhit()){settextstyle(30, 15, _T("宋体"));settextcolor(RGB(a, 0, 255));outtextxy(270, 500, "请按除空格外的任意键开始游戏");Sleep(41);a -= 5;if (a == 0)a = 255;}}//初始化背景图片loadimage(&mapImg, "map.jpg");putimage(0, 0, &mapImg);//初始化玩家player.x=400; //初始化玩家的位置player.y=300;player.dirx=1;player.diry=0;loadimage(&player.player_photo,"man.PNG",40,40);putimage(0, 0, &player.player_photo);player.t1 = GetTickCount() ; //获取系统时间player.dt = 5;//控制速度//初始化敌人for (int i = 0; i < ENEMY_NUM; i++){//方向随机int n = rand() % 4; //四个方向if (n == 0) enemy[i].dirx = 1, enemy[i].diry = 0;else if(n==1) enemy[i].dirx = -1, enemy[i].diry = 0;else if (n == 2) enemy[i].dirx = 0, enemy[i].diry = 1;else if (n == 3) enemy[i].dirx = 0, enemy[i].diry = -1;while (1) //位置随机{enemy[i].x = rand() % (WIDTH/30)*30;enemy[i].y = rand() & (HEIGHT/30)*30;if (getpixel(enemy[i].x +40, enemy[i].y+40) != BLACK)continue;elsebreak;}enemy[i].t1 = GetTickCount();//获取系统时间enemy[i].dt = 5; //单位是ms}tt1 = GetTickCount(); //初始化tt1//初始化豆子for (int i = 0; i < BEAN_NUM; i++){beans[i].exist = true; //初始条件该豆子存在beans[i].r = 10; //生成半径为10的豆子,半径不变//随机生成x,y坐标beans[i].x = rand() % (WIDTH/10)*10;beans[i].y = rand() % (HEIGHT/10)*10;}//使豆子不重叠for (int i = 0; i < BEAN_NUM; i++){for (int j = i + 1; j < BEAN_NUM; j++){if ((beans[i].x >= beans[j].x - R) && (beans[i].x <= beans[j].x + R) &&(beans[i].y >= beans[j].y - R) && (beans[i].y <= beans[j].y + R)){beans[i].x = rand() % WIDTH;beans[i].y = rand() % HEIGHT;}}}}
//生成迷宫/***************************显示绘制程序********************************/
void GameDraw()
{//开始绘制BeginBatchDraw();//绘制背景图片putimage(0, 0, &mapImg);//绘制玩家putimage(player.x, player.y, &player.player_photo);//绘制敌人for (int i = 0; i < ENEMY_NUM; i++){setfillcolor(RED);fillrectangle(enemy[i].x, enemy[i].y, enemy[i].x + 40, enemy[i].y + 40); //敌人长宽为40}//绘制豆子for (int i = 0; i < BEAN_NUM; i++){if (beans[i].exist == true){setfillcolor(YELLOW);solidcircle(beans[i].x, beans[i].y, beans[i].r);}}//结束绘制EndBatchDraw();
}/*******************************数据更新变化*************************************/
void GameUpdate()
{//玩家数据变化_手动char key;if (_kbhit())//如果有按键动作{key = _getch();switch (key) //分别是上下左右{case 72: //向上loadimage(&player.player_photo, "man3.PNG", 40, 40);putimage(0, 0, &player.player_photo);player.dirx = 0, player.diry = -1;break;case 80: loadimage(&player.player_photo, "man4.PNG", 40, 40);putimage(0, 0, &player.player_photo);player.dirx = 0, player.diry = 1;break;case 75: loadimage(&player.player_photo, "man2.PNG", 40, 40);putimage(0, 0, &player.player_photo);player.dirx = -1, player.diry = 0;break; case 77: loadimage(&player.player_photo, "man.PNG", 40, 40);putimage(0, 0, &player.player_photo);player.dirx = 1, player.diry = 0;break; case 32: //空格暂停player.dirx = 0,player.diry = 0;for (int i = 0; i < ENEMY_NUM; i++){enemy[i].dirx = 0, enemy[i].diry = 0;}system("pause");break;}}//玩家数据变化_自动//移动player.t2 = GetTickCount();if (player.t2 - player.t1 >= player.dt) //每隔5ms移动一次{player.x += 2 * player.dirx;player.y += 2 * player.diry;player.t1 = player.t2; //重置时间}//撞墙,方向相反if ((player.x)+40 >= 960 || player.x <= 0){player.dirx = -player.dirx;}else if (player.y <= 0 || (player.y)+40 >= 630){player.diry = -player.diry;}//敌人数据变化 for (int i = 0; i < ENEMY_NUM; i++){enemy[i].t2 = GetTickCount();if (enemy[i].t2 - enemy[i].t1 >= enemy[i].dt) //每隔5ms移动一次{enemy[i].x += 2 * enemy[i].dirx;enemy[i].y += 2 * enemy[i].diry;enemy[i].t1 = enemy[i].t2;}//撞墙if ((enemy[i].x +40)>= WIDTH || enemy[i].x <= 0){enemy[i].dirx = -enemy[i].dirx;}if (enemy[i].y <= 0 || (enemy[i].y+40) >= HEIGHT){enemy[i].diry = -enemy[i].diry;}}tt2 = GetTickCount();if (tt2 - tt1 > 1000) //时间大于1.5秒,重新随机生成敌人方向{for (int i = 0; i < ENEMY_NUM; i++){int n = rand() % 4; //四个方向if (n == 0) enemy[i].dirx = 1, enemy[i].diry = 0;else if (n == 1) enemy[i].dirx = -1, enemy[i].diry = 0;else if (n == 2) enemy[i].dirx = 0, enemy[i].diry = 1;else if (n == 3) enemy[i].dirx = 0, enemy[i].diry = -1;}tt1 = tt2;}//判断敌人是否与玩家相碰for (int i = 0; i < ENEMY_NUM; i++){if ((enemy[i].x +40 >= player.x ) && (enemy[i].x<= player.x + 40) &&(enemy[i].y +40 >= player.y ) && (enemy[i].y <= player.y + 40)){player.dirx = 0, player.diry = 0;for (int i = 0; i < ENEMY_NUM; i++){enemy[i].dirx = 0, enemy[i].diry = 0;}end = 1; //失败结束}}//豆子数据变化,判断豆子与玩家碰撞 for (int i = 0; i < BEAN_NUM; i++){if ((player.x + 40 >= beans[i].x - 10) && (player.x <= beans[i].x + 10) &&(player.y + 40 >= beans[i].y - 10) && (player.y <= beans[i].y + 10)){beans[i].exist = false;price += 1;}}//判断豆子是否全被吃完int sign = 0; //标志符号for (int i = 0; i < BEAN_NUM; i++) //遍历所有的豆子{if (beans[i].exist == true){sign = 0;break;}else if (beans[i].exist == false){sign = 1;continue;}}if (sign == 1){end = 0; //成功结束}
}
/***********************************主函数**************************************/
int main()
{ GameInit(); //初始化窗口while (1){GameDraw(); //绘制界面GameUpdate(); //更新数据if (end == 2){continue;}else if (end == 1) //失败{cleardevice();settextcolor(RED);settextstyle(60, 40, _T("宋体"));outtextxy(330, 260, "游戏失败!");settextcolor(GREEN);settextstyle(40, 20, _T("Arial"));outtextxy(50, 260, "最终分数:");//输出分数******************************//char s[10];//sprintf_s(s,"%d", price);//outtextxy(50, 300, s);//break;}else if (end == 0) //成功{cleardevice();settextcolor(RED);settextstyle(60, 40, _T("宋体"));outtextxy(330, 260, "通关成功!");break;}}_getch();system("pause");return 0;}
最后上一下完成图:
游戏过程图:
C语言_写简易吃豆人小游戏相关推荐
- 前端实现简易吃豆人小游戏
1.首先先将html文件里的初始代码设置完毕 2.规定范围 规定人物的活动范围,豆子的起始位置,人物的大小,并且逐次进行样式的编写 技术范围:css.html. 难点:需要在脑海中构思下一步的操作. ...
- C语言实现吃豆人小游戏(转载)
c语言实现吃豆人小游戏(转载) 游戏内还有一些bug,凑活着来玩一玩吧! #include <stdio.h> #include <iostream> #include < ...
- JS实现简单的吃豆人小游戏
吃豆人小游戏 今天练习了一下JS,写了一个吃豆人的小demo Html以及CSS部分 首先定义一个div,用来存放吃豆人的一些元素,我们给他加一个id="game",然后我们在这d ...
- 基于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 ...
- python 吃豆人_pacman 人工智能编程 吃豆人小游戏 可实现智能寻路 吃豆 通关 - 下载 - 搜珍网...
Berkeley人工智能吃豆人作业-Python/ Berkeley人工智能吃豆人作业-Python/再附带一份完整工程源码吧/ Berkeley人工智能吃豆人作业-Python/再附带一份完整工程源 ...
- Dev-C++5.11游戏创作之吃豆人小游戏(转载)
Hi!大家好,我是你们的编程小王子!今天为大家转载了一个小游戏, 蒟蒻一枚https://blog.csdn.net/yueyuedog原创 代码我不过多解释,还是比较"简单"的 ...
- C语言零基础项目:吃豆人小游戏!详细思路+源码分享
每天一个C语言小项目,提升你的编程能力! <吃豆游戏>是一款休闲小游戏,和贪吃蛇,球球大作战吃食物都是有差不多的游戏逻辑. 效果展示: 这个游戏本身很简单,一共3关,吃掉画面上全部小豆子就 ...
最新文章
- 面试官:能不能手写一个 Promise?
- 使用sqlserver搭建高可用双机热备的Quartz集群部署【附源码】
- python网络编程项目_Python网络编程攻略
- Oracle Golden Gate - 概念和机制
- Kubernetes入门——k8s概念和架构
- 管理感悟:承认错误,善于总结
- 网页设计html5实训心得,网页设计实习心得
- SpringBoot 中如何使用JSP页面开发?
- 故宫元宵灯会票务系统崩溃背后:年游客达1700万人
- Python数据处理041:数据分析之时间序列
- python做软件二次开发好吗_利用Python二次开发Creo
- PTA 7-6 sdut-oop-5 计算长方体和四棱锥的表面积和体积(类的继承) (10 分) JAVA
- 类和对象8:数值方法
- php5.5.12 yar,[原]PHP-yar拓展源码解读五-server篇
- Win10跳过开机登录界面
- 【2021-07-15】JS逆向之网易云音乐(私信、关注、点赞)
- git删除分支时究竟会删掉哪些东西
- 在线文字生成音频工具
- docker内运行的grafana重置登录密码
- VB虚拟机中ubuntu Linux系统安装使用MCNP5