要求:
(1)绘制棋盘
(2)提示黑方(用 1 表示)和白方(用 2 表示)分别下棋(X,Y 轴位
置)并重新绘制棋盘。
(3)每当一方下棋后判断是否获胜 。
(4)提示:采用二维数组来模拟棋盘。
总体思路:
- 利用二维数组创建棋盘,默认值为0,黑方下棋置为1,白方下棋置为2,在玩家每次下棋之前判断数组在横、竖、斜这三个方向上连续排列的棋子达到五个。
- 整个过程使用while循环持续提示玩家下棋,玩家每次下棋之后都打印棋盘出来供玩家观看(先判断其中一方是否获胜,再打印棋盘),直到其中一方获胜后,跳出循环,打印获胜结果。
如何判断一方获胜,执行“跳出循环操作”?
- 当其中一方没有棋时。
- 当棋盘中任意一方在横、竖、左斜、右斜这四个方向上连续排列的棋子达到五个时。
如何判断其中一方在横、竖、斜这三个方向上连续排列的棋子达到五个?
- 横:使用for循环遍历二维数组中第二个数组,如:nums[i][j]、nums[i][j+1]…
将二维数组的每行数据分割成一组5个,外层循环5个5个依次遍历下去,内层循环1个1个一次遍历下去。当nums[i][j]==1 || nums[i][j]==j时,内层循环+1(继续遍历下一个);当nums[i][j]!=1 && nums[i][j]!=2时,外层循环范围+1(继续遍历下一组)。每次遍历均判断每一个值是否为1(黑方)或2(白方)。 - 竖:使用for循环遍历二维数组中第一个数组,如:nums[i][j]、nums[i+1][j]…
【判断流程与横向的判断一样】 - 左斜:使用for循环遍历联合二维数组中第一个第二个数组,如:nums[i][j]、nums[i+1][j+1]…
nums[i+1][j]、nums[i+2][j+1]…
【判断流程与横向的判断一样】 - 右斜:使用for循环遍历联合二维数组中第一个第二个数组,如:
nums[nums.length-1][nums.length-1]、nums[nums.length-1-1][nums.length-1-1]…
nums[nums.length-1-1][nums.length-1]、nums[nums.length-1-2][nums.length-1-1]…
【判断流程与横向的判断一样】
java源码
package pers.sheng.demo;
import java.util.Arrays;
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
int x,y;//棋盘坐标
int whitePiecesNum = 112;//白方棋子总数
int blackPiecesNum = 112;//黑方棋子总数
int[][] checkerBoard= {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
};
int success = 0;
while(true) {
// 判断胜出者
if(blackPiecesNum==0 && whitePiecesNum==0) {
System.out.println("---------------------------------------游戏结束,双方平局");
showBoard(checkerBoard);
break;
}else if(blackPiecesNum==0||rightOblique(checkerBoard)==2||leftOblique(checkerBoard)==2||landscape(checkerBoard)==2||vertical(checkerBoard)==2) {
System.out.println("---------------------------------------游戏结束,白方获胜");
showBoard(checkerBoard);
success = 2;
break;
}else if(whitePiecesNum==0||rightOblique(checkerBoard)==1||leftOblique(checkerBoard)==1||landscape(checkerBoard)==1||vertical(checkerBoard)==1) {
System.out.println("---------------------------------------游戏结束,黑方获胜");
showBoard(checkerBoard);
success = 1;
break;
}
Scanner input = new Scanner(System.in);
// 白方下棋
if(success!=1) {
showBoard(checkerBoard);
System.out.println("请白方下棋(输入棋盘坐标x,y):");
x = input.nextInt()-1;
y = input.nextInt()-1;
checkerBoard[x][y] = 2;
whitePiecesNum--;
}else {
break;
}
// 判断胜出者
if(blackPiecesNum==0 && whitePiecesNum==0) {
System.out.println("---------------------------------------游戏结束,双方平局");
showBoard(checkerBoard);
break;
}else if(blackPiecesNum==0||rightOblique(checkerBoard)==2||leftOblique(checkerBoard)==2||landscape(checkerBoard)==2||vertical(checkerBoard)==2) {
System.out.println("---------------------------------------游戏结束,白方获胜");
showBoard(checkerBoard);
success = 2;
break;
}else if(whitePiecesNum==0||rightOblique(checkerBoard)==1||leftOblique(checkerBoard)==1||landscape(checkerBoard)==1||vertical(checkerBoard)==1) {
System.out.println("---------------------------------------游戏结束,黑方获胜");
showBoard(checkerBoard);
success = 1;
break;
}
// 黑方下棋
if(success!=2) {
showBoard(checkerBoard);
System.out.println("请黑方下棋(输入棋盘坐标x,y):");
x = input.nextInt();
y = input.nextInt();
checkerBoard[x-1][y-1] = 1;
blackPiecesNum--;
}else {
break;
}
}
}
// 横向
// 判断横向是否连续排列的棋子达到五个
public static int landscape(int[][] checkerBoard) {
// 判断白方在横向是否连续排列的棋子达到五个
for(int i=0,key=0,sum=0;i<15;i++) {
for(int j=sum;j<sum+5;j++) {
if(checkerBoard[i][j]==2) {
key++;
if(key==5) {
return 2;
}else {
if(sum!=14) {
sum++;
}else{
sum=0;
}
}
}else {
key=0;
if(sum!=14) {
sum++;
}else{
sum=0;
}
}
}
}
// 判断黑方在横向是否连续排列的棋子达到五个
for(int i=0,key=0,sum=0;i<15;i++) {
for(int j=sum;j<sum+5;j++) {
if(checkerBoard[i][j]==1) {
key++;
if(key==5) {
return 1;
}else {
if(sum!=14) {
sum++;
}else{
sum=0;
}
}
}else {
key=0;
if(sum!=14) {
sum++;
}else{
sum=0;
}
}
}
}
return 3;
}
// 判断竖向是否连续排列的棋子达到五个
// 竖向
public static int vertical(int[][] checkerBoard) {
// 判断白方在竖向是否连续排列的棋子达到五个
for(int i=0,sum=0,key=0;i<15;i++) {
for(int j=sum;j<sum+5;j++) {
if(checkerBoard[j][i]==2) {
key++;
if(key==5) {
return 2;
}else {
if(sum!=14) {
sum++;
}else{
sum=0;
}
}
}else {
key=0;
if(sum!=14) {
sum++;
}else{
sum=0;
}
}
}
}
// 判断黑方在竖向是否连续排列的棋子达到五个
for(int i=0,sum=0,key=0;i<15;i++) {
for(int j=sum;j<sum+5;j++) {
if(checkerBoard[j][i]==1) {
key++;
if(key==5) {
return 1;
}else {
if(sum!=14) {
sum++;
}else{
sum=0;
}
}
}else {
key=0;
if(sum!=14) {
sum++;
}else{
sum=0;
}
}
}
}
return 3;
}
// 判断左斜是否连续排列的棋子达到五个
// 左斜
public static int leftOblique(int[][] checkerBoard) {
// 判断白方在左斜是否连续排列的棋子达到五个
// 左下角
for(int leftSum=10;leftSum>=0;leftSum--) {
for(int y=0,x=0,next=0,key=0;y<next+5;y++) {
x = leftSum+y;
if(checkerBoard[x][y]==2) {
key++;
if(key==5) {
return 1;
}
}else {
key=0;
if(5+next<15-leftSum) {
next++;
}else {
next=0;
}
}
}
}
// 右上角
for(int leftSum=10;leftSum>=0;leftSum--) {
for(int y=0,x=0,next=0,key=0;y<next+5;y++) {
x = leftSum+y;
if(checkerBoard[y][x]==2) {
key++;
if(key==5) {
return 1;
}
}else {
key=0;
if(5+next<15-leftSum) {
next++;
}else {
next=0;
}
}
}
}
// 判断黑方在左斜是否连续排列的棋子达到五个
// 左下角
for(int leftSum=10;leftSum>=0;leftSum--) {
for(int y=0,x=0,next=0,key=0;y<next+5;y++) {
x = leftSum+y;
if(checkerBoard[x][y]==1) {
key++;
if(key==5) {
return 1;
}
}else {
key=0;
if(5+next<15-leftSum) {
next++;
}else {
next=0;
}
}
}
}
// 右上角
for(int leftSum=10;leftSum>=0;leftSum--) {
for(int y=0,x=0,next=0,key=0;y<next+5;y++) {
x = leftSum+y;
if(checkerBoard[y][x]==1) {
key++;
if(key==5) {
return 1;
}
}else {
key=0;
if(5+next<15-leftSum) {
next++;
}else {
next=0;
}
}
}
}
return 3;
}
// 判断右斜是否连续排列的棋子达到五个
// 右斜
public static int rightOblique(int[][] checkerBoard) {
// 判断白方在右斜是否连续排列的棋子达到五个
// 左上角
for(int leftSum=4;leftSum<15;leftSum++) {
for(int y=0,x=0,next=0,key=0;y<next+5;y++) {
x = leftSum-y;
if(checkerBoard[x][y]==2) {
key++;
if(key==5) {
return 2;
}
}else {
key=0;
if(5+next<leftSum+1) {
next++;
}else {
next=0;
}
}
}
}
// 右下角
for(int leftSum=10;leftSum>=0;leftSum--) {
for(int next=14,x=next,y=leftSum,key=0;x>next-5;x--) {
for(;y<=14;) {
if(checkerBoard[x][y]==2) {
key++;
if(key==5) {
return 2;
}
y++;
break;
}else {
key=0;
if(5+next<15-leftSum) {
next--;
}else {
next=0;
}
y++;
break;
}
}
}
}
// 判断黑方在右斜是否连续排列的棋子达到五个
// 左上角
for(int leftSum=4;leftSum<15;leftSum++) {
for(int y=0,x=0,next=0,key=0;y<next+5;y++) {
x = leftSum-y;
if(checkerBoard[x][y]==1) {
key++;
if(key==5) {
return 1;
}
}else {
key=0;
if(5+next<leftSum+1) {
next++;
}else {
next=0;
}
}
}
}
// 右下角
for(int leftSum=10;leftSum>=0;leftSum--) {
for(int next=14,x=next,y=leftSum,key=0;x>next-5;x--) {
for(;y<=14;) {
if(checkerBoard[x][y]==1) {
key++;
if(key==5) {
return 1;
}
y++;
break;
}else {
key=0;
if(5+next<15-leftSum) {
next--;
}else {
next=0;
}
y++;
break;
}
}
}
}
return 3;
}
// 打印棋盘
// 打印棋盘
public static void showBoard(int[][] checkerBoard) {
for(int i=0;i<15;i++) {//行
if(i==0) {
System.out.print("00"+"|"+(i+1)+"");
}else if(i==14) {
System.out.print("|"+(i+1)+"|");
}else if(i>8) {
System.out.print("|"+(i+1));
}else {
System.out.print("|"+(i+1));
}
}
System.out.println();
for(int i=0;i<15;i++) {
if(i<9) {
System.out.print("0"+(i+1));
}else {
System.out.print((i+1));
}
for(int j=0;j<15;j++) {//列
if(j==0) {
System.out.print("|"+checkerBoard[i][j]+"|");
}else if(j>=9){
System.out.print(" "+checkerBoard[i][j]+"|");
}else {
System.out.print(checkerBoard[i][j]+"|");
}
}
System.out.println();
}
}
}
运行结果: