我不确定我是否能够以合理的方式表达它。
我正在尝试编写一个简单的非图形游戏。用户将对计算机进行骰子游戏。
(更具体地说,这个游戏:危险骰子游戏Pig的目标是成为第一个达到100分的玩家。每个玩家的回合包括反复掷骰子。每次滚动后,玩家面对两种选择:再次滚动或按住(拒绝再次滚动)。
我编写了程序,但现在我想以面向对象的方式完成它。这是我的问题:
我有一个抽象的Player类。 Human_player类和Computer_player类扩展了Player类。另一个名为Game_Controller的类控制着游戏的流程。假设Computer_Player有一定的策略,除非“初始总数”小于20,否则他会继续掷骰子(这意味着他处于某个循环中)。另一方面,Game_Controller只要他愿意,只要他愿意,就会继续为Computer_Player滚动骰子(这意味着程序的那一部分处于某个循环中)。因此,当Computer_Player滚动“1”时,Game_Controller将转向Human_Player。如何让Compter_Player结束他的循环?
此外,我很难将Computer_Player作为一个具体的播放器实现(因为我是编程新手,而且我在这种交互方面特别陌生)。处理这个问题的正确方法是什么?---也就是说,Game-Controller类与Computer_Player类交互,Computer_Player类与Game_Controller类交互。
感谢您节省时间。
编辑1:这类东西是否有良好的来源(网站,书籍)?我不是在寻找那些先进的游戏编程资源,只是简单而基本的东西。
答案 0 :(得分:3)
玩家可以是active
或inactive
。一旦他活跃,他必须做出roll()
或hold()
的决定。每个玩家都有一个制定这个决策过程的策略 - 一个人类玩家有策略,计算机玩家需要一个在代码中实现的策略。此策略可以提供方法:decide(int myScore, int oppenentsScorce)
并生成结果:滚动或不滚动。
Player
类可能如下所示:
public class Player {
enum Decision { ROLL, HOLD }
private Controller gameController;
public Player(Controller gameController) {
this.gameController = gameController;
}
// this is the real players strategy (-> Strategy pattern)
abstract Decision decide(int myScore, int opponentsScore);
// this method is called by the controller
public void doTurn() {
Decision decision = decide(gameController.getScore(this), gameControlle.getOpponentsScore(this);
if (decision == ROLL)
gameController.roll(this);
if (decision == HOLD)
gameController.hold(this);
}
}
HumanPlayer
子类可以打开人类玩家的对话框,显示实际结果并提供两个按钮:滚动/保持。 ComputerPlayers
实现将使用算法进行决策。
控制器控制游戏,滚动骰子并保持分数。如果有胜利者,控制器会在每次转弯后进行检查。
答案 1 :(得分:0)
如果Player公开了DoYouWantToThrow方法,具体类可以通过决定返回true或false来实现它。如果投掷结果为1,则游戏控制器根本不会调用此方法。对于任何其他值,计算得分并将问题呈现给玩家。如果玩家是人类玩家,则该方法向用户实施问题对话。对于计算机播放器,问题实现为一个看起来像这样的逻辑(伪代码)。
return
(self.TurnScore < 20) or // Always throw again if under 20.
(self.Bravery <= 1 and self.TurnScore < 25) or // Scared
(self.Bravery = 2 and self.TurnScore < 40) or // Moderate
(self.Bravery = 3 and self.TurnScore < 70) or // Gambler
(self.Bravery = 4); // All or nothing
因此计算机播放器实际上没有循环。只询问是否要再次投掷。循环实际上在游戏控制器中,如果投掷结果为1或ThrowAgain返回False或最后一次投掷使玩家达到100,则该循环被破坏。在该示例中,我添加了一些简单的勇敢程度。你也可以添加一些随机性,但实质是相同的:计算机只决定是再次投掷还是交出。循环在游戏控制器中。