主要使用的就是二维数组和循环的概念,初始化棋盘的实现并不难,稍微有点困难的就是判断输赢的实现。
首先需要初始化棋盘,只有先将棋盘打印出来才能实现接下来的步骤。
//初始化棋盘
public static void arrayList(int n,int m,char[][] arr,char[]arrs1) {
//设置五子棋的棋子属性
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (i == n) {
arr[n][j] = arrs1[j];
} else if (j == m) {
arr[i][m] = arrs1[i];
} else {
arr[i][j] = '╋';
}
}
}
}
完成棋盘初始化后,就可以写下棋的环节了。
//开始下棋子
public static void startChess(char[][] arr){
Scanner scanner=new Scanner(System.in);
boolean win=false;
boolean flag=true;
while(true){
//黑子下棋的顺序
if(flag==true){
System.out.println("黑子下棋");
System.out.println("请输入x坐标:");
int x=scanner.nextInt();
System.out.println("请输入y坐标:");
int y=scanner.nextInt();
flag=isTrue(x,y,arr);
if(flag==false){
System.out.println("这个位置已被占用或为非法位置");
flag=true;
continue;
}
arr[x-1][y-1]='○';
win=isWinner(x,y,arr);
if(win==true){
System.out.println("黑子获得胜利");
break;
}
flag=false;
}else{
//白子下棋的顺序
System.out.println("白子下棋");
System.out.println("请输入x坐标:");
int x=scanner.nextInt();
System.out.println("请输入y坐标:");
int y=scanner.nextInt();
flag=isTrue(x,y,arr);
if(flag==false){
System.out.println("这个位置已被占用或为非法位置");
continue;
}
arr[x-1][y-1]='●';
win=isWinner(x,y,arr);
if(win==true){
System.out.println("白子获得胜利");
break;
}
flag=true;
}
//为保证每次下棋都会打印一次
printList(arr);
}
}
在下棋的同时,需要判断棋子的位置是否正确,如不正确则返回false,正确就返回true.
//判断棋子位置是否正确
public static boolean isTrue(int n,int m,char [][] arr){
if(n>14||n<0||m>14||m<0){
return false;
}
if(arr[n-1][m-1]!='╋'){
return false;
}
return true;
}
打印数组使用数组的遍历即可
//打印数组
public static void printList(char[][] arr){
for(int i=0;i
接下来就是判断输赢了。
判断输赢的算法思路:
五子棋的规则为五个相连为胜,可以每次将每次输入的棋子作为看为原点,分为左右、上下、向左上下,向右上下。
左右可以直接固定输入的x值,用i进行遍历,为五个就返回true,否则就跳出循环,进行下一个判断,上下固定输入的y值,同样用i进行遍历,与左右相同。向左上下,先进行向左上,如果不满足五个点,回到输入的原点,不初始化计数器的值,再向左下进行遍历,计数器值相加,若为五个就返回true,向右上下同理。
//判断输赢
public static boolean isWinner(int x,int y,char [][]arr){
//左右
int count=1;
for(int i=0;i< arr[x-1].length-2;i++){
if(arr[x-1][i]!='╋'){
if(arr[x-1][i]==arr[x-1][i+1]){
count=count+1;
}else{
count=1;
break;
}
}
}
if(count>=5){
return true;
}else {
//初始化计数器
count=1;
}
//上下
for(int j=0;j< arr.length-2;j++){
if(arr[j][y-1]!='╋'){
if(arr[j][y-1]==arr[j+1][y-1]){
count=count+1;
}else{
break;
}
}
}
if(count>=5){
return true;
}else {
count=1;
}
//向左 x+1 y+1
//左下
int j=y-1;
for(int i=x-1;i0;i--){
if(i==0||j==0){
break;
}
if(arr[i][j]!='╋'){
if(arr[i][j]==arr[i-1][j-1]){
count++;
}else {
break;
}
}
j--;
}
if(count>=5){
return true;
}else {
count=1;
}
//向右 x++ y--
//右下
j=y-1;
for(int i=x-1;i< arr.length-1;i++){
if(x== arr.length||j==0){
break;
}
if(arr[i][j]!='╋'){
if(arr[i][j]==arr[i+1][j-1]){
count=count+1;
}else {
break;
}
}
j--;
}
// 右上 x-1 y+1
j=y-1;
for (int i=x-1;i<0;i--){
if(i==0||j==arr[x-1].length-1){
break;
}
if(arr[i][j]!='╋'){
if(arr[i][j]==arr[i-1][j+1]){
count++;
}else {
break;
}
}
j++;
}
if(count>=5){
return true;
}else {
count=1;
}
return false;
}
这个方法并不是最优的,相对来说想的比较麻烦。
public class Demo3 {
public static void main(String[] args) {
//完成数组的创建
//棋盘为一个14*14的棋盘
char [] arrs1={'⒈','⒉','⒊','⒋','⒌','⒍','⒎','⒏','⒐','⒑','⒒','⒓','⒔','⒕','⒖'};
int a=14;
int b=14;
char [][] arr=new char [a+1][b+1];
arrayList(a,b,arr,arrs1);
startChess(arr);
}



