Qt实现的宠物小精灵对战游戏阶段三-联网对战

Daisy

发布日期: 2019-03-17 18:21:57 浏览量: 1266
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

1、题目要求

  • 已经登录的在线用户可以和服务器进行虚拟决斗,决斗分两种:升级赛和决斗赛,两种比赛都能增长宠物经验值。服务器上有一个虚拟精灵的列表,用户可以挑选其中任意一个进行比赛(升级赛或者决斗赛)。另外决斗赛中用户胜出可以直接获得该战胜的的精灵,失败则系统从用户的精灵中随机选三个(不够三个精灵的情况就选择他所有的精灵),然后由用户选一个送出

    • 升级赛 只是用户用来增加精灵经验值,规则开发者自定
    • 累积多少经验值升一级,规则开发者自定
    • 决斗赛的上述规则同升级赛,只是额外还可以赢得宠物一个
  • 用户如果没有精灵(比如总是失败,已经全部送出去),则系统会随机放给给他一个初级精灵

  • 请让你的系统自动模拟每场比赛的每次出招。另外,为了增加不确定性,可以加入概率闪避攻击和暴击伤害机制

    • 比赛的过程和结果由系统根据上述规则自动模拟完成,要求结果具有一定的随机性
  • 用户增加新功能,可以查看某个用户的胜率

  • 用户增加新属性,为宠物个数徽章(金银铜)和高级宠物徽章(金银铜),分别根据拥有的宠物个数的多少和拥有高级宠物(15级)个数的多少颁发

  • 如有界面设计可酌情加分,如有新颖设计可酌情加分

  • 题目考察点:客户端与服务器数据交互(可采用多进程或异步通信或其他方法均可),并发请求处理,类的方法设计,伤害计算方法设计

2、通信协议设计

发送到客户端的战斗信息格式:

  1. <playerRound: 0 | 1> <skillName> <dodge: 0 | 1> <defenderHP> <defenderAtk: 0 | 1 | 2> <defenderDef: 0 | 1 | 2> <defenderSpeed: 0 | 1 | 2> <defenderPP1> <defenderPP2> <defenderPP3> <attackerHP> <attackerAtk: 0 | 1 | 2> <attackerDef: 0 | 1 | 2> <attackerSpeed: 0 | 1 | 2> <attackerPP1> <attackerPP2> <attackerPP3>

其中playerRound为1表示玩家的回合,为0表示对手的回合。属性为0表示下降,为1表示不变,为2表示上升。HP显示精灵剩余血量。闪避为0表示闪避失败

客户端需要监视精灵血量,当血量为0时战斗终止。

自动战斗由客户端实现,随机使用技能。

3、服务端设计

第三版主要用于实现战斗。

Endpoint添加以下接口:

  • battle <type: LV_UP | DUEL> <pokemonID> <enemyRaceID> <enemyLV>

    • 发起战斗请求,包括战斗类型(升级比赛或决斗比赛),己方精灵ID,敌方种族和敌方等级
    • 返回消息见下文“战斗同步问题”
  • useSkill <skillID>

    • 使用技能
    • 返回消息见下文“战斗同步问题”
  • getDuelStatistic

    • 返回玩家的战斗统计信息,包括获胜场数和总决斗场数
    • 返回信息格式:<win> <total>
  • chooseBet

    • 服务器挑选三个精灵返回给玩家,玩家选择一个丢弃
    • 调用getPokemonByID函数返回三次消息,每次返回一个Pokemon的详情
  • discard <pokemonID>

    • 丢弃指定ID的精灵
    • 无返回消息

Pokemon类添加静态函数getEnemy,能够通过敌人种族和等级构造一个精灵作为玩家精灵的对手。

Pokemon原本的attack函数拆分为两个函数,分别是:

  1. bool attack(Pokemon &aim, string &msg); // auto attack
  2. bool attack(Pokemon &aim, int skillIndex, string &msg); // manual attack

其中string &msg为需要返回给客户端的战斗消息。第一个attack函数不需要提供skillIndex,自动战斗,被电脑控制的Pokemon使用。第二个函数需要提供skillIndex,由玩家控制的Pokemon使用。玩家自动战斗系统由客户端实现,自动战斗状态下客户端发送随机技能给服务器。

为了使战斗可控,改造BattleController类,在构造函数中把Socket传给BattleController,这样BattleController在内部就可以调用Socket::recv来阻塞战斗流程等待用户选择技能。

战斗同步问题

客户端向服务器发起战斗请求时,服务器会在Endpoint内新建一个BattleController并运行此BattleController。BattleController判定为电脑控制的Pokemon行动时会把行动结果发送到客户端,客户端需要回复一个”done”表示已经执行完动画,然后服务器接收到”done”之后才能继续运行。当BattleController判定为玩家行动时,会向客户端发动”turn”,客户端把释放技能按钮设置为可用,然后根据用户的选择发送释放技能信息useSkill <skillID>给服务器,服务器会把行动结果返回给客户端,客户端仍需要回复”done”表示动画执行完毕。服务器向客户端发出的战斗信息格式如下(信息之间使用空格隔开):

  1. <playerRound: 0 | 1>
  2. <skillName>
  3. <dodge: 0 | 1>
  4. <defenderHP>
  5. <defenderAtk: 0 | 1 | 2>
  6. <defenderDef: 0 | 1 | 2>
  7. <defenderSpeed: 0 | 1 | 2>
  8. <defenderPP1>
  9. <defenderPP2>
  10. <defenderPP3>
  11. <attackerHP>
  12. <attackerAtk: 0 | 1 | 2>
  13. <attackerDef: 0 | 1 | 2>
  14. <attackerSpeed: 0 | 1 | 2>
  15. <attackerPP1>
  16. <attackerPP2>
  17. <attackerPP3>

其中:

  • playerRound表示此回合为玩家的回合还是电脑控制Pokemon的回合。为0表示电脑控制Pokemon的回合,为1表示是玩家的回合

  • skillName表明使用了哪个技能

  • dodge表示被攻击方是否闪避。为1时表示闪避成功,为0时表示闪避失败

  • defenderAtk/defenderDef等属性为0表示下降,为1表示不变,为2表示上升

战斗结束时服务器不会给客户端提示,所以客户端需要自行监视精灵血量,当任意一方血量为0时战斗结束。

徽章系统交给客户端实现。

4、客户端设计

主界面增加升级决斗和比赛决斗的按钮。为决斗场景添加页面与自动机状态。因为升级比赛和决斗比赛有很多共用的地方,所以把自动机的状态改为使用Bitmask实现,具体如下:

  1. enum State // use bitmask
  2. {
  3. START = 1,
  4. LOGIN = 2,
  5. MAIN = 4,
  6. POKEMON_TABLE = 8,
  7. PLAYER_TABLE = 16,
  8. CHANGE_PSW = 32,
  9. LV_UP_BATTLE = 64,
  10. DUEL_BATTLE = 128,
  11. CHOOSE_ENEMY = 256,
  12. CHOOSE_BET = 512
  13. };

在查看宠物界面添加勋章的展示。勋章展示规则如下:

  • 精灵爱好者徽章

    • 金质 - 精灵数量不少于20
    • 银质 - 精灵数量不少于10
    • 铜质 - 精灵数量不少于5
  • 精灵大师徽章

    • 金质 - 15级精灵数量不少于5
    • 银质 - 15级精灵数量不少于3
    • 铜质 - 拥有15级精灵

查看宠物界面也优化了UI,添加了小精灵的种族图片等。

在战斗界面使用QProgressBar作为小精灵的血条,并使用format函数重设显示方式,使其能够显示具体数值。

战斗界面给小精灵设置了简单的动画,精灵获得增益(如吸血造成的血量增加)时精灵图片会上下移动(getImpreoved函数),受到攻击时会闪烁(getDecreased函数)。为了实现这些动画的延时效果,设置了函数mySleep,在sleep的同时不会阻塞Qt的事件循环。

战斗界面的四个技能按钮会显示剩余技能释放次数。如果小精灵等级不够,则按钮为锁定状态不可使用。技能按钮在对方回合也为disabled状态。

战斗界面使用一个QLabel来显示小精灵使用的技能和对对方或自己造成的效果。

决斗比赛失败,选择精灵送出时,会弹出三个PokemonDlg以显示精灵详情。用户选中一个精灵送出时,这三个PokemonDlg会自动消失。

MainWindow使用了QMediaPlaylist实现了bgm的单曲循环。

5、运行截图

初始界面,添加了按钮图标

注册界面美化UI

主界面添加两个比赛按钮

宠物详情界面显示玩家拥有的宠物、显示宠物图标和宠物徽章

升级比赛选精灵界面,在精灵表的基础上添加了一列“就决定是你了”按钮

选择对手界面。对手默认和己方精灵同级。升级比赛可以选择对手等级,决斗比赛对手只能和自己同级

战斗界面,包括技能锁和能够显示具体血量的血条

决斗比赛选择精灵界面,能够查看自己的战绩

玩家列表界面,可以查看所有玩家的在线状态和战绩

其他玩家的小精灵页面。可以看到其他玩家的徽章

决斗比赛战败,选择小精灵送出的界面

上传的附件 cloud_download 宠物小精灵对战游戏阶段三-联网对战.7z ( 14.80mb, 55次下载 )
error_outline 下载需要14点积分

发送私信

离开的不会再回来,回来的不再完美

12
文章数
15
评论数
eject