聯成電腦技術論壇

 找回密碼
 註冊
搜索
查看: 928|回復: 23

[作品] 猜數字遊戲(電腦出題), OO版

[複製鏈接]
發表於 2012-9-11 05:11:55 | 顯示全部樓層 |閱讀模式
又到了分享的時間了。之前一直在想猜數字可不可以寫成物件導向。以下是一個初步嘗試的版本。

先貼定義猜數字物件的內容:

public class GNComputerHost {

        private int digitNum;
        private int totalGuess;
        private int guessCount = 0;
        private String answer;
        private Hint[] guessHistory;

        public class Hint {
                private int a;
                private int b;
                String guess;
                public Hint(int a, int b) { this.a = a; this.b = b; }
                public Hint(int a, int b, String g) { this.a = a; this.b = b; guess = g; }
                public int getA() {return a;}
                public int getB() {return b;}
                public String getGuess () {return guess;}
        }

        public GNComputerHost (int digit, int tGuess) { // constructor
                digitNum = digit;
                totalGuess = tGuess;
                answer = generateAnswer();
                guessHistory = new Hint[totalGuess];
        }

        public int getGuessCount () { return guessCount; }
       
        public String getAnswer() { return answer; }
       
        public String printGuessHistory () {
                String m = "";
                for (int i = 0; i < guessCount; i++)
                        m+= String.format("Round %d : guess = %s, hint = %da/%db.\n", i+1, guessHistory[i].getGuess(), guessHistory[i].getA(), guessHistory[i].getB());
                return m;
        }

        public Hint clientGuess (String guess) {
                Hint h = getHint(guess, answer);
                guessHistory[guessCount++] = h;
                return h;
        }

        public Hint getHint(String g, String ans) {
                int a = 0, b = 0;
                for (int i = 0; i < digitNum; i++)
                        if (g.charAt(i) == ans.charAt(i)) a++;
                for (int i = 0; i < digitNum; i++)
                        for (int j = 0; j < digitNum; j++)
                                if (i != j && g.charAt(i) == ans.charAt(j)) b++;
                Hint h = new Hint(a, b, g);
                return h;
        }
       
        private String generateAnswer() {
                String myAnswer = "";
                int[] flag = new int[10];
                int randomNum;
                for (int i = 0; i < digitNum; i++) {
                        do randomNum = (int) (Math.random()*10);
                        while (flag[randomNum] == -1);
                        myAnswer += Integer.toString(randomNum);
                        flag[randomNum] = -1;
                }
                return myAnswer;
        } // end of generateAnswer()
}
 樓主| 發表於 2012-9-11 05:16:09 | 顯示全部樓層
這個類別定義的內容包含了 GNComputerHost 和 Hint 兩個類別

因為當時寫的時候把 Hint 給當作 C 語言裡面的 struct 來用,所以就寫在 GNComputerHost 裡面,

不過後來發現它也可以當作物件來寫,而且執行也沒問題,

就留在那兒了。

不過實作時若別的程式要用到它的話好像要特別 import, 即便放在同一個 package 裡。

所以說不定它放到 GNComputerHost 外面較好,這個再問問老師的意見。
 樓主| 發表於 2012-9-11 05:18:26 | 顯示全部樓層
接下來是猜數字的主程式,由人來猜,電腦出題並給提示:

import javax.swing.JOptionPane;
import com.polymorphism.oo.guessNumber.GNComputerHost.*;

public class HumanGuessComputer {

        public static void main(String[] args) {
               
                String m = "歡迎來到猜數字遊戲。您想要猜幾位數?";
                int digit = Integer.parseInt(JOptionPane.showInputDialog(m));
               
                m = "不能猜太多次喲!! 您最多想猜幾次?";
                int guessNum = Integer.parseInt(JOptionPane.showInputDialog(m));
               
                GNComputerHost gnc = new GNComputerHost(digit, guessNum);
                Hint h;
               
                do {
                        m = String.format("第 %d 次, 請猜一個 %d 位數字:", gnc.getGuessCount()+1, digit);
                        h = gnc.clientGuess(JOptionPane.showInputDialog(m));
                        if (h.getA() == digit) break;
                        m = String.format("我的提示是: %da / %db.", h.getA(), h.getB());
                        JOptionPane.showMessageDialog(null, m);
                } while (gnc.getGuessCount() < guessNum);
               
                if (h.getA() == digit)
                        m = String.format ("恭禧您!! 您猜中了!! 您共猜了 %d 次, ", gnc.getGuessCount());
                else
                        m = String.format("喔!! 你猜超過 %d 次了啦!! 答案是 %s, ", guessNum, gnc.getAnswer());
                m += "以下是您猜的過程: \n" + gnc.printGuessHistory();
                JOptionPane.showMessageDialog(null, m);
        }
}
 樓主| 發表於 2012-9-11 05:20:50 | 顯示全部樓層
主程式中:

import com.polymorphism.oo.guessNumber.GNComputerHost.*;

這行主要是要import Hint 物件,因此 package 的路徑請依實際情形修改。

程式一開始會要求使用者輸入想猜的位數,以及猜的次數上限,做為猜數字物件建構子的引數。

第一次在Java裡寫物件導向程式,挺新鮮的,

也請大家多多指導囉。
 樓主| 發表於 2012-9-11 05:37:51 | 顯示全部樓層
來附上執行結果。因為太多分幾篇po。

先貼初始值的設定。
oo1.gif
oo2.gif
 樓主| 發表於 2012-9-11 05:39:32 | 顯示全部樓層
接下來是猜的過程Part 1。
oo3.gif
oo4.gif
 樓主| 發表於 2012-9-11 05:39:51 | 顯示全部樓層
Part 2。
oo5.gif
oo6.gif
 樓主| 發表於 2012-9-11 05:40:14 | 顯示全部樓層
第3次猜。
oo7.gif
oo8.gif
 樓主| 發表於 2012-9-11 05:40:38 | 顯示全部樓層
第4次。
oo9.gif
oo10.gif
 樓主| 發表於 2012-9-11 05:41:03 | 顯示全部樓層
第5次。
oo11.gif
oo12.gif
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



小黑屋|Archiver|手機版|聯成電腦技術論壇  

GMT+8, 2019-10-14 11:29

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表