2016-04-26 4 views
0

現時点では、私は2つの異なるタイプのコンピュータプレーヤーとの打ち合わせとクロスゲームを行っています。ユーザーに再生するゲームの数を入力し、ランダムまたはシンプルなプレーヤーを再生したいと思っています。だから、whileループとif文をそれぞれ実装しました。しかし、if文のおかげで、私のp2はもはや変数に解決されなくなり、私はこれを回避する方法を知らない。どんな助けもありがとう。これは、エラーが発生したコードの主要部分のみです。p2はif文のために変数に解決できませんか?

public static void main(String[] args) 
{ 
    Scanner scan = new Scanner(System.in); 

    int Wins = 0; 
    int Loses = 0; 
    int Draws = 0; 

    System.out.println("To choose player type Random or Simple"); 
    String ChoosePlayer = scan.nextLine(); 

    System.out.println("Please enter the number of rounds you want to play:"); 
    int i = scan.nextInt(); 
    int Rounds = 0; 


while(Rounds < i){ 
    NCGridV3 theGrid = new NCGridV3(gridSize, gridSize); 
    GameRunnerV3 theGame = new GameRunnerV3(); 
    Scanner sc = new Scanner(System.in);  // only needed if we include human players 

    HumanPlayer p1 = new HumanPlayer(sc, theGame); 

    if(ChoosePlayer == "Simple"){ 
     SimpleComputerPlayer p2 = new SimpleComputerPlayer(); 
     p2.setMySymbol(SquareStatus.NOUGHT); 
     } 

    else if(ChoosePlayer == "Random"){ 
     RandomComputerPlayer p2 = new RandomComputerPlayer(); 
     p2.setMySymbol(SquareStatus.NOUGHT); 
     } 


    p1.setMySymbol(SquareStatus.CROSS); 

    System.out.println(INITIAL_INSTRUCTIONS); 


    NCPlayer nextToPlay = p1;  // arbitrary decision that p1 goes first 

    while (theGrid.getGameStatus() == GameStatus.STILLPLAYING) 
    { 
     GridCoordinate nextMove = nextToPlay.getNextMove(theGrid) ; 
     try 
     { 
      theGrid.setSquareStatus(nextMove.getRow(), nextMove.getCol(), nextToPlay.getMySymbol()); 
     } 
     catch (outOfRangeError e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     // take turns 
     if(nextToPlay == p1) 
      nextToPlay = p2; // possible problem here 
     else 
      nextToPlay = p1; 
+0

適切なIDEを使用して、コードを適切にフォーマットし、セミコラムと中括弧が欠落していないことを確認します。 – niyasc

答えて

0
if(ChoosePlayer == "Random"){ 
    RandomComputerPlayer p2 = new RandomComputerPlayer(); 
    p2.setMySymbol(SquareStatus.NOUGHT); 
} 

問題にこれらのプレイヤーの各クラスに共通のコードを入れて、あなたということです命令のブロックifの中にp2を定義してください。

変数は、定義された後、その変数が定義されているブロックの内部で使用できます。コンパイラがその命令ブロックの外にコードをコンパイルすると、p2は定義されなくなります。

したがって、それを共有するブロック(通常はメソッド本体またはクラスの属性として)にp2を定義し、そこで使用してください。もちろん、変数の型は、(この例では、それはSimpleComputerPlayerRandomComputerPlayer両方から実装/伸びるスーパークラス/インターフェースでなければならない可能な値の任意の逢引を可能にするようなものでなければならない。

ComputerPlayer p2 = null; <--- 
if (ChoosePlayer.equals("Simple")) { 
    p2 = new SimpleComputerPlayer(); 
} else if (ChoosePlayer.equals("Random")){{ 
    p2 = new RandomComputerPlayer(); 
} 

注常にp2に値を代入する必要があります。そうでない場合、式で使用しようとすると、式で初期化されていない値を使用できないため、コンパイラによってエラーが発生します。 ChoosePlayerSimpleでもRandomでもない場合はどうなりますか

また、私のJavaの変数と文字列(および他のオブジェクト)の比較を実行する方法...

0

共通インタフェースRandomComputerPlayerとSimpleComputerPlayer用/スーパークラスを作成しているかの/ elseブロックの外で変数を定義します。

ComputerPlayer p2; 
if(......) { 
    p2 = new SimpleComputerPlayer(); 
} else { 
    p2 = new RandomComputerPlayer(); 
} 
0

あなたは「P2」プレイヤーを表現するために2つの異なるクラスを使用しています。私は、次のことをお勧め: まず、次にabstract class ComputerPlayer

を作成し、ComputerPlayerを拡張するためにSimpleComputerPlayerRandomComputerPlayerを変更します。

その後、ステートメントあなたの場合には:

使用ComputerPlayer p2 = new SimpleComputerPlayer();

またはComputerPlayer p2 = new SimpleComputerPlayer();

ComputerPlayer