井字棋:
判断其中是否存在某一方获胜,获胜的条件是存在整行或整列或整条对角线或整条反对角线上是相同的棋子。如果存在,则输出代表获胜一方字母:X或O(大写字母X或O);如果没有任何一方获胜,则输出平局。
主要思路:
将棋盘看做一个对象,将下棋的人,看做是两个属性,不论人怎么下,改变的是棋盘的状态,所以只需要维护好棋盘的状态就行,至于怎么判断是谁下,用一个静态常亮表示
//代码如下
//井字棋游戏
import java.util.Scanner; //输入
import javax.swing.JOptionPane; //窗口组件---不用管
class Exp_Game
{
//静态成员可以不用实例化,就可以在类中的任意位置使用
private static char[][] table = new char[3][3]; //棋盘
final static int player1 = 0; //玩家1 用O
final static int player2 = 1; //玩家2 用X
//主函数
public static void main(String[] args){
Scanner input = new Scanner(System.in);
initTable(); //初始化棋盘
int host = player1; //下棋者
do{
++host;
host %= 2;
drawTable();
System.out.println((host == player1 ? "player1" : "player2")
+ "---" + (host == player1 ? "O" : "X")
+ ", 输入位置(,):");
System.out.printf("Row:");
int i = input.nextInt();
System.out.printf("Col:");
int j = input.nextInt();
write(host, i - 1, j - 1);
if(judge(host)) //如果赢得比赛,就打印棋盘状态
drawTable();
}while(!judge(host));
//if(host == player1)
JOptionPane.showMessageDialog(null, (host == player1 ? "player1" : "plaer2")
+ "赢得了比赛", "TIP", JOptionPane.INFORMATION_MESSAGE);
}
//初始化棋盘
public static void initTable()
{
for(int i = 0; i < table.length; ++i)
for(int j = 0; j < table[i].length; ++j)
table[i][j] = ' ';
}
//画棋盘
public static void drawTable(){
for(int i = 0; i < table.length; ++i){
for(int j = 0; j < table[i].length; ++j)
System.out.printf("| %c", table[i][j]);
System.out.printf("|\n");
System.out.println("|--|--|--|-");
}
}
//下棋
public static void write(int player, int i, int j){
Scanner input = new Scanner(System.in);
if(i < 0 || j < 0 || i >= 3 || j >= 3
|| table[i][j] == 'O' || table[i][j] == 'X'){
System.out.println("输入错误!");
do{
System.out.println(">>>请重新输入位置!");
System.out.println("Enter row:");
i = input.nextInt();
System.out.println("Enter col:");
j = input.nextInt();
}while(i < 0 || j < 0 || i >= 3 || j >= 3
|| table[i][j] == 'O' || table[i][j] == 'X'); //不能越界且不能在已有位置下
}
//判断是谁在下
table[i][j] = (player == player1) ? 'O' : 'X';
}
//判断下了(i,j)位置之后, 棋盘的状态是否是一个赢的状态 -- 要传入是谁在下
public static boolean judge(int play){
char ch;
if(play == player1)
ch = 'O';
else
ch = 'X';
int row = 0;
int col = 0;
int line_main = 0; //主对角线
int line_sub = 0; //次对角线
for(int i = 0; i < 3; ++i){
//检查主对角线
if(table[i][i] == ch)
line_main++;
//检查次对角线
if(table[i][2 - i] == ch)
line_sub++;
}
//检查行
for(int i = 0; i < 3; ++i){
for(int j = 0; j < 3; ++j) //每一行
if(table[i][j] == ch)
row++;
if(row == 3)
break;
else
row = 0; //统计下一行前先将row归为0
}
//同理检查列
for(int i = 0; i < 3; ++i){
for(int j = 0; j < 3; ++j)
if(table[j][i] == ch)
col++;
if(col == 3)
break;
else
col = 0; //同理
}
if(row == 3 || col == 3 || line_main == 3 || line_main == 3)
return true;
else
return false;
}//end of judge
}//end of class