# 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`