90 likes | 346 Views
小型專題 1A2B 猜數字遊戲. 鄧姚文 http://www.ywdeng.idv.tw. 遊戲規則. 遊戲雙方:甲方為使用者,乙方為電腦 乙方於 0,1,2,3,4,5,6,7,8,9 等十個數字之中,隨機不重複地選擇三個數字,任意排列其順序,然後秘藏之。 甲方試圖以最快的速度猜出乙方秘藏的三個數字包括其順序。. 遊戲規則. 甲方每次提出三個數字挑戰乙方 乙方以甲方提出之數字比對秘藏之數字,並以 nAmB 之編碼方式回應甲方, n+m≤3 A 表示數字相符而且位置也相符 B 表示數字相符但位置不相符. 遊戲規則. 例如,乙方秘藏之數字為 385
E N D
小型專題1A2B猜數字遊戲 鄧姚文 http://www.ywdeng.idv.tw
遊戲規則 遊戲雙方:甲方為使用者,乙方為電腦 乙方於0,1,2,3,4,5,6,7,8,9等十個數字之中,隨機不重複地選擇三個數字,任意排列其順序,然後秘藏之。 甲方試圖以最快的速度猜出乙方秘藏的三個數字包括其順序。
遊戲規則 • 甲方每次提出三個數字挑戰乙方 • 乙方以甲方提出之數字比對秘藏之數字,並以nAmB之編碼方式回應甲方,n+m≤3 • A表示數字相符而且位置也相符 • B表示數字相符但位置不相符
遊戲規則 • 例如,乙方秘藏之數字為385 • 若甲方猜246則乙方回答0A0B,因為沒有任何一個數字相符 • 若甲方猜123則乙方回答0A1B,因為3為數字相但位置不相符 • 若甲方猜345則乙方回答2A0B,因為3和5不但數字相符,而且位置也相符 • 若甲方猜135則乙方回答1A1B,因為數字相符者有3與5,但是3的位置不相符,而5的位置相符 • 若乙方的回應為3A0B,即表示甲方已經猜出乙方秘藏之數字。
如何產生隨機亂數? • Math.random() 隨機傳回一個介於0與1之間的浮點數,包括0但不包括1,亦即[0..1) • 隨機產生一個介於[0..9]的數字: • int n = (int)(Math.random() * 10);
如何從0,1,2,3,4,5,6,7,8,9之中不重複地選出三個數字?如何從0,1,2,3,4,5,6,7,8,9之中不重複地選出三個數字? • 先建立一個長度為10的整數陣列 • 設定陣列元素初始值: • 陣列第一個元素為0,第二個元素為1,第三個元素為2,…,第10個元素為9 • 針對陣列內的每一個元素 x 執行下列步驟 • 產生一個介於[0..9]的隨機亂數 r • 令 y 為陣列的第 r+1 個元素(陣列索引值為r的元素) • 將 x 與 y 的內容對調 • 取出陣列的前三個元素,依序裝入陣列 S • 陣列 S 即為所需之三個不重複的隨機亂數。
如何比對數字並回應nAmB ? • 將甲方提出的三個數字依序裝入陣列C之中 • 令 A 值為 0,B 值也為 0 • 針對陣列C之中的每一個元素 t 執行下列步驟: • 在陣列 S 中搜尋 t • 若在陣列 S 內發現 t 則 • 若 t 位於 S 內的位置與 t 位於 C 內的位置相同,則 • A 加 1 • 否則 • B 加 1 • 回應甲方A與B的值
如何在一個陣列內搜尋特定值? • 若在陣列內發現目標值,則傳回目標值在陣列內的位置,否則傳回 -1 • 令 p 值為 -1 • 以一個迴圈將陣列從頭到尾掃描一遍 • 若在陣列內位置 k 處發現目標值,則令 p = k 並且立即終止迴圈 • 傳回 p 值
如何處理輸入? • 甲方輸入 098 時應如何處理? • 將字串拆成三個數字,以整數陣列的形式儲存以便比對 • String.substring(int beginIndex, int endIndex)可取出字串之中的一小段(子字串) • 例如 • String line = "098"; • line.substring(0, 1) 將傳回 "0" • line.substring(1, 2) 將傳回 "9" • line.substring(2, 3) 將傳回 "8"