这是一个井字棋游戏的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