# Python 幾a幾b ## 說明 猜數字遊戲,電腦會產生100~999隨機一個數字,玩家可以輸入答案, 程式會根據你的答案回答幾a幾b(猜對且正確位置為a,猜對但位置錯誤為b), 如果回答超過10次就輸了 ## 程式 首先是變數設定與import library的部分,因為會需要產生一個隨機的數字,所以會使用到標準函式庫的**random**功能。接著是變數的部分,我會在下方各別說明: - MAX_GUESS : 整數,玩家回答的最大次數 - flag : 布林,當True時,遊戲會繼續進行。如果為False,遊戲則會結束 - ans_list : 串列,當電腦產生隨機答案時存入這個串列 - guess_list : 串列,負責存取玩家輸入的答案 ```python= import random # Constant Setting MAX_GUESS = 10 flag = True ans_list = [] guess_list = [] ``` ## 隨機產生數字 這個部分透過random.randint()隨機產生介於最小值與最大值之間的數值,然後因為型態是整數,所以要先轉成字串str,才能存入串列list。最後我們再把資料指派給ans_list串列 ```python= def spawn_rand_number(): print('Game Start!!') ans_list = list(str(random.randint(100,999))) return ans_list ``` ## 玩家輸入和回合處理 接下來我們將上一步回傳的ans_list作為引數,傳入guess_round作為參數。裡面的運作機制其實不會很複雜,首先使用一個for迴圈定義玩家可以猜的次數,接著透過input()取得玩家的輸入,然後轉成串列後並且指派給guess_list。 這邊加入輸入處理的防呆機制,因為電腦產生的答案是介於100~999之間,所以我們加入while判斷。當玩家輸入的數字長度不等於答案的長度時,會要求玩家重新輸入一遍。輸入成功後才會把串列丟給下一個function進行處理。 透過detect_stage可以得到玩家是否回答完全正確,如果正確就顯示過關並且加入return不讓for繼續跑下去 ```python= def guess_round(ans_list): for i in range(1,MAX_GUESS): print('Round %2d'%(i)) guess_list = list(input()) while len(guess_list) != len(ans_list): print('Please input again!') guess_list = list(input()) correct = decide_stage(guess_list, ans_list,len(ans_list)) if correct == len(ans_list): print('Win!!!') return print('Lose!') ``` ### 幾a幾b 這邊需要將玩家的回答、答案、答案長度當作引數輸入,然後透過迴圈去個別取得玩家猜的答案。接著跟正確答案進行比較,如果正確且位置一樣,則a+1。如果正確但位置錯誤,則b+1。結束後會print出幾a幾b,然後回傳a,代表的是正確幾個位置 ```python= def decide_stage(guess,ans_list,length): a=b=0 for i in range(length): if ans_list[i] == guess[i]: a+=1 elif ans_list[i] in guess: b+=1 print('%dA %dB'%(a,b)) return a ``` ### 重新開始 當猜完後,會跳出一則訊息問說要不要繼續遊戲。透過input取得玩家的回答後,如果為yes,則回傳True,於main部分的while迴圈會重複進行。如果為False,則會break,遊戲就結束。這邊的else代表的是如果玩家輸入其他字串,則會要求重新輸入 ```python= def restart_game(): print('Play again?(yes or no)') string = input() if string == 'yes': return True elif string == 'no': return False else: print('input error! Please type again') restart_game() ``` ## 完整程式碼 ```python= import random # Constant Setting MAX_GUESS = 10 flag = True ans_list = [] guess_list = [] # Define Function def spawn_rand_number(): print('Game Start!!') ans_list = list(str(random.randint(100,999))) return ans_list def guess_round(ans_list): for i in range(1,MAX_GUESS): print('Round %2d'%(i)) guess_list = list(input()) while len(guess_list) != 3: print('Please input again!') guess_list = list(input()) correct = decide_stage(guess_list, ans_list,len(ans_list)) if correct == len(ans_list): print('Win!!!') return print('Lose!') def decide_stage(guess,ans_list,length): a=b=0 for i in range(length): if ans_list[i] == guess[i]: a+=1 elif ans_list[i] in guess: b+=1 print('%dA %dB'%(a,b)) return a def restart_game(): print('Play again?(yes or no)') string = input() if string == 'yes': return True elif string == 'no': return False else: print('input error! Please type again') restart_game() #Main while flag: LIST = spawn_rand_number() guess_round(LIST) flag = restart_game() ``` 實作完成 --- ###### tags: `python`