文章目录

  • 前言
  • 一、Java背景故事
  • 二、代码编写
    • 1.工具类
    • 2.主窗口类
    • 3.游戏窗口类
    • 4.参数设置窗口类
    • 5.参数设置提示窗口类
  • 总结

前言

通过这个小游戏可以对Java用户图形界面的基础方面有进一步的认识。

这也是对于完成这个项目过程中的一些自我总结。

(还有就是这篇文章的目录不好用,我研究了好久也没琢磨出来怎么设置目录,各位大哥体谅一下新人la)

【推荐一波个人在用的配色网站:[link]https://coolors.co/】

               


共有5个类:主窗口类、游戏窗口类、参数设置窗口类、设置成功提示窗口类和工具类。

1.工具类:

工具类主要是为了生成十个算数式子,代码如下:

package mathgame;import java.util.Random;
/*** 工具类* @author yexiaoye**/
public class Tools {/***    生成十个式子的方法*/public static void rand(){int a,b,operator;Random ran = new Random();for(int i= 0;i<10;i++){a= ran.nextInt(MainMenu.max)+1;// 随机数范围b= ran.nextInt(MainMenu.max)+1;operator=ran.nextInt(MainMenu.operat)+1;// 自定义运算符switch(operator){case 1:// "+"Game.question[i] = a + "+" + b + "=";Game.result[i] = a + b;break;case 2:// "-"Game.question[i] = a + "-" + b + "=";Game.result[i] = a - b;break;case 3:// "*"Game.question[i] = a + "*" + b + "=";Game.result[i] = a * b;break;case 4:// "/"Game.question[i] = a + "/" + b + "=";Game.result[i] = a / b;break;}}}}
MainMenu.Max// 从主类那里获取到的最大值max

2.主窗口类:

其中最大值max和运算符operat定义为类级别的静态变量,为了给其他类的调用,

来完成参数设置和设置运算符的操作。

package mathgame;import javax.swing.*;import java.awt.*;
import java.awt.event.*;/*** 主窗口* @author yexiaoye**/
public class MainMenu extends JFrame implements ActionListener{private static final long serialVersionUID = 1L;static int max = 20;// 声明int类型的全局变量max,为了给其他类的调用static int operat = 2;// 声明运算符:1为+,2为-,3为*,4为/// 主窗口中的组件Container winContainer;// 声明容器JMenuBar mbar;// 声明菜单栏JMenu fileMenu,systemMenu;// 声明菜单组JMenuItem startMenuItem,setMenuItem;// 声明子菜单项JMenuItem exitMenuItem,helpMenuItem;JLabel jl_hello;// 声明labelpublic MainMenu() {super("GAME");this.setBounds(400,150,500,400);// (x,y,width,height)winContainer = this.getContentPane();// 获取当前框架的容器winContainer.setLayout(null);// 自定义编辑布局方法(取消容器布局方式)jl_hello = new JLabel("Hello World!");jl_hello.setBounds(140, 100, 200, 40);// 颜色转换网址:https://bj.96weixin.com/tools/rgbjl_hello.setForeground(new Color(255,130,71));jl_hello.setFont(new Font("微软雅黑", Font.BOLD, 30));// 实例化菜单栏对象mbar = new JMenuBar();// 实例化菜单组fileMenu = new JMenu("文件");systemMenu = new JMenu("系统");// 实例化子菜单项startMenuItem = new JMenuItem("开始游戏");setMenuItem = new JMenuItem("参数设置");exitMenuItem = new JMenuItem("退出");helpMenuItem = new JMenuItem("帮助");// 注册监听器startMenuItem.addActionListener(this); setMenuItem.addActionListener(this);exitMenuItem.addActionListener(this);helpMenuItem.addActionListener(this);this.setJMenuBar(mbar);// 设置菜单栏(将菜单栏添加到框架上)mbar.add(fileMenu);// 将菜单组添加到菜单栏中mbar.add(systemMenu);// 将子菜单项添加到菜单组中// 将开始、参数设置子菜单项添加到文件菜单组中fileMenu.add(startMenuItem);fileMenu.add(setMenuItem);// 将退出、帮助子菜单项添加到系统菜单组中systemMenu.add(exitMenuItem);systemMenu.add(helpMenuItem);// 将欢迎标签添加到Container容器中winContainer.add(jl_hello);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 框架关闭时,退出JVM}public void actionPerformed(ActionEvent e) {if(e.getSource() == startMenuItem) {// 开始游戏按钮触发事件winContainer.removeAll();// 清空当前winContainer(用户定义的Container名)上的所有控件Game g1 = new Game();g1.setSize(500, 400);g1.setLayout(null);// 设置为null即为清空布局管理器,之后添加组件winContainer.add(g1);winContainer.repaint();//new Game().setVisible(true);// 实例化游戏界面并设置可见性为true}else if(e.getSource() == exitMenuItem) {// 退出按钮触发事件System.exit(0);// 退出JVM}else if(e.getSource() == setMenuItem){// 参数设置按钮触发事件winContainer.removeAll();// 清空当前winContainer(用户定义的Container名)上的所有控件SetGame s1 = new SetGame();// 实例化参数设置s1.setSize(500, 400);// 必须设置s1对象的窗口大小winContainer.add(s1);// 将对象s1添加到容器中winContainer.repaint();// 在Container上生成新放置的控件后,使用此方法来刷新放置内容}}public static void main(String[] args) {// 主方法new MainMenu().setVisible(true);}}
removeAll()// 清空当前容器上的所有控件
repaint()// 刷新放置的内容
setDefaultCloseOperation()设置框架关闭时执行何种操作
EXIT_ON_CLOSE是JFrame类定义的常量字段,表示窗口关闭时执行System.exit(0);退出系统

3.游戏类:

package mathgame;import javax.swing.*;import java.awt.*;
import java.awt.event.*;
/*** 游戏窗口类* @author yexiaoye**/
public class Game extends JPanel implements ActionListener{private static final long serialVersionUID = 1L;/*JLabel label[]= new JLabel[10];// 显示10个随机的式子JLabel err[] = new JLabel[10];// 显示10个提示信息JTextField text[] = new JTextField[10];// 10个文本输入static String[] question = new String[10];// 接收随机式子的字符串static int[] result = new int[10];// 接收结果int变量*/JLabel label[];JLabel err[];JTextField text[];static String[] question;static int[] result;JLabel head;// 声明标题标签JButton jb_enter;// 声明确认按钮JButton jb_reset;// 声明重置按钮public Game(){// 构造方法//super("四则运算");// 初始化父类型特征label = new JLabel[10];// 显示10个随机的式子err = new JLabel[10];// 显示10个提示信息text = new JTextField[10];// 10个文本输入question = new String[10];// 接收随机式子的字符串result = new int[10];// 接收结果int变量Tools.rand();// 调用工具类中生成十个式子的方法//this.setBounds(650, 250, 400, 300);// 设置主窗口大小//Container c1 = this.getContentPane();// 获得当前框架的容器//c1.setLayout(null);// 自定义编辑布局方法head = new JLabel("四则运算小程序");head.setBounds(145, -10, 120, 100);// 设置标签的显示位置和大小 head.setForeground(new Color(131,188,255));// 设置标签字体颜色head.setFont(new Font("微软雅黑", Font.BOLD, 15));// 字体,加粗,字号jb_enter = new JButton("确认");// 创建“确认”按钮对象jb_reset = new JButton("重置");// 创建“重置”按钮对象jb_enter.setBounds(110, 190, 60, 20);jb_reset.setBounds(245, 190, 60, 20);// 注册监听器jb_enter.addActionListener(this);jb_reset.addActionListener(this);// 将组件添加到框架中this.add(jb_reset);this.add(jb_enter);this.add(head);// 循环出十个式子,每行两道题for(int i = 0; i<10; i+=2){label[i] = new JLabel(question[i]);// 第一列第i个式子label[i].setBounds(70,70+10*i,60,15);err[i]= new JLabel("");// 定义第一列第i个内容为""提示标签err[i].setBounds(180,70+10*i,40,15);err[i].setForeground(new Color(239,131,84));text[i] = new JTextField("",20);// 第一列第i行文本输入框text[i].setBounds(130,70+10*i,40,15);label[i+1] = new JLabel(question[i+1]);// 第二列第i个式子label[i+1].setBounds(230,70+10*i,60,15);err[i+1] = new JLabel("");// 定义第二列第i个内容为""提示标签err[i+1].setBounds(340,70+10*i,40,15);err[i+1].setForeground(new Color(239,131,84));text[i+1] = new JTextField("",20);// 第二列第i行文本输入框text[i+1].setBounds(290,70+10*i,40,15);// 将组件添加到框架中this.add(label[i]);this.add(label[i+1]);this.add(err[i]);this.add(err[i+1]);this.add(text[i]);this.add(text[i+1]);}//这句话需要注释,当在Jemnu实例化出此窗口,并且关闭时//会关闭整个程序,非常的不合理!//this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口关闭时,退出JVMthis.setVisible(true);//可见性为true}int error = 0;// 错误题数计数器// 监听按钮事件public void actionPerformed(ActionEvent e) {if(e.getSource()== jb_enter){// 单击确认按钮for(int i = 0; i<10;i++){try{if(result[i] != Integer.parseInt(text[i].getText())){error++;err[i].setText("错误!");// 更改第i个err[]文本为错误}else{err[i].setText("正确!");// 更改第i个err[]文本为正确}}catch(NumberFormatException f){JOptionPane.showMessageDialog(this,"请全部输入!","警告",JOptionPane.WARNING_MESSAGE);error++;break;}}if(error == 0){JOptionPane.showMessageDialog(this,"过关!","恭喜",1 );}}else if(e.getSource()==jb_reset){Tools.rand();// 调用生成10个式子的方法for(int i=0;i<10;i++){//通过循环重新赋值err[i].setText("");text[i].setText("");label[i].setText(question[i]);}}}}
setForeground(Color.blue);// 设置标签字体颜色
// 还可以这样设置
setForeground(new Color(255,130,71));
setFont(new Font("微软雅黑", Font.BOLD, 15));// 字体,加粗,字号

4.参数设置窗口类:

设置式子最大值随机生成的范围

package mathgame;import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;/*** 游戏参数设置类* @author yexiaoye**/
public class SetGame extends JPanel implements ActionListener {//继承JPanel(面板)实现ActionListener(监听器)接口private static final long serialVersionUID = 1L;JButton jb_enter;// 参数设置确定键JTextField jt_max;// 用户输入最大值的输入框public SetGame(){// 无参构造方法// 实例化组件JLabel jl_reset = new JLabel("参数设置");JLabel jl_number = new JLabel("运算数范围:1-");jt_max = new JTextField(""+MainMenu.max,15);jb_enter = new JButton("确定");// 为确定按钮添加监听jb_enter.addActionListener(this);// 组件的参数设置jl_reset.setFont(new Font("微软雅黑", Font.BOLD, 20));jl_number.setFont(new Font("宋体", Font.BOLD, 15));jl_reset.setForeground(Color.blue);jl_reset.setBounds(180, 60, 120, 20);jl_number.setBounds(150,110,120,20);jt_max.setBounds(265, 110, 40, 20);jb_enter.setBounds(190, 160, 65, 25);// 将组件添加到JPanelthis.add(jl_reset);this.add(jl_number);this.add(jt_max);this.add(jb_enter);}public void actionPerformed(ActionEvent e) {if(e.getSource() == jb_enter){new SetPrompt().setVisible(true);// 先将文本输入框中的string转换为int类型,在max值赋值给MainMenu中的maxMainMenu.max = Integer.parseInt(jt_max.getText());}}
}

5.参数设置提示窗口类:

提示用户参数设置成功

package mathgame;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.*;/*** 参数设置成功提示类* @author yexiaoye**/
public class SetPrompt extends JFrame implements ActionListener {private static final long serialVersionUID = 1L;JButton jb_enter;/** jp_enter.add(jb_enter)// 将按钮添加面板上* 暂时理解:JPanel也是一个Container所以无法在同一个frame上添加两个容器*/public SetPrompt(){super("提示!");this.setBounds(500,260,280,200);Container c1 = this.getContentPane();c1.setLayout(null);JLabel jl_prompt = new JLabel("设置成功!");jb_enter = new JButton("确认");jb_enter.addActionListener(this);jl_prompt.setFont(new Font("宋体",Font.BOLD,15));jl_prompt.setBounds(85,45,80, 16);jb_enter.setBounds(95,75, 65, 25);c1.add(jb_enter);c1.add(jl_prompt);}public void actionPerformed(ActionEvent e) {if(e.getSource() == jb_enter){// 实现按下确认键,关闭提示窗口/** setDefaultCloseOperation():当窗口关闭时,执行何种操作:*    1、DO_NOTHING_ON_CLOSE,不执行任何操作*   2、HIDE_ON_CLOSE,只隐藏界面【相当于setVisible(false)】-默认关闭状态:JFrame.class中: private int defaultCloseOperation = HIDE_ON_CLOSE; -因此,默认情况下,关闭窗口,只隐藏界面,不释放占用的内存*  3、DISPOSE_ON_CLOSE,隐藏并释放窗体,dispose(),当最后一个窗口被释放后,则程序也随之运行结束。*   4、EXIT_ON_CLOSE,直接关闭应用程序,【相当于System.exit(0),直接关闭所有】*/
//          this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//          this.setDefaultCloseOperation(3);
//          System.exit(0);// 按钮已经注册监听// 弹出提示窗口后用户点击确认按钮弹出游戏界面//new Game().setVisible(true);// 实例化游戏界面并设置可见性为true}}}

总结

这个小游戏还有很多不足,比如主窗口上面的东西还不够完善,还没有添加自定义运算符的功能等等等.....我会在以后哟有空的时候慢慢完善滴。

还有就是在参数设置提示类里面实现用户点击确定按钮就关闭这个弹窗,翻了好多资料也没找到解决办法,导致后来我想改为点击确定直接弹出游戏界面都没心情做了(请允许我为我的懒找借口,哈哈哈哈)

还有就是希望有大佬来指出我这个程序中的不足,谢谢啦,谢谢啦,谢谢啦

Java四则运算小游戏(用户图形界面)相关推荐

  1. C语言初学者复刻经典扫雷小游戏(图形界面,非黑白窗口)(含源码)

    注:除计时器和剩余雷数显示外,其他功能完美还原. 目录 一.程序演示 二.程序信息 1.基础信息 2.前言 3.所需文件 三.代码解析 1.头文件 2.变量声明 3.随机生成雷 4.生成雷位置矩阵 5 ...

  2. java图形界面的监听_非专业码农 JAVA学习笔记 用户图形界面设计与实现-所有控件的监听事件...

    用户图形界面设计与实现-监听事件 System.applet.Applet (一)用户自定义成分 1.绘制图形 Public voit piant(Ghraphics g){  g.drawLine等 ...

  3. (心得三)java俄罗斯方块小游戏编写心得

    在"java俄罗斯方块小游戏编写心得02"中,我们已经做到了方块的各种功能的实现,那么接下来我们需要一个destroyLine()方法来对方块进行消除.我们需要想一个问题,当一个方 ...

  4. matlab创建图形用户界面,Matlab 用户图形界面 基础 (一)

    创建 MATLAB 用户图形界面必须由三个基本元素: 1.组件 在 MATLAB GUI 中的每一个项目(按钮,标签,编辑框等)都是一个图形化组件组件可分为三类:图形化控件(按钮,编辑框,列表,滑动条 ...

  5. 用JAVA制作小游戏——飞机大战(三)

    本篇博客是对飞机大战游戏项目完整代码的展示 详细代码讲解: 用JAVA制作小游戏--飞机大战(一) 用JAVA制作小游戏--飞机大战(二) 最下方附整个程序的文件下载链接 代码展示 主界面 impor ...

  6. 用JAVA制作小游戏——推箱子(三)

    本篇博客主要是对推箱子地图编辑器功能的代码讲解. 首先给出这段代码的部分运行截图: 重难点: 地图编辑器主要有三个重难点: 需要有一个绘制地图的界面 能够实现地图绘制的功能 地图绘制完成后需要将地图内 ...

  7. 用JAVA制作小游戏——推箱子(一)

    本篇博客是对推箱子游戏首页代码的展示 效果图: 难点: 在背景图上添加按钮. 由于直接使用add方法,会变成图片一块区域,按钮一块区域,彼此互不重叠,形成的界面效果不太好,因此用了JLayeredPa ...

  8. (心得二)java俄罗斯方块小游戏编写心得

    在"java俄罗斯方块小游戏编写心得01"中已经将游戏界面完成,那么接下来就是要让方块动起来. 我们之前在写Cell类时,曾经给每个最基本小方块定义了三个方法,即左移.右移.下落, ...

  9. java swing 小游戏 炸弹人

    java 炸弹人小游戏 用java swing写的炸弹人小游戏,学了一会java后写来练代码的,游戏资源为网上找的以及合作者画制 截图: 主界面: 地图编辑器: 一些说明: 机器人写了个状态机来控制, ...

最新文章

  1. RandomStringUtils工具类
  2. python中绝对路径的区别,理解Python中的绝对路径和相对路径
  3. 【408预推免复习】计算机组成原理之计算机系统概论
  4. centos7编译安装mysql5.7_在Centos7源码包编译安装MySQL5.7
  5. UNIX环境高级编程》笔记--getrlimit和setrlimit函数
  6. ubuntu怎么打中文_记录一下我在笔记本上安装ubuntu+win10系统的过程,仅供参考
  7. caffe安装_Ubuntu 16.04 下 Theano 安装,及配置多 GPU使用(Multiple GPUs)
  8. C/Cpp / STL / vector 的 erase 会造成当前位置和之后的迭代器失效的疑问
  9. 【前端分享】jQuery.lazyload详解(转)
  10. nodejs源码_nodejs之setTimeout源码解析
  11. JAVA 入门(2)-如何编译源代码
  12. Android编译过程详解(三)
  13. tensorflow Image 解码函数
  14. 如何在Arduino上使用OV7670摄像头模块
  15. VSS下载地址及安装使用
  16. html css字体最小,css字体最小是多少?
  17. maya导入模型后贴图没渲染怎么办?
  18. 08s01 mysql_mysql报错 code:08S01,msg:SQLSTATE
  19. 【新手上路】Java必备小游戏——Flappy Bird(飞翔的小鸟)
  20. 利用MatLab对数据进行插值计算(分段插值和三次样条插值)

热门文章

  1. WAP熵变——中国免费WAP站点发展状况研究
  2. 通用的网页底部导航div布局代码
  3. Android Studio“官方”汉化
  4. GBase 8s V8.8 SQL 指南:教程-5.1.5(1)
  5. pcx文件丢失原因和三种恢复方法
  6. 圆盘旋转按钮--自定义view
  7. 软件测试(测试工具)
  8. 高中生用计算机打游戏,高中生用3年在游戏中复制母校!逝去的都是青春,看哭了……...
  9. Python实现简易勒索病毒
  10. 咋咋呼呼的马桶MT、聊天宝、多闪,为何这么快没声了?