1

私はJavaプログラミングの初心者で、じゃんけんゲームを作ろうとしていました。コメントが不足していることをお詫び申し上げます。

これは私のメインプログラムであり、他の2つのオブジェクトを呼び出します。

 import java.util.*;

  public class RPSMain extends RPSPlayer{
   RPSPlayer player = new RPSPlayer();
   RPSGame gameObject = new RPSGame ();
   public void main () {


     Random generator = new Random ();
     Scanner sc = new Scanner(System.in);
     System.out.print ("Number of Rounds: ");
     int rounds = sc.nextInt();


    //Call and process all of the methods found in RPSPlayer and RPSGame
     for (int i = 0; i < rounds; i++){
        player.makeThrow();
        gameObject.makeThrow();
        gameObject.announceWinner (compThrow, getPThrow);
     }
    //Final Output
     System.out.print (gameObject.bigWinner(winner, rounds));
  }
//accessor to return round to RPSGame
   public static int getRound (int round){
     this.round = round;
     return round;
  }
}

私の最初のオブジェクトは、プレーヤーが希望するスロー数を入力し、そこで処理される場所です。

  import java.util.*;

  public class RPSPlayer {

  public static void main (String args[]) {
     Random generator = new Random ();
     Scanner sc = new Scanner(System.in);
  }
//This method gets the throw, and loops if throw is not within 1 and 3
  public static int makeThrow (){
     Scanner sc = new Scanner (System.in);
     int playerThrow;
     do{
        System.out.print ("Enter your throw (1=Rock, 2=Paper, 3=Scissors)");
        playerThrow = sc.nextInt();
     } while (playerThrow > 3 && playerThrow < 1);
     return playerThrow;
  }

    //Accessor method
  public static int getThrow (int playerThrow){
    this.playerThrow = playerThrow;
     return playerThrow;
  }


 }

最後のオブジェクトは、すべての計算が行われる場所です。正しくコンパイルされない変数がたくさんあり、その理由がよくわかりません...

  import java.util.*;

 public class RPSGame extends RPSPlayer{
  RPSPlayer player = new RPSPlayer();
  RPSGame game = new RPSGame ();
  RPSMain mainRPS = new mainRPS();
   public static void main (String args[]) {

     Random generator = new Random ();
     Scanner sc = new Scanner(System.in);
     int rounds = mainRPS.getRound(rounds);
   }
   //Random Throw Generator
   public static int makeCompThrow (){
     int Max = 3;
     int Min = 1;

     int compThrow =   Min + (int)(Math.random() * ((Max - Min) + 1));
     return compThrow;
  }

   //  Get the throw from the player in RPSPlayer
       public static int getPlayerThrow (){
     RPSPlayer player = new RPSPlayer();
     int getPThrow = player.makeThrow();
     return getPThrow;
  }

 //Does all of the calculatoins and ouputs who threw what.
   public static int announceWinner (int compThrow, int getPThrow) {
     int winner = 0;

     if (getPThrow == 1){
        System.out.println ("Player throws ROCK.");
     }
     else if (getPThrow == 2){
        System.out.println ("Player throws PAPER.");
     }
     else if (getPThrow == 3){
        System.out.println ("Player throws SCISSORS.");
     }


     if (compThrow == 1){
        System.out.println ("Computer throws ROCK.");
     }
     else if (compThrow == 2){
        System.out.println ("Computer throws PAPER.");
     }
     else if (compThrow == 3){
        System.out.println ("Computer throws SCISSORS.");
     }

     if (getPThrow == compThrow){
        winner = 3;
     }
     else if (getPThrow == 1 && compThrow == 3){
        winner = 1;
     }
     else if (getPThrow == 1 && compThrow == 2){
        winner = 2;
     }
     else if (getPThrow == 2 && compThrow == 1){
        winner = 1;
     }
     else if (getPThrow == 2 && compThrow == 3){
        winner = 2;
     }
     else if (getPThrow == 3 && compThrow == 1){
        winner = 2;
     }
     else if (getPThrow == 3 && compThrow == 2){
        winner = 1;
     }  

     return winner;
   }

//Final Output with imported values of 'rounds' and 'winner'
   public int bigWinner (int winner, int rounds){
     int tie = 0;
     int playerWins = 0;
     int compWins = 0;

     if (winner == 1){
        playerWins = playerWins + 1;
     }

     else if (winner == 0){
        tie = tie + 1;
     }

     else if (winner == 3){
        compWins = compWins + 1;
     }
     System.out.println ("You win " +playerWins+ ". Computer wins " +(compWins)+ ".");
     if (playerWins > compWins){
        System.out.print ("You win!"); 
     }
     if (playerWins < compWins){
        System.out.print ("Computer wins!"); 
     }

     if (playerWins == compWins){
        System.out.print ("It's a tie!"); 
     }
     return tie;
  }


 }

再度コンパイルすると、WATTO Studiosの提案を追加した後、2つの新しいエラーが表示されます。これらはコンパイラエラーです。

RPSMain.java:23: cannot find symbol
symbol  : variable winner
location: class RPSMain
     RPSGame.bigWinner(winner, rounds);
                       ^
RPSMain.java:23: non-static method bigWinner(int,int) cannot be referenced 
from a static context
     RPSGame.bigWinner(winner, rounds);

RPSGameから参照している場合、変数「winner」が見つからないのはなぜですか。また、RPSMainで変数を検索しているのはなぜですか。

4

4 に答える 4

3

これらのエラーの場合、RPSMainクラスで、他のクラスの変数にアクセスしようとしています。ここにあなたのコード...

 for (int i = 0; i < rounds; i++){
    player.makeThrow();
    gameObject.makeThrow();
    gameObject.announceWinner (compThrow, getPThrow);
 }

実際にはこれである必要があります...

 for (int i = 0; i < rounds; i++){
    int playerThrow = player.makeThrow();
    int compThrow = gameObject.makeCompThrow();
    gameObject.announceWinner (compThrow, playerThrow );
 }

makeThrow()のようなメソッドを呼び出すときは、変数をキャプチャして呼び出すことに注意してくださいplayerThrow。これで、この変数をannounceWinner()メソッドで使用できます。compThrow変数についても同じです。

あなたはあなたのラインで同じことをしています-それは存在しないというRPSGame.bigWinner(winner, rounds);不平を言っています。winnerこれは真実です-winnerの変数ではなく、のRPSMain唯一の変数ですRPSGame-このように異なるクラス間で変数を共有することはできません。

メソッドは、実際の勝者を表すをgameObject.announceWinner()返します。intこの戻り値を使用する場合は、それを変数に取り込む必要があります。現在、このようなコードがありますRPGMain...

for (int i = 0; i < rounds; i++){
   int playerThrow = player.makeThrow();
   int compThrow = gameObject.makeCompThrow();
   gameObject.announceWinner (compThrow, playerThrow );
}
System.out.print (gameObject.bigWinner(winner, rounds));

intメソッドから返されたものを保持したい場合はannounceWinner()、次の調整を行ってキャプチャする必要があります...

for (int i = 0; i < rounds; i++){
   int playerThrow = player.makeThrow();
   int compThrow = gameObject.makeCompThrow();
   int winner = gameObject.announceWinner (compThrow, playerThrow );
   System.out.print (gameObject.bigWinner(winner, rounds));
}

これは、から返される値がクラスでgameObject.announceWinner()呼び出されるローカル変数に格納されることを示しています。次の行のメソッドで変数を使用しようとすると、値がわかります。winnerRPGMainwinnergameObject.bigWinner()

エラーを修正するnon-static method bigWinner(int,int) cannot be referenced from a static contextには、次の行を変更する必要があります...

public int bigWinner (int winner, int rounds){

このように、その中に単語を入れるためにstatic...

public static int bigWinner (int winner, int rounds){

または、さらに良いstaticことに、コード内のあらゆる場所から単語を削除します。Javaを初めて使用する場合、変数とメソッドを使用しようとすると、実際に必要なものよりも複雑になり、プログラムにstaticそれらを含める必要がある理由がわかりません。static

于 2012-05-19T04:55:45.820 に答える
1

compThrowgetPThrowはのローカル変数ですRPSGame。で使用することはできませんRPSMain。それらを使用する1つの方法は、これらをRPSMain引数としてメソッド呼び出しを介してに送信し、変数を再宣言しRPSMainてこれらを受け入れることです。

他のより好ましい解決策は、それらをクラス内の保護されたインスタンス変数にすることRPSPlayerです。そうすれば、それらは継承と継承の両方で利用できるようになりRPSGameますRPSMain

于 2012-05-19T05:00:47.863 に答える
0

メンタルノート:静的メソッドが多数あり、一部のクラスは完全に静的メソッドで構成されているようですが、クラスをインスタンス化して、オブジェクトインスタンスの一部であるかのようにメソッドを呼び出します。

一般に、静的メソッドを呼び出すときは、静的参照を使用する必要があります。

RSPGame.makeCompThrow();

これの代わりに

RSPGame game = new RSPGame().
game.makeCompThrow();

コンパイラの警告が生成されます。

于 2012-05-19T05:00:13.317 に答える
0

私はあなたのmakeThrow方法を選びます:

} while (playerThrow > 3 && playerThrow < 1);

1より小さい数、および&&3より大きい数はないため、ループすることはありません。

} while (playerThrow > 3 || playerThrow < 1);

3より大きいOR(||)1より小さいこれで、意図したとおりに機能するはずです。

于 2012-05-21T14:36:57.987 に答える