返回顶部
首页 > 资讯 > 精选 >使用Java编写一个2048小游戏
  • 775
分享到

使用Java编写一个2048小游戏

2023-06-06 15:06:26 775人浏览 泡泡鱼
摘要

本文章向大家介绍使用Java编写一个2048小游戏的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页

本文章向大家介绍使用Java编写一个2048小游戏的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Java可以用来干什么

Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页开发;5. 企业级应用开发;6. Java大数据开发;7.游戏开发等。

1.项目结构

使用Java编写一个2048小游戏

2.代码

BaseData接口

package com.hsy.game;import java.awt.*;public interface BaseData { Font topicFont = new Font("微软雅黑", Font.BOLD, 50); Font scoreFont = new Font("微软雅黑", Font.BOLD, 28); Font nORMalFont = new Font("宋体", Font.PLaiN, 20); Font font1 = new Font("宋体", Font.BOLD, 46); Font font2 = new Font("宋体", Font.BOLD, 40); Font font3 = new Font("宋体", Font.BOLD, 34); Font font4 = new Font("宋体", Font.BOLD, 28); Font font5 = new Font("宋体", Font.BOLD, 22); int normalFontData = 20; int topicFontData = 30; void init(); void showView();}

GameView类

package com.hsy.game;import java.awt.Color;import java.awt.FlowLayout;import java.awt.FontMetrics;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.RenderingHints;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.ArrayList;import java.util.List;import java.util.Random;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;public class GameView implements BaseData{ private static final int jFrameWidth = 400; private static final int jFrameHeight = 530; private static int score = 0; private JFrame jFrameMain; private JLabel jLblTitle; private JLabel jLblScoreName; private JLabel jLblScore; private GameBoard gameBoard; private JLabel jlblTip; public GameView() {  init(); } @Override public void init() {  jFrameMain = new JFrame("2048小游戏");  jFrameMain.setSize(jFrameWidth, jFrameHeight);  jFrameMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  jFrameMain.setLocationRelativeTo(null);  jFrameMain.setResizable(false);  jFrameMain.setLayout(null);  jLblTitle = new JLabel("2048", JLabel.CENTER);  jLblTitle.setFont(topicFont);  jLblTitle.setForeground(Color.BLACK);  jLblTitle.setBounds(50, 0, 150, 60);  jFrameMain.add(jLblTitle);  // 分数区  jLblScoreName = new JLabel("得 分", JLabel.CENTER);  jLblScoreName.setFont(scoreFont);  jLblScoreName.setForeground(Color.WHITE);  jLblScoreName.setOpaque(true);  jLblScoreName.setBackground(Color.GRAY);  jLblScoreName.setBounds(250, 0, 120, 30);  jFrameMain.add(jLblScoreName);  jLblScore = new JLabel("0", JLabel.CENTER);  jLblScore.setFont(scoreFont);  jLblScore.setForeground(Color.WHITE);  jLblScore.setOpaque(true);  jLblScore.setBackground(Color.GRAY);  jLblScore.setBounds(250, 30, 120, 30);  jFrameMain.add(jLblScore);  // 说明:  jlblTip = new JLabel("操作: ↑ ↓ ← →, 按esc键重新开始 ",    JLabel.CENTER);  jlblTip.setFont(normalFont);  jlblTip.setForeground(Color.DARK_GRAY);  jlblTip.setBounds(0, 60, 400, 40);  jFrameMain.add(jlblTip);  gameBoard = new GameBoard();  gameBoard.setBounds(0, 100, 400, 400);  gameBoard.setBackground(Color.GRAY);  gameBoard.setFocusable(true);  gameBoard.setLayout(new FlowLayout());  jFrameMain.add(gameBoard); } // 游戏面板需要对键值实现侦听, // 这里采用内部类来继承 JPanel 类, // 并实现接口 KeyListener 中的 keyPressed 方法, // 方格是通过 @SuppressWarnings("serial") class GameBoard extends JPanel implements KeyListener {  private static final int CHECK_GAP = 10;  private static final int CHECK_ARC = 20;  private static final int CHECK_SIZE = 86;  private Check[][] checks = new Check[4][4];  private boolean isAdd = true;  public GameBoard() {   initGame();   addKeyListener(this);  }  @Override  public void keyPressed(KeyEvent e) {   switch (e.geTKEyCode()) {    case KeyEvent.VK_ESCAPE:     initGame();     break;    case KeyEvent.VK_LEFT:     moveLeft();     createCheck();     judgeGameOver();     break;    case KeyEvent.VK_RIGHT:     moveRight();     createCheck();     judgeGameOver();     break;    case KeyEvent.VK_UP:     moveUp();     createCheck();     judgeGameOver();     break;    case KeyEvent.VK_DOWN:     moveDown();     createCheck();     judgeGameOver();     break;    default:     break;   }   repaint();  }  private void initGame() {   score = 0;   for (int indexRow = 0; indexRow < 4; indexRow++) {    for (int indexCol = 0; indexCol < 4; indexCol++) {     checks[indexRow][indexCol] = new Check();    }   }   // 生成两个数   isAdd = true;   createCheck();   isAdd = true;   createCheck();  }  private void createCheck() {   List<Check> list = getEmptyChecks();   if (!list.isEmpty() && isAdd) {    Random random = new Random();    int index = random.nextInt(list.size());    Check check = list.get(index);    // 2, 4出现概率3:1    check.value = (random.nextInt(4) % 3 == 0) ? 2 : 4;    isAdd = false;   }  }  // 获取空白方格  private List<Check> getEmptyChecks() {   List<Check> checkList = new ArrayList<>();   for (int i = 0; i < 4; i++) {    for (int j = 0; j < 4; j++) {     if (checks[i][j].value == 0) {      checkList.add(checks[i][j]);     }    }   }   return checkList;  }  private boolean judgeGameOver() {   jLblScore.setText(score + "");   if (!getEmptyChecks().isEmpty()) {    return false;   }   for (int i = 0; i < 3; i++) {    for (int j = 0; j < 3; j++) {     //判断是否存在可合并的方格     if (checks[i][j].value == checks[i][j + 1].value       || checks[i][j].value == checks[i + 1][j].value) {      return false;     }    }   }   return true;  }  private boolean moveLeft() {   for (int i = 0; i < 4; i++) {    for (int j = 1, index = 0; j < 4; j++) {     if (checks[i][j].value > 0) {      if (checks[i][j].value == checks[i][index].value) {       score += checks[i][index++].value <<= 1;       checks[i][j].value = 0;       isAdd = true;      } else if (checks[i][index].value == 0) {       checks[i][index].value = checks[i][j].value;       checks[i][j].value = 0;       isAdd = true;      } else if (checks[i][++index].value == 0) {       checks[i][index].value = checks[i][j].value;       checks[i][j].value = 0;       isAdd = true;      }     }    }   }   return isAdd;  }  private boolean moveRight() {   for (int i = 0; i < 4; i++) {    for (int j = 2, index = 3; j >= 0; j--) {     if (checks[i][j].value > 0) {      if (checks[i][j].value == checks[i][index].value) {       score += checks[i][index--].value <<= 1;       checks[i][j].value = 0;       isAdd = true;      } else if (checks[i][index].value == 0) {       checks[i][index].value = checks[i][j].value;       checks[i][j].value = 0;       isAdd = true;      } else if (checks[i][--index].value == 0) {       checks[i][index].value = checks[i][j].value;       checks[i][j].value = 0;       isAdd = true;      }     }    }   }   return isAdd;  }  private boolean moveUp() {   for (int i = 0; i < 4; i++) {    for (int j = 1, index = 0; j < 4; j++) {     if (checks[j][i].value > 0) {      if (checks[j][i].value == checks[index][i].value) {       score += checks[index++][i].value <<= 1;       checks[j][i].value = 0;       isAdd = true;      } else if (checks[index][i].value == 0) {       checks[index][i].value = checks[j][i].value;       checks[j][i].value = 0;       isAdd = true;      } else if (checks[++index][i].value == 0){       checks[index][i].value = checks[j][i].value;       checks[j][i].value = 0;       isAdd = true;      }     }    }   }   return isAdd;  }  private boolean moveDown() {   for (int i = 0; i < 4; i++) {    for (int j = 2, index = 3; j >= 0; j--) {     if (checks[j][i].value > 0) {      if (checks[j][i].value == checks[index][i].value) {       score += checks[index--][i].value <<= 1;       checks[j][i].value = 0;       isAdd = true;      } else if (checks[index][i].value == 0) {       checks[index][i].value = checks[j][i].value;       checks[j][i].value = 0;       isAdd = true;      } else if (checks[--index][i].value == 0) {       checks[index][i].value = checks[j][i].value;       checks[j][i].value = 0;       isAdd = true;      }     }    }   }   return isAdd;  }  @Override  public void paint(Graphics g) {   super.paint(g);   for (int i = 0; i < 4; i++) {    for (int j = 0; j < 4; j++) {     drawCheck(g, i, j);    }   }   // GameOver   if (judgeGameOver()) {    g.setColor(new Color(64, 64, 64, 150));    g.fillRect(0, 0, getWidth(), getHeight());    g.setColor(Color.WHITE);    g.setFont(topicFont);    FontMetrics fms = getFontMetrics(topicFont);    String value = "Game Over!";    g.drawString(value,      (getWidth()-fms.stringWidth(value)) / 2,      getHeight() / 2);   }  }  // 绘制方格  // Graphics2D 类扩展了 Graphics 类,  // 提供了对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制  private void drawCheck(Graphics g, int i, int j) {   Graphics2D gg = (Graphics2D) g;   gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,     RenderingHints.VALUE_ANTIALIAS_ON);   gg.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,     RenderingHints.VALUE_STROKE_NORMALIZE);   Check check = checks[i][j];   gg.setColor(check.getBackground());   // 绘制圆角   // x - 要填充矩形的 x 坐标。   // y - 要填充矩形的 y 坐标。   // width - 要填充矩形的宽度。   // height - 要填充矩形的高度。   // arcwidth - 4 个角弧度的水平直径。   // archeight - 4 个角弧度的垂直直径。   gg.fillRoundRect(CHECK_GAP + (CHECK_GAP + CHECK_SIZE) * j,     CHECK_GAP + (CHECK_GAP + CHECK_SIZE) * i,     CHECK_SIZE, CHECK_SIZE, CHECK_ARC, CHECK_ARC);   gg.setColor(check.getForeground());   gg.setFont(check.getCheckFont());   // 对文字的长宽高测量。   FontMetrics fms = getFontMetrics(check.getCheckFont());   String value = String.valueOf(check.value);   //使用此图形上下文的当前颜色绘制由指定迭代器给定的文本。   //getAscent()是FontMetrics中的一个方法,   //它返回某字体的基线(baseline)到该字体中大多数字符的升部(ascender)之间的距离   //getDescent 为降部   gg.drawString(value,     CHECK_GAP + (CHECK_GAP + CHECK_SIZE) * j +       (CHECK_SIZE - fms.stringWidth(value)) / 2,     CHECK_GAP + (CHECK_GAP + CHECK_SIZE) * i +       (CHECK_SIZE - fms.getAscent() - fms.getDescent()) / 2       + fms.getAscent());  }  @Override  public void keyReleased(KeyEvent e) {  }  @Override  public void keyTyped(KeyEvent e) {  } } @Override public void showView() {  jFrameMain.setVisible(true); }}

Check类

package com.hsy.game;import java.awt.Color;import java.awt.Font;public class Check { public int value; public Check() {  clear(); } public void clear() {  value = 0; } public Color getForeground() {  switch (value) {   case 0:    return new Color(0xcdc1b4);   case 2:   case 4:    return Color.BLACK;   default:    return Color.WHITE;  } } public Color getBackground() {  switch (value) {   case 0:    return new Color(0xcdc1b4);   case 2:    return new Color(0xeee4da);   case 4:    return new Color(0xede0c8);   case 8:    return new Color(0xf2b179);   case 16:    return new Color(0xf59563);   case 32:    return new Color(0xf67c5f);   case 64:    return new Color(0xf65e3b);   case 128:    return new Color(0xedcf72);   case 256:    return new Color(0xedcc61);   case 512:    return new Color(0xedc850);   case 1024:    return new Color(0xedc53f);   case 2048:    return new Color(0xedc22e);   case 4096:    return new Color(0x65da92);   case 8192:    return new Color(0x5abc65);   case 16384:    return new Color(0x248c51);   default:    return new Color(0x248c51);  } } public Font getCheckFont() {  if (value < 10) {   return BaseData.font1;  }  if (value < 100) {   return BaseData.font2;  }  if (value < 1000) {   return BaseData.font3;  }  if (value < 10000) {   return BaseData.font4;  }  return BaseData.font5; }}

Test类

package com.hsy.game;public class Test { public static void main(String[] args) {  new GameView().showView(); }}

以上就是小编为大家带来的使用Java编写一个2048小游戏的全部内容了,希望大家多多支持编程网!

--结束END--

本文标题: 使用Java编写一个2048小游戏

本文链接: https://lsjlt.com/news/247551.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用Java编写一个2048小游戏
    本文章向大家介绍使用Java编写一个2048小游戏的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页...
    99+
    2023-06-06
  • 使用JavaScript编写一个2048小游戏
    今天就跟大家聊聊有关使用JavaScript编写一个2048小游戏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点...
    99+
    2023-06-07
  • Android编写2048小游戏
    先来说说2048游戏规则: 开始时棋盘内随机出现两个数字,出现的数字仅可能为2或4 玩家可以选择上下左右四个方向,若棋盘内的数字出现位移或合并,视为有效移动 玩家选择的方向上若...
    99+
    2022-06-06
    小游戏 Android
  • 用Python写一个无界面的2048小游戏
    以前游戏2048火的时候,正好用其他的语言编写了一个,现在学习python,正好想起来,便决定用python写一个2048,由于没学过python里面的界面编程,所以写了一个极其简单的无界面2048。游戏2...
    99+
    2022-06-04
    小游戏 界面 Python
  • 利用c++编写简易版2048小游戏
    目录1、程序初始化2、画图操作3、字符控制4、判断游戏结束和游戏胜利别的不多说,先上效果图 我们都知道2048是个4 4的方格,为了方便数组下表我们生成5 5的数组,只用到1~4的...
    99+
    2024-04-02
  • 利用java编写一个弹球小游戏
    本篇文章给大家分享的是有关利用java编写一个弹球小游戏,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。弹球游戏实现原理:  隔一定时间(小于1秒)重新绘制图像,因为Graphi...
    99+
    2023-05-31
    java ava
  • 原生js如何编写2048小游戏
    这篇文章给大家分享的是有关原生js如何编写2048小游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果图:代码如下:<!DOCTYPE html> &l...
    99+
    2024-04-02
  • 使用java编写一个猜字母游戏
    使用java编写一个猜字母游戏?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和...
    99+
    2023-06-06
  • 使用java实现2048小游戏的案例
    这篇文章将为大家详细讲解有关使用java实现2048小游戏的案例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下实现文件APP.javaimport javax.swing.*;pub...
    99+
    2023-06-14
  • 利用Java编写一个俄罗斯方块小游戏
    这期内容当中小编将会给大家带来有关利用Java编写一个俄罗斯方块小游戏,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java游戏俄罗斯方块的实现实例    &nbs...
    99+
    2023-05-31
    java ava
  • 怎么用Elixir语言编写一个小游戏
    本篇内容主要讲解“怎么用Elixir语言编写一个小游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Elixir语言编写一个小游戏”吧!通过编写“猜数字”游戏来学习 Elixir 编程语言...
    99+
    2023-06-15
  • Java使用定时器编写一个简单的抢红包小游戏
    目录1.新建项目2. 添加 计时器,按钮组件3.抢红包业务逻辑4.效果演示1.新建项目 2. 添加 计时器,按钮组件 <xml version="1.0" encodi...
    99+
    2024-04-02
  • java实现2048小游戏(含注释)
    本文实例为大家分享了java实现2048小游戏的具体代码,供大家参考,具体内容如下 实现文件 APP.java import javax.swing.*; public cla...
    99+
    2024-04-02
  • 如何使用Python编写小游戏?
    大家好,我是沐尘而生,如果你是一个热爱编程的小伙伴,又想尝试游戏开发,那么这篇文章一定能满足你的好奇心。不废话,让我们马上进入Python游戏开发的精彩世界吧! Python游戏开发的魅力 编写小游...
    99+
    2023-08-31
    python pygame 开发语言
  • 怎么在python中使用tkinter制作一个2048游戏
    怎么在python中使用tkinter制作一个2048游戏?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。创建main.py代码:from tkinter i...
    99+
    2023-06-14
  • 一步步教你用Python实现2048小游戏
    前言 2048游戏规则:简单的移动方向键让数字叠加,并且获得这些数字每次叠加后的得分,当出现2048这个数字时游戏胜利。同时每次移动方向键时,都会在这个4*4的方格矩阵的空白区域随机产生一个数字2或者4,如...
    99+
    2022-06-04
    小游戏 教你用 Python
  • 利用Matlab制作一款3D版2048小游戏
    其实逻辑和2维版本完全一样,就不进行详细解说了,直接看效果: 效果: 目前界面还不咋好看,期待大家的优化 还是键盘↑↓←→操作嗷 完整代...
    99+
    2024-04-02
  • Python+Pygame编写一个Pong游戏
    目录前言代码教学最终代码前言 这次,我们要用Pygame写一个Pong游戏 先看看效果: 需要的模块:Pygame 在python文件同目录下新建resources文件夹,在文件夹...
    99+
    2023-01-05
    Python Pygame Pong游戏 Python Pong游戏 Python Pygame 游戏
  • 利用Java编写个"不贪吃蛇"小游戏
    目录前言代码蛇、药丸的抽象游戏界面启动类游戏演示最后前言 我写的这个”贪吃蛇“和小时候玩的”贪吃蛇“有点不一样,以往的”贪...
    99+
    2022-11-13
    Java不贪吃蛇游戏 Java 贪吃蛇游戏 Java 贪吃蛇
  • 怎么用Python实现2048小游戏
    这篇文章主要介绍怎么用Python实现2048小游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、开发环境Python版本:3.6.4相关模块:pygame模块;以及一些Python自带的模块。二、环境搭建安装P...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作