- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
人机对战版泡泡堂
摘要:本游戏模仿盛大网络版泡泡堂,使用C和windows api编写完成,使用到了碰撞检测,人工智能技术。而人工智能部分又使用到A寻路算法,有限状态机。
关键词:绘图,碰撞检测,人工智能。
1. 引言:
实验主要为了掌握基于windows api 下的C语言图像编程,掌握图像的绘制以及windows消息传递机制。选用熟悉的泡泡堂可以去除其它无关因素,从而能迅速投入学习。
本游戏大概于2001被盛大游戏公司所做。
游戏把数据处理和图形绘制完全分离.玩家的输入状态使用windows消息处理机制接受.另外使用SetTimer模拟多线程的方法类处理不同的数据和绘图。 A.数据处理大体为:接受玩家的输入,针对相应的输入状态判断输入状态是否有效(如碰撞检测,泡泡放置),从而对数据进行不同的修改。B.人工电脑AI:没有直接修改游戏数据,而是模拟人的输入,使用有限状态机判断模拟应该输入什么,而后改输入状态数据。主要逻辑包括所站区域是否安全,不安全便逃跑;是否有道具可以捡,有便去拾取;是否有障碍物可炸,有便去炸;以及根据人物的方位做相应的操作。C.绘制图像:贴背景图,按照特定的顺序贴大小为40*40的各类图片。D.系统对游戏数据的处理,如时间的变化带来的数据变化如泡泡的生命变化,人物是否被炸到及死亡等。
2. 总体框架:
先初始化各种资源,然后游戏开始,之后定时选择处理绘图或者游戏数据。选择到游戏数据处理时,使用消息处理机制接受玩家信息,判断消息类型并处理,接着是获取AI的返回信息。接着根据按键和AI返回的信息对游戏人物数据进行修改,然后是系统对数据的处理,最后判断人物是否死亡,死亡则重新开始,否则跳转到定时选择处理绘图或者游戏数据重新继续下一轮的处理。流程图如下:
窗口及各类数据初始化
窗口及各类数据初始化
游戏开始
绘图或数据处理选择
图像绘制
玩家输入
退出按键
消息处理
获取AI本身输入状态
释放各种资源并退出
是否可行
人物数据修改
游戏系统对数据处理
玩家死亡
游戏结束
数据重新初始化
图1:游戏流程图
3.游戏具体功能实现:
3.1.背景图加载
为了使游戏图像优美,背景图是十分必要的。
先加载图片资源,然后在每次绘图的时候首先绘制此背景图:
图1:游戏背景图
代码实现:
InitImage(hdc, imageDC, bBG, cBG, 800, 600,Pic\\BG.bmp);
void InitImage(HDC hdc, HDC imageDC , HDC bImage, HDC cImage,
int width, int height, char fileName[]){
bImage = CreateCompatibleDC(hdc);
cImage = CreateCompatibleDC(hdc);
HBITMAP tempImage = (HBITMAP)LoadImage(NULL, fileName, IMAGE_BITMAP, width,
height, LR_LOADFROMFILE);
SelectObject(imageDC, tempImage);
SelectObject(bImage, CreateCompatibleBitmap(hdc, width, height));
SelectObject(cImage, CreateCompatibleBitmap(hdc, width, height));
for(int i=0; iwidth; i++) {
for(int j=0; jheight; j++){
if(GetPixel(imageDC, i, j) != RGB(255, 0, 255))
BitBlt(bImage, i, j, 1, 1, imageDC, i, j, SRCCOPY);
else
SetPixel(cImage , i, j, RGB(255, 255, 255)); }}
DeleteObject(tempImage);}
BitBlt(bufHdc, 0 ,0, 800, 600, bBG, 0, 0, SRCCOPY);
3.2.定时处理绘图,数据
采用SetTimer模拟多线程成处理绘图和数据。通过调用各个功能的函数接口实现:图像绘制;处理玩家,AI的输入并对数据修改;游戏系统对数据的修改;游戏的开始,结束,和再游戏中状态。代码如下:
void CALLBACK TimerProc(HWND hwnd, UINT nMsg, UINT nTimerid, DWORD dwTime){
HDC hdc;
hdc = GetDC(h
原创力文档


文档评论(0)