Tic Tac Toe阻止获胜的举动

时间:2015-12-07 21:25:47

标签: java

我创建了一个播放tic tac toe的程序。到目前为止,玩家和机器只是来回播放。我需要帮助创建一个方法,使机器播放器阻止一个成功的举动。我知道我需要检查是否有2个X在行,列或对角线中。我该怎么做呢?

任何帮助将不胜感激。仍然是编码的初学者。

以下是代码:

import java.util.Scanner;
import java.io.PrintStream;
import java.util.Random;


public class TicTacToe
{
    static Scanner stdin = new Scanner( System.in);
    static PrintStream stdout = System.out;
public static void main(String[] arg) 
{
  Board bd = new Board();
  char currentPlayer = 'X';

  while(true) {
    getmove(bd, currentPlayer); //puts move on the board
    bd.print();

    if( bd.won(currentPlayer)) {
      stdout.printf("Player %c has won!\n", currentPlayer);
      return; //end main
    }

    if( bd.done()) {
      stdout.println("Stalemate!");
      return;
    }

    if( currentPlayer == 'X')
      currentPlayer = 'O';
    else
      currentPlayer = 'X';
  }
}

static void getmove( Board bd, char player) {
  if( player == 'X') {
    usermove(bd);
  } else {
    machinemove(bd);
  }
}

static Random r = new Random(99);

static void machinemove(Board bd) {
  int row = r.nextInt(3);
  int col = r.nextInt(3);

  while( !bd.play(row, col, 'O')) {
    row = r.nextInt(3);
    col = r.nextInt(3);
  }
}

static void usermove(Board bd) {
  int row = getpos("row (1,2,3): ");
  int col = getpos("col (1,2,3): ");

  while( !bd.play(row, col, 'X')) {
    stdout.println("Cannot play on non-blank location!");
    row = getpos("row (1,2,3): ");
    col = getpos("col (1,2,3): ");
  }

}

static int getpos(String prompt) {
  int i;

  stdout.print(prompt);

  try {
    i = stdin.nextInt();
  }
  catch( Exception e) {
    return getpos(prompt);
  }

  if( 1 <= i && i <= 3)
    return i - 1; //our coords in range 0..2

  return getpos(prompt);
}
}




class Board {
  char[][] b;
  int moves;

  boolean done() {
    return moves == 9;
  }

  boolean won(char p) { //either 'X' or 'O'
    for( int i = 0; i < 3; ++i)
      if( (eq(i,0,p) && eq(i,1,p) && eq(i,2,p)) ||
          (eq(0,i,p) && eq(1,i,p) && eq(2,i,p))
      ) return true;
    if( (eq(0,0,p) && eq(1,1,p) && eq(2,2,p)) ||
        (eq(0,2,p) && eq(1,1,p) && eq(2,0,p))
    ) return true;
    return false;
  }

  private boolean eq(int i, int j, char p) {
    return b[i][j] == p;
  }

  Board() {
    b = new char[3][3];
    for( int r = 0; r < 3; ++r)
      for( int c = 0; c < 3; ++c)
        b[r][c] = ' ';
  }

  boolean play(int row, int col, char p) {
    if( b[row][col] == ' ') {
      b[row][col] = p;
      ++moves;
      return true;
    } else return false;
  }

  void print() {
    System.out.println();
    System.out.printf( " %c | %c | %c \n", b[0][0], b[0][1], b[0][2]);
    System.out.println("-----------");
    System.out.printf( " %c | %c | %c \n", b[1][0], b[1][1], b[1][2]);
    System.out.println("-----------");
    System.out.printf( " %c | %c | %c \n", b[2][0], b[2][1], b[2][2]);
    System.out.println();
  }
}

1 个答案:

答案 0 :(得分:0)

您将需要在machinemove()中添加一些逻辑(可能与won()函数中的类型相似),这样如果玩家可以进行游戏获胜移动就可以解决这个问题。如果将结果设置为布尔值,则可以使用条件逻辑来决定要播放的移动。

如果玩家尚未进行至少2次移动,则可以通过忽略检查来进一步简化/改进逻辑(因为获胜的移动需要在棋盘上有3个标记)。