3


0

Java 2Dターンベースのゲームプログラミング:プレーヤーごとに2回のマウスクリックを処理する

したがって、JavaのSwingを使用してチェスのようなプログラムを開発しているとします。 ユーザー入力を処理するMouseListenerを追加しました。 移動するには、ユーザーは有効なピースをクリックしてから、有効な場所をクリックする必要があります。 順番に2回のマウスクリックを追跡する最良の方法は何ですか? ある種の変数を使用して、ターンの最初のクリックか2番目かを記録することを考えています。

2 Answer


5


2つのゲームの状態を区別する必要があります。変数を使用することは問題ありません。 また、NomeNコメントで示唆されているように何かを考え、それらを交換することで2つの異なるリスナーを使用することもできます。

あなたのケースは非常に単純ですが、一般にこれらのことを処理するために使用する形式は、ゲームの状態と、ある状態から別の状態への移行方法を記述する一種の「有限状態マシン」です。

この場合、次のような状態になります。

  • プレイヤー1ターン

  • プレイヤー2ターン

  • メインスクリーン

  • 一時停止画面

  • オプション画面

そして、ある状態から別の状態に渡す方法とタイミングを決定します。たとえば、

  • player1が移動した後、player2ターンにパスします

  • player2が移動した後、player1ターンに戻ります

  • ゲームが開始すると、メイン画面に移動します

  • 新しいゲームを始めたら、player1ターンに行きます

  • ゲーム中に一時停止キーを押すと、ターンから一時停止画面に移動します 閉じたら、一時停止する前のターンに戻ります

これは単にアイデアを提供するためのものであるため、たとえば、 `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;
  }
}


2


おっと、私はあまりにも早く答えました。 はい、クリック位置をエンコードし、介在するモーションイベントを探し、2回目のクリックを記録する構造です。 開始状態、受け入れ状態が存在する必要があり、おそらく中止状態を記録する必要があります(ESCを押した可能性があります)。