import java.util.*;
class GoBang {
char[][] chessboard; // 创建全局二维数组
// 构造棋盘
public GoBang() {
chessboard = new char[15][15];
for (int i = 0; i < chessboard.length; i++) {
for (int j = 0; j < chessboard.length; j++) {
chessboard[i][j] = '+';
}
}
}
// 打印棋盘
void printBoard() {
for (int i = 0; i < chessboard.length; i++) { // 遍历二维数组 打印当前状态棋盘
for (int j = 0; j < chessboard.length; j++) {
System.out.print(chessboard[i][j] + " ");
}
System.out.println();
}
}
//统计棋子个数
int num(){
int num = 0;
for (int i = 0; i < chessboard.length; i++) {
for (int j = 0; j < chessboard.length; j++) {
if (chessboard[i][j] == '*' || chessboard[i][j] == '$') {
num++;
}
}
}
return num;
}
// 判赢
boolean judge() {
for (int i = 0; i < chessboard.length; i++) { // 遍历棋盘
for (int j = 0; j < chessboard.length; j++) {
if (chessboard[i][j] != '+'){ // 当前棋盘位置不是+号时
// 向右 判断是否有相同五颗棋子
if (j < 11) {
boolean flag = true;
for (int y = 0; y < 5; y++) {
if (chessboard[i][j] != chessboard[i][j + y]) { // 对比向右连续5个格子
flag = false;
break;
}
}
if (flag) { // 判断结果是break出来的还是走完循环的
return true;
}
}
// 向下 判断是否有相同五颗棋子
if (i < 11) {
boolean flag = true;
for (int x = 0; x < 5; x++) {
if (chessboard[i][j] != chessboard[i + x][j]) { // 对比向下连续5个格子
flag = false;
break;
}
}
if (flag) { // 判断结果是break出来的还是走完循环的
return true;
}
}
// 向右上 判断是否有相同五颗棋子
if (i > 3 && j < 11) {
boolean flag = true;
for (int xy = 0; xy < 5; xy++) {
if (chessboard[i][j] != chessboard[i - xy][j + xy]) { // 对比向右上连续5个格子
flag = false;
break;
}
}
if (flag) { // 判断结果是break出来的还是走完循环的
return true;
}
}
// 向右下 判断是否有相同五颗棋子
if (i < 11 && j < 11) {
boolean flag = true;
for (int xy = 0; xy < 5; xy++) {
if (chessboard[i][j] != chessboard[i + xy][j + xy]) { // 对比向右下连续5个格子
flag = false;
break;
}
}
if (flag) { // 判断结果是break出来的还是走完循环的
return true;
}
}
}
}
}
return false;
}
//游戏开始方法
void start() {
System.out.println("游戏开始!");
while (true) {
Scanner input = new Scanner(System.in);
int x = 0, y = 0;
//人下棋(判赢),用*表示人的棋子
while(true){
System.out.println("请输入落子的位置:x,y");
try {
String p_input = input.nextLine();
String[] p_inputs = p_input.split(",");
x = Integer.parseInt(p_inputs[0]);
y = Integer.parseInt(p_inputs[1]);
}catch (Exception e){
System.out.println("输入有误!");
continue;
}
//落子的合理性
if (x >= 0 && x < 15 && y >= 0 && y < 15)
if (chessboard[x][y] == '+') { //如果当前位置为+,则放入棋子
chessboard[x][y] = '*';
break;
} else { //否则打印棋子已存在
System.out.println("棋子已存在,请重新落子!");
}else{
System.out.println("棋子出界,请重新落子!");
}
}
printBoard();
if (judge()) {
System.out.println("人获胜!");
break;
}
//判断是否发生平局
if (!judge() && num() == 225) {
System.out.println("平局");
break;
}
//机器随机下棋(判赢),用*表示人的棋子
while(true){
System.out.println("机器落子!");
x = (int) (Math.random() * 15);
y = (int) (Math.random() * 15);
if (x >= 0 && x < 15 && y >= 0 && y < 15)
if (chessboard[x][y] == '+') { //如果当前位置为+,则放入棋子
chessboard[x][y] = '$';
break;
} else { //否则打印棋子已存在
System.out.println("棋子已存在,请重新落子!");
}
}
printBoard();
if (judge()) {
System.out.println("机器获胜!");
break;
}
//判断是否发生平局
if (!judge() && num() == 225) {
System.out.println("平局");
break;
}
}
}
public static void main(String[] args) {
GoBang gb = new GoBang();
gb.start();
}
}
1.程序采用二维数组构建棋盘,通过遍历数组实现显示棋盘和下棋的效果。
2.采用while结构实现人和机器循环下棋,在人下棋时要求其输入棋子的坐标,使用while循环,当其输入的坐标存在棋子和坐标越界是让其重新输入。机器下棋时采用Math中的random方法实现随机下棋功能,同样采用while循环筛除机器随机到覆盖棋子的情况。
3.当每次人或机器下完棋子后便会遍历棋盘,并且判断人或机器是否获胜。在判断获胜时调用judge方法,具体实现思路如下:判断获胜条件为x,y轴,y=x, y = -x, 四条线上是否有五个棋子相连。每次调用judge方法时,便会遍历棋盘寻找所下棋子,找到j<11的棋子时便向右判断连续五个是否相等,若不相等又满足i<11时便向下判断连续五个棋子是否相等,若不相等又i>3&&j<11时便向右上判断连续五个棋子是否相等,若不相等又i<11&&j<11便向右下判断是否有五个棋子相等。若经过上述四种情况遍历没找到连续相等的五个棋子,即没达到获胜条件则继续下棋。直至找到获胜条件时或达到平局时结束游戏。
4.当人或机器下完棋子后judge方法为false并且所下棋子个数为225个时本局游戏为平局。
5.异常处理:当在接受用户输入落子坐标时,当输入非要求字符时程序会抛出异常,将可能发生异常的String p_input = input.nextLine();String[] p_inputs = p_input.split(",");x = Integer.parseInt(p_inputs[0]);y = Integer.parseInt(p_inputs[1]);代码放在了 try 块中,在 catch 语句中指定捕获的异常类型为 Exception,提示用户输入错误,进入下次循环让用户重新输入。