一.游戏分析
//五子棋游戏必备元素 static String white = "○"; static String black = "●"; static String[][] qp = new String[15][15];//棋盘 static String[] num = {"⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖"}; static String line = "十";
1.将所有必要元素搞到棋盘中去
如图所示:
代码实现:
//初始化棋盘
public static void init() {
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];/*将{"⒈", "⒉", "⒊", "⒋", "⒌", "⒍",
"⒎", "⒏", "⒐", "⒑", "⒒", "⒓",
"⒔", "⒕", "⒖"},放进去*/
}
System.out.print(qp[i][j] + " "); //遍历数组
}
System.out.println(); //换行
}
}
2.打印棋盘
//打印棋盘
public static void print() {
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();
}
}
3.判断下的棋子是否越界
//判断是否越界,是否重复
public static boolean check(int x, int y) {
if (x < 0 || y < 0 || y > 14 || x > 14) { // c超过棋盘边界及判定为越界
return false;
}
if (!qp[x][y].equals(line)) { //如果输入的棋子坐标对应的地方不是"十",即为重复
return false;
}
return true;
}
4.判断输赢
说明:从上,下,左,右,右斜向上,右斜向下,左斜向上,左斜向下这八个方向判断;
如果出现有五个连续的同一方的棋子(使用记数的方法,出现一个连续的就加一), 即获胜。代码实现:
private static boolean Iswin(int x, int y, String qizi) {
/*
水平查找
*/
//水平向右查找
int risum = 1;
for (int righty = y - 1; righty >= 0; righty--) {
if (qp[x][righty].equals(qizi)) {
risum++;
} else {
break;
}
}
if (risum >= 5) {
return true;
}
//水平向左查找
int lesum = 1;
for (int lefty = y + 1; lefty <= 14; lefty++) {
if (qp[x][lefty].equals(qizi)) {
lesum++;
} else {
break;
}
}
if (lesum >= 5) {
return true;
}
/*
竖直查找
*/
//向上查找
int upsum = 1;
for (int upx = x + 1; upx <= 14; upx++) {
if (qp[upx][y].equals(qizi)) {
upsum++;
} else {
break;
}
}
if (upsum >= 5) {
return true;
}
//向下查找
int dosum = 1;
for (int dox = x - 1; dox >= 0; dox--) {
if (qp[dox][y].equals(qizi)) {
dosum++;
} else {
break;
}
}
if (dosum >= 5) {
return true;
}
/*
对角线查找
*/
//右斜向下查找
int xridosum = 1;
for (int xridox = x + 1, xridoy = y + 1; xridox <= 14 && xridoy <= 14; xridox++, xridoy++) {
if (qp[xridox][xridoy].equals(qizi)) {
xridosum++;
} else {
break;
}
}
if (xridosum >= 5) {
return true;
}
//右斜向上查找
int xriupsum = 1;
for (int xriupx = x + 1, xriupy = y - 1; xriupx <= 14 && xriupy >= 0; xriupx++, xriupy--) {
if (qp[xriupx][xriupy].equals(qizi)) {
xriupsum++;
} else {
break;
}
}
if (xriupsum >= 5) {
return true;
}
//左斜向下查找
int xledosum = 1;
for (int xledox = x - 1, xledoy = y + 1; xledox >= 0 && xledoy <= 14; xledox--, xledoy++) {
if (qp[xledox][xledoy].equals(qizi)) {
xledosum++;
} else {
break;
}
}
if (xledosum >= 5) {
return true;
}
//左斜向上查找
int xleupsum = 1;
for (int xleupx = x - 1, xleupy = y - 1; xleupx >= 0 && xleupy >= 0; xleupx--, xleupy--) {
if (qp[xleupx][xleupy].equals(qizi)) {
xleupsum++;
} else {
break;
}
}
if (xriupsum >= 5) {
return true;
}
return false;
}
5.准备阶段结束,游戏开始
//开始游戏
public static void stratGame() {
Scanner PD = new Scanner(System.in);
boolean flag = true;
while (true) {
if (flag == true) {
System.out.println("黑方下");
int num1 = PD.nextInt() - 1;
int num12 = PD.nextInt() - 1;
boolean result = check(num1, num12);
if (result) {
qp[num1][num12] = black;
print();
boolean win = Iswin(num1, num12, black);
if(win){
System.out.println("黑方胜利");
break;
}
flag = false;
} else {
System.out.println("棋子越界或重复,请重新输入!");
}
}
if (flag == false) {
System.out.println("白方下");
int num2 = PD.nextInt() - 1;
int num21 = PD.nextInt() - 1;
boolean result = check(num2, num21);
if (result) {
qp[num2][num21] = white;
print();
boolean win = Iswin(num2, num21, white);
if(win){
System.out.println("白方胜利");
break;
}
flag = true;
} else {
System.out.println("棋子越界或重复,请重新输入!");
}
}
}
}
总上述方法,总代码如下:
import java.util.Scanner;
public class WZQ {
static String white = "○";
static String black = "●";
static String[][] qp = new String[15][15];//棋盘
static String[] num = {"⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖"};
static String line = "十";
public static void main(String[] args) {
/*
1.
初始化棋盘 抽取到一个方法中
打印棋盘 抽取到一个方法中
2.
黑白双方交替下棋
打印棋盘
3.
判断是否越界
判断是否重复
判断输赢
*/
init();
stratGame();
}
//初始化棋盘
public static void init() {
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];
}
System.out.print(qp[i][j] + " ");
}
System.out.println();
}
}
//打印棋盘
public static void print() {
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 stratGame() {
Scanner PD = new Scanner(System.in);
boolean flag = true;
while (true) {
if (flag == true) {
System.out.println("黑方下");
int num1 = PD.nextInt() - 1;
int num12 = PD.nextInt() - 1;
boolean result = check(num1, num12);
if (result) {
qp[num1][num12] = black;
print();
boolean win = Iswin(num1, num12, black);
if(win){
System.out.println("黑方胜利");
break;
}
flag = false;
} else {
System.out.println("棋子越界或重复,请重新输入!");
}
}
if (flag == false) {
System.out.println("白方下");
int num2 = PD.nextInt() - 1;
int num21 = PD.nextInt() - 1;
boolean result = check(num2, num21);
if (result) {
qp[num2][num21] = white;
print();
boolean win = Iswin(num2, num21, white);
if(win){
System.out.println("白方胜利");
break;
}
flag = true;
} else {
System.out.println("棋子越界或重复,请重新输入!");
}
}
}
}
private static boolean Iswin(int x, int y, String qizi) {
/*
水平查找
*/
//水平向右查找
int risum = 1;
for (int righty = y - 1; righty >= 0; righty--) {
if (qp[x][righty].equals(qizi)) {
risum++;
} else {
break;
}
}
if (risum >= 5) {
return true;
}
//水平向左查找
int lesum = 1;
for (int lefty = y + 1; lefty <= 14; lefty++) {
if (qp[x][lefty].equals(qizi)) {
lesum++;
} else {
break;
}
}
if (lesum >= 5) {
return true;
}
/*
竖直查找
*/
//向上查找
int upsum = 1;
for (int upx = x + 1; upx <= 14; upx++) {
if (qp[upx][y].equals(qizi)) {
upsum++;
} else {
break;
}
}
if (upsum >= 5) {
return true;
}
//向下查找
int dosum = 1;
for (int dox = x - 1; dox >= 0; dox--) {
if (qp[dox][y].equals(qizi)) {
dosum++;
} else {
break;
}
}
if (dosum >= 5) {
return true;
}
/*
对角线查找
*/
//右斜向下查找
int xridosum = 1;
for (int xridox = x + 1, xridoy = y + 1; xridox <= 14 && xridoy <= 14; xridox++, xridoy++) {
if (qp[xridox][xridoy].equals(qizi)) {
xridosum++;
} else {
break;
}
}
if (xridosum >= 5) {
return true;
}
//右斜向上查找
int xriupsum = 1;
for (int xriupx = x + 1, xriupy = y - 1; xriupx <= 14 && xriupy >= 0; xriupx++, xriupy--) {
if (qp[xriupx][xriupy].equals(qizi)) {
xriupsum++;
} else {
break;
}
}
if (xriupsum >= 5) {
return true;
}
//左斜向下查找
int xledosum = 1;
for (int xledox = x - 1, xledoy = y + 1; xledox >= 0 && xledoy <= 14; xledox--, xledoy++) {
if (qp[xledox][xledoy].equals(qizi)) {
xledosum++;
} else {
break;
}
}
if (xledosum >= 5) {
return true;
}
//左斜向上查找
int xleupsum = 1;
for (int xleupx = x - 1, xleupy = y - 1; xleupx >= 0 && xleupy >= 0; xleupx--, xleupy--) {
if (qp[xleupx][xleupy].equals(qizi)) {
xleupsum++;
} else {
break;
}
}
if (xriupsum >= 5) {
return true;
}
return false;
}
//判断是否越界,是否重复
public static boolean check(int x, int y) {
if (x < 0 || y < 0 || y > 14 || x > 14) {
return false;
}
if (!qp[x][y].equals(line)) {
return false;
}
return true;
}
}