Java窗口的猜数字游戏
1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ ...
最近学习java看到了猜数字游戏,想自己照着写,结果找的代码有问题,就想着自己能模仿改写一个。
最开始找的代码 ⬇️
import javax.swing.JOptionPane;
public class GuessGame{
public static void main(String[] args){
boolean guessflag = false;
int realnumber = (int)(Math.random()*100+1);
int guessnumber = 0;
int count = 0;
while(guessflag != true && count < 3 ){
guessnumber = Integer.parseInt(JOptionPane.showInputDialog("请输入一个整数进行试猜,注意允许竞猜的最大次数是3次!",new Integer(guessnumber)));
if(guessnumber > realnumber){
count++;
System.out.println("您输入的数字太大了,请重新猜!");
}
else if(guessnumber < realnumber){
count++;
System.out.println("您输入的数字太小了,请重新猜!");
}
else{
count++;
System.out.println("恭喜您猜对了,您共猜了 "+count+" 次。" );
}
}
if(guessflag != true && count == 3) System.out.println("您共猜了 "+count+" 次,已经超过了允许竞猜的最大次数!游戏结束!");
}
}
我的java版本是14的,运行结果提示说Swing的JOptionPane过时了。。。
~$ java -version
openjdk version "14.0.2" 2020-07-14
OpenJDK Runtime Environment (build 14.0.2+12-Ubuntu-120.04)
OpenJDK 64-Bit Server VM (build 14.0.2+12-Ubuntu-120.04, mixed mode, sharing)
~$ javac GuessGame.java
Note: GuessGame.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
因为代码导入的只是Swing包,小白我于是想去摆弄一下,现在开始入坑。。。
第一步:借鉴菜鸟教程
首先得熟悉一下Swing,去教程网比较容易找到基本方法。
菜鸟教程地址【点击这里】
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class SwingLoginExample {
public static void main(String[] args) {
// 创建 JFrame 实例
JFrame frame = new JFrame("Login Example");
// Setting the width and height of frame
frame.setSize(350, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/* 创建面板,这个类似于 HTML 的 div 标签
* 我们可以创建多个面板并在 JFrame 中指定位置
* 面板中我们可以添加文本字段,按钮及其他组件。
*/
JPanel panel = new JPanel();
// 添加面板
frame.add(panel);
/*
* 调用用户定义的方法并添加组件到面板
*/
placeComponents(panel);
// 设置界面可见
frame.setVisible(true);
}
private static void placeComponents(JPanel panel) {
/* 布局部分我们这边不多做介绍
* 这边设置布局为 null
*/
panel.setLayout(null);
// 创建 JLabel
JLabel userLabel = new JLabel("User:");
/* 这个方法定义了组件的位置。
* setBounds(x, y, width, height)
* x 和 y 指定左上角的新位置,由 width 和 height 指定新的大小。
*/
userLabel.setBounds(10,20,80,25);
panel.add(userLabel);
/*
* 创建文本域用于用户输入
*/
JTextField userText = new JTextField(20);
userText.setBounds(100,20,165,25);
panel.add(userText);
// 输入密码的文本域
JLabel passwordLabel = new JLabel("Password:");
passwordLabel.setBounds(10,50,80,25);
panel.add(passwordLabel);
/*
*这个类似用于输入的文本域
* 但是输入的信息会以点号代替,用于包含密码的安全性
*/
JPasswordField passwordText = new JPasswordField(20);
passwordText.setBounds(100,50,165,25);
panel.add(passwordText);
// 创建登录按钮
JButton loginButton = new JButton("login");
loginButton.setBounds(10, 80, 80, 25);
panel.add(loginButton);
}
}
通过上面的代码,我们最基本可以得到两样东西,输入框、标签和确定按钮(乍一看,感觉是为我准备的呀!)
第二步: 做流程图 和 一些代码分析
-
流程图
我在Ubutnu里面使用的流程图软件叫做Dia,如果有更好的希望可以推荐一下Y(附上我的潦草流程图)。
-
一些代码分析
import javax.swing.JButton;
import ...;
//导入Swing的所需组件;
JFrame frame = new JFrame("窗口标题");
frame.setSize(350, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//JFrame窗体是一个容器,承载Swing各个组件。
//这里创建了一个窗口,frame.setSize设置大小。
//当关闭窗口时,关闭java虚拟机(结束程序)。
placeComponents(panel);
//panel的布局部分
第三步: 补充 和 修改
[-] 导入部分的import javax.swing.*代替原来的一堆 import javax.swing.xx,方便以后添加组件。
[-] 删除密码部分。
[+] 通过文本框接收用户数据。
找到了 JTextField的getText()属性 获取用户数据
[+] 确定按钮部分,添加事件。
导入事件包 import java.awt.event.ActionEvent; 和import java.awt.event.ActionListener;
使用Button组件的addActionListener()属性创建事件
[+] 更改标签内容
使用JLabel组件的setText()属性更改标签内容
[+] 让输入框里面居中,清除内容
JTextFiel组件的setHorizontalAlignment(JTextField.CENTER)属性让内部居中
通过JTextFiel的setText("")属性将值改为空值
完成代码(里面有很多BUG)⬇️
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
//导入相应的包
public class U3_5_3 {
public static int couBut = 0;
//创建一个公共整形coutBut用户控制输入次数
public static void main(String[] args) {
/*创建 JFrame 实例,设置宽400,高200
*设置窗口关闭退出虚拟机。
*添加面板
*调用用户定义的方法并添加组件到面板,窗口显示
*panel的布局部分
*设置界面可见
*/
JFrame frame = new JFrame("*猜数字游戏*");
frame.setSize(400, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
frame.add(panel);
placeComponents(panel);
frame.setVisible(true);
}
private static void placeComponents(JPanel panel) {
/* 布局部分,设置布局为 空值
*创建 JLabel,初始化内容
*/
panel.setLayout(null);
JLabel userLabel = new JLabel("请输入一个100内整数进行试猜,注意允许竞猜的最大次数是5次!", SwingConstants.CENTER);
/* 这个方法定义了组件的位置。
* setBounds(x, y, width, height)
* x 和 y 指定左上角的新位置,由 width 和 height 指定新的大小。
*/
userLabel.setBounds(10,20,360,25);
//将标签添加进面板
panel.add(userLabel);
/*创建文本域用于用户输入设置宽度为20
*设置文本域位置
*添加进面板
*让文本域内容居中
*/
JTextField userText = new JTextField(20);
userText.setBounds(160,50,80,25);
panel.add(userText);
userText.setHorizontalAlignment(JTextField.CENTER);
/*创建登录按钮
*设置按钮位置
*将按钮添加进面板
*/
JButton loginButton = new JButton("确定");
loginButton.setBounds(160, 80, 80, 25);
panel.add(loginButton);
//设置JButton的addActionListener()属性
loginButton.addActionListener(new ActionListener() {
/*创建鼠标单击按钮事件*/
public void actionPerformed(ActionEvent actionEvent) {
//猜的次数加1
couBut += 1;
//创建整形guessnum接收用户数据
int guessnum;
//通过JTextField的getText()属性接收用户数据转换为整形
guessnum = Integer.parseInt(userText.getText());
//生成随机数
int realnumber = (int)(Math.random()*100+1);
//控制猜的次数为5
if(couBut > 4 && couBut < 6){
userLabel.setText("您猜 5 次了都没猜对,这不怪你,程序就是这么扣!");
userText.setText("");
}
//如果超出指定次数退出程序
else if(couBut > 4){
System.exit(0);
}
else if(guessnum > realnumber){
userLabel.setText("您输入的数字太大了,请重新竞猜!");
userText.setText("");
}
else if(guessnum < realnumber){
userLabel.setText("您输入的数字太小了,请重新竞猜!");
userText.setText("");
}
//用户猜对了,退出游戏
else{
userLabel.setText("这么抠门的游戏,你竟然猜对了,这程序怕是你写的吧!");
couBut = 6;
}
}
});
}
}
效果图
小实例的总结
1.学习了用Swing包创建窗口
2.知道如何向窗口添加标签、输入框、密码框
3.懂得了创建鼠标单击按钮事件的方法