1A2B程式碼、詳解

這是之前老師上課時出的作業,就是設計一個1A2B的遊戲,其實在上這堂課之前我一直以為1A2B很難寫,等到這堂課上完才知道,不是很難寫,是我這傢伙太宅了,根本不知道1A2B的規則是啥….

所謂的1A2B是一種猜數字遊戲,假設我現在設定答案是1234,然後讓你來猜數字

當你輸入1567的時候,因為有一個數字的位置、答案都正確(1),這時候就是1A0B

當你輸入1256的時候,因為有兩個數字的位置、答案都正確(1、2),這時候就是2A0B

再來解釋B的來源

當你輸入4321時,有4個數字是跟答案一樣的,但是位置錯誤,所以是0A4B

當你輸入4325時,有3個數字是跟答案一樣的,但是位置錯誤,這時候就是0A3B

簡單講A就是位置對、而且是答案的字母有幾個

B則是「有出現在答案裡面」,但是位置錯誤的字母有幾個

維基百科的解釋:http://goo.gl/FvfLq

兩個人玩,一方出數字,一方猜。出數字的人要先想好一個沒有重複數字的4位數,不能讓猜的人知道。猜的人就可以開始猜。每猜一個數,出數者就要根據這個數字給出幾A幾B,其中A前面的數字表示位置正確的數的個數,而B前的數字表示數字正確而位置不對的數的個數。

從以上規則來看,我們可以分成計算A跟計算B來寫程式

解題說明:

首先在檢查A與B之前,必須先把預定的答案以及使用者猜的數字分成陣列(一個字元一個空間)

再來檢查A其實很簡單,大多數人都會寫,就是逐一檢查每一個位置,當同一位置上面,答案相同時,就代表A增加一個,可以寫成

if(x[i]==y[i]){a++;}

/*

x、y陣列存放答案以及使用者的輸入值,i會一直做i++的運算直到大於等於x、y的維度

*/

以上是計算A的邏輯,在來計算B就比較複雜

因為剛剛說B是不同位置、有出現過的數字,所以我們就用類似循序搜尋法的方式,陣列的每一格空間都找看看,如果有遇到相同的數字,而且是出現在不同的位置,則B+1,然後開始執行下一個字母的搜尋

以下是完整的程式碼,我分成A、B兩部分寫,另外我的程式碼寫的比較簡單,用的是數學的方法解題,請先看註解,不然你會看不懂我在寫什麼

專案檔載點:Box.net4SharedDropboxGoogle

程式碼:

/*
    計算1A2B的程式
    演算法不同於一般的字串比對
    而是直接以Integer儲值使用者輸入的資料,然後透過除法的運用分寫出每個字
    例如:
    1234/1000%10=4
    1234/100%10=3
    1234/10%10=2
*/

#include 
#include 

using namespace std;

int main(int argc, char *argv[])
{
    int x=1234;     //被猜的數字
    int a=0,b=0;        //用來統計A、B數量
    int y;      //儲存使用者輸入的值
    while(x!=y){
        a=0;b=0;
        cout<<"請輸入你要猜的數字:";
        cin>>y;
        cout<
	

在〈1A2B程式碼、詳解〉中有 16 則留言

  1. 還不錯喔!也可以反過來練習看,寫個能讓電腦猜使用者心裡所想數字的功能。

    流程分解:
    1.使用者先在心裡想好一組數字(不要告訴電腦)
    2.在螢幕上顯示電腦所猜的4個數字(使用亂數來產生)
    3.再由使用者來判斷是幾A幾B,並輸入到程式內
    4.重複1、2流程,讓電腦再繼續猜。直到猜中,使用者輸入4A0B為止。

      1. 因為這個是包涵可以重複或是不可重複再加上有防呆機制所以比較長= =

      2. 不知道防呆是什麼意思嗎?
        就是防止有人輸入錯誤的值,
        也就是不符合規則的值。

  2. 說真的啦=口=
    才幾歲上課就交到這個…..
    還真羨慕~_~

    我是很想學 也有在自修,可憐的我 讀了爛學校

    老師:我講得在細你們也沒人聽得懂 ((挖耖
    我也算是班上電腦理解最強的吧=口=
    目前會點java、c++、vb 當然 只有基本功= =

    1. 你們是哪間學校0.0

      說實話
      不管你念哪間學校,老師都不會教
      是自己要學
      不要怪學校爛= =

      因為老師上課要配合大家的程度

  3. 之前寫出由電腦猜人
    過程是這樣:
    1.產生所有組合,共5040種
    2.挑一種問使用者,得到回覆
    3.依序比較,刪除不符的答案
    4.再從剩餘的選一個問使用者,以此類推
    5.直到使用者輸入4A0B

    這過程沒有防呆
    如果有一次使用者輸入錯誤
    大概就解不出來了…
    輸入正確的話,最多7次可以篩選出答案

    1. 電腦猜人的我記得我們學校的老師在教flash的時候有寫我們看,
      不過他的程式碼只有讓我們撇到一眼,他沒有講解,只是秀給我們看

  4. 請問一下
    int i;
    char code[4]={1,2,3,4},a[4];
    printf(“猜四個數字”);
    scanf(“%s”,&a[0]);
    for(i=0;i<=3;i++)
    {
    if(a[0]==code[0])
    if(a[1]==code[1])
    if(a[2]==code[2])
    if(a[3]==code[3])
    printf("%d",i);
    }
    可以嗎

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料