2020年最强大脑第五期黑白迭代小游戏实现(Java)

游戏规则:

8×8的棋盘上初始所有格子均为白色。每点击一个方格,则该方格与其上下左右共5个方格变色(由白变黑或相反)。游戏目标是要把自己的棋盘变为与题目棋盘完全一致。

 

实现代码:

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;

import static java.awt.Color.*;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import java.util.Random;

public class Game extends JFrame implements MouseListener {

	public static Random random = new Random();
	
	public static int[][][] items = new int[2][8][8];//存储棋盘状态
	
	public static JButton[][][] jButtons = new JButton[2][8][8];//棋盘格子对应的按钮
	
	public static JButton nextJButton = new JButton("next");
	public static JButton resetJButton = new JButton("reset");

	public static void main(String[] args) {
		new Game("黑白迭代");
		init(0);
		init(1);
		create();
	}

	public Game() {
		this("未命名");
	}

	/*
	 * 绘制游戏窗口
	 */
	public Game(String title) {
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 8; j++) {
				jButtons[0][i][j] = new JButton();
				jButtons[1][i][j] = new JButton();
				jButtons[1][i][j].addMouseListener(this);
			}
		}
		
		JPanel jPanel1 = new JPanel(new GridLayout(8, 8));
		JPanel jPanel2 = new JPanel(new GridLayout(8, 8));
		
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 8; j++) {
				jPanel1.add(jButtons[0][i][j]);
				jPanel2.add(jButtons[1][i][j]);
			}
		}
		
		JPanel jPanel3 = new JPanel(new GridLayout(1, 2, 10, 10));
		
		jPanel3.add(jPanel1);
		jPanel3.add(jPanel2);
		
		JPanel jPanel4 = new JPanel();
		
		nextJButton.addMouseListener(this);
		resetJButton.addMouseListener(this);
		
		jPanel4.add(nextJButton);
		jPanel4.add(resetJButton);
		
		this.add(jPanel3, BorderLayout.CENTER);
		this.add(jPanel4, BorderLayout.SOUTH);
		
		this.setTitle(title);
		this.setSize(1200, 900);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setVisible(true);
	}
	
	/*
	 * 初始化棋盘,棋盘状态数组里置0,代表格子的按钮恢复为白色
	 */
	public static void init(int num) {
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 8; j++) {
				items[num][i][j] = 0;
				jButtons[num][i][j].setBackground(WHITE);
			}
		}
	}

	/*
	 * 随机出题,在棋盘的左4列25%概率地生成黑色格子,再轴对称到右边四列
	 */
	public static void create() {
		init(0);
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 4; j++) {
				if (random.nextInt(4) == 1) {
					items[0][i][j] = 1;
					items[0][i][7 - j] = 1;
					jButtons[0][i][j].setBackground(BLACK);
					jButtons[0][i][7 - j].setBackground(BLACK);
				}
			}
		}
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		/*
		 * 按游戏规则,点击就先改变状态数组,要考虑边缘情况
		 */
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 8; j++) {
				if (e.getSource() == jButtons[1][i][j]) {
					items[1][i][j] = 1 - items[1][i][j];
					if (i != 0)
						items[1][i - 1][j] = 1 - items[1][i - 1][j];
					if (j != 0)
						items[1][i][j - 1] = 1 - items[1][i][j - 1];
					if (i != 7)
						items[1][i + 1][j] = 1 - items[1][i + 1][j];
					if (j != 7)
						items[1][i][j + 1] = 1 - items[1][i][j + 1];
				}
			}
		}
		/*
		 * 遍历状态数组,改变对应格子颜色
		 */
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 8; j++) {
				jButtons[1][i][j].setBackground(items[1][i][j] == 0 ? WHITE : BLACK);
			}
		}
		//next按钮重置右边棋盘并重新出题
		if (e.getSource() == nextJButton) {
			init(1);
			create();
		}
		//reset按钮只重置右边棋盘
		if (e.getSource() == resetJButton)
			init(1);
	}
	
	@Override
	public void mousePressed(MouseEvent e) {}
	@Override
	public void mouseReleased(MouseEvent e) {}
	@Override
	public void mouseEntered(MouseEvent e) {}
	@Override
	public void mouseExited(MouseEvent e) {}
}

效果图:

黑白迭代

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章