(ノ>ω<)ノ來寫程式囉~//***我的物件庫叫mylib***
※先來寫人猜電腦:
用物件的方式,將整個程式分成三個部分
- 隨機產生一組不重複的四位數當謎底
- 讓玩家輸入四位數
- 檢查是?A?B
謎底就設為ans,玩家猜的數字是gus
來製作第一個物件,隨機產生不重複四位數
用先前的mylib.Rand物件產生四位數,然後用mylib.CheckSame檢查四個數是否不同
用do-while迴圈來過篩
static String BuildAns()
{
String ans;
do
{
ans=String.valueOf(mylib.Rand(1023,9876));
}while(mylib.CheckSame(ans)==false);
return(ans);
}
接下來製作玩家的猜數字 (。A。)
用mylib.Input輸入數字,會遇到三個問題
1只能是數字 2限定為四位數(不能多不能少) 3四個數字不相同
- mylib.Input是輸入字串,用Integer.parseInt轉成數字就可以做檢測了
如果輸入非數字的東西,則轉成數字的過程會出現exception
用try-catch把exception過濾,剩下純數字 - 用length檢查長度 並且 用mylib.CheckSame檢查四個數字是否不同
這裡用到一個符號「 || 」意思是 「or」
static String MakeGuess()
{
String gus;int k;boolean fg;
do
{
do
{
gus=mylib.Input("Enter 4 numbers:");
fg=false;
try
{k=Integer.parseInt(gus);}
catch(Exception e){fg=true;System.out.println("only enter number:(");}
}while(fg==true);
}while((gus.length()!=4)||(mylib.CheckSame(gus)==false));
return(gus);
}
再來要解決檢查是「?A?B」的問題
遊戲規則:ans和gus有「相同數字且位置相同」顯示為A,「相同數字但位置不同」則為B
我們要製作一個物件,功能是同時輸入ans和gus,然後讓「字串ans」分別比對「字串gus的四個數字」,會用到ans.indexOf(gus.substring(i,i+1))檢查出現第一個相同的字的位置(設為k),gus.substring(i,i+1)是gus第i個字的位置(i從0~3)
當第一個出現相同的位置k等於gus的第i個字,就意味著「相同數字且位置相同」,讓A+1
當第一個出現相同的位置k不等於gus的第i個字,就意味著「相同數字但位置不同」,讓B+1
最後這個物件要輸出:A和B
static int CountAB(String s1,String s2)
{
int A=0,B=0,k,i;
for(i=0;i<s2.length();i++)
{
k=s1.indexOf(s2.substring(i,i+1));
if(k>=0)
{if(k==i){A++;}else{B++;}}
}
return(A+B*10);
}
這個物件CountAB是用int的物件形式製作的,輸出整數
問題是他沒辦法分開輸出A和B兩個數字,所以只好對其中一個數字動手腳,把AB結合在一起做輸出。之後要用A和B再把它拆解(感覺好像把檔案加密,要看的時候再解密(✪ω✪)
但這樣太麻煩了,所以有個更讚更簡潔的辦法,既然int只能輸出一個int值,那就來製作一個物件來輸出兩個int值吧。:.゚ヽ(*´∀`)ノ゚.:。
(迷知音:什麼?自製物件來作物件?太狂啦~~~(其實這就是java物件的基本構造啦 )
做一個物件AB,內容要儲存兩個int值
static class AB{int A;int B;}
這樣CountAB就可以設為輸出物件AB,之後要用intA和intB,就可以改用物件形式來叫
static AB CountAB2(String s1,String s2)
{
int k,i; AB p=new AB(); p.A=0;p.B=0; //***因為AB物件裡有intA和intB,所以可以叫出「物件裡的物件」,p.A和p,B***
//***AB p=new AB();意思是:產生AB物件型態的p,一個AB物件,讓p指向AB物件 ***
for(i=0;i<s2.length();i++)
{
k=s1.indexOf(s2.substring(i,i+1));
if(k>=0)
{if(k==i){p.A++;}else{p.B++;}}
}
return(p); //***p有A,B 回傳物件p***
}
現在三大物件都有了,來把他們組合起來吧~
{
String ans,gus; int k,cnt=1; mylib.AB n;
//***cnt是用來蒐集玩家猜了幾次***
ans=mylib.BuildAns();
do
{
gus=mylib.MakeGuess();
n=mylib.CountAB2(ans,gus);
System.out.println("It is :"+n.A+"A"+n.B+"B"+" // "+cnt+" time(s)");
cnt++;
}while(n.A<4);
System.out.println("YA~~~You win :D");
}
來試玩吧 :D
居然抽到0A1B這好像是最難猜的。゚(゚´ω`゚)゚。
想知道幾A幾B最難猜嗎?請期待下一回的1A2B電腦猜人版