项目要求
四连珠游戏,两个玩家交替落子。
每次输入一个数表示在该列落子,由下往上落子。若同一玩家在同行、同列或对角线出现四连珠则获胜。
代码如下
package curriculum.java;
import java.util.Scanner;
public class connectFour {
private static int girds[][] = new int[7][7];
private static int column;
private static int player1 = 1, player2 = 2;// player1表示为R(red),player2表示为Y(yellow)
private static int player = player1; // 初始化先落子的玩家为R玩家
private static int win = 0;// 记录获胜情况
private static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
// 一直循环至有玩家获胜或者平局
while (judgeDraw() == true && win == 0) {
// 一直循环至玩家输入正确
while (true) {
System.out.print("Drop a " + (player == 1 ? "red" : "yellow")
+ " disk at column (0-6): ");
column = input.nextInt();
if (judgeToken(column, player) == 1) {
break;
}
}
// 更换落子的玩家
if (player == player1) {
player = player2;
} else {
player = player1;
}
}
}
// 判断格子是否可以落子并显示棋盘
private static int judgeToken(int c, int p) {
if (c < 0 || c > 6 || girds[0][c] != 0) {
System.out.println("Input Error! Please re-enter.");
return 0;
}
for (int i = 6; i >= 0; i--) {
if (girds[i][c] == 0) {
girds[i][c] = p;
showGirds();
judgeWin(i, c, p);
return 1;
}
}
return 0;
}
// 判断是否获胜。r表示行,c表示列,p表示玩家;返回判断情况,若为1则游戏结束
private static void judgeWin(int r, int c, int p) {
int count1 = 0, count2 = 0, count3 = 0, count4 = 0;
// count1:判断同列是否连续4个相同,相同则+1,不同则清零重计
// count2:判断同行是否连续4个相同,相同则+1,不同则清零重计
for (int i = 0; i < 7; ++i) {
if (girds[i][c] == p) {
count1++;
} else if (count1 < 4) {
count1 = 0;
}
if (girds[r][i] == p) {
count2++;
} else if (count2 < 4) {
count2 = 0;
}
}
// count3:判断右上到左下对角线是否连续4个相同,相同则+1,不同则清零重计
if (r < 4 && c > 2) {
for (int i = r, j = c; i < 7; i++, j--) {
if (girds[i][j] == p) {
count3++;
} else {
count3 = 0;
}
}
}
// count4:判断左上到右下对角线是否连续4个相同,相同则+1,不同则清零重计
if (r < 4 && c < 4) {
for (int i = r, j = c; i < 7; i++, j++) {
if (girds[i][j] == p) {
count4++;
} else {
count4 = 0;
}
}
}
// count1、count2、count3、count4任一成为4则表示四子相连,以此判断获胜情况
if (count1 >= 4 || count2 >= 4 || count3 >= 4 || count4 >= 4) {
System.out.println((p == 1 ? "red" : "yellow") + " win.");
win = 1;
}
}
// 判断是否平局。若有空格则不算平局
private static boolean judgeDraw() {
for (int i = 0; i < 7; ++i) {
for (int j = 0; j < 7; ++j) {
if (girds[i][j] == 0) {
return true;
}
}
}
System.out.println("Y and R draw.");
return false;
}
// 显示棋盘
private static void showGirds() {
for (int i = 0; i < 7; ++i) {
for (int j = 0; j < 7; ++j) {
System.out.print("|"
+ (girds[i][j] == 0 ? " " : (girds[i][j] == 1 ? "R"
: "Y")) + "");
if (j == 6) {
System.out.println("|");
}
}
}
System.out.println("---------------");
}
}
运行结果
同行四连珠
同列四连珠
右上到左下四连珠
左上到右下四连珠
超出棋盘
题目来自《JAVA语言程序设计》P258-7.20***