0

いくつかの静的メソッドを使用して、このティック タック トゥ ゲームを作成しようとしています。私はまだこれに比較的慣れておらず、マウスクリックの全体像を完全に理解することはできません. mouseclick と mouseevent について読んだことがありますが、完全には意味がなく、それを試みると多くのエラーが発生します。もともと、独自のメソッドでマウス情報を取得する部分がありましたが、x 値と y 値の両方を返す方法がわかりませんでした。そのため、下の配列を埋めるメソッドを追加します。今、私はそれをいじり、独自の方法でそれらを取得することができましたが、プログラムの実行にはまだ問題があります。(それらは独自のメソッドである必要はありません。単純化できると思いました)このプログラムを実行すると、クリックした行と列を示す無限の行を印刷し、クリックするかどうかに関係なく、最初の行と最初の列に O を配置するだけです。また、プレイヤー間のターンの切り替えもないようです。誰かが私を助けることができれば、私はそれを大いに感謝します. ありがとう!

import java.util.*;
public class Game {

  public static int x;
  public static int y;
  public static double a;
  public static double b;
  public static int empty = 0;
  public static int Cross = 1;
  public static int Oh = -1;
  public static double[][] board = new double[3][3];
  public static int currentPlayer;
  public static int Point;


  public static void main (String args[]) {



    drawBoard();


    Fill();
  }

    public static void drawBoard(){
    StdDraw.setXscale(0,9);
    StdDraw.setYscale(0,9);
    StdDraw.setPenRadius(.01);
    StdDraw.setPenColor(StdDraw.BLACK);
    StdDraw.line(0,3,9,3);
    StdDraw.line(0,6,9,6);
    StdDraw.line(3,0,3,9);
    StdDraw.line(6,0,6,9);
  } //end draw board




  //get mouse click and turn into array spot
  public static void Mouse(){
    while(true){
      if (StdDraw.mousePressed()){
        a = StdDraw.mouseX();
        b = StdDraw.mouseY();
        System.out.println( a + " " + b);
      }



      //set column
      if ( 0<=a && a< 3){
        x =  0;}
      if ( 3<=a && a<6){
        x = 1;}
      if ( 6<=a && a< 9){
        x = 2;}
      //set row
      if ( 0<=b && b< 3){
        y = 0;}
      if ( 3<=b && b< 6){
        y = (int)1;}
      if ( 6<=b && b< 9){
        y = 2;}
      System.out.println("You clicked in Row" + x + "and column" +y);
    }
  }

      public static void Fill(){
      //fill array
        Mouse();
      boolean validInput = false;
      do{    
      for (int i = 0 ; i <=9 ; i++){
    if (i % 2 == 0){
          currentPlayer = Cross;
        }
        else {
          currentPlayer = Oh;
        }}
          if (0 <= x && x<=2 && 0 <=y && y <= 2 && board[x][y] == 0){

            //fill array spot
        board[x][y] = currentPlayer;
        //check game status and print board
        GameStatus();
        PrintBoard();
        validInput = true; //input is good, exit the loop
        }
        else { 
          System.out.println("This move is not valid. Try again.");
          }
      }while (!validInput);
    }














    public static void PrintBoard(){
  for (int j = 0; j<=2; j++){
    for (int k = 0; k<=2; k++){
      if (board[j][k] == 0){
        //do nothing leave empty
      }
      if (board[j][k] == 1){
        double l = ((j+1) * 3) - 1.5;
        double m = ((k+1) * 3) - 1.5;
        //print x
        StdDraw.text(l,m,"X");}
      if (board[j][k] == -1){
        double l = ((j+1) * 3) - 1.5;
        double m = ((k+1) * 3) - 1.5;
        //print O
        StdDraw.text(l,m,"O");}
    }
  }
    }


  public static void GameStatus(){
        //check for win
        if (// First column
            board[0][0] == currentPlayer
              && board[0][1] == currentPlayer
              && board[0][2] == currentPlayer
              //second column
              || board[1][0] == currentPlayer
              && board[1][1] == currentPlayer
              && board[1][2] == currentPlayer
              //third column
              || board[2][0] == currentPlayer
              && board[2][1] == currentPlayer
              && board[2][2] == currentPlayer
              //first row
              ||board[0][0] == currentPlayer
              && board[1][0] == currentPlayer
              && board[2][0] == currentPlayer
              //second row
              || board[0][1] == currentPlayer
              && board[1][1] == currentPlayer
              && board[2][1] == currentPlayer
              //third row
              || board[0][2] == currentPlayer
              && board[1][2] == currentPlayer
              && board[2][2] == currentPlayer
              //diagonal 1
              || board[0][2] == currentPlayer
              && board[1][1] == currentPlayer
              && board[2][0] == currentPlayer
              // diagonal 2
              || board[2][2] == currentPlayer
              && board[1][1] == currentPlayer
              && board[0][0] == currentPlayer){
          //X win
          while (currentPlayer==1){
            StdDraw.text(0.5, 0.5, "X Won!");}
          //O win
          while (currentPlayer==-1){
            StdDraw.text(0.5, 0.5, "O Won!");}
          return;
        }

        //draw
        if  (board[0][0] != 0 
               && board[0][1] != 0
               && board[0][2] != 0
               && board[1][0] != 0
               && board[1][1] != 0
               && board[1][2] != 0
               && board[2][0] != 0
               && board[2][1] != 0
               && board[2][2] != 0){
          StdDraw.text(0.5, 0.5, "Cat's Game!");
          return;}

        //still playing
        else {
          System.out.println("Keep Playing.");
          //keep playing
        }

  }//Ends playerMove

}// end game
4

2 に答える 2

0

まず、「while(true)」ステートメントがあります。これは無限ループであり、抜け出すように指示する何かが必要です。テキストのスパムが表示されるのはそのためです。

次に、「mousePressed」イベントを取得するために使用している StdDraw オブジェクトはどこにありますか? クリックしただけの場合は「MOUSE_CLICKED」イベントをお勧めしますが、mousePressed を使用したままでも、マウスが押されていない場合はそれが検出されていないことを確認する必要があります。

于 2016-11-02T23:28:28.553 に答える
0

Mouse() メソッドで無限ループを作成したため、行を出力し続け、if ステートメントの条件を毎秒何百万回もチェックします。

たとえば、gameLoop() と呼ばれる別のメソッドを作成し、gameLoop() 内から [慎重に構造化された] 他のすべてのメソッドを呼び出すことをお勧めします。

stdlib パッケージのドキュメントには、次のように記載されています。

[キーボードとマウスの入力] これらのメソッドは、マウスの現在の状態をポーリングする前に少し待機するアニメーション ループで使用する必要があります。

したがって、ゲームで次のようなことを試すことができます。

gameLoop() {
    isPlaying = true;
    drawBoard();
    ...;
    while (isPlaying) {
        isPressed = false;
        checkMousePressed();
        if (isPressed) {
            checkMove();
            ...;
        }  
        Thread.sleep(100); // 100 ms, so you repeat the loop 10 times/sec.
    }
    printWinner();
}

また、メソッド名には名詞ではなく動詞を使用することをお勧めします。したがって、メソッドが何をするか、つまりその目的を述べると、プログラムのロジックをたどりやすくなります。これを mouse() と呼ぶと、メソッドが何をするべきかが不明確になります。

于 2016-11-02T23:29:11.517 に答える