下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、回合制战斗类游戏程序功能与设计思路整体设计目标:含有游戏场景、游戏角色、动作控制、动画、交战可选、人 工智能、音效可选等各局部内容。1 游戏实现功能说明:本次游戏是关于回合制战斗游戏的设计,游戏含有背景音效,玩家通过点击攻击命令 图标对怪物发动攻击,程序响应后智能的选择攻击模式,计算对双方产生的伤害值, 并显示对战消息,当其中的任何一方生命值为 0时,游戏结束。游戏场景设计:贴天空、山峦、草地图,并实现其循环移动,对山峦进行透明处理。游戏角色设计:贴怪兽、玩家图,并进行透明效果处理,设定生命值。动作控制、交战:点击攻击命令图标玩家可以对怪物发动技能攻击,同时怪物也可以 选择相应的攻击方式。动画
2、:怪物和玩家采用透明动画制作的技巧,对图案进行连续显示及图案本身背景的 透明化处理。人工智能:在游戏中设定怪物有 5种行为即利爪攻击、闪电链攻击、致命一击、使用 梅肯斯姆回复生命值、逃跑,根据以上设计的怪物行为,利用“ if-else 、“ switch 语句,使计算机对角色进行事件情况判断,用来模拟怪物对战时的思考与行为的方式。 音效:游戏的背景音效贯穿于整个游戏的始终。2. 界面效果显示:1游戏开始界面效果显示:2游戏进行界面效果显示:3游戏结束界面效果显示:3 主界面设计思路简单结构框图:贴天空图贴背景图贴山峦图设置背景循环移动天空、山峦、草地贴草地图贴怪物图贴攻击命令图标贴玩家图贴攻击
3、效果图画显示对战消息和生命值贴游戏结束图画相关原理知识介绍游戏流程:开始显示贴图、播放背景音乐点击攻击命令图标玩家发动攻击程序随机响应玩家角色攻击 方式、AI怪物攻击与思考方显示攻击特效、对战消息计算相应伤害值并进 行生命值的加减玩家生命值player.nHp>0&& 怪物生命值monster.nHp>0游戏结束1、贴图原理:位图是属于GDI的对象之一,在一套游戏开发过程中,常常需要运用大量的位图 来构建游戏的所有画面。以游戏程序来说,由于使用的位图数量相当多,因此都会先 将位图存成文件,等到程序需要时再将文件加载到窗口中。将位图从文件中加载到绘 制窗口中必须经过以
4、下几个步骤。1从文件加载位图BITMAP对象。2建立一个与窗口 DC兼容的内存DC3内存DC使用步骤1 所建立的位图对象。4将内存DC的内容粘贴到窗口 DC中,完成显像的操作。BitBlt 函数对指定的源设备环境区域中的像素进行位块 bit_block 转换,以传 送到目标设备环境。例如: BitBlt hdc, 50,50,350,250 , mdc, 200,1 00 , SRCCOPY;这行程序表示,从来源DCmdC坐标点200,100的地方开始向右向下剪裁出宽350, 高250的区域,并将其贴到目的 DChdc以坐标点50,50为原点的区域中。2、背景循环移动原理:循环背景是不断地进行
5、背景图的裁切与结合,然后显示在窗口上所产生的一种背 景画面循环滚动的效果。下面就介绍如何利用同一张跟窗口大小相同的背景天空图案 来产生背景由左向右循环滚动的动画效果的。当背景在由左向右移动时,背景图右移 的过程中,屏幕会出现“缝隙,所以我们需要把移出屏幕的图贴到缝隙中来。这样 子循环后,就可以看到在空中飞行的效果了。由上面的分析看出,我们的工作就是两次贴图:1 第一步,裁取原始背景图右边局部进行贴图操作到另一个DC中,假设目前裁 取的右边局部的宽度为 x;2 第二步,裁取原始背景图左边局部惊醒贴图操作到另一DC中,完成了向右滚 动接合后的新背景图;3 第三步,将接合后的背景图显示在窗口中,之后
6、递增 x值,进行循环操作。当 x大于等于背景图后,就将x的值重设为0,继续重复循环。这样子就形成了背景循环 效果。注意:循环背景的选图很重要,要力求看不出背景缝隙。3、技能攻击算法设计原理1. AI 怪物攻击与思考方式设计假设怪物作战时具有如下几种行为:1 利爪攻击2 闪电链攻击3致命一击4) 使用梅肯斯姆回复生命值(补血)5) 逃跑那么我们可以根据以上设计的怪物行为,设计以下一段算法,用来模拟怪物对战时的 思考与行为的方式:if (monster.nHp > 20)/ 生命值大于 20if (rand() % 5 != 1)/进行利爪攻击概率 4/5mon ster.k ind = 0
7、;else/进行闪电链攻击概率1/5mon ster.k ind = 1;case 0:/利爪攻击mon ster.k ind = 0; break;case 1:/释放闪电链mon ster.k ind = 1;这段代码中,利用if-else判断式判断怪物生命值,然后怪物有4/5的几率释放普通的利爪攻击,有1/5的几率释放闪电链魔法攻击,当怪物重伤生命值小于20点时,也有一定的几率逃跑。以上的利用“ if-else 、“switch 语句,使计算机角色进行事件情况判断,然后写 出相应的动作实现代码,这就是行为型游戏AI设计的核心精神。2. 玩家角色攻击方式设计然后设计玩家的攻击技能。在游戏中
8、给人物设定了两个技能,一个主动的普通攻击技 能“无敌斩,伤害计算公式为 damage = ran d()%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 * (ra nd()
9、% 10 + player.lv*player.w);/player.lv为角色等级,player.w为攻击系数monster.nHp -= ( int )damage;|sprintf(str,"恩赐解脱触发,这下牛逼了,4倍暴击对怪物照成了 d点伤害,damage);elsedamage = rand() % 10 + player.lv*player.w;monster.nHp -= ( int )damage;sprintf(str,"玩家使用了无敌斩,伤害一般般.对怪物照成了 d点伤害", damage);二、设计步骤说明1.开发环境配置(路径、头文件、
10、静态或动态链接库等)Windows 7、Visual Studio 2022、Win32 工程2.全局以及局部的各种变量说明自定义一个结构体:struct chrintnHp;/设定角色生命值intfHp;/设定角色生命值上限intlv;/设定角色等级intw;/设定攻击伤害加权值int;ki nd;/设定攻击种类自定义全局变量:HBITMARIra, bg3, girl, skill, skillult, slash, magic, recover, game;HDChdc, mdc, bufdc;HWNDhWnd;DWORDtPre, tNow;intpNum, f, txtNum;Boo
11、lattack, over;chrplayer, mon ster;chartext5100;intx0 = 0, x1 = 0, x2 = 0, num = 0;3. 自定义类及其成员函数的说明自定义函数:voidMyPaint( HDChdc); /自定义绘图函数voidMsg In sert( char*); /新增的对战消息函数voidCheckDie( int hp, bool player); /生命值判断函数4. 实现功能的关键代码及代码含义a. 添加背景音效在主程序中添加头文件:#include "mmsystem.h"/ 导入声音头文件#pragma co
12、mmen(lib , "winmm.lib" ) / 导入声音头文件库在函数InitInstance(HINSTANCE, int)中添加如下代码:/翻开音乐文件mciSendString( "open background.mp3 alias bgMusic ", NULL, 0, NULL);mciSendString( "play bgMusic repeat" , NULL, 0, NULL);b. 贴图在函数 In it In sta nce(HINSTANCE, i nt)中定义变量 HBITMAP bmp;添加如下代码:
13、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,
14、 "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, "sk
15、illult.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, "rec
16、over.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;mon ster. nHp = mon ster.fHp = 120;/设定玩家角色生命值及上限/设定玩家角色等级/设定攻击伤害加权值/设定怪物
17、角色生命值及上限mon ster.lv = 1;/设定怪物角色等级mon ster.w = 1;/设定攻击伤害加权值d. 在消息处理函数 WndProc()函数中添加以下代码进行游戏操作的控制:int x, y;switch ( messagecase WM_KEYDOWN/ 键盘消息if ( wParam= VK_ESCARE / 按下 Esc 键PostQuitMessage(O);break;case WM_LBUTTONDOWN/ 鼠标左键消息if (!attack)x = LOWORlParam);/X 坐标y = HIWORDParam);/Y 坐标if (x >= 500
18、&& x <= 550 && y >= 350 && y <= 400) attack = true ;break;case WM_DESTROY/ 窗口结束消息DeleteDC(mdc);DeleteDC(bufdc);DeleteObject(bg0);DeleteObject(bg1);DeleteObject(bg2);DeleteObject(dra);DeleteObject(girl);DeleteObject(skill);DeleteObject(skillult);DeleteObject(slash);De
19、leteObject(magic);DeleteObject(recover);DeleteObject(game);ReleaseDC(hWnd hdc);PostQuitMessage(0);break;default :/默认消息return DefWindowProc(hWnd message wParam lParam);e. 自定义函数关键代码及解释1)自定义绘图函数 void MyPaint(HDC hdc);1. 画面贴图与对战消息显示2. 怪物行为判断及各项数据处理与计算voidMyPai nt(HDC hdc)char str100; int i, damage;/贴天空图
20、SelectObject(bufdc, bgO);BitBlt(mdc, 0, 0, x0, 300, bufdc, 640 - x0, 0, SRCCOPY);BitBlt(mdc, x0, 0, 640 - x0, 300, bufdc, 0, 0, SRCCOPY);/贴草地图|BitBlt(mdc, 0, 300, x2, 180, bufdc, 640 - x2, 300, SRCCOPY); BitBlt(mdc, x2, 300, 640 - x2, 180, bufdc, 0, 300, SRCCOPY);/贴山峦图并透明SelectObject(bufdc, bg1);Bit
21、Blt(mdc, 0, 0, x1,300, bufdc, 640 - x1,300, SRCAND);BitBlt(mdc, x1, 0, 640 - x1, 300, bufdc, 0, 300, SRCAND); BitBlt(mdc, 0, 0, x1,300, bufdc, 640 - x1,0, SRCPAINT);BitBlt(mdc, x1, 0, 640 - x1, 300, bufdc, 0, 0, SRCPAINT);/显示对战消息for (i = 0; i<txtNum; i+)TextOut(mdc, 0, 360 + i * 18, texti, strle
22、n(texti);/贴上怪物图if (monster.nHp>0)SelectObject(bufdc, dra);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, strle n(str);/贴上玩家图if (player.nH
23、p>0) ISelectObject(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, strle n(str);if (over)/贴上游戏结束图画 | 二SelectObject(bufdc, g
24、ame);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);
25、f+;/第510个画面时显示玩家攻击图标if (f >= 5 && f <= 10)|SelectObject(bufdc, slash);BitBlt(mdc, 70, 260, 98, 162, bufdc, 98, 0, SRCAND);BitBlt(mdc, 70, 260, 98, 162, bufdc, 0, 0, SRCPAINT);/第10个画面时计算怪物受伤害程度并参加显示消息if (f = 10) if (4 = rand() %5)/ 20%几率触发幻影刺客的大招,恩赐解脱,4倍暴击伤害damage = 4 * (ra nd() % 10 +
26、player.lv*player.w);/player.lv为角色等级,player.w为攻击系数monster.nHp -= ( int )damage;sprintf(str,"恩赐解脱触发,这下牛逼了,4倍暴击 对怪物照成了 d点伤害damage); |elsedamage = rand() % 10 + player.lv*player.w;monster.nHp -= ( int )damage;sprintf(str,"玩家使用了无敌斩,伤害一般般.对怪物照成了 d点伤害",damage); |MsgI nsert(str);CheckDie(mons
27、ter.nHp,false );sra nd(tPre);/第15个画面时判断怪物进行哪项动作if (f = 15) if (monster.nHp > 20)/ 生命值大于 20if (rand() % 5 != 1)/进行利爪攻击概率4/5mon ster.k ind = 0;else/进行闪电链攻击概率1/5mon ster.k ind = 1;else/生命值小于20switch (rand() % 5)case 0:/利爪攻击mon ster.k ind = 0; break;case 1:mon ster.k ind = 1; break;/释放闪电链case 2:/致命一击
28、mon ster.ki nd = 2;break;case 3:/使用梅肯斯姆回复mon ster.k ind = 3; break; |case 4:/ 逃跑mon ster.ki nd = 4;break;/第2630个画面时显示玩家攻击图标(f >= 26 && f <= 30)switch (monster.kind) case 0:if (f >= 26 && f <= 30)switch (monster.kind)case 0:/利爪攻击SelectObject(bufdc, slash);BitBlt(mdc, 480,
29、260, 98, 162, bufdc, 98, 0, SRCAND);BitBlt(mdc, 480, 260, 98, 162, bufdc, 0, 0, SRCPAINT);/第30个画面时计算玩家受伤害程度并参加显示消息if (f = 30)damage = rand() % 10 + mon ster.lv*m on ster.w;player.nHp -= (int )damage;sprintf(str, "怪物利爪攻击 对玩家照成 %d点伤害", damage); MsgI nsert(str);CheckDie(player.nHp, true );bre
30、ak;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 = ran d() % 10 + 3 * mon ster.w; |player.nHp -= (int )damage;sprintf(str, "怪物释放闪电链.对玩家照成%d点伤害",
31、 damage); MsgI nsert(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 = ran d() % 10 + mon sterv*m on ster.w * 5;player.nH
32、p -= (int )damage;sprintf(str,"怪物致命一击 对玩家照成 d点伤害.",damage);MsgI nsert(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
33、 = 30)mon ster. nHp += 30;sprintf(str,"怪物使用梅肯斯姆 恢复了 30点生命值",damage);MsgI nsert(str);break;case 4:/在第30个画面时判断怪物是否逃跑成功if (f = 30)if (1 = rand() % 3)/ 逃跑几率 1/3over = true ;mon ster. nHp = 0;sprintf(str,"怪物逃跑中逃跑成功");MsgI nsert(str);elsesprintf(str,"怪物逃跑中逃跑失败");MsgI nsert(str);break; Lif (f = 30)/回合结束BitBlt(hdc, 0, 0, 640, 480, mdc, 0, 0, SRCCOPY);tPre = GetTickCou nt();x0 += 5;/ 重设天空背景切割宽度if (x0 = 640) x0 = 0;x1 += 8;/ 重设山峦背景切割宽度if (x1 = 640) x1 = 0;x2 += 16;/ 重设草地背景切割宽度if (x2 = 640) x2 = 0;n um+;/ 重设跑动图的图号if (num = 8) num = 0;pNum+;if (pNum = 8) pNum = 0;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年临沂职业学院单招职业适应性考试必刷测试卷附答案解析
- 2026年上饶卫生健康职业学院单招职业倾向性考试题库附答案解析
- 2026年宁波工程学院单招职业适应性考试题库带答案解析
- 2026年浙江万里学院单招职业倾向性测试必刷测试卷附答案解析
- 2026年天津艺术职业学院单招职业适应性考试必刷测试卷及答案解析(夺冠系列)
- 多模式交通流协同优化
- 房屋拆迁款合同范本
- 房屋授权开店协议书
- 房屋整治维修协议书
- 房屋模拟搬迁协议书
- 2024-2025学年广东省深圳市坪山区教科版四年级上册期中考试科学试卷(解析版)
- 2025年四川省考选调公务员录用考试《行测》真题及答案
- 校长在班主任经验交流会上的讲话-:以经验为梯强班建以责任为炬护成长
- 机电设备安装工程物料调度方案
- ISO9001-2026质量管理体系中英文版标准条款全文
- 集中供热管网建设项目初步设计
- 2025.9.6+增值税法背景下进项抵扣与风险提示(一)
- 厂房建设监理工作方案范文
- 卷烟厂安全培训考核制度
- 安全工伤培训教学课件
- 木门厂安全培训课件
评论
0/150
提交评论