这是一个井字棋游戏的java实现。摘录于stackoverflow。
游戏规则很简单,只要一方棋子在水平线,垂直线或者对角线任意一条线上排列成功即为获胜。
作者原先的代码存在着一些问题:
代码如下:
一共有几个类: play, player, human, computer, set
Play类:
import java.util.Scanner; public class play { public static void main(String[] args) { System.out.println("Welcome to Tickle Tackle Toe!!! :D"); System.out.println(); //creat markers String marker1 = "x"; String marker2 = "o"; boolean playAgain = true; Scanner s = new Scanner(System.in); //create player objects Human human = new Human(); Computer computer = new Computer(); while(playAgain){ //run board setup set Setup = new set(); Setup.createBoard(); Setup.printBoard(); System.out.println("please choose your marker"); System.out.println("type 1 for 'x' or 2 for 'o'"); //set markers if(s.nextInt() == 1){ // create player objects human.setMarker("x"); computer.setMarker("o"); } else { human.setMarker("o"); computer.setMarker("x"); } // determine who goes first int first = (int) (Math.random() * 2); boolean won = false; int turns = 0; if(first == 0){ System.out.println("You go first!"); System.out.println(); while(!won){ human.takeTurn(Setup.getBoard()); turns++; Setup.printBoard(); if(Setup.hasWon(Setup.getBoard())){ won = true; System.out.println("Congrats you won!"); } if(turns == 9){ won = true; System.out.println("Its a draw!"); break; } if(!won){ computer.takeTurn(Setup.getBoard(), human); turns++; System.out.println(); Setup.printBoard(); System.out.println(); if(Setup.hasWon(Setup.getBoard())){ won = true; System.out.println("You lost!"); } if(turns == 9){ won = true; System.out.println("Its a draw!"); break; } } } // close while 1 } else { System.out.println("Computer goes first!"); System.out.println(); while(!won){ computer.takeTurn(Setup.getBoard(), human); turns++; Setup.printBoard(); if(Setup.hasWon(Setup.getBoard())){ won = true; System.out.println("You lost!"); } if(!won){ human.takeTurn(Setup.getBoard()); turns++; System.out.println(); Setup.printBoard(); System.out.println(); if(Setup.hasWon(Setup.getBoard())){ won = true; System.out.println("Congrats you won!"); } } } // close while 2 } System.out.println("Would you like to play again? Type 1 for yes or 2 to quit"); System.out.println(); if(s.nextInt() == 2){ playAgain = false; } } } }
Player类
public class player { public String Marker; // set marker method public void setMarker(String marker){ Marker = marker; } //get marker method public String getMarker(){ return Marker; } }
棋局Set类:
import java.util.Random; import java.util.Scanner; public class set { // setup variables default board size and board private int N = 3; public String[][] board = new String [N][N]; public boolean hasWon (String [] [] board){ //horizontal for(int i = 0; i<3; i++){ if(board[i][0].equals(board[i][1]) && board[i][1].equals(board[i][2])){ return true; } } //vertical for(int i = 0; i<3; i++){ if(board [0][i].equals(board[1][i]) && board[1][i].equals(board[2][i])){ return true; } } //diagonal if(board[0][0].equals(board[1][1]) && board[1][1].equals(board[2][2]) || board[2][0].equals(board[1][1]) && board[1][1].equals(board[0][2])) return true; return false; } int x = 1; public void createBoard(){ for(int i = 0; i < board.length; i++){ for(int j = 0; j < board.length; j++){ board[i][j] = "" + (x); x++; } } } public void printBoard(){ for(int i = 0; i < board.length; i++){ for(int j = 0; j < board.length; j++){ System.out.print("[" + board[i][j] + "]" + " "); } System.out.println(); } } public String[][] getBoard(){ return board; } }
Computer类
class Computer extends player { public Computer(){ } int boardsize = 3; public void takeTurn(String[][] board, Human human) { int vertical = 0; int horizontal = 0; int diagonal = 0; boolean mademove = false; // check if you can take a win horizontally for(int i = 0; i<3; i++){ if(board[0][i].equals(board[1][i]) && board[0][i].equals(Marker)){ if(board[2][i] != human.getMarker()){ board[2][i] = Marker; mademove = true; return; } } } for(int i = 0; i<3; i++){ if(board[2][i].equals(board[1][i]) && board[2][i].equals(Marker)){ if(board[0][i] != human.getMarker()){ board[0][i] = Marker; mademove = true; return; } } } // check if you can take a win vertically for(int i = 0; i<3; i++){ if(board[i][0].equals(board[i][1]) && board[i][0].equals(Marker)){ if(board[i][2] != human.getMarker()){ board[i][2] = Marker; mademove = true; return; } } } for(int i = 0; i<3; i++){ if(board[i][2].equals(board[i][1]) && board[i][2].equals(Marker)){ if(board[i][0] != human.getMarker()){ board[i][0] = Marker; mademove = true; return; } } } // check if you can take a win diagonally if(board[0][0].equals(board[1][1]) && board[0][0].equals(Marker)){ if(board[2][2] != human.getMarker()){ board[2][2] = Marker; mademove = true; return; } } if(board[2][2].equals(board[1][1]) && board[2][2].equals(Marker)){ if(board[0][0] != human.getMarker()){ board[0][0] = Marker; mademove = true; return; } } if(board[0][0].equals(board[1][1]) && board[0][0].equals(Marker)){ if(board[2][2] != human.getMarker()){ board[2][2] = Marker; mademove = true; return; } } if(board[0][2].equals(board[1][1]) && board[0][2].equals(Marker)){ if(board[2][0] != human.getMarker()){ board[2][0] = Marker; mademove = true; return; } } if(board[2][0].equals(board[1][1]) && board[2][0].equals(Marker)){ if(board[0][2] != human.getMarker()){ board[0][2] = Marker; mademove = true; return; } } // BLOCKS!!!! // // check if you can block a win horizontally for(int i = 0; i<3; i++){ if(board[0][i].equals(board[1][i]) && board[0][i].equals(human.getMarker())){ if(board[2][i] != Marker){ board[2][i] = Marker; mademove = true; return; } } } for(int i = 0; i<3; i++){ if(board[2][i].equals(board[1][i]) && board[0][i].equals(human.getMarker())){ if(board[0][i] != Marker){ board[0][i] = Marker; mademove = true; return; } } } // check if you can block a win horizontally for(int i = 0; i<3; i++){ if(board[i][0].equals(board[i][1]) && board[i][0].equals(human.getMarker())){ if(board[i][2] != Marker){ board[i][2] = Marker; mademove = true; return; } } } for(int i = 0; i<3; i++){ if(board[i][2].equals(board[i][1]) && board[i][2].equals(human.getMarker())){ if(board[i][0] != Marker){ board[i][0] = Marker; mademove = true; return; } } } // check if you can block a win diagonally if(board[0][0].equals(board[1][1]) && board[0][0].equals(human.getMarker())){ if(board[2][2] != Marker){ board[2][2] = Marker; mademove = true; return; } } if(board[2][2].equals(board[1][1]) && board[2][2].equals(human.getMarker())){ if(board[0][0] != Marker){ board[0][0] = Marker; mademove = true; return; } } if(board[0][0].equals(board[1][1]) && board[0][0].equals(human.getMarker())){ board[2][2] = Marker; mademove = true; return; } if(board[0][2].equals(board[1][1]) && board[0][2].equals(human.getMarker())){ if(board[2][0] != Marker){ board[2][0] = Marker; mademove = true; return; } } if(board[2][0].equals(board[1][1]) && board[2][0].equals(human.getMarker())){ if(board[0][2] != Marker){ board[0][2] = Marker; mademove = true; return; } } // make random move if above rules dont apply for(int i = 0; i<3; i++){ if(board[i][0] != "x" && board[i][0] != "o"){ board[i][0] = Marker; return; } } for(int i = 0; i<3; i++){ if(board[i][1] != "x" && board[i][0] != "o"){ board[i][1] = Marker; return; } } for(int i = 0; i<3; i++){ if(board[i][2] != "x" && board[i][0] != "o"){ board[i][2] = Marker; return; } } } }
Human类
import java.util.Scanner; class Human extends player { public Human(){ } public void takeTurn(String[][] board) { Scanner s = new Scanner(System.in); boolean turn = true; while(turn){ System.out.println("please enter row"); int row = s.nextInt(); System.out.println("please enter col"); int col = s.nextInt(); System.out.print("you entered "+row+" "+col); System.out.println(); if(board[row - 1][col - 1] != "x" && board[row - 1][col - 1] != "o"){ board[row - 1][col - 1] = Marker; turn = false; } // closes if else { System.out.println("Already Marker here! please guess again!"); } } // ends while } // ends method } // ends class
这段代码需要进一步调试。摘录此仅供参考。
原文出处:https://stackoverflow.com/questions/10645381/tictactoe-ai-java