close

這次是作業完成紀錄。
作業主題是限制10次內要猜對數字
花了好一陣子才解出正確答案!!!

好啦!進入正題,為了記錄一下解出正確答案的心路歷程(哭)
就特別寫了這篇文章啦!
*可能會有更好的解法,但文科腦袋轉不快,只能用大部分的人應該都能理解的最爛解法下去解XDD

題目內容:
必須讓電腦在10次機會內猜中我們給的一個正解(正確答案以隨機方式出題)
 

步驟一:先設定出現的數字變數-->模擬第一次我們出題(answer),電腦猜題的情境(guess)
let answer = Math.floor(Math.random() * 100) + 1
let guess = Math.floor(Math.random() * 100) + 1
 

步驟二:設定最大值及最小值的變數,以設定下一回合猜的範圍(為了不斷縮小範圍用),count則是為了顯示猜到第幾局
let max = 100
let min = 1
let count = 0

步驟三:設定一個顯示正解的內容,讓前後內容更清楚(但是可以省略)
console.log(`正確答案為 ${answer}`)


步驟四:在第一個步驟就已經開始第一次猜數字了,但為了在猜數字之後能依照不同條件執行動作,
且必須執行到猜到正解為止,所以用迴圈及設定條件下去寫這個步驟

* while迴圈設定條件為執行到電腦猜的數字等於正解為止-->設定條件為兩個數字不相等就會跑{}的動作
* {}內用if條件設定來決定在答案不相等的前提下,且依照答案大於正解,答案小於正解印出不同的句子
* 不管是小於或大於,因為都已經算猜了一次數字,所以count要增加一次
* <答案大於正解的狀態> 包含答案以上的數字都不需要猜了,所以最大值就會是這次猜的數字減1 --> max = guess - 1
<答案小於正解的狀態> 包含答案以下的數字都不需要猜了,所以最小值就會是這次猜的數字加1 --> min = guess + 1

* 在這段while這段的結尾,還需要讓電腦再猜一次,直到猜對為止,
若未猜對就必須繼續執行這次的迴圈,所以要再用讓guess出現一個值
-->為了程式碼的簡潔,我把它寫在if外面,因為不管是大於或小於都需要再重猜一次
* 為了讓第二次以上(包含第二次的猜數字)的範圍可以不斷地縮小,
用當下最大值~最小值的剖半數字下去猜
-->guess = Math.floor(min + (max - min) / 2)
*還有更簡潔的寫法為guess = Math.floor((max + min) / 2)

image

步驟五:while為沒猜到正解的狀態,另外最後要再寫上有猜到正解的狀態
此時已經不用再猜數字,所以只需要加上這次的回合數,及印出的結果
count += 1
console.log(`第 ${count} 局,挑戰者猜 ${guess},莊家回:賓果!`)

 

結論:
簡單來說,整個過程就是 
出題+猜數字->判斷是否為正解->進行對應條件的執行內容->繼續猜數字->
判斷是否為正解.....->顯示正解時的印出句子

在解這道題的時候,我不小心在whlie迴圈已經設定為猜與正解不相等的狀況下,
又加入了答案相等的條件設定,導致整個迴圈無限輪迴,整個邏輯思路也是不順的
另外因為限定10次內要猜對,所以在猜題範圍這部分,
也是不斷卡關,參考了很多厲害大大的解答,才知道要用剖半的方式讓猜題次數變更少。

以上就是我解這題的心路歷程
希望自己別再犯同樣錯誤,可以聰明一點XD
好啦!打完收工!掰餔~

 

 

 

 

 

 

arrow
arrow
    創作者介紹
    創作者 文科少女寫程式 的頭像
    文科少女寫程式

    文科少女學程式

    文科少女寫程式 發表在 痞客邦 留言(0) 人氣()