井字棋:读入一个整数,表示井字棋棋盘的边长。判断其中是否存在某一方获胜,获胜的条件是存在整行或整列或整条对角线或整条反对角线上是相同的棋子。如果存在,则输出代表获胜一方字母:X或O(大写字母X或O);如果没有任何一方获胜,则输出平局。
———《Java语言程序设计-基础篇》习题7.9
package Tic-Tac-Toe;
import java.util.Scanner;
public class Ex7_9 {
//i表示行数,j表示列数
static int[][] x=new int[3][3];
static int[][] o=new int[3][3];
static int row;
static int rank;
//判断
public static boolean judge(int[][] m,int i,int j){
int num0=0;
int num1=0;
int num2=0;
int num3=0;
for(int l=0;l<3;l++){
//正对角线
if(i==j){
if(m[l][l]==1){
num0+=1;
}}
//反对角线
if(i==2-j){
if(m[l][2-l]==1){
num1+=1;
}}
//行
if(m[i][l]==1){
num2+=1;
}
//列
if(m[l][j]==1){
num3+=1;
}
}
if(num0==3||num1==3||num2==3||num3==3){
return true;
}
else
return false;
}
//输入位置
static void position(int[][] xo,int m,char player){
//记录玩家是o或x
//判断玩家
Scanner input=new Scanner(System.in);
System.out.print("玩家"+player+"输入行数:");
row=input.nextInt()-1;
System.out.print("玩家"+player+"输入列数:");
rank=input.nextInt()-1;
//判断该坐标上是否有棋子,如果有就重新输入,没有就赋值并输出
if(row>2||rank>2||row<0||rank<0){
System.out.println("行数列数必须为1到3之间整数,请重新输入");
position(xo,m,player);
}
else if(x[row][rank]+o[row][rank]>0){
System.out.println("坐标重复,请重新输入");
position(xo,m,player);
}
else{
xo[row][rank]=1;
printMap(); //调用方法打印棋盘
}
}
//打印棋盘
public static void printMap(){
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(x[i][j]==1)
System.out.print(" x |");
else if(o[i][j]==1)
System.out.print(" o |");
else
System.out.print(" |");
}
System.out.println("");
}
}
public static void main(String[] args){
boolean res=false;
char player;
//调用方法输入并判断胜利否
for(int i=1;i<10;i++){
int m=i%2;
//输入数值
if(m==0){
player='x';
position(x,m,'x');
res=judge(x,row,rank);//判断胜利否
}
else{
player='o';
position(o,m,'o');
res=judge(o,row,rank);}//判断胜利否
if(res){
System.out.println("玩家"+player+"获胜");
break;
}
else if(i==9){
System.out.println("平局");
}
}
}
}