我是Java的新手,我正在尝试构建一个简单的TicTactoE-game。我创建了checkforWin方法来检查棋盘上不同组合的胜者,它似乎很管用,但似乎很麻烦,我不确定它是否被认为是“好的编码”。这是我的代码:
import java.util.*;
public class TicTacToeNeu {
static public char playerPiece = 'X';
static public char computerPiece = 'O';
static char[] [] board = {{'_','|','_','|','_'},
{'_', '|', '_','|','_'},
{' ','|',' ','|',' '}};
static boolean gameOver = false;
/**
* @param args
*/
public static void main(String[] args) {
Scanner imputScanner = new Scanner(System.in);
System.out.println("Would you like to start?"); // "Would you like to start (Yes/No)"
String firstImput = imputScanner.nextLine(); // input user
boolean playersTurn = start(firstImput);
if (!playersTurn) { //it's the computers turn first
int rand = (int) (Math.random() * 4); //random number between 0 and 3
switch (rand) {
case 0:
board[0][0] = computerPiece;
break;
case 1:
board[0][4] = computerPiece;
break;
case 2:
board[2][0] = computerPiece;
break;
case 3:
board[2][4] = computerPiece;
break;
}
playersTurn = true;
}
while(true) {
if(playersTurn) {
printBoard(board);
System.out.println("Give a number from 1 to 9");
int secondImput = imputScanner.nextInt();
playerMove(board, secondImput);
boolean playerWinner = checkforWin(board);
if(playerWinner == true) {
gameOver = true;
System.out.println("You won!");
}
}
else {
computerMove(board);
boolean computerWinner = checkforWin(board);
if(computerWinner == true && gameOver == false) {
System.out.println("Computer won!");
}
}
playersTurn = !playersTurn;
}
}
public static boolean checkforWin(char [] [] board) {
for(int r = 0; r < 3; r ++) {
//check horizontal winner
if(board[r][0] == 'X' && board[r][2] == 'X' && board[r][4] == 'X') {
return true;
}
else if(board[r][0] == 'O' && board[r][2] == 'O' && board[r][4] == 'O') {
return true;
}
}
// check vertical winner
for(int c = 0; c <= 4; c += 2 ) {
if(board[0][c] == 'X' && board[1][c] == 'X' && board[2][c] == 'X') {
return true;
}
else if(board[0][c] == 'O' && board[1][c] == 'O' && board[2][c] == 'O') {
return true;
}
}
//check diagonal winner X (player)
if(board[1][2]=='X') {
for(int x = 0; x <= board.length; x ++){
if((board[0][0] == 'X' && board[2][4]=='X')||(board[0][4]=='X'&&board[2][0]=='X')) {
return true;
}
}
}
else if (board[1][2]=='O') { //check diagonal winner O (computer)
for(int x = 0; x <= board.length; x ++){
if((board[0][0] == 'O' && board[2][4]=='O')||(board[0][4]=='O'&&board[2][0]=='O')) {
return true;
}
}
}
else {
return false;
}
return false;
}
// public static boolean validateImputUser(String imputUser) {
//
// Scanner in = new Scanner(System.in);
// imputUser = in.nextLine();
// while (imputUser.length() != 2) {
// return false;
// System.out.println("Geben Ihr Eingabe wieder");
// imputUser = in.nextLine();
// }
// return true;
// }
public static void computerMove(char [] [] board) {
char character = 'O';
int position = (int)(Math.random() * 9);
boolean result = validateMove(position, board); // controls open space on the board
while(!result) {
position = (int) (Math.random() * 9);
result = validateMove(position, board);
}
switch (position){
case 1:
board[0][0] = character;
break;
case 2:
board[0][2] = character;
break;
case 3:
board[0][4] = character;
break;
case 4:
board[1][0] = character;
break;
case 5:
board[1][2] = character;
break;
case 6:
board[1][4] = character;
break;
case 7:
board[2][0] = character;
break;
case 8:
board[2][2] = character;
break;
case 9:
board[2][4] = character;
break;
default:
break;
}
}
public static boolean validateMove(int position, char[][] board) {
switch (position){
case 1:
if(board[0][0] == '_'){
return true;
} else{
return false;
}
case 2:
if(board[0][2] == '_'){
return true;
} else{
return false;
}
case 3:
if(board[0][4] == '_'){
return true;
} else{
return false;
}
case 4:
if(board[1][0] == '_'){
return true;
} else{
return false;
}
case 5:
if(board[1][2] == '_'){
return true;
} else{
return false;
}
case 6:
if(board[1][4] == '_'){
return true;
} else{
return false;
}
case 7:
if(board[2][0] == ' '){
return true;
} else{
return false;
}
case 8:
if(board[2][2] == ' '){
return true;
} else{
return false;
}
case 9:
if(board[2][4] == ' '){
return true;
} else{
return false;
}
default:
return false;
}
}
public static void playerMove(char [] [] board, int position) {
char character = 'X';
boolean result = validateMove(position, board);
while(!result) {
System.out.println("Invalid");
System.out.println("Give a number between 1 and 9");
Scanner scan = new Scanner(System.in);
position = scan.nextInt();
result = validateMove(position, board);
}
switch (position){
case 1:
board[0][0] = character;
break;
case 2:
board[0][2] = character;
break;
case 3:
board[0][4] = character;
break;
case 4:
board[1][0] = character;
break;
case 5:
board[1][2] = character;
break;
case 6:
board[1][4] = character;
break;
case 7:
board[2][0] = character;
break;
case 8:
board[2][2] = character;
break;
case 9:
board[2][4] = character;
break;
default:
break;
}
}
public static boolean start (String imput) {
if(imput.equals("Yes")) {
return true;
}
return false;
}
public static void printBoard(char [] [] board) {
for(char [] row: board) {
for(char column: row) {
System.out.print(column);
}
System.out.println();
}
}
}
问题是将checkforWin方法拆分为两个方法是否更好,一个用于播放机,一个用于计算机。此外,我不知道使用和if-else语句来检查板子上的对角线胜利是否是个好主意,开始两个检查中心位置(板子[1][2])。每一个改进这部分代码的提示都将非常感谢。
问题的根本原因是您将数据模型与“可视化”“融合”了。用于计算游戏(棋盘)状态的数据结构不应与游戏的可视化方式相联系,即不应在每列的奇数点中有空格。
电路板需要为3×3阵列。为使其可视化而插入的任何空格都应添加到printboard
方法中。此外,电路板不需要char[][]
-您可以创建一个特殊的枚举
来表示x
、0
和未占用的单元格。除非你计划将游戏扩展到更大的网格,否则你也不需要一个循环来做对角线。
最后,通过观察位置1..9可以很容易地用/
和%
运算符解码成一行和列,您可以消除代码中的大多数switch
语句,如下所示:
int row = (position-1) / 3;
int col = (position-1) % 3;
我是Java的新手,我正在尝试构建一个简单的TicTactoE-game。我创建了checkforWin方法来检查棋盘上不同组合的胜者,它似乎很管用,但似乎很麻烦,我不确定它是否被认为是“好的编码”。这是我的代码: 问题是将checkforWin方法拆分为两个方法是否更好,一个用于播放机,一个用于计算机。此外,我不知道使用和if-else语句来检查板子上的对角线胜利是否是个好主意,开始两个检查中心
我正在创建一个固定大小的线程池,包含10个线程,如下所示: 现在,在生成10个线程之后,每个线程都会执行一个runnable。这里的Runnable由工厂提供。得到() 现在,我想做一件事,一旦一个线程被关闭,也就是说,它完成了一个任务,它就会再次选择另一个runnable并开始运行它。因此,基本上检查所有10个线程的状态,并在线程关闭时再次执行runnable。 我知道我可以这样做,在其中我可以
我有一个连接四个“板”,它是一个6*7的二维字符数组,填充了空格X或o。当在垂直、水平或对角线上有四个X或四个Os在一行中时,满足win条件。我已经成功地检查了垂直和水平的win条件,其中win字符通过如下所示的一些方法返回:
问题内容: 目前,我正在开发在8x8 2D阵列板上生成随机0和1的程序。我要做的是检查对角线上的所有数字是否都相同(从角开始,而不仅仅是对角线)。 例: 因此,如果偶然从左上角(0,0),(1,1)…(7,7)开始的所有数字均为0或1,那么我必须输出到扫描仪,指示“是0“的主要对角线(来自上面的示例)。 同样从该示例中,我们可以看到从右上角向左下角对角重复数字“ 1”,然后我还必须显示“有一个较小
请原谅长标题。StackOverflow不会接受较短的。 我试图在科特林制作一个井字游戏。到目前为止,除了对角线检查之外,一切都运行得非常好。 基本上, 函数的作用是创建一个矩阵,其中包含井字棋棋盘中的所有容器,然后检查棋盘的行,列和对角线值是否相等。如果检测到获胜者,该函数会将文本设置为“您获胜”。行和列检查工作正常,但是如果我在对角线上有3个X-s,则没有任何反应。 代码对我来说似乎很好,所以
我正在写一个井字游戏,“编码规则”的一部分是应该有一个“checkwin”函数来查看玩家是否赢了。我定义了两个名为“tttXArray”和“tttOArray”的变量,以查看一个玩家是否连续获得三个水平,垂直或对角线输入。这是以 tttXArray 为例放置的函数: Checkwin是time循环的一部分: 我得到的错误是: 问题是什么?