回合制战斗类游戏_第1页
回合制战斗类游戏_第2页
回合制战斗类游戏_第3页
回合制战斗类游戏_第4页
回合制战斗类游戏_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

回合制战斗类游戏 一、 程序功能与设计思路 整体设计目标:含有游戏场景、游戏角色、动作控制、动画、交战(可选)、人 工智能、音效(可选)等各部分内容。 1游戏实现功能说明: 本次游戏是关于回合制战斗游戏的设计,游戏含有背景音效,玩家通过点击攻击命令 图标对怪物发动攻击,程序响应后智能的选择攻击模式,计算对双方产生的伤害值, 并显示对战消息,当其中的任何一方生命值为 0 时,游戏结束。 游戏场景设计:贴天空、山峦、草地图,并实现其循环移动,对山峦进行透明处理。 游戏角色设计:贴怪兽、玩家图,并进行透明效果处理,设定生命值。 动作控制、交战:点击攻击命令图标玩家可以对怪物发动技能攻击,同时怪物也可以 选择相应的攻击方式。 动画:怪物和玩家采用透明动画制作的技巧,对图案进行连续显示及图案本身背景的 透明化处理。 人工智能:在游戏中设定怪物有 5 种行为即利爪攻击、闪电链攻击、致命一击、使用 梅肯斯姆回复生命值、逃跑,根据以上设计的怪物行为,利用“if-else”、 “switch”语句,使计算机对角色进行事件情况判断,用来模拟怪物对战时的思考与 行为的方式。 音效:游戏的背景音效贯穿于整个游戏的始终。 2界面效果显示: 1)游戏开始界面效果显示: 1 2)游戏进行界面效果显示: 3)游戏结束界面效果显示: 3主界面设计思路(简单结构框图): 贴天空图 贴山峦图 贴草地图 贴怪物图 贴玩家图 贴背景图 设置背景循环移动 (天空、山峦、草地) 贴攻击命令图标 贴攻击效果图画 显示对战消息和生命值 贴游戏结束图画 3 二、 相关原理知识介绍 游戏流程: 1、贴图原理: 位图是属于 GDI 的对象之一,在一套游戏开发过程中,常常需要运用大量的位图 来构建游戏的所有画面。以游戏程序来说,由于使用的位图数量相当多,因此都会先 将位图存成文件,等到程序需要时再将文件加载到窗口中。将位图从文件中加载到绘 制窗口中必须经过以下几个步骤。 1)从文件加载位图(BITMAP)对象。 2)建立一个与窗口 DC 兼容的内存 DC。 开始 点击攻击命令图标 显示贴图、播放背景音乐 玩家发动攻击 程序随机响应玩家角色攻击方 式、AI 怪物攻击与思考方式 计算相应伤害值并进行 生命值的加减 显示攻击特效、对战消息 游戏结束 玩家生命值 player.nHp0 else /进行闪电链攻击概率 1/5 monster.kind = 1; else /生命值小于 20 switch (rand() % 5) case 0: /利爪攻击 monster.kind = 0; break; case 1: /释放闪电链 monster.kind = 1; break; case 2: /致命一击 monster.kind = 2; break; case 3: /使用梅肯斯姆回复 monster.kind = 3; break; case 4: /逃跑 monster.kind = 4; break; 这段代码中,利用 if-else 判断式判断怪物生命值,然后怪物有 4/5 的几率释放普通 的利爪攻击,有 1/5 的几率释放闪电链魔法攻击,当怪物重伤生命值小于 20 点时, 也有一定的几率逃跑。 以上的利用“if-else”、“switch”语句,使计算机角色进行事件情况判断,然后 写出相应的动作实现代码,这就是行为型游戏 AI 设计的核心精神。 2.玩家角色攻击方式设计 然后设计玩家的攻击技能。在游戏中给人物设定了两个技能,一个主动的普通攻击技 能“无敌斩”,伤害计算公式为 damage = rand()% 10 + player.lv*player.w(player.lv 为角色等级,player.w 为攻击系数)。 而被动技能为可以有一定几率打出 4 倍暴击伤害的“恩赐解脱”,其暴击的实现方式 很简单,就是用 if 条件句进行概率的判断(在这里利用 4=rand( )%5 来设定暴击概 率为 20%),如果判断成功就将“倍率 x 普通攻击”作为 damage 的值。 下面贴出代码人物技能的代码: if (4 = rand() % 5) / 20%几率触发幻影刺客的大招,恩赐解脱,4 倍暴击伤害 damage = 4 * (rand() % 10 + player.lv*player.w); /player.lv为角色等级,player.w 为攻击系数 monster.nHp -= (int)damage; sprintf(str, “恩赐解脱触发,这下牛逼了,4 倍暴击.对怪物照成了%d 点伤害“, damage); else damage = rand() % 10 + player.lv*player.w; monster.nHp -= (int)damage; sprintf(str, “玩家使用了无敌斩,伤害一般般.对怪物照成了%d 点伤害“, damage); 三、 设计步骤说明 1.开发环境配置(路径、头文件、静态或动态链接库等) Windows 7 、Visual Studio 2013 、Win32 项目 2.全局以及局部的各种变量说明 自定义一个结构体: struct chr int nHp; /设定角色生命值 int fHp; /设定角色生命值上限 int lv; /设定角色等级 int w; /设定攻击伤害加权值 int kind; /设定攻击种类 ; 自定义全局变量: HBITMAP dra, bg3, girl, skill, skillult, slash, magic, recover, game; HDC hdc, mdc, bufdc; HWND hWnd; DWORD tPre, tNow; int pNum, f, txtNum; Bool attack, over; 7 chr player, monster; char text5100; int x0 = 0, x1 = 0, x2 = 0, num = 0; 3.自定义类及其成员函数的说明 自定义函数: void MyPaint(HDC hdc); /自定义绘图函数 void MsgInsert(char*); /新增的对战消息函数 void CheckDie(int hp, bool player); /生命值判断函数 4.实现功能的关键代码及代码含义 a.添加背景音效 在主程序中添加头文件: #include “mmsystem.h“/导入声音头文件 #pragma comment(lib,“winmm.lib“)/导入声音头文件库 在函数 InitInstance(HINSTANCE, int)中添加如下代码: mciSendString(“open background.mp3 alias bgMusic “, NULL, 0, NULL); /打开音乐文件 mciSendString(“play bgMusic repeat“, NULL, 0, NULL); b.贴图 在函数 InitInstance(HINSTANCE, int)中定义变量 HBITMAP bmp; 添加如下代码: bg0 = (HBITMAP)LoadImage(NULL, “bg0.bmp“, IMAGE_BITMAP, 640, 480, LR_LOADFROMFILE); bg1 = (HBITMAP)LoadImage(NULL, “bg1.bmp“, IMAGE_BITMAP, 640, 600, LR_LOADFROMFILE); bg2 = (HBITMAP)LoadImage(NULL, “bg2.bmp“, IMAGE_BITMAP, 640, 600, LR_LOADFROMFILE); dra = (HBITMAP)LoadImage(NULL, “dra.bmp“, IMAGE_BITMAP, 760, 198, LR_LOADFROMFILE); girl = (HBITMAP)LoadImage(NULL, “girl.bmp“, IMAGE_BITMAP, 480, 148, LR_LOADFROMFILE); skill = (HBITMAP)LoadImage(NULL, “skill.bmp“, IMAGE_BITMAP, 50, 50, LR_LOADFROMFILE); skillult = (HBITMAP)LoadImage(NULL, “skillult.bmp“, IMAGE_BITMAP, 50, 50, LR_LOADFROMFILE); slash = (HBITMAP)LoadImage(NULL, “slash.bmp“, IMAGE_BITMAP, 196, 162, LR_LOADFROMFILE); magic = (HBITMAP)LoadImage(NULL, “magic.bmp“, IMAGE_BITMAP, 200, 100, LR_LOADFROMFILE); recover = (HBITMAP)LoadImage(NULL, “recover.bmp“, IMAGE_BITMAP, 300, 150, LR_LOADFROMFILE); game = (HBITMAP)LoadImage(NULL, “over.bmp“, IMAGE_BITMAP, 289, 74, LR_LOADFROMFILE); c.定义玩家、怪物的等级及生命值 player.nHp = player.fHp = 50; /设定玩家角色生命值及上限 player.lv = 2; /设定玩家角色等级 player.w = 4; /设定攻击伤害加权值 monster.nHp = monster.fHp = 120; /设定怪物角色生命值及上限 monster.lv = 1; /设定怪物角色等级 monster.w = 1; /设定攻击伤害加权值 d.在消息处理函数 WndProc()函数中添加以下代码进行游戏操作的控制: int x, y; switch (message) case WM_KEYDOWN: /键盘消息 if (wParam = VK_ESCAPE) /按下 Esc键 PostQuitMessage(0); break; case WM_LBUTTONDOWN: /鼠标左键消息 if (!attack) x = LOWORD(lParam); /X坐标 y = HIWORD(lParam); /Y坐标 if (x = 500 BitBlt(mdc, 70, 270, 95, 99, bufdc, num * 95, 99, SRCAND); BitBlt(mdc, 70, 270, 95, 99, bufdc, num * 95, 0, SRCPAINT); sprintf(str, “%d / %d“, monster.nHp, monster.fHp); TextOut(mdc, 100, 320, str, strlen(str); /贴上玩家图 if (player.nHp0) SelectObject(bufdc, girl); BitBlt(mdc, 500, 275, 60, 74, bufdc, pNum * 60, 74, SRCAND); BitBlt(mdc, 500, 275, 60, 74, bufdc, pNum * 60, 0, SRCPAINT); sprintf(str, “%d / %d“, player.nHp, player.fHp); TextOut(mdc, 510, 320, str, strlen(str); if (over) /贴上游戏结束图画 SelectObject(bufdc, game); BitBlt(mdc, 200, 200, 289, 37, bufdc, 0, 37, SRCAND); BitBlt(mdc, 200, 200, 289, 37, bufdc, 0, 0, SRCPAINT); else if (!attack) /贴上攻击命令图画 SelectObject(bufdc, skill); BitBlt(mdc, 500, 350, 50, 50, bufdc, 0, 0, SRCCOPY); SelectObject(bufdc, skillult); BitBlt(mdc, 430, 350, 50, 50, bufdc, 0, 0, SRCCOPY); else f+; /第 510个画面时显示玩家攻击图标 if (f = 5 else /进行闪电链攻击概率 1/5 monster.kind = 1; else /生命值小于 20 switch (rand() % 5) case 0: /利爪攻击 monster.kind = 0; break; case 1: /释放闪电链 monster.kind = 1; break; 11 case 2: /致命一击 monster.kind = 2; break; case 3: /使用梅肯斯姆回复 monster.kind = 3; break; case 4: /逃跑 monster.kind = 4; break; /第 2630个画面时显示玩家攻击图标 if (f = 26 BitBlt(mdc, 480, 260, 98, 162, bufdc, 98, 0, SRCAND); BitBlt(mdc, 480, 260, 98, 162, bufdc, 0, 0, SRCPAINT); /第 30个画面时计算玩家受伤害程度并加入显示消息 if (f = 30) damage = rand() % 10 + monster.lv*monster.w; player.nHp -= (int)damage; sprintf(str, “怪物利爪攻击.对玩家照成 %d 点伤害“, damage); MsgInsert(str); CheckDie(player.nHp, true); break; case 1: /释放闪电链 SelectObject(bufdc, magic); BitBlt(mdc, 480, 260, 100, 100, bufdc, 100, 0, SRCAND); BitBlt(mdc, 480, 260, 100, 100, bufdc, 0, 0, SRCPAINT); /第 30个画面时计算玩家受伤害程度并加入显示消息 if (f = 30) damage = rand() % 10 + 3 * monster.w; player.nHp -= (int)damage; sprintf(str, “怪物释放闪电链.对玩家照成 %d 点伤害“, damage); MsgInsert(str); CheckDie(player.nHp, true); break; case 2: /致命一击 SelectObject(bufdc, slash); BitBlt(mdc, 480, 260, 98, 162, bufdc, 98, 0, SRCAND); BitBlt(mdc, 480, 260, 98, 162, bufdc, 0, 0, SRCPAINT); /第 30个画面时计算玩家受伤害程度并加入显示消息 if (f = 30) damage = rand() % 10 + monster.lv*monster.w * 5; player.nHp -= (int)damage; sprintf(str, “怪物致命一击.对玩家照成 %d 点伤害.“, damage); MsgInsert(str); CheckDie(player.nHp, true); break; case 3: /使用梅肯斯姆补血 SelectObject(bufdc, recover); BitBlt(mdc, 60, 260, 150, 150, bufdc, 150, 0, SRCAND); BitBlt(mdc, 60, 260, 150, 150, bufdc, 0, 0, SRCPAINT); /第 30个画面时怪物回复生命值并加入显示消息 if (f = 30) monster.nHp += 30; sprintf(str, “怪物使用梅肯斯姆.恢复了 30点生命值“, damage); MsgInsert(str); break; case 4: /在第 30个画面时判断怪物是否逃跑成功 if (f = 30) if (1 = rand() % 3) /逃跑几率 1/3 over = true; monster.nHp = 0; sprintf(str, “怪物逃跑中.逃跑成功“); MsgInsert(str); else sprintf(str, “怪物逃跑中.逃跑失败“); MsgInsert(str); break; if (f = 30) /回合结束 attack = false; f = 0; BitBlt(hdc, 0, 0, 640, 480, mdc, 0, 0, SRCCOPY); tPre = GetTickCount(); x0 += 5; / 重设天空背景切割宽度 if (x0 = 640) x0 = 0; x1 += 8; / 重设山峦背景切割宽度 13 if (x1 = 640) x1 = 0; x2 += 16; / 重设草地背景切割宽度 if (x2 = 640) x2 = 0; num+; / 重设跑动图的图号 if (num = 8) num = 0; pNum+; if (pNum = 8) pNum = 0; 2)新增的对战消息函数 void MsgInsert(char*); void MsgInsert(char* str) if (txtNum 5) sprintf(texttxtNum, str); txtNum+; else for (int i = 0; itxtNum; i+) sprintf(texti, texti + 1); sprintf(text4, str); 3)生命值判断函数 void CheckDie(int hp, bool player); void CheckDie(int hp, bool p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论