我用Java创建了我的第一个游戏.这场比赛是垄断.我正在努力设计游戏以模拟其回合制结构(管理玩家转弯).我想允许单个人控和一个或多个AI控制的玩家玩游戏.

我的具体问题是我不知道是否实现游戏循环,这意味着可以管理玩家的循环以及与大富翁游戏直接相关的变量,(想想诸如提示每个玩家轮到他们的事情,将转弯增加到下一个玩家,或者依次从每个玩家获得骰子.我并不是指“游戏循环”这个术语的更低级含义,它更多地涉及屏幕上的绘图框架,更新物理或以特定的时间更新AI.

我的理解是,我尝试实现我需要的选择是:

>实现完全事件驱动的程序,没有这样的游戏循环,或

>实现一个游戏循环 – 在后台长时间运行并且只要游戏正在运行就基本上永无止境.这将是更具程序性的方法.

当我第一次尝试解决这个问题时,我遇到了我的UI冻结的问题,因为我的游戏循环永无止境,并且完全消耗了它运行的线程(我只是做了一个非常简单的while循环来说明这一点) .所以我开始创建一个SwingWorker来封装我的游戏循环.这解决了UI冻结的问题,但仍然让我想知道我是否走错了路.

作为一般规则,我发现网上的大多数建议似乎都支持任何事件驱动的方法,因此我使用SwingWorker的当前实现可能是朝错误方向迈出的一步.但是我无法完全理解如何为这个特定任务实现一个完全事件驱动的系统(意味着没有游戏循环存在).在我看来,一个循环必须存在于某个地方,以管理玩家转弯.

以下是我的具体问题:

>游戏循环(正如我所描述的那样)适用于基于回合制的游戏,例如Monopoly – 专门用于排队玩家轮流并提示适当的玩家轮流,一次一个玩家(并排队/序列的整个过程)包含转弯的步骤)?

>如果要创建一个纯粹的事件驱动系统来管理玩家回合,你如何迭代每个玩家来提示他们轮到他们并继续迭代直到游戏结束?

>如果要使用游戏循环来解决上述特定问题,是否必须在其自己的线程中运行(可能使用SwingWorker)以避免冻结UI?我的情况是特定于Java的,但我想我也会对非Java特定情况的答案感兴趣.

目前,我使用MVC模式组织了我的代码.我的控制器是我的游戏循环(实际的SwingWorker线程)所在的位置.它远非完整,但它有助于说明我如何管理玩家转向我称之为“游戏循环”.

来自控制器的SwingWorker代码:

swingWorker = new SwingWorker() {

@Override

protected Void doInBackground() throws InterruptedException {

gameLoopRunning = true;

while (gameLoopRunning) {

//to do: use a timer instead of thread.sleep

Thread.sleep(1000);

//user turn prompt

if (model.getActivePlayer().isUserControlled()) {

boolean userRolled = false;

while(!userRolled) {

System.out.println("Roll the dice please...");

Thread.sleep(3000);

}

}

//bot turn prompt

else {

//insert code for bot rolling dice here

model.rollDice();

}

publish(model);

Thread.sleep(1000);

model.incrementPlayerTurn();

publish(model);

}

return null;

}

@Override

protected void process(List chunks) {

Model gameModel = chunks.get(chunks.size() - 1);

//hard-coded for 6 players

for (int i = 0; i < 6; i++) {

view.getPlayerPanel(i).setTurn(gameModel.getPlayers().get(i).isTurn());

}

view.getGamePanel().getDice().setDie1(model.getDie1());

view.getGamePanel().getDice().setDie2(model.getDie2());

}

};

swingWorker.execute();

解决方法:

SirDarius的评论很有见.

虽然,对于像推进玩家转弯这样简单的事情,你并不需要费心去实现一个完整的有限状态机.

就MVC而言,这是你应该为人类玩家做的事情:

>模型:提供将活动玩家推进到下一个玩家并运行“转弯过程”(即滚动骰子,移动活动玩家的令牌等)的方法.由于大部分转弯过程都是事件驱动的,因此这些方法调用将来自控制器中的事件侦听器.

>视图:当活动玩家完成转弯时提升事件,以及在各种其他输入上引发事件.

>控制器:每当玩家完成转弯时,告诉模型前进到下一个玩家,并再次开始“转弯过程”.每当玩家提供输入时,将触发一个事件,告诉模型前进到转弯的下一个阶段.

对于AI玩家,可以使用大多数相同的代码,但是通过视图驱动转弯进程是没有意义的.相反,该模型需要另一种“转弯过程”方法,该方法专门针对AI玩家.唯一的区别是代码将在不等待视图输入的情况下连续执行,而不是一系列事件侦听器.

标签:swingworker,event-driven-design,java,events

来源: https://codeday.me/bug/20191005/1854675.html

java回合制游戏女主牺牲自己_java – 回合制游戏设计:事件驱动与游戏循环相关推荐

  1. 《游戏视频主播手册》——2.2 哪些人适合做游戏主播

    本节书摘来自异步社区<游戏视频主播手册>一书中的第2章,第2.2节,作者 王岩,更多章节内容可以访问云栖社区"异步社区"公众号查看. 2.2 哪些人适合做游戏主播 据不 ...

  2. 依托广泛跨界联动,腾讯游戏认证主播持续发力

    自腾讯游戏认证主播计划推出以来,如何为破圈合作.资源盘活带来更多的可能性,就一直是各方进行探索和尝试的重点. 譬如就在今年早些时候,<王者荣耀>知名主播孤影.A老回携手"高音女王 ...

  3. java模拟回合制游戏大小姐_java – 回合制游戏设计:事件驱动与游戏...

    我用Java创建了我的第一个游戏.这场比赛是垄断.我正在努力设计游戏以模拟其回合制结构(管理玩家转弯).我想允许单个人控和一个或多个AI控制的玩家玩游戏. 我的具体问题是我不知道是否实现游戏循环,这意 ...

  4. 以前一款半回合制java游戏_浅谈游戏的战斗方式分类:回合制,半回合制,即时制...

    游戏的分类很多,按照题材可分为动作.冒险.角色扮演.策略.模拟.音乐.休闲.体育等.今天聊一下传统的战斗方式分类: 回合制,半回合制,即时制. 1.回合制RPG:代表作品:仙剑奇侠传.轩辕剑等. 优点 ...

  5. 女主技能是鞭炮java游戏_五本女主怼人技能满分的言情小说推荐,全程嘴角疯狂上扬~...

    原标题:五本女主怼人技能满分的言情小说推荐,全程嘴角疯狂上扬~ 大家好,我是毛毛虫.今天给大家推荐女主嘴炮无敌,花式怼人,口舌犀利,伶牙俐齿,毒舌杠精的小说,一起来看看.五本女主怼人技能满分的言情小说 ...

  6. bg感_【0328】BG推文 | 5本我在逃生游戏里养娃娃+岁月缱绻已无你+关于我比女主苏这回事+消失的白月光又回来了等...

    大家多多支持原文! 以下内容多为网络搜集,非商业用途.版权归原作者所有,侵联! BG文 <我在逃生游戏里养娃娃>作者:鹤舫闲人 <岁月缱绻已无你>作者:酒爷 <关于我比女 ...

  7. java游戏男主黑化_男主黑化小说推荐,他偏执到疯狂隐忍到极致,可只爱你一人!...

    男主黑化小说推荐,他偏执到疯狂隐忍到极致,可只爱你一人! 1.<重生到七十年代后的生活> 作者:漫天星光 书评: 女主自强自立特别理性有思想,最开始男主在她刚穿过去时雷点,喜欢的是她的姐姐 ...

  8. 当硬核动作游戏《怪物猎人》变成了回合制RPG,还会那么好玩吗?

    CAPCOM 旗下动作狩猎游戏<怪物猎人>系列作为动作游戏盛享名气,不过也常常会有剧情面薄弱的批评声浪.但<怪物猎人>系列的本质终究是在动作狩猎怎样做得好玩,确实不适合太花心力 ...

  9. 小型策略类竞技游戏:完美世界(The Perfect World)重制计划

    = = 先说一下这个游戏是我在高一的寒假时期写的--当时刚熟悉C的一些语法然后就抱着"试试"的心态写了一发这个东西...现在回想起来整整26KB的代码真的是噩梦啊... 这个游戏最 ...

最新文章

  1. 在wpf中运行EXE文件
  2. Stuts2的struts.devMode设置成true后,不起作用,仍需要重启tomcat
  3. 文件保存,String与int转换。
  4. 2019-03-15-算法-进化(两数之和)
  5. php7改进,关注一下:PHP 7.3.7 正式发布 改进、修复的地方不少哦
  6. 信息学奥赛一本通 1039:判断数正负 | OpenJudge NOI 1.4 01
  7. Linux中使用sftp的常用命令
  8. 新概念英语(1-59)Is that all
  9. 电商项目--使用GitHub进行版本管理,完美衔接idea详细流程,Java初阶知识点,完整步骤
  10. ELK 学习笔记之 elasticsearch Bulk操作
  11. 北京飞马贸易借沟通CTBS实现总部与分公司同步做帐
  12. Qt实现名字的幸运大抽奖
  13. GRE阅读高频机经原文及答案之鸟叫研究
  14. 安卓运行linux命令mux,都能看懂的嵌入式linux/android alsa_aplay alsa_amixer命令行用法...
  15. 绝对差值和 —— 二分
  16. php修改浏览器地址,PHPstorm设置浏览器打开代码
  17. c++中获取蓝图组件_C++和蓝图
  18. 设 l í {a,b,c}* 是满足下述条件的符号串构成的语言,陇东学院《编译原理》练习题及答案...
  19. 使用数字芯片将5V转3.3V方案电路图
  20. qt android 浮动窗口,QT+ 状态栏+核心控件+浮动窗口

热门文章

  1. ondblclick
  2. 【BZOJ 2843】极地旅行社
  3. unoin all 和union 区别
  4. 美国大兵的二十二条军规
  5. 人事工作中的Python运用——批量劳动合同+实习协议
  6. 【Visual C++】游戏开发笔记四十二 浅墨DirectX教程之十 游戏输入控制利器:DirectInput专场
  7. SVHN街道实景门牌识别
  8. 如何正确使用机器学习中的训练集、验证集和测试集?
  9. 北京内推 | 微软亚洲研究院招聘模型压缩方向研究型实习生(可远程)
  10. Cascade RCNN论文翻译