close

1A2B第二彈來囉~(*´∀`)~♥

電腦已經強到能猜出你的心?知道你在想什麼了嗎?

之前有個很紅的網頁遊戲叫神燈精靈,他能很準確地猜到你在想的任何人或東西

這裡用到的篩選方法是差不多的概念

  • 先給電腦要猜的數字範圍(存於矩陣中,就像是把很多筆數字存於資料庫的感覺)
  • 電腦隨機選一個數字
  • 玩家判斷電腦猜的數字是幾A幾B
  • 篩選可能答案:先比對電腦自己的答案和資料庫各是?A?B,再和玩家的?A?B做比較
  • 篩選出得的資料,不能直接寫回原本的資料庫,必須先存入新的資料庫,再做覆寫(蓋掉舊資料庫的資料)
  • 玩家若回答4A表示電腦猜對了,玩家若回答3A1B、中途更改了答案、回覆?A?B時打錯了,會導致可能的答案為0

放上簡略很多東西卻還是很精美的流程圖:

Untitled Diagram.png


這次只有一個新的物件SolutionSet()

功能是在輸入一個矩陣,每一格都填入四個位數都不重複的四位數字

最後多一格放入pt,用pt-1表示目前存有幾筆資料

然後輸出pt

static int SolutionSet(int[] set)
{
    int pt=0,i;
    for(i=1023;i<=9876;i++)
    {
        if(mylib.CheckSame(String.valueOf(i))==true)/*若四位數都不相同*/

        { set[pt]=i;pt++;}/*pt=0,pt從第0格開始;pt的那格放入資料;然後pt+1,pt跑到第1格,迴圈*/
    }
    return(pt);
}


由於照著流程圖做下去就對了,所以就挑幾個重點講:

Point 1, 建立矩陣來放資料

int[] set= new int[8000];

其實這要拆成兩部分來解說,

int[] set; set is a reference to int[],set指向 物件int[],這叫call by reference

set=new int[8000]; 用new指令產生物件,此陣列有8000格

接著把set矩陣放進物件SolutionSet中,

int pt=mylib.SolutionSet(set);

 

Point 2, 篩選可能答案:

附圖說明,database是電腦目前的所有可能解,電腦猜1234,而玩家決定的答案是5678

當玩家回答1234是0A0B表示這四個數字都不是答案,但如果只把這四個數字的組合刪掉太沒效率了,剩餘的可能資料還是很多;

看附圖能明白一件事,只要在資料庫中找同樣和1234是0A0B的數字就很有可能是答案

J1.png

for(int i=0;i<pt;i++)
        {
            p=mylib.CountAB2(String.valueOf(set[i]),s);
/*先比對電腦自己的答案和資料庫各是?A?B*/
            if((p.A==A)&&(p.B==B)){set2[pt2]=set[i];pt2++;}/*再和玩家的?A?B做比較,並把相同AB的解放入矩陣二*/
        }


public static void main(String[] g)
{
    int[] set= new int[8000];
    int[] set2=new int[4000];
    int gus; String s=""; int A=0,B=0; mylib.AB p;
    
int pt=mylib.SolutionSet(set);/*pt是可能答案總數+1*/
    int pt2=0;
    do
    {
        gus=set[mylib.Rand(0,pt-1)];
/*從矩陣中挑一格可能的答案*/
        System.out.println("guess a number,then "+gus+" is?");
        A=Integer.parseInt(mylib.Input("?A:"));
        B=Integer.parseInt(mylib.Input("?B:"));
            
        if(A==4){System.out.println("Win :D");break;}
/*玩家回答4A表示電腦猜中了*/
            
        s=String.valueOf(gus);
/*把目前選的答案轉成字串,比對要用*/pt2=0;/*pt2是用來表示新矩陣的資料數量,pt2要歸零,避免迴圈後把原本的值累計*/
        for(int i=0;i<pt;i++)
        {
            p=mylib.CountAB2(String.valueOf(set[i]),s);
/*從矩陣中挑一格可能的答案*/
            if((p.A==A)&&(p.B==B)){set2[pt2]=set[i];pt2++;}
/*再和玩家的?A?B做比較,並把相同AB的解放入矩陣二*/
        }
        System.out.println("還有"+pt2+"組可能的答案");
/*pt2是存於資料數+1格,但格數是從0開始計算,所以剛好能用來表示總共有多少資料,這串可以不用顯示出來沒關係,非遊戲必要*/ 

        for(int i=0;i<pt2;i++){set[i]=set2[i];}/*copy set2 to set,重新放入,概念是同時存有兩組資料,才能把第二組寫回第一組*/
        pt=pt2;
        if(pt2==0){System.out.println("you change your mind!!Don't do that!!");break;}
/*玩家作弊或失誤的警告*/
    }while(true);
}


那麼來測試?A?B最好猜吧

01a.JPG

01b.JPG

0A1B大約有1620或1320種可能答案

02a.JPG

02b.JPG

0A2B就少一點,1155種或1050種

22.JPG

2A2B最少5、6組而已

謝謝指教~・*・:≡( ε:)

明天要期中考了阿(´◓Д◔`)

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Kuihao 的頭像
    Kuihao

    溫暖午後的金針田__孕育有趣的創新

    Kuihao 發表在 痞客邦 留言(1) 人氣()