主要应用二维数组,循环的知识
import java.util.Scanner;
public class Wuziqi {
public static void main(String[] args) {
String white = "☆";
String black = "★";
int m = 15, n = 15;
String[][] qp = new String[16][16];
String[] num = {"⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖", "⒗"};
String line = "十";
arrayList(m, n, qp, num, line);
start(black, white, qp,line);
}
先应用二维数组建棋盘
//15*15棋盘的创建
public static void arrayList(int m, int n, String[][] qp, String[] num, String line) {
for (int i = 0; i < qp.length; i++) {
for (int j = 0; j < qp[i].length; j++) {
if (i == m) { //当变量i的值相等于m时,将num数组的值赋给二维数组的最后一列
qp[m][j] = num[j];
} else if (j == n) { //当变量j的值相等于n时,将num数组的值赋给二维数组的最后一行
qp[i][n] = num[i];
} else {
qp[i][j] = line; //将十赋给剩余二维数组的位置
}
}
}
print(qp); //此时棋盘创建好
}
运行结果:
打印二维数组,即打印生成的棋盘
//打印棋盘
public static void print(String[][] qp) {
for (int i = 0; i < qp.length; i++) { //双重循环来打印二维数组
for (int j = 0; j < qp[i].length; j++) {
System.out.print(qp[i][j]);
}
System.out.println();
}
}
完成之后就到下棋环节:
public static void start(String black, String white, String[][] qp,String line) {
Scanner scanner = new Scanner(System.in);
boolean flag = true; //用来判断哪一方下棋
while (true) {
if (flag == true) {
System.out.println("黑子下棋:");
System.out.print("请输入x坐标:");
int x = scanner.nextInt();
System.out.print("请输入y坐标:");
int y = scanner.nextInt();
//判断下棋的位置是否正确
boolean a=position(x,y,qp,line);
if(a==false){
System.out.print("输入有误或者已经用过");
continue;
}
qp[x - 1][y - 1] = black;
boolean b=win(x,y,qp,line);
if(b==true){
print(qp);
System.out.println("恭喜黑方获胜!!");
break;
}
flag = false;
} else {
System.out.println("白子下棋:");
System.out.print("请输入x坐标:");
int x = scanner.nextInt();
System.out.print("请输入y坐标:");
int y = scanner.nextInt();
//判断下棋的位置是否正确
boolean a=position(x,y,qp,line);
if(a==false){
System.out.print("输入有误或者已重复");
continue;
}
qp[x - 1][y - 1] = white;
boolean b=win(x,y,qp,line);
if(b==true){
print(qp);
System.out.println("恭喜白方获胜!!");
break;
}
flag = true;
}
print(qp);
}
}
下棋时需要判断输入的是否越界和重复,位置正确返回true,不正确返回false
//判断下棋的位置是否正确
public static boolean position(int a, int b,String[][] qp,String line) {
//判断是否越界,输入有误
if (a <= 0 || a > 15 || b <= 0 || b > 15) {
return false;
}
//判断是否重复输入
if(qp[a-1][b-1]!=line){
return false;
}
return true;
}
// == 引用类型比较比较的是地址,比较内容时用 equals()
接下来判断输赢
五子棋五个相连就胜利
可以每次将每次输入的棋子作为看为原点,分为左右、上下、向左上下,向右上下。
左右可以直接固定输入的x值,用i进行遍历,为五个就返回true,否则就跳出循环,进行下一个判断,上下固定输入的y值,同样用i进行遍历,与左右相同。
向左上下,先进行向左上,如果不满足五个点,回到输入的原点,不初始化计数器的值,再向左下进行遍历,计数器值相加,若为五个就返回true,向右上下同理。
//判断输赢
public static boolean win(int a,int b,String[][] qp,String line){
//判断左右 上下 左上左下 右上右下 是否连成五个用count计数 count>=4时,返回true
int count=0;
//判断左右 行不变,输入的a不变,已输入的为原点,进行查找
for(int i=0;i<qp.length-1;i++){
if(qp[a-1][i]!=line){
if(qp[a-1][i]==qp[a-1][i+1]){
count++;
}else{
break; //不连续结束循环
}
}
}
//判断上下 输入的b不变,已输入的为原点,进行查找
for (int i=0;i<qp.length-1;i++){
if(qp[i][b-1]!=line){
if(qp[i][b-1]==qp[i+1][b-1]){
count++;
}else{
break; //不连续结束循环
}
}
}
//判断左上左下
//左上 a-1 b-1
int j=b-1;
for(int i=a-1;i>0;i--){
if(i==0||j==0){
break;
}
if(qp[i][j]!=line){
if(qp[i][j]==qp[i-1][j-1]){
count++;
}else{
break;
}
}
j--;
}
//左下 a+1 b-1
j=b-1;
for(int i=a-1;i<qp.length-1;i++){
if(i==qp.length-1||j== 0){
break;
}
if(qp[i][j]!=line){
if(qp[i][j]==qp[i+1][j-1]){
count++;
}else{
break;
}
}
j--;
}
//判断右上右下
//右上 a-- b++
j=b-1;
for(int i=a-1;i>0;i--){
if(i==0||j==qp.length-1){
break;
}
if(qp[i][j]!=line){
if(qp[i][j]==qp[i-1][j+1]){
count++;
}else{
break;
}
}
j++;
}
//右下 a++ b++
for(int i=a-1;i<qp.length-1;i++){
if(i==qp.length-1||j==qp.length-1){
break;
}
if(qp[i][j]!=line){
if(qp[i][j]==qp[i+1][j+1]){
count++;
}else{
break;
}
}
j++;
}
if(count>=4){
return true;
}else{
count=0; //更新计数
}
return false;
}