首页 > 试题广场 >

(游戏:四子连)四子连是一个两个人玩的棋盘游戏,在游戏 中

[问答题]
 (游戏:四子连)四子连是一个两个人玩的棋盘游戏,在游戏 中,玩家轮流将有颜色的棋子放在一个六行七列的垂直悬挂的 网格中,如下所示。 这个游戏的目的是在对手实现一行、一列或者一条对角线 上有四个相同颜色的棋子之前,你能先做到。程序提示两个玩 家交替地下红子 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;
	}
}

发表于 2020-03-03 15:42:11 回复(0)