解题思路
1.
初始化棋盘 抽取到一个方法中
打印棋盘 抽取到一个方法中
2.
黑白双方交替下棋
打印棋盘
3.
判断是否越界
判断是否重复
判断输赢
写出程序运行的大致框架
public class Wzqrun {
public static void main(String[] args) {
//启动游戏
WzqRule.start();
// 交替下棋权力
boolean flag=true;
do {
if (flag) {
WzqRule.whitePrint();
flag = false;
} else {
WzqRule.blackPrint();
flag = true;
}
}while(WzqRule.Terminate());
}
}
开始补充细节
import java.util.Arrays;
import java.util.Scanner;
public class WzqRule {
//该部分为五子棋游戏的素材,包括棋盘样式,黑白双方棋子的样式
//注意:棋盘坐标对应的值,应使用占用空间大小为1的字符如:⒈
static String white = "☆";
static String black = "★";
static String[][] qp = new String[15][15];//棋盘
static String[] num = {"⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖"};
static String line = "十";
// 声明全局变量m,用于后续判定胜方,终止程序的运行
static int m=0;
//启动五子棋游戏
public static void start() {
init();
}
// 初始化棋盘
public static void init() {
System.out.println("游戏开始!一决胜负吧!");
// 建立二维数组qp,表示棋盘
for (int i = 0; i < qp.length; i++) {
for (int j = 0; j < qp[i].length; j++) {
qp[i][j] = line;
if (j == qp[i].length - 1)
qp[i][j] = num[i];
if (i == qp.length - 1)
qp[i][j] = num[j];
}
}
// 输出二维数组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 whitePrint() {
System.out.println("白方请输入棋子坐标:");
Scanner scan = new Scanner(System.in);
int x = scan.nextInt();
int y = scan.nextInt();
// 判断输入坐标是否可以下棋
if (x > 14 || y > 14 || qp[x - 1][y - 1] == white || qp[x - 1][y - 1] == black || x < 0 || y < 0) {
System.out.println("该位置不可以下棋");
whitePrint();
} else {
qp[x - 1][y - 1] = white;
// 输出白棋落子后的棋盘
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();
}
}
// 判断白棋是否胜利
if(isWin(x,y,white)) {
System.out.println("白棋胜利!");
m=10;
Terminate();
}
}
// 黑方下棋
public static void blackPrint() {
System.out.println("黑方请输入棋子坐标:");
Scanner scan = new Scanner(System.in);
int x = scan.nextInt();
int y = scan.nextInt();
// 判断输入坐标是否可以下棋
if (x > 14 || y > 14 || qp[x - 1][y - 1] == white || qp[x - 1][y - 1] == black || x < 0 || y < 0) {
System.out.println("该位置不可以下棋");
blackPrint();
} else {
// 输出黑棋落子后的棋盘
qp[x - 1][y - 1] = black;
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();
}
}
// 判断黑棋是否胜利
if(isWin(x,y,black)) {
System.out.println("黑棋胜利!");
m=10;
Terminate();
}
}
public static boolean isWin(int x, int y, String qizi) {
// 定义整型变量spSum来统计所下棋子及其水平方向周围位置同类棋子的总数
int spSum = 0;
//水平向左找
for (int leftY = y - 1; leftY >= 0; leftY--) {
if (qp[x - 1][leftY].equals(qizi))
spSum++;
else
break;
}
if (spSum >= 5)
return true;
//水平向右找
for (int rightY = y; rightY < qp.length; rightY++) {
if (qp[x - 1][rightY].equals(qizi))
spSum++;
else
break;
}
if (spSum >= 5)
return true;
// 垂直向下查找
int czSum = 0;
for (int downX = x - 1; downX < qp.length; downX++) {
if (qp[y - 1][downX].equals(qizi))
czSum++;
else
break;
}
if (czSum >= 5)
return true;
// 垂直向上查找
for (int upSum = x; upSum >= 0; upSum--) {
if (qp[y - 1][upSum].equals(qizi))
czSum++;
else
break;
}
if (czSum >= 5)
return true;
//斜向右上查找
int ysSum = 0;
for (int rightY = y, upX = x; rightY < qp.length && upX >= 0; rightY++, upX--) {
if (qp[upX][rightY].equals(qizi))
ysSum++;
else
break;
}
if (ysSum >= 5)
return true;
//斜向左下查找
for (int leftY = y - 1, downX = x - 1; downX < qp.length && leftY >= 0; leftY--, downX++) {
if (qp[downX][leftY].equals(qizi))
ysSum++;
else
break;
}
if (ysSum >= 5)
return true;
// 斜向右下查找
int zxSum = 0;
for (int rightY = y, downX = x - 1; rightY < qp.length && downX < qp.length; rightY++, downX++) {
if (qp[downX][rightY].equals(qizi))
zxSum++;
else
break;
}
if (zxSum >= 5)
return true;
// 斜向左上查找
for (int leftY = y - 1, upX = x; upX >= 0 && leftY >= 0; leftY--, upX--) {
if (qp[upX][leftY].equals(qizi))
zxSum++;
else
break;
}
if (zxSum >= 5)
return true;
else
return false;
}
public static boolean Terminate(){
int temp=0;
if(m>temp)
return false;
else
return true;
}
}
这就是我设计的五子棋游戏程序了,不足之处有很多,代码优化余地还很大,相信大家会越来越优秀