Java 2D回合制游戏编程:处理每个玩家的2次鼠标点击

3

假设我正在使用Java的Swing开发一个类似于国际象棋的程序。我添加了一个MouseListener来处理用户输入。为了移动棋子,用户必须点击有效的棋子,然后再点击有效的位置。在一回合中,跟踪这2次鼠标点击的最佳方法是什么?我考虑使用某种变量来记录是否是回合的第一次或第二次点击。


只是一个奇怪的想法,也许可以在第一次点击后更改处理程序/监听器(无论它是如何工作的),以便专门处理第二次点击(并在第二次点击后再次更改处理程序)。在我的脑海中,这种方法似乎很优雅。 - NomeN
2个回答

5
您需要区分两个游戏状态,使用变量是可以的。您也可以像NomeN评论中建议的那样考虑一些东西,并通过交换它们来使用两个不同的监听器。
您的情况非常简单,但通常您用于处理这些事情的形式主义是一种描述游戏状态及其如何从一个状态转移到另一个状态的有限状态机。
在这种情况下,您可以有一些状态,例如:
- 玩家1回合 - 玩家2回合 - 主屏幕 - 暂停屏幕 - 选项屏幕
您可以决定何时以及如何从一个状态转移到另一个状态,例如:
- 玩家1移动后,您会进入玩家2回合 - 玩家2移动后,您会回到玩家1回合 - 游戏开始时,您进入主屏幕 - 如果您开始新游戏,则进入玩家1回合 - 如果您在游戏中按暂停键,则从回合转到暂停屏幕,关闭后返回之前暂停的回合
这只是给您一个想法,因此例如您的MouseListener可能会关注状态:
enum State { TURN_P1, TURN_P2, MAIN, PAUSE, ... }
public State gameState
...

public void mouseClicked(MouseEvent e)
{
  if (gameState == TURN_P1)
  {
    ...

    if (move_is_legal and so on)
      gameState = TURN_P2;
  }
  else if (gameState == TURN_P2)
  {
    ...

    if (move_is_legal and so on)
      gameState = TURN_P1;
  }
}

感谢Jack的回复。使用一个变量来保存游戏状态似乎是正确的方法。 - Humberto Pinheiro
1
原来有限状态机就是这样的。一直以来,我以为它是某种神奇的计算机科学概念,但实际上我自己已经使用并运用了这种方法很长时间了,只是没有意识到而已。 - Callum Rogers

2

抱歉,我回答得太快了。是的,需要一个结构来编码点击位置,查找介于其中的运动事件,然后记录第二个点击。它应该有一个初始化状态、一个接受状态,并且可能还需要记录一个中止状态(例如按下 ESC 键)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接