(游戏:四子连)四子连是一个两个人玩的棋盘游戏,在游戏 中,玩家轮流将有颜色的棋子放在一个六行七列的垂直悬挂的 网格中,如下所示。 这个游戏的目的是在对手实现一行、一列或者一条对角线 上有四个相同颜色的棋子之前,你能先做到。程序提示两个玩 家交替地下红子 Red 或黄子 Yellow。当放下一子时,程序在控 制台重新显示这个棋盘,然后确定游戏的状态(贏、平局还是 继续)。下面是一个运行示例:
// 四连子: 在游戏中,玩家轮流将红黄棋子放在一个六行七列的垂直悬挂的网格中 // 先4连的获胜,或者棋盘全部下满还没有出现四连则平局 // 编写程序模拟该游戏的全过程 import java.util.Scanner; public class SiLianZi { public static void main(String[] args) { char[][] checkerboard = new char[6][15]; // 创建一个二维数组模拟网格 char[][] chess = new char[6][7]; // 创建一个二维数组记录棋子的落点 checkerboardInput(checkerboard); // 对数组checkerboard赋值形成网格 int num = 0; do { System.out.println(); checkerboardOutput(checkerboard); // 输出数组checkerboard中的所有元素即网格加棋子 playChess(checkerboard, chess, num); // 对数组chess赋值, 将棋子落点添加到数组checkerboard中 num++; } while (fourLinks(chess, num) && num < 42); // fourLinks(chess, num)判断是否有棋子4连,小于42表示棋盘没满 System.out.println(); checkerboardOutput(checkerboard); if (fourLinks(chess, num)) { System.out.println("棋逢对手——平局"); } else { if ( num % 2 == 0) { System.out.println("执黄色棋的玩家获胜"); } else { System.out.println("执红色棋的玩家获胜"); } } } public static void checkerboardInput(char[][] checkerboard) { // 对数组checkerboard赋值形成网格 for (int i = 0; i < 6; i++) { for (int j = 0; j < 15; j++) { if (j % 2 == 0) { checkerboard[i][j] = '|'; } } } } public static void checkerboardOutput(char[][] checkerboard) { // 输出数组checkerboard中的所有元素即网格加棋子 for (int i = 0; i < 6; i++) { for (int j = 0; j < 15; j++) { System.out.print(checkerboard[i][j]); } System.out.println(); } System.out.println(); } public static void playChess(char[][] checkerboard, char[][] chess, int num) { // 对数组chess赋值, 将棋子落点添加到数组checkerboard中 Scanner sc = new Scanner(System.in); if (num % 2 == 0) { System.out.print("在0-6了列放下红色磁盘: "); int a = sc.nextInt(); for (int j = 5; j >= 0; j--) { if (checkerboard[j][2 * a + 1] == 0) { // 判断a列该下到哪个位置 checkerboard[j][2 * a + 1] = 'R'; chess[j][a] = 'R'; break; } } } else { System.out.print("在0-6了列放下黄色磁盘: "); int a = sc.nextInt(); for (int j = 5; j >= 0; j--) { if (checkerboard[j][2 * a + 1] == 0) { // 判断a列该下到哪个位置 checkerboard[j][2 * a + 1] = 'Y'; chess[j][a] = 'Y'; break; } } } } public static boolean fourLinks(char[][] chess, int num) { // 判断是否有棋子4连 int num1; int num2; int num3; if (num > 5) { for (int i = 5; i >= 0; i--) { // 判断行是否有棋子4连 num1 = 0; for (int j = 1; j < 7; j++) { if (chess[i][j] == chess[i][j - 1] && chess[i][j] != 0) { // 比较挨着的两个棋子颜色是否相同 num1++; // 连续比较挨着的两个棋子颜色相同的次数 if (num1 == 3) { return false; } } else { num1 = 0; } } } for (int j = 0; j < 7; j++) { // 判断列是否有棋子4连 num1 = 0; for (int i = 5; i > 0; i--) { if (chess[i][j] == chess[i - 1][j] && chess[i][j] != 0) { num1++; if (num1 == 3) { return false; } } else { num1 = 0; } } } for (int i = 0; i < 3; i++) { // 判断主对角的左半边是否有棋子4连 num3 = 0; num1 = 5; num2 = 3; num2 = num2 + i; for (int j = 0; j < i + 3; j++) { if (chess[num1][num2] == chess[num1 - 1][num2 - 1] && chess[num1][num2] != 0) { num3++; if (num3 == 3) { return false; } } else { num3 = 0; } num1--; num2--; } } for (int i = 0; i < 3; i++) { // 判断主对角的右半边是否有棋子4连 num3 = 0; num1 = 0; num2 = 1; num2 = num2 + i; for (int j = 5 - i; j > 0; j--) { if (chess[num1][num2] == chess[num1 + 1][num2 + 1] && chess[num1][num2] != 0) { num3++; if (num3 == 3) { return false; } } else { num3 = 0; } num1++; num2++; } } for (int i = 0; i < 3; i++) { // 判断副对角的左半边是否有棋子4连 num3 = 0; num1 = 0; num2 = 3; num2 = num2 + i; for (int j = 0; j < i + 3; j++) { if (chess[num1][num2] == chess[num1 + 1][num2 - 1] && chess[num1][num2] != 0) { num3++; if (num3 == 3) { return false; } } else { num3 = 0; } num1++; num2--; } } for (int i = 0; i < 3; i++) { // 判断副对角的右半边是否有棋子4连 num3 = 0; num1 = 5; num2 = 1; num2 = num2 + i; for (int j = 5 - i; j > 0; j--) { if (chess[num1][num2] == chess[num1 - 1][num2 + 1] && chess[num1][num2] != 0) { num3++; if (num3 == 3) { return false; } } else { num3 = 0; } num1--; num2++; } } } return true; } }