我创建了一个播放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();
}
}
答案 0 :(得分:0)
您将需要在machinemove()中添加一些逻辑(可能与won()函数中的类型相似),这样如果玩家可以进行游戏获胜移动就可以解决这个问题。如果将结果设置为布尔值,则可以使用条件逻辑来决定要播放的移动。
如果玩家尚未进行至少2次移动,则可以通过忽略检查来进一步简化/改进逻辑(因为获胜的移动需要在棋盘上有3个标记)。