基于Java的2048小游戏的设计与实现,附源码+文档,适合课程设计,包远程安装调试运行

1、项目介绍

本游戏采用Java语言编写,使用Eclipse编译器,jdk1.8编译环境。游戏的UI主要运用Java图形界面编程(AWT),实现窗口化可视化的界面。

游戏的后台通过监听键盘方向键来移动数字方块,运用随机数的思想随机产生一个2或4的随机数,显示在随机方块中,运用二维数组存储、遍历查找等思想,在每次移动前循环查找二维数组相邻的移动方向的行或列可以合并与否,如果没有可以合并的数字方块同时又没有空余的空间产生新的数字则游戏宣告结束,同时,当检测到合并的结果中出现2048,也宣告游戏结束。

游戏设计了非常简单的交互逻辑,流程如下:

为了增加游戏的用户体验,后期加入了操作音效(音效文件提取自百度移动应用商店——2048),在移动和合并方块时播放不同声音。

2、技术框架

运行系统:windows

编程语言:java

系统架构:gui界面

系统框架:Swing+AWT

数据库:无

Maven项目:否

运行环境:JDK8+idea

3、演示视频

基于Java的2048小游戏的设计与实现

4、项目截图

5、文档截图

6、代码示例

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;



public class Game extends JFrame {

	/**
	 * KevinWu
	 */
	private static final long serialVersionUID = 1L;

	public static void main(String[] args) {
		Game UI = new Game();
		UI.IntUI();
	}

	// 用于存放数据的数组
	private int Numbers[][] = new int[4][4];

	private void IntUI() {
		this.setTitle("2048小游戏");
		this.setLocation(450, 100);
		this.setSize(400, 500);
		this.setLayout(null);

		// 开始游戏按钮
		ImageIcon imgicon = new ImageIcon("res/start.png");
		JButton bt = new JButton(imgicon);
		bt.setFocusable(false);
		bt.setBorderPainted(false);
		bt.setFocusPainted(false);
		bt.setContentAreaFilled(false);
		bt.setBounds(5, 10, 120, 30);// 设置按钮的x,y坐标位置和宽度与高度
		this.add(bt);

		//后退一步按钮
		ImageIcon backicon = new ImageIcon("res/backicon.png");
		JButton back = new JButton(backicon);
		back.setFocusable(false);
		back.setBorderPainted(false);
		back.setFocusPainted(false);
		back.setContentAreaFilled(false);
		back.setBounds(270, 10, 120, 30);// 设置按钮的x,y坐标位置和宽度与高度
		this.add(back);

		// 关于按钮
		ImageIcon imgicon2 = new ImageIcon("res/about.png");
		JButton about = new JButton(imgicon2);
		about.setFocusable(false);
		about.setBorderPainted(false);
		about.setFocusPainted(false);
		about.setContentAreaFilled(false);
		about.setBounds(160, 10, 70, 30);
		this.add(about);

		// 分数显示
		JLabel lb = new JLabel("分数:0");
		lb.setBounds(40, 45, 120, 30);
		lb.setFont(new Font("幼圆", Font.CENTER_BASELINE, 18));
		lb.setForeground(new Color(0x000000));
		this.add(lb);
		
		
		JCheckBox isSoundBox=new JCheckBox("静音");
		isSoundBox.setBounds(290, 45, 120, 30);
		isSoundBox.setFont(new Font("幼圆", Font.CENTER_BASELINE, 18));
		isSoundBox.setFocusable(false);
		isSoundBox.setBorderPainted(false);
		isSoundBox.setFocusPainted(false);
		isSoundBox.setContentAreaFilled(false);
		this.add(isSoundBox);
		
		this.setDefaultCloseOperation(3);
		this.setResizable(false);
		this.setVisible(true);// 显示界面

		// 创建事件处理类
		MyListener cl = new MyListener(this, Numbers, lb, bt, about,back,isSoundBox);
		bt.addActionListener(cl);
		about.addActionListener(cl);
		back.addActionListener(cl);
		isSoundBox.addActionListener(cl);
		this.addKeyListener(cl);

	}

	// 重写窗体
	@Override
	public void paint(Graphics g) {
		super.paint(g);
		g.setColor(new Color(0xBBADA0));
		g.fillRoundRect(15, 110, 370, 370, 15, 15);// 大矩形框

		g.setColor(new Color(0xCDC1B4));
		for (int i = 0; i < 4; i++) {
			for (int j = 0; j < 4; j++) {
				g.fillRoundRect(25 + i * 90, 120 + j * 90, 80, 80, 15, 15);// 小矩形框
			}
		}

		// 调整数字的位置并上色
		for (int i = 0; i < 4; i++) {
			for (int j = 0; j < 4; j++) {
				if (Numbers[j][i] != 0) {
					int FontSize = 30;
					int MoveX = 0, MoveY = 0;
					switch (Numbers[j][i]) {
					case 2:
						g.setColor(new Color(0xeee4da));
						FontSize = 30;
						MoveX = 0;
						MoveY = 0;
						break;
					case 4:
						g.setColor(new Color(0xede0c8));
						FontSize = 30;
						MoveX = 0;
						MoveY = 0;
						break;
					case 8:
						g.setColor(new Color(0xf2b179));
						FontSize = 30;
						MoveX = 0;
						MoveY = 0;
						break;
					case 16:
						g.setColor(new Color(0xf59563));
						FontSize = 29;
						MoveX = -5;
						MoveY = 0;
						break;
					case 32:
						g.setColor(new Color(0xf67c5f));
						FontSize = 29;
						MoveX = -5;
						MoveY = 0;
						break;
					case 64:
						g.setColor(new Color(0xf65e3b));
						FontSize = 29;
						MoveX = -5;
						MoveY = 0;
						break;
					case 128:
						g.setColor(new Color(0xedcf72));
						FontSize = 28;
						MoveX = -10;
						MoveY = 0;
						break;
					case 256:
						g.setColor(new Color(0xedcc61));
						FontSize = 28;
						MoveX = -10;
						MoveY = 0;
						break;
					case 512:
						g.setColor(new Color(0xedc850));
						FontSize = 28;
						MoveX = -10;
						MoveY = 0;
						break;
					case 1024:
						g.setColor(new Color(0xedc53f));
						FontSize = 27;
						MoveX = -15;
						MoveY = 0;
						break;
					case 2048:
						g.setColor(new Color(0xedc22e));
						FontSize = 27;
						MoveX = -15;
						MoveY = 0;
						break;
					default:
						g.setColor(new Color(0x000000));
						break;
					}

					g.fillRoundRect(25 + i * 90, 120 + j * 90, 80, 80, 15, 15);// 小矩形框上色
					g.setColor(new Color(0x000000));
					g.setFont(new Font("Kristen ITC", Font.PLAIN, FontSize));
					g.drawString(Numbers[j][i] + "", 25 + i * 90 + 30 + MoveX,
							120 + j * 90 + 50 + MoveY);
				}
			}
		}
	}

}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java源码集合

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值