Java用GUI实现猜数字的游戏

运行界面

刚打开的界面

输入的数字太小时
重新开始游戏

布局:

  1. 整个窗口用的边界布局
    分为上、中、下三部分

  2. 上层为JTextField控件

  3. 中层JLabel控件

  4. 下层为网格布局
    为一行三列,每一个空放一个Button

代码如下:

package com.gpf.crossword.ui;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import com.gpf.crossword.biz.GameManager;

/**
 * 这是一个实现猜字游戏的窗口
 * 
 * @author 朝九晚十
 * 
 */
public class GameFrame extends JFrame {
    GameManager gameManager = new GameManager();
    JLabel label1;
    JTextField txt1;
    JButton button1;// 按钮“猜 ”
    JButton button2;// 按钮“重新来过”
    JButton button3;// 按钮“退出游戏”

    /*
     * 构造方法
     */
    public GameFrame() {

        // 程序一运行先产生一个随机数
        gameManager.Again();

        // 设置Container
        Container con = getContentPane();
        /*
         * 设置边界布局
         */
        con.setLayout(new BorderLayout());

        // 上
        JPanel jp1 = new JPanel();
        jp1.setLayout(new GridLayout(1, 1));//设置布局
        txt1 = new JTextField();
        jp1.add(txt1);

        // 中
        JPanel jp2 = new JPanel();
        jp2.setLayout(new BorderLayout());
        label1 = new JLabel("请输入一个1000以内的整数");
        jp2.add(label1, BorderLayout.CENTER);//添加监听

        // 下
        JPanel jp3 = new JPanel();
        jp3.setLayout(new GridLayout(1, 3));//设置布局
        button1 = new JButton("猜");
        //添加监听
        button1.addActionListener(new Monitor1(txt1, label1));
        button2 = new JButton("重新来过");
        //添加监听
        button2.addActionListener(new Monitor2(txt1, label1));
        button3 = new JButton("退出游戏");
        //添加监听
        button3.addActionListener(new Monitor3());
        jp3.add(button1);
        jp3.add(button2);
        jp3.add(button3);

        con.add(jp1, BorderLayout.NORTH);//上
        con.add(jp2, BorderLayout.CENTER);//中
        con.add(jp3, BorderLayout.SOUTH);//下

        /*
         * 回车监听事件  
         * 键盘点击回车,实现和点击“猜”按钮一样的功能
         */
        txt1.addActionListener(new Monitor1(txt1, label1));

        /*
         * 窗体设置
         */
        setTitle("猜字游戏");// 设置窗口的标题
        setSize(300, 250);// 设置大小
        setLocation(750, 400);// 设置窗口出现的位置
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        txt1.requestFocus();// txt1获取光标
        setVisible(true);// 可视化设置
    }

    // 监听按钮一:猜
    class Monitor1 implements ActionListener {
        JTextField num = new JTextField();
        JLabel label = new JLabel();

        // 构造函数
        Monitor1(JTextField num, JLabel label) {
            this.num = num;
            this.label = label;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            int number = Integer.parseInt(num.getText());
            int flag;
            flag = gameManager.Guess(number);
            if (flag == 1) {
                label.setText(number + "\t这个数太大了");
            } else if (flag == -1) {
                label.setText(number + "\t这个数太小了");
            } else if (flag == 0) {
                label.setText("恭喜你,猜对了!");
            }
            num.setText("");
            num.requestFocus();
        }
    }

    /*
     * 监听按钮二:重新开始
     */
    class Monitor2 implements ActionListener {
        JTextField num = new JTextField();
        JLabel label = new JLabel();

        // 构造函数
        Monitor2(JTextField num, JLabel label) {
            this.num = num;
            this.label = label;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            gameManager.Again();
            label.setText("请再次输入一个1000以内的整数!");
            num.setText("");
        }
    }

    // 监听按钮三:退出游戏
    class Monitor3 implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    }

    // 主函数
    public static void main(String[] args) {
        GameFrame Frame = new GameFrame();
    }
}
package com.gpf.crossword.biz;

import java.util.Random;

/**
 * 这是一个产生随机数和比较猜的对不对的函数
 * 
 * @author 朝九晚十
 * 
 */
public class GameManager {
    private int number = 0;// 随机数

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    /**
     * 猜数
     * 
     * @param number玩家猜的数
     * @return大了返回1,小了返回-1,相等返回0
     */
    public int Guess(int number) {
        if (number > this.number) {
            // System.out.println("大了");
            return 1;
        } else if (number < this.number) {
            // System.out.println("小了");
            return -1;
        } else {
            // System.out.println("相等");
            return 0;
        }
    }

    // 再来一次
    public void Again() {
        Random random = new Random();
        // 产生一个1-1000的一个随机数
        int num = random.nextInt(999) + 1;
        setNumber(num);
        System.out.print(num + "-");
    }

}

结束语:

刚学的GUI,随便写了写,写完后发现写的很不规范,请大神们看一看,有什么需要修改的地方,比如规范什么的,评论一下,欢迎大神提意见!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值