修改row和col可以改变大小,如果棋盘太小可以更改frame的长和宽
按 a 可以让电脑按上左下右的规则一直运行到游戏结束 // 暂时不知道怎么变成动态的,并且row和col大于6时就会运行很久
上下左右都是通过 先合并,再移动 的方式实现的 // 可能比较复杂
这是类的代码,要运行直接再main函数里面实例化对象就行了
package com.game.frame;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
public class GameFrame implements KeyListener {
private static final int row = 4;
private static final int col = 4;
private static final int totalNum = 12;
int aiCount = 0;
long Score = 0;
Font fontSongti = new Font("宋体", Font.BOLD, 24); // 加粗
Color backgroundColor = new Color(188, 177, 159);
Color numberColor[] = new Color[totalNum];
long[] gameBoard = new long[row * col];
JFrame frame = new JFrame("2048");
JLabel[] jl = new JLabel[row * col];
JPanel jp = new JPanel();
boolean moved = false;
public GameFrame() {
// 初始化棋盘
initGameBoard();
// 初始化各种颜色
setColor();
// 设置窗体属性
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭就结束程序
jp.setLayout(new GridLayout(row, col, 10, 10));
jp.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
jp.setBackground(backgroundColor);
frame.setVisible(true);
frame.setSize(600, 600);
frame.setResizable(false); // 无法最大化
frame.setLocationRelativeTo(null); // 居中显示
frame.setFocusable(true);
// 添加组件
frame.add(jp);
loadBoard();
frame.addKeyListener(this);
}
public void initGameBoard() {
for (int i = 0; i < row * col; ++i) {
gameBoard[i] = 0;
}
// 随机生成两个地方
generateRandomNum();
generateRandomNum();
}
public boolean check() {
boolean dead = true;
for(int i = 0; i < row; ++i) {
for(int j = 0; j < col; ++j) {
if(0