文档详情

泡泡堂开发文档

工****
实名认证
店铺
DOC
457KB
约18页
文档ID:504020829
泡泡堂开发文档_第1页
1/18

人机对战版泡泡堂摘要:本游戏模仿盛大网络版泡泡堂,使用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; i

通过调用各个功能的函数接口实现:图像绘制;处理玩家,AI的输入并对数据修改;游戏系统对数据的修改;游戏的开始,结束,和再游戏中状态代码如下:void CALLBACK TimerProc(HWND hwnd, UINT nMsg, UINT nTimerid, DWORD dwTime){ HDC hdc; hdc = GetDC(hwnd); switch(nTimerid){ case 1: Paint(hdc); break; case 2: if(begin){ role1->state++; role2->state++; if(role1->state >= BEGINSTATE + 60){ begin = false; role1->state = 1; role2->state = 1; win = 0;}} else if(end){ if(role1 != NULL){ if(role1->state < ENDSTATE){ role1->state = ENDSTATE;} else if(role1->state > ENDSTATE + 72){ end = false; GameStart(); begin = true;} else role1->state++;} else if(role2 != NULL){ if(role2->state < ENDSTATE){ role2->state = ENDSTATE;} else if(role2->state > ENDSTATE + 72){ end = false; GameStart(); begin = true;} else role2->state++;} else{ if(win++ > 72){ end = false; GameStart(); begin = true;}}} else{ if(role1 != NULL) DealRole(map, role1, state1); if(role2 != NULL) DealRole(map, role2, state2);} break; case 3:{ struct Popo *temp; temp = rolePopo1; while(temp != NULL){ if(temp->life >= POPOLIFE){ DealExPopo(temp->x, temp->y);} else{ temp->life++;} temp = temp->next;}} break; case 4:{ for(int i=0; i 100) map[j][i]++;}} break; case 5:{ if(role2->state <= DEATH || end || begin) break; state2 = true; bool cdirection = false; bool putPopo = false; int direction; AIDeal(map, role2, role1, rolePopo1, direction, putPopo); if(direction == -1){ state2 = false; for(int i=0; i<4; i++) role2->keyState[i] = false; role2->state = 0;} else if(role2->keyState[direction] != true){ state2 = false; role2->direction = direction; for(int i=0; i<4; i++) role2->keyState[i] = false; role2->keyState[direction] = true; role2->state = 0;} if(putPopo) role2->addPopo = true;}break; default: break;} ReleaseDC(hwnd, hdc);}3.3游戏界面绘制:首先加载各种需要的图片,并处理成前景图和掩模图的两种图,贴图的时候分别加载前景图和掩膜图即可。

之后按照特定的顺序排序贴上泡泡,障碍物,人物,爆炸图片,使画面具有层次感 图3:游戏各种绘制代码: InitImage(hdc, imageDC, bBG, cBG, 800, 600,"Pic\\BG.bmp"); InitImage(hdc, imageDC, bBigPopo, cBigPopo, 648, 72,"Pic\\BigPopo.bmp"); InitImage(hdc, imageDC, bDraw, cDraw, 204, 68,"Pic\\Draw.bmp"); InitImage(hdc, imageDC, bExplosion, cExplosion, 560, 200,"Pic\\Explosion.bmp"); InitImage(hdc, imageDC, bGift[0], cGift[0], 126, 45,"Pic\\Gift1.bmp"); InitImage(hdc, imageDC, bGift[1], cGift[1], 126, 45,"Pic\\Gi。

下载提示
相似文档
正为您匹配相似的精品文档