import java.util.Scanner;
/**
* 五子棋
*/
public class Gobang {
public static char[][] chessbord = {
{'┌','┬','┬','┬','┬','┬','┬','┬','┬','┐'},
{'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
{'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
{'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
{'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
{'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
{'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
{'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
{'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
{'└','┴','┴','┴','┴','┴','┴','┴','┴','┘',}
};
public static String separator = "────";
public static char pieceA='○';//玩家A的棋子
public static char pieceB='■';
public static int times = 0;//记录棋盘使用次数,偶数次玩家A落子,奇数次玩家B落子
public static void main(String[] args) {
// System.out.println("┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐");
// System.out.println("│ │ │ │ │ │ │ │ │ │ │");
// System.out.println("├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤");
// System.out.println("│ │ │ │ │ │ │ │ │ │ │");
// System.out.println("├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤");
// System.out.println("│ │ │ │ │ │ │ │ │ │ │");
// System.out.println("├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤");
// System.out.println("│ │ │ │ │ │ │ │ │ │ │");
// System.out.println("├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤");
// System.out.println("│ │ │ │ │ │ │ │ │ │ │");
// System.out.println("├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤");
// System.out.println("│ │ │ │ │ │ │ │ │ │ │");
// System.out.println("├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤");
// System.out.println("│ │ │ │ │ │ │ │ │ │ │");
// System.out.println("├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤");
// System.out.println("│ │ │ │ │ │ │ │ │ │ │");
// System.out.println("├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤");
// System.out.println("│ │ │ │ │ │ │ │ │ │ │");
// System.out.println("├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤");
// System.out.println("│ │ │ │ │ │ │ │ │ │ │");
// System.out.println("└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘");
//
// System.out.println("============================================================");
showChessBoard();
int totalPosition =chessbord.length*chessbord[0].length;
Scanner sc = new Scanner(System.in);
outer:
while(times<totalPosition){//交替落子
System.out.println(times%2==0 ? "请玩家A落子:":"请玩家B落子:");
char currentPiece = (times % 2 ==0) ? pieceA : pieceB;//当前使用的棋子
while(true){//保证落子成功的循环
//检测Scanner中是否有输入数据并且判断数据是否为整数,如果没有数据,就需要从控制台输入
if(sc.hasNextInt()){
int position = sc.nextInt();
if(position>=0&&position<totalPosition)
{
int row = position /chessbord.length;//位置除以棋盘数组的长度得到行号
int col = position %chessbord[0].length;
if(chessbord[row][col]==pieceA||chessbord[row][col]==pieceB)
{
System.out.println("非法落子,请重新选择落子的位置");
continue;
}
else{
chessbord[row][col]=currentPiece;
break;}
}else{
System.out.println("非法落子,请重新选择落子位置");
}
}
else
{
System.out.println("非法落子,请重新选择落子位置");
sc.next();//将Scanner中 存储的数据取出来防止死循环
}
}
//落子完成后棋盘需要重新展示
showChessBoard();
//获胜情况,一共四种
for(int i=0;i<chessbord.length;i++)
{
for(int j=0;j<chessbord[i].length;j++)
{
//第一种是水平方向上存在同一玩家的连续五颗棋子
//
boolean case1 = (j+4<chessbord[i].length)
&& chessbord[i][j]==currentPiece
&& chessbord[i][j+1]==currentPiece
&& chessbord[i][j+2]==currentPiece
&& chessbord[i][j+3]==currentPiece
&& chessbord[i][j+4]==currentPiece;
//第二种垂直方向连续五颗棋子
//
boolean case2 = (i+4<chessbord.length)//总行数
&& chessbord[i][j]==currentPiece
&& chessbord[i+1][j]==currentPiece
&& chessbord[i+2][j]==currentPiece
&& chessbord[i+3][j]==currentPiece
&& chessbord[i+4][j]==currentPiece;
//第三种:135度角上存在同一玩家的连续五颗棋子
//(i,j)(i+1,j+1)(i+2,j+2)(i+3,j+3)(i+4,j+4)
boolean case3 = (i+4<chessbord.length)
&& (j+4<chessbord[i].length)
&& chessbord[i][j] ==currentPiece
&& chessbord[i+1][j+1] ==currentPiece
&& chessbord[i+2][j+2] ==currentPiece
&& chessbord[i+3][j+3] ==currentPiece
&& chessbord[i+4][j+4] ==currentPiece;
//第四种:45度角上存在同一玩家的连续五颗棋子
//(i,j)(i-1,j+1)(i-2,j+2)(i-3,j+3)(i-4,j+4)
boolean case4 = (i>4)&&(j+4<chessbord[i].length)
&&chessbord[i][j]==currentPiece
&&chessbord[i-1][j+1]==currentPiece
&&chessbord[i-2][j+2]==currentPiece
&&chessbord[i-3][j+3]==currentPiece
&&chessbord[i-4][j+4]==currentPiece;
if(case1||case2||case3||case4){
System.out.println(times%2==0 ? "玩家A获得胜利":"玩家B获得胜利");
break outer;
}
}
}
//第一种是水平方向上存在同一玩家的连续五颗棋子
times++;
}
if(times==totalPosition){//说明棋盘已经用完还未分出胜负
System.out.println("平局");
}
}
public static void showChessBoard(){
System.out.println(" 0 1 2 3 4 5 6 7 8 9");
for(int i=0;i<chessbord.length;i++){//外层循环控制行
System.out.print(i+" ");
for(int j=0;j<chessbord[i].length;j++){
if(j==chessbord[i].length-1){System.out.print(chessbord[i][j]);}//使用print打印,不换行
else{System.out.print(chessbord[i][j]+separator);}
}
System.out.println();
if(i<chessbord.length-1){//排除最后一行
System.out.println(" │ │ │ │ │ │ │ │ │ │");
}
}
}
}
07-12
1306
08-19
435
11-20
1091