2011年6月19日 星期日

猜數字 (幾A幾B) 遊戲 - 視窗介面版 - 新版可玩1至10位數,速度更快!

小弟寫了兩個版本
一個舊版的是用C++ Builder撰寫(2010年5月12日)
另一個新版的用Visual C# 2010重新撰寫(2011年6月19日)
建議大家下載新版來玩
舊版的就供大家參考比較看看囉
舊版也是可以玩啦~只是新版的功能比較好就是了
且速度也比較快~詳細差異就請往下看新版的說明囉




舊版:
--------------------------------------------------------------------------------------
【軟體名稱】:猜數字 (幾A幾B)
【軟體性質】:免費軟體
【軟體語言】:繁體中文
【軟體版本】:v1.1
【最後更新】:2010.05.12



不知道從哪冒出來的一時興趣,突然想寫這個遊戲的程式,而且不是只有猜電腦數字喔~!除了你要猜出電腦數字之外,電腦還要猜你的數字~

Coding過程...

  剛開始最大的問題當然就是在電腦如何猜玩家的數字,一開始我當然也是 have no idea to deal with it,所以就上網找看看有沒有一種方法讓電腦去猜出我的數字,也就是我給電腦幾個A幾個B,然後電腦會去算出可能的結果跟答案出來。

  後來果然找到方法了,這方法我是google到某論壇的某位大大分享他的source code,而且剛好是C語言,於是就花了不少時間去搞懂他的程式運作原理,也就是所謂的演算法(Algorithm)啦~,搞懂他之後,就把他的程式碼大改特改~去除不必要的部份,改良計算上的效率,並讓程式能夠運行1~10個位數數字去猜 (假如是1個位數,就是0、1、2、3、4、5、6、7、8、9,假如是2個位數,就是01、02、03、04、...、97、98),在這部份是花我最多時間的。

演算法(Algorithm)...

  那位大大的方法原理其實不會太難,沒有複雜的數學理論。先用四個數字為例:一開始先把所有合法的四個數字全抓出來(從0000到9999),所謂合法的四個數字例如說1234、7416、0852...等等,各個位數沒重複,全抓出來之後存放在buffer,接著從buffer裡面隨便挑一個出來問玩家是幾A幾B,假設電腦亂數挑出1234,玩家的數字是4256,那玩家就必須輸入1A1B,然後電腦就開始去猜所有可能的數字。電腦的猜法是先把剛剛亂數選出來的「1234」去跟在buffer裡所有數字進行比對,比出來是1A1B的數字就另外存起來,其他數字就去掉了。到了第二次電腦穢亂數決定剛剛比對出來的那些數字裡抽一個出來,如果電腦猜1238,那玩家就輸入3A0B,然後再把剛剛比對後所剩下的數字再比一次,如果是3A0B就保留下來,其他就刪掉。依此類推,每次每次過濾掉一堆數字,到最後就慢慢的過濾出來了。根據我測試,大概最多7次以內電腦絕對會猜出你的數字。

浩大工程...

  浩大工程...就如上一段所說的,因為他的方法是一開始把所有合法的數字找出來並存起來放入buffer,後來發現,當數字到6或7的時候,竟然要跑一段時間才出來,到7、8、9、10的數字跑更久,所以我就想辦法解決這個問題,於是後來想到方法就是把所有從1~10,這10種數字長度分別用個檔案存起來,因此玩的時候就不需要從頭把所有合法數字都找出來,直接讀取檔案內的數字就好了。我記得到數字8的時候需要超過10幾分鐘才找出所有合法數字並自動存入一個檔案,到了9位數....超過2個小時吧...到了10個數字....實際多久我沒記...我只記得超過兩天.....對!你沒看錯,我就為了把10個位數所有合法的數字全找出來,花了超過兩天時間給電腦一直跑...
  (2011.06.19) 後記:其實後來發現是我當時的程式沒寫好,沒加一些判斷條件,才會跑這麼久。不然找出合法的10位數其實1秒就可以全部找出來並寫入檔案了......根本不用花到幾小時或幾天時間...= =

  雖然這浩大工程是花了電腦不少時間,不過弄成檔案後比原本每次玩遊戲都要從頭找到尾要快上很多很多,我記得8位數字花了10幾分鐘才跑出來,用成檔案去讀的話大概5秒左右就好了,差很多很多...不過相對的這樣方式檔案也不小,幾10MB的資料檔了說

避免被認為作弊...

  玩了我的程式之後一定會發現一個問題,就是為什麼還要玩家自己輸入幾A幾B,怎麼不直接在電腦猜字的下方打上自己的底數,讓電腦算出幾A幾B就好了阿?這原因很簡單...因為避免別人會認為電腦會去抓取那個欄位的數字,認為電腦會作弊,所以只純粹想讓別人知道電腦猜字是有根據一定的算法去猜,而不是偷偷去抓取你打的數字去猜的 =..=

How To Play ... (點圖放大)


執行檔下載:點我



新版:
--------------------------------------------------------------------------------------
【軟體名稱】:猜數字 (幾A幾B)
【軟體性質】:免費軟體
【軟體語言】:繁體中文
【軟體版本】:v1.1
【最後更新】:2011.06.30



這跟舊版差別如下:

1. 電腦運算速度更快。
2. 改成暴力計算方式,不需要10個資料檔,所以只有一個小小的執行檔即可玩。
3. 可以設定電腦強度(三種強度)。
4. 可以玩10位數字。

原本想寫個多執行緒,讓有多核心CPU都能發揮出來
不過我發現只要電腦計算數字寫得好一點,其實電腦運算10位數大概1.5秒就出來了
我測試過我的Acer Aspire One小筆電,電腦計算10位數字只要1.7~2.1秒而已
所以根本沒必要去特別設計成多工運算

p.s 如果程式開不起來,請安裝.Net Framework 3.5試試看。

下載頁面:點我進入 檔名是:AB_Game

13 則留言:

  1. 你好,因最近本人在學校課程上也有寫到猜數字的程式,並使用相同的演算法實作
    剛好看到這隻程式並測試使用後,發現你的版本在「從buffer中挑選可能結果」的效率比我寫的程式(Java)高上許多,而這部份正是我程式目前速度上最大的瓶頸

    因此很好奇你的程式在這步程式的寫法,不知你是否願意與有空相互交流討論這方面的技術?

    感謝你

    回覆刪除
  2. 花了超過兩天時間給電腦一直跑.....

    真的是好久@@..
    這個跑的速度的原因 跟電腦核心或是記憶體有很大的關係嗎?
    (我指的是10位數,目前網路上10位數只有Neil大你的最完整)

    回覆刪除
  3. Neil 我剛剛有去看 你幾a幾b的程式
    可是 10位數你的不能玩耶 = =

    回覆刪除
  4. 他寫了 找不到 資料檔...
    應該是你沒放進去吧@@..

    順道一提 剛剛開啟你num_rec_9.txt的檔案
    想說觀察一下數字排列順序 點了一下 自動換行
    電腦就卡住了 :D

    回覆刪除
  5. 其實10位數不能玩的原因是因為...
    我設定的亂數純粹用unsigned int型態,也就是32位元的數值
    所以最大的值只到4,294,967,295
    會有問題
    因此10位數沒辦法玩...囧

    要解決當然是可以,不過程式要整個大改了
    因為當時都寫得差不多後才發現有這個問題
    所以就懶得改了.....
    或許哪天心血來潮會重新寫一個吧....XD

    回覆刪除
  6. 嗯嗯...了解
    謝謝你的解說
    Neil大 謝囉^^

    回覆刪除
  7. neil大 你是唯一目前看到 寫到9位數的...
    我會期待你的10位數的 XD
    畢竟 10位數感覺與誘惑太大了

    順道一提
    最近我在研究DDOS的防範以及
    學習寫一點小程式
    不過進度很少就是了..
    我今年要畢業得暑修.. = . =

    回覆刪除
  8. 新版推出了~~~~~~~~
    大家快下載來玩唷XDD

    回覆刪除
  9. 請問有提供程式碼嗎?比較好奇是電腦猜你的數字是怎麼弄成邏輯?

    回覆刪除
  10. To 9樓:

    電腦猜玩家數字的部份,文章已經有提到作法了

    回覆刪除
  11. for(___;i<4;i++) for(j=0;j<4;j++) un[i]==cn[j]&&(i==j?na++:nb++); //計算幾A幾B
    請教一下 ^_^ 為什麼 i 可以不給初值?謝謝 ^_^

    回覆刪除
  12. 樓上 if :

    你是從另一篇「C語言短碼範例」看的吧?
    i 有給初值喔,在上一行,請仔細找找囉~

    回覆刪除
  13. na=nb=i=scanf("%4s",un)&0; fflush(stdin);
    是零嗎?這一行我實在看不懂 Orz

    回覆刪除