用JAVA实现2048小游戏

2024-03-05 11:40
文章标签 java 实现 小游戏 2048

本文主要是介绍用JAVA实现2048小游戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

用JAVA实现2048小游戏

  • 前言
  • 一、代码
    • 运行结果


前言

今天给大家分享一个简单的游戏——2048,想必大家平常都玩过这款,那么今天我就给大家分享一下这游戏的代码吧。下面直接给大家上代码展示!!

一、代码

package com.company;import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;
//继承 JPanel 用于我们游戏界面布局
//tips:JPanel 是 Java图形用户界面(GUI)工具包swing中的面板容器类
/*** 2048小游戏* 游戏玩法:通过上下左右方向键移动图块,使得数字合出2048则获胜*/
public class Game2048 extends JPanel {//枚举:开始,获胜,正在进行游戏,游戏结束enum State {start, won, running, over}final Color[] colorTable = {new Color(0x701710), new Color(0xFFE4C3), new Color(0xfff4d3),new Color(0xffdac3), new Color(0xe7b08e), new Color(0xe7bf8e),new Color(0xffc4c3), new Color(0xE7948e), new Color(0xbe7e56),new Color(0xbe5e56), new Color(0x9c3931), new Color(0x701710)};final static int target = 2048;//游戏最终目标static int higheNum;//最高数static int score;private Color gridColor = new Color(0xBBADA0);//网格颜色private Color emptyColor = new Color(0xCDC1B4);//没有图块的格子的颜色private Color startColor = new Color(0xFFEBCD);//开始界面框的颜色private Random rand = new Random();private Tile[][] tiles;private int side = 4;private State gamestate = State.start;private boolean checkingAvailableMoves;public Game2048() {setPreferredSize(new Dimension(900, 700));setBackground(new Color(0xFAF8EF));setFont(new Font("SansSerif", Font.BOLD, 48));setFocusable(true);addMouseListener(new MouseAdapter() {@Overridepublic void mousePressed(MouseEvent e) {startGame();repaint();}});addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {switch (e.getKeyCode()) {case KeyEvent.VK_UP:moveUp();break;case KeyEvent.VK_DOWN:moveDown();break;case KeyEvent.VK_LEFT:moveLeft();break;case KeyEvent.VK_RIGHT:moveRight();break;}repaint();}});}//复写JPanel里面的paintComponent方法,创建一个我们自己想要的界面@Overridepublic void paintComponent(Graphics gg) {super.paintComponent(gg);Graphics2D g = (Graphics2D) gg;g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);drawGrid(g);}//开始游戏void startGame() {if (gamestate != State.running) {score = 0;higheNum = 0;gamestate = State.running;tiles = new Tile[side][side];//执行两次,生成两个随机数addRandomTile();addRandomTile();}}//生成框及里面内容void drawGrid(Graphics2D g) {g.setColor(gridColor);g.fillRoundRect(200, 100, 499, 499, 15, 15);if (gamestate == State.running) {for (int r = 0; r < side; r++) {for (int c = 0; c < side; c++) {if (tiles[r][c] == null) {g.setColor(emptyColor);g.fillRoundRect(215 + c * 121, 115 + r * 121, 106, 106, 7, 7);} else {drawTile(g, r, c);}}}} else {g.setColor(startColor);g.fillRoundRect(215, 115, 469, 469, 7, 7);g.setColor(gridColor.darker());//设置一个比当前颜色深一级的Colorg.setFont(new Font("SansSerif", Font.BOLD, 128));g.drawString("2048", 310, 270);g.setFont(new Font("SansSerif", Font.BOLD, 20));if (gamestate == State.won) {g.drawString("恭喜你,你成功得到2048!!", 330, 350);} else if (gamestate == State.over)g.drawString("你失败了,请重新开始游戏", 330, 350);g.setColor(gridColor);g.drawString("开始游戏", 390, 470);g.drawString("tips:使用上下左右箭头移动图块", 310, 530);}}void drawTile(Graphics2D g, int r, int c) {int value = tiles[r][c].getValue();g.setColor(colorTable[(int) (Math.log(value) / Math.log(2)) + 1]);g.fillRoundRect(215 + c * 121, 115 + r * 121, 106, 106, 7, 7);String s = String.valueOf(value);g.setColor(value < 128 ? colorTable[0] : colorTable[1]);FontMetrics fm = g.getFontMetrics();int asc = fm.getAscent();int dec = fm.getDescent();int x = 215 + c * 121 + (106 - fm.stringWidth(s)) / 2;int y = 115 + r * 121 + (asc + (106 - (asc + dec)) / 2);g.drawString(s, x, y);}private void addRandomTile() {int pos = rand.nextInt(side * side);int row, col;do {pos = (pos + 1) % (side * side);row = pos / side;col = pos % side;} while (tiles[row][col] != null);int val = rand.nextInt(10) == 0 ? 4 : 2;tiles[row][col] = new Tile(val);}private boolean move(int countDownFrom, int yIncr, int xIncr) {boolean moved = false;for (int i = 0; i < side * side; i++) {int j = Math.abs(countDownFrom - i);int r = j / side;int c = j % side;if (tiles[r][c] == null)continue;int nextR = r + yIncr;int nextC = c + xIncr;while (nextR >= 0 && nextR < side && nextC >= 0 && nextC < side) {Tile next = tiles[nextR][nextC];Tile curr = tiles[r][c];if (next == null) {if (checkingAvailableMoves)return true;tiles[nextR][nextC] = curr;tiles[r][c] = null;r = nextR;c = nextC;nextR += yIncr;nextC += xIncr;moved = true;} else if (next.canMergeWith(curr)) {if (checkingAvailableMoves)return true;int value = next.mergeWith(curr);if (value > higheNum)higheNum = value;score += value;tiles[r][c] = null;moved = true;break;} elsebreak;}}if (moved) {if (higheNum < target) {clearMerged();addRandomTile();if (!movesAvailable()) {//如果不能再移动图块,则则把游戏状态变成游戏失败gamestate = State.over;}} else if (higheNum == target)//如果最高数=2048,则把游戏状态变成游戏成功gamestate = State.won;}return moved;}boolean moveUp() {return move(0, -1, 0);}boolean moveDown() {return move(side * side - 1, 1, 0);}boolean moveLeft() {return move(0, 0, -1);}boolean moveRight() {return move(side * side - 1, 0, 1);}void clearMerged() {for (Tile[] row : tiles)for (Tile tile : row)if (tile != null)tile.setMerged(false);}//判断是否还能继续移动图块boolean movesAvailable() {checkingAvailableMoves = true;boolean hasMoves = moveUp() || moveDown() || moveLeft() || moveRight();checkingAvailableMoves = false;return hasMoves;}public static void main(String[] args) {SwingUtilities.invokeLater(() -> {JFrame f = new JFrame();f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.setTitle("2048小游戏");f.setResizable(true);f.add(new Game2048(), BorderLayout.CENTER);f.pack();f.setLocationRelativeTo(null);f.setVisible(true);});}
}class Tile {private boolean merged;private int value;Tile(int val) {value = val;}boolean canMergeWith(Tile other) {return !merged && other != null && !other.merged && value == other.getValue();}int mergeWith(Tile other) {if (canMergeWith(other)) {value *= 2;merged = true;return value;}return -1;}//set getint getValue() {return value;}void setMerged(boolean m) {merged = m;}
}

运行结果

1.开始界面
在这里插入图片描述
2.游戏界面
在这里插入图片描述
3.失败后界面
在这里插入图片描述

这篇关于用JAVA实现2048小游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/776391

相关文章

pandas中位数填充空值的实现示例

《pandas中位数填充空值的实现示例》中位数填充是一种简单而有效的方法,用于填充数据集中缺失的值,本文就来介绍一下pandas中位数填充空值的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是中位数填充?为什么选择中位数填充?示例数据结果分析完整代码总结在数据分析和机器学习过程中,处理缺失数

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Pandas使用AdaBoost进行分类的实现

《Pandas使用AdaBoost进行分类的实现》Pandas和AdaBoost分类算法,可以高效地进行数据预处理和分类任务,本文主要介绍了Pandas使用AdaBoost进行分类的实现,具有一定的参... 目录什么是 AdaBoost?使用 AdaBoost 的步骤安装必要的库步骤一:数据准备步骤二:模型

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

使用Pandas进行均值填充的实现

《使用Pandas进行均值填充的实现》缺失数据(NaN值)是一个常见的问题,我们可以通过多种方法来处理缺失数据,其中一种常用的方法是均值填充,本文主要介绍了使用Pandas进行均值填充的实现,感兴趣的... 目录什么是均值填充?为什么选择均值填充?均值填充的步骤实际代码示例总结在数据分析和处理过程中,缺失数

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾