-6

私は現在、4 人のプレイヤーが交代で 3 枚のコインを投げるプログラムを作成しています。最初に 16 ポイントを獲得したプレイヤーが勝利します。プレイヤーはコインを投げるたびにポイントを獲得します。彼が獲得するポイントの数は、トスした表の数と同じです。彼が表を投げない場合、彼は次のターンに負けます。彼が 3 回表を裏返すと、追加のターンを獲得し、再びコインをトスします。投げた表が 3 未満の場合は、次のプレーヤーの番です。プレーヤーが勝つには、ちょうど 16 ポイントを獲得する必要があります。プレーヤーが 14 点を持っていて 2 回表を投げた場合、そのプレーヤーは勝ちますが、n回表を投げて 16 点を超えた場合、そのプレーヤーは点数の半分を失い、自分の番も失います。彼が勝つにはちょうど 16 ポイントが必要です。

プレーヤーを次のターンにスキップするにはどうすればよいですか? 各プレイヤーは現在順番に進んでいます。元。トム、ハンク、ハンナ、ティナ。ハンクが 0 の表または 16 ポイントを超えた場合、ハンクは次のターンに負け、トム、ハンナ、ティナ、トム、ハンク、ハンナ、ティナの順になります。コードを投稿しましたが、ニーズに合わせて nextPlayer() メソッドを編集する方法を理解する必要があります。computerState() メソッドで行ったロジックとコードは、LOSE_TURN に対して正しいと思います。どんな助けでも大歓迎です。

ゲームクラス

import java.util.Random;

    public class Game
    {
      private Random randomizer;
      private final int n_players;
      private final int m_coins;
      private final int p_points;
      private int player_index;
      private boolean game_over;

      public Game()
      {
        n_players = 4;
        m_coins = 3;
        p_points = 16;
        game_over = false;
        randomizer = new Random();
        player_index = randomizer.nextInt(n_players);
      }

      public Game(int new_m_coins, int new_n_players, int new_p_points)
      {
          n_players = new_n_players;
          m_coins = new_m_coins;
          p_points = new_p_points;
          game_over = false;
          randomizer = new Random();
          player_index = randomizer.nextInt(n_players);
      }

      public int getPlayerIndex()
      {
          return player_index;
      }

      public void setPlayerIndex()
      {
          player_index = randomizer.nextInt(n_players);
      }

      public boolean gameOver()
      {

          return game_over;

      }

      public int nextPlayer(Player[] players)
      {
          //player_index = (player_index + 1) % n_players;

          if(players[player_index].getState() == State.EXTRA_TURN)
          {
             players[player_index].setState(State.NORMAL);
          }
          else if(players[player_index].getState() == State.LOSE_TURN)
          {
              player_index = (player_index + 1) % n_players;

          }
          else
          {
              player_index = (player_index + 1) % n_players;
          }

          /*while(players[player_index].getState() != State.NORMAL)
          {
              players[player_index].setState(State.NORMAL);
              player_index = (player_index + 1) % n_players;
          }*/
          return player_index;
      }
      public void computeState(Player player, int m_heads, int oldPoints, int newPoints)
      {

            int player_points = player.getPoints();

            if(player_points == p_points)
                game_over = true;
            else if(player_points > p_points)
            {
                player.setPoints(player_points / 2);
                player.setState(State.LOSE_TURN);
            }
            else if(m_heads == 0)
            {
                player.setState(State.LOSE_TURN);
            }
            else if(m_heads == 3)
            {
                player.setState(State.EXTRA_TURN);
            }
            else if(m_heads == 3 && player_points > p_points)
            {
                player.setState(State.NORMAL);
            }
            else
                player.setState(State.NORMAL);

      }
    }

テストコインゲーム

public class testcoingame
{
  public static void main(String[] args)
  {
     try
     {
      int m_coins = 3;
      int n_players = 4;
      int p_points = 16;
      String [] names = {"Hank", "Tina", "Hannah", "Tom"};
      Player [] players = new Player[n_players];

      for(int index = 0; index < players.length; index++)
        players[index] = new Player(names[index]);

      Coins coins = new Coins();
      Game game = new Game();
      int player_index;
      do
      {
          player_index = game.nextPlayer(players);
          System.out.printf("It is %s's turn\n", players[player_index].getName());
          System.out.printf("%s has %d points\n", players[player_index].getName(),
          players[player_index].getPoints());

          coins.tossCoins();
          int n_heads = coins.getNHeads();
          System.out.printf("%s tossed %d heads\n",
          players[player_index].getName(), n_heads);

          int old_points = players[player_index].getPoints();
          int new_points = old_points + n_heads;
          players[player_index].setPoints(new_points);
          game.computeState(players[player_index], n_heads, old_points, new_points);
          System.out.printf("%s has %d points\n", players[player_index].getName(),players[player_index].getPoints());
       }
      while(!game.gameOver());
      System.out.printf("%s wins!\n", players[player_index].getName());
     }
     catch(Exception ex)
     {
     }
  }
}
4

1 に答える 1

2

Player Classプレイヤーが次のターンをスキップするかどうかを追跡するブール型のインスタンス変数を に含めることができます。その値が true か false かを確認し、true と評価されたら (つまり、はい、彼女は自分のターンをスキップします)、ターンに対して通常行うことをスキップしますが、移動する前にブール値を false に設定します。次へ、PlayerまたはTurnあなたは何を持っていますか。

編集 (ユーザーの応答に基づく): 疑似コード: 配列やリスト、またはそれに匹敵するものを介して、誰の番になるかを追跡していると思います。これを playerList と呼びます。たとえば、プレイヤーが 3 人いる場合、 、 、 をループしplayerList[0]続けplayerList[1]ますplayerList[2]

while (gameNotOver())
{
    if (!playerList[currentPlayer].skipNextTurn())
    {
        //do what you would normally do
    }
    else
    {
        playerList[currentPlayer].setSkipNextTurn(false);
    }
}
于 2013-05-14T13:43:09.633 に答える