1A2B第二彈來囉~(*´∀`)~♥
電腦已經強到能猜出你的心?知道你在想什麼了嗎?
之前有個很紅的網頁遊戲叫神燈精靈,他能很準確地猜到你在想的任何人或東西
這裡用到的篩選方法是差不多的概念
- 先給電腦要猜的數字範圍(存於矩陣中,就像是把很多筆數字存於資料庫的感覺)
- 電腦隨機選一個數字
- 玩家判斷電腦猜的數字是幾A幾B
- 篩選可能答案:先比對電腦自己的答案和資料庫各是?A?B,再和玩家的?A?B做比較
- 篩選出得的資料,不能直接寫回原本的資料庫,必須先存入新的資料庫,再做覆寫(蓋掉舊資料庫的資料)
- 玩家若回答4A表示電腦猜對了,玩家若回答3A1B、中途更改了答案、回覆?A?B時打錯了,會導致可能的答案為0
放上簡略很多東西卻還是很精美的流程圖:
這次只有一個新的物件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的數字就很有可能是答案
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最好猜吧
0A1B大約有1620或1320種可能答案
0A2B就少一點,1155種或1050種
2A2B最少5、6組而已
謝謝指教~・*・:≡( ε:)
明天要期中考了阿(´◓Д◔`)