双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜
此任务由java基础语言,二维数组来完成
思路:
1. 用二维数组绘制初始地图
2. 实现双方玩家轮流下棋的方法
while(true)构成无限循环 if条件判断是否获胜使用break来跳出循环
接收用户输出的坐标并改变棋盘上对应坐标图案
3. 胜利条件检测
胜利条件检测在用户下棋之后,根据用户所下棋子位置对其周围进行检测,避免对整个棋盘进行遍历
行向检测:检测目标棋子的左至右各4个位置,是否存在连续的相同棋子
竖向检测:检测目标棋子的上至下各4个位置,是否存在连续的相同棋子
斜向检测:检测目标棋子的左斜上至右斜下各4个位置,是否存在连续的相同棋子
检测目标棋子的左斜下至右斜上各4个位置,是否存在连续的相同棋子
检测时要先考虑边缘情况 避免出现ArrayIndexOutOfBoundsException.
import java.util.Scanner;
public class Chess {
public static void main(String[] args) {
boolean gameOver=false;
//创建一个二维数组作为棋盘
int[][] board=new int[16][16];
//初始化棋盘
initialize(board);
//黑白双方轮换下棋直至有一方获胜
while(true) {
System.out.println("==========黑棋回合==========");
gameOver=putBlack(board);
printboard(board);
//获胜时跳出循环
if(gameOver==true) {
break;
}
System.out.println("==========白棋回合==========");
gameOver=putWhite(board);
printboard(board);
if(gameOver==true) {
break;
}
}
}
//初始化棋盘并打印
public static void initialize(int[][] board) {
for(int i=0;i<board.length;i++) {
for(int j=0;j<board[i].length;j++) {
if(i==0) {
board[i][j]=j;
}
if(j==0) {
board[i][j]=i;
}
System.out.print(board[i][j]+"\t");
}
System.out.println();
}
}
//打印棋盘
public static void printboard(int[][] board) {
for(int i=0;i<board.length;i++) {
for(int j=0;j<board[i].length;j++) {
System.out.print(board[i][j]+"\t");
}
System.out.println();
}
}
//黑方下棋
public static boolean putBlack(int[][] board) {
Scanner scanner=new Scanner(System.in);
System.out.println("输入横坐标:");
int x =scanner.nextInt();
//有效值检测
while(x<1||x>15) {
System.out.println("您输入了一个无效的横坐标");
System.out.println("请重新输入横坐标");
x=scanner.nextInt();
}
System.out.println("输入纵坐标:");
int y =scanner.nextInt();
//有效值检测
while(y<1||y>15) {
System.out.println("您输入了一个无效的纵坐标");
System.out.println("请重新输入纵坐标");
y=scanner.nextInt();
}
board[x][y]=1;
if(check(board, x, y)) {
System.out.println("黑棋获得胜利");
return true;
}
return false;
}
//白方下棋
public static boolean putWhite(int[][] board) {
Scanner scanner=new Scanner(System.in);
System.out.println("输入横坐标:");
int x =scanner.nextInt();
//有效值检测
while(x<1||x>15) {
System.out.println("您输入了一个无效的横坐标");
System.out.println("请重新输入横坐标");
x=scanner.nextInt();
}
System.out.println("输入纵坐标:");
int y =scanner.nextInt();
//有效值检测
while(y<1||y>15) {
System.out.println("您输入了一个无效的纵坐标");
System.out.println("请重新输入纵坐标");
y=scanner.nextInt();
}
board[x][y]=2;
if(check(board, x, y)) {
System.out.println("白棋获得胜利");
return true;
}
return false;
}
//五子检测
public static boolean check(int[][] board,int x,int y) {
int count=0;
//1.玩家获取
int player=0;
player =board[x][y];
//2.横向检查
for(int i=-4;i<=4;i++) {
if(y+i<=0||y+i>=15) {
continue;
}
if(board[x][y+i]==player) {
count+=1;
}else {
continue;
}
if(count==5) {
return true;
}
}
count=0;
//3.纵向检查
for(int i=-4;i<=4;i++) {
if(x+i<=0||x+i>=15) {
continue;
}
if(board[x+i][y]==player) {
count+=1;
}else {
continue;
}
if(count==5) {
return true;
}
}
count=0;
//4.斜向检察(二四象限)
for(int i=-4;i<=4;i++) {
//边界判定
if(x+i<=0||x+i>=15||y+i<=0||y+i>=15) {
continue;
}
if(board[x+i][y+i]==player) {
count+=1;
}else {
continue;
}
if(count==5) {
return true;
}
}
count=0;
//5.斜向检查(一三象限)
for(int i=-4;i<=4;i++) {
//边界判定
if(x+i<=0||x+i>=15||y-i<=0||y-i>=15) {
continue;
}
if(board[x+i][y-i]==player) {
count+=1;
}else {
count=0;
continue;
}
if(count==5) {
return true;
}
}
return false;
}
}