(ノ>ω<)ノ來寫程式囉~//***我的物件庫叫mylib***

※先來寫人猜電腦:

用物件的方式,將整個程式分成三個部分

  • 隨機產生一組不重複的四位數當謎底
  • 讓玩家輸入四位數
  • 檢查是?A?B

謎底就設為ans,玩家猜的數字是gus

手寫a.png

來製作第一個物件,隨機產生不重複四位數

用先前的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);
}

手寫b.png

接下來製作玩家的猜數字 (。A。)

用mylib.Input輸入數字,會遇到三個問題

1只能是數字 2限定為四位數(不能多不能少) 3四個數字不相同

  1. mylib.Input是輸入字串,用Integer.parseInt轉成數字就可以做檢測了
    如果輸入非數字的東西,則轉成數字的過程會出現exception
    用try-catch把exception過濾,剩下純數字
  2. 用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);
}

手寫c.png

再來要解決檢查是「?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

擷取.JPG

居然抽到0A1B這好像是最難猜的。゚(゚´ω`゚)゚。

想知道幾A幾B最難猜嗎?請期待下一回的1A2B電腦猜人版

 

 

 

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

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

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