Java图形界面化实现猜生日

需求分析:

给出指定的集合;接收用户反馈的数字(0/1);设计算法根据用户输入的数字判断用户心中选择的数字;

涉及到的知识:

输入输出流;位运算;循环语句;

算法分析:

生日只能是1,281,291,301,31号中的某一天,不会超过31天,所以用[1,31]天完全能够表示生日的号数,31的二进制位11111=00001+00010+00100+01000+10000,也就是:
00001--------------1
00010--------------2
00100--------------4
01000--------------8
+
10000--------------16
———————————————————————
11111--------------31
---------------------------------------------
然而我们知道,二进制只能由0或者1组成,所以一个数字[1,31]的各个位数只能是0或者1,
所以由上面的数组合可以组合相加,可以得到任意一个数字。这样的话,我们任意取一个数字,
其二进制表示为:ABCDE(注:对应A表示二进制由左往右第一位,B第二位,C第三位,D第四位,E第五位。
例:10110,则(A=1,B=0,C=1,D=1,E=0)
则ABCDE可以由如下算式得到:
0000E
000D0
00C00
0B000
+
A0000
———----
ABCDE
---------------------------------------------
显然这个ABCDE是任意的,并且A,B,C,D,E要么为0要么为1。这样我们可以将对应的生日放在5个集合的某个集合中,规则是:
如果这个数的E=1(不限定其他位数字),那么就应该放在集合set1中。
如果这个数的D=1(不限定其他位数字),那么就应该放在集合set2中。
如果这个数的C=1(不限定其他位数字),那么就应该放在集合set3中。
如果这个数的B=1(不限定其他位数字),那么就应该放在集合set4中。
如果这个数的A=1(不限定其他位数字),那么就应该放在集合set5中。
注:可能一个生日会放在多个集合中。
当将这些生日放置在不同的集合中后,通过指定某个生日存在于5个集合中的哪些集合。我们便可以轻易的得到这个生日号数。
例:生日19号,其二进制为10011,那么我们会将它放置到set1,set2,set5中。
这样当你指定说某个数在集合set1,set2,set5,那么我们便知道,你说的某数必然是E=1,D=1,C=0,B=0,A=1
很容易的我们便可以猜出你说的某数为1+2+0+0+16=19。

import javax.swing.*;
public class GuessBirthday {
    public static void main(String[] args) {
        //定义存放生日号码字符串的数组
        String[] str = new String[]{"1 3 5 7\n" + "9 11 13 15\n"+ "17 19 21 23\n" + "25 27 29 31\n",
                "2 3 6 7\n" + "10 11 14 15\n" + "20 21 22 23\n" + "26 27 30 31\n",
                "4 5 6 7\n" + "12 13 14 15\n" + "20 21 22 23\n" + "28 29 30 31\n",
                "8 9 10 11\n" + "12 13 14 15\n" + "24 25 26 27\n" + "28 29 30 31\n",
                "16 17 18 19\n" + "20 21 22 23\n" + "24 25 26 27\n" + "28 29 30 31\n"};
        int day=0;
        for (int i = 0; i < str.length; i++) {
            //调出带有选项 Yes、No 和 Cancel 的对话框;标题为 Select an Option。
            int answer = JOptionPane.showConfirmDialog(null, "Is your birthday in this strings?\n" + str[i]);
            //如果选择是的话代表在这个字符串中,否则不在这里面
            //static int YES_OPTION : 选择 YES 时从类方法返回的值。
            if(answer == JOptionPane.YES_OPTION){
                day+=inWhichStrings(i);
            }
        }
        /*调出标题为 "Message" 的信息消息对话框。
        参数:
        parentComponent - 确定在其中显示对话框的 Frame;如果为 null 或者 parentComponent 不具有 Frame,则使用默认的 Frame
        message - 要显示的 Object*/

        JOptionPane.showMessageDialog(null,"your birthday is "+day+"!");
    }

    private static int inWhichStrings(int i) {
        int num=0;
        switch(i){
            case 0:
                num=1;
                break;
            case 1:
                num=2;
                break;
            case 2:
                num=4;
                break;
            case 3:
                num=8;
                break;
            case 4:
                num=16;
                break;
        }
        return num;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Java图形化界面数字的示例: ```java import javax.swing.*;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class GuessNumberGUI extends JFrame { private int randomNumber; private int guessCount; private JLabel promptLabel; private JTextField guessTextField; private JButton guessButton; private JLabel resultLabel; public GuessNumberGUI() { randomNumber = (int) (Math.random() * 100) + 1; guessCount = 0; promptLabel = new JLabel("一个1到100之间的数字:"); guessTextField = new JTextField(10); guessButton = new JButton(""); resultLabel = new JLabel(""); guessButton.addActionListener(new GuessButtonListener()); setLayout(new FlowLayout()); add(promptLabel); add(guessTextField); add(guessButton); add(resultLabel); setTitle("数字游戏"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true); } private class GuessButtonListener implements ActionListener { public void actionPerformed(ActionEvent event) { try { int guess = Integer.parseInt(guessTextField.getText()); guessCount++; if (guess == randomNumber) { resultLabel.setText("恭喜你对了!你了" + guessCount + "次。"); guessButton.setEnabled(false); } else if (guess < randomNumber) { resultLabel.setText("的数字太小了,请再试一次。"); } else { resultLabel.setText("的数字太大了,请再试一次。"); } } catch (NumberFormatException e) { resultLabel.setText("请输入一个有效的数字。"); } guessTextField.setText(""); guessTextField.requestFocus(); } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new GuessNumberGUI(); } }); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值