[Day26] 猜数字小游戏

今天我们要用前面 25 天所学,实作一个小游戏。大家都有玩过猜数字几 A 几 B 的小游戏吗?我们就来写一个这样的游戏。

首先,要产生一个随意的四位数字为答案,这和我们之前用的方法是不一样的。透过 Math.random() 可以获取随机数,返回 [0.0, 1.0) 之间的 double 值。

String ans = "";
for(int i = 0 ; i < 4 ; i++){
    ans += (int) (Math.random() * 10);
}

接着思考我们每次输入一个数字时,需要如何判断有几 A 几 B?我的作法是先判断有几个 A 把符合的标示後,再判断有几个 B。可以自己想想看要怎麽写,再来参考哦!

import java.util.Scanner;

public class GuessNum {
    public static void main(String[] args) {
        int A = 0, cnt = 0;
        String ans = "";
        Scanner sc = new Scanner(System.in);

        // 产生随机四位数
        for (int i = 0; i < 4; i++) {
            ans += (int) (Math.random() * 10);
        }

        // 输入数字
        System.out.print("This is a guess number game. Please enter four digits: ");
        while (A != 4) {
            A = 0;
            int B = 0;
            boolean checked[] = new boolean[4];
            for (int i = 0; i < 4; i++) {
                checked[i] = false;
            }

            // 读取输入
            String guessNum = sc.next();
            cnt++;

            // 判断有多少A
            for (int i = 0; i < 4; i++) {
                if (guessNum.charAt(i) == ans.charAt(i)) {
                    A++;
                    checked[i] = true;
                }
            }

            // 判断有多少B
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    if (!checked[j] && (guessNum.charAt(j) == ans.charAt(i))) {
                        B++;
                        checked[j] = true;
                        break;
                    }
                }
            }
            System.out.println(A + "A" + B + "B");
        }
        System.out.println("You try " + cnt + " times.");
        System.out.println("Answer is " + ans);
        sc.close();
    }
}

范例中使用 String 型别储存答案和输入值,在利用 charAt() 这个方法取得 String 中的第几位数,若是使用整数储存,则可以用余数的方法来实作,大家也可以试试看。

因为在产生随意四位数字时并未排除重复,所以在遇到有重复数字时,一个数字可能被判断两次,因此可以在产生数字时判断有无重复,改良此程序。

除了判断答案外,也会判断使用者猜了几次,虽然程序码并不长,但是需要先思考它的逻辑在实作。一般在实作专案的时候,我们也都是用这种模式,大家可以想想看可以写出什麽有趣的程序哦!


<<:  Progressive Web App 用户端储存简介 (13)

>>:  Logo 语言和你 SAY HELLO!!

Day06 - 随意玩之 OrderQuery/OrderPayQuery

昨天介绍了 OrderCreate,今天会把另外两个都介绍完! OrderQuery 主要功能:查询...

在我的 iMac 上制作双系统的随身碟

用同一个硬碟外接盒,分别在不同的硬碟安装上 Windows 10 与 Clear Linux,在使用...

Day28 - Linux 编译 POC/exploit

复习:渗透测试的目的 在合法委托下,确认目标网站或系统有可利用的漏洞,若确认有目标在取得授权下,提升...

Day 30 - [最终章] 完赛心路历程

天啊~终於到了铁人赛的最後一天,威尔猪成功插旗了。第一次参加铁人赛就历经艰辛,甚至可以说是惊心动魄...

Day8. functional programming in Ruby - Block Part1

这篇文章会用不一样的观点来介绍Ruby and Rails,写过 Javascript 的读者们,相...