1.問題規則
Bagels是一个簡單的邏輯推理遊戲. 目的是根據提示猜一个三位數(位數可調整).
遊戲規則:
當有正確的數碼出現在錯誤的位置時, 反饋'Pico';
當有正確的數碼出現在正確的位置時, 反饋'Fermi';
當無正確的數碼出現時, 反饋'Bagels';
反饋可以累加, 如Pico Pico
共十次機會, 猜對贏得遊戲, 猜不出失敗.
結合規則, 解題思路就是檢查每个位上的數碼與目標數的關係.
2.實現代碼
import random
import sys
num_target = random.randint(100, 999)
list_tar = [num_target % 10, num_target//10 % 10, num_target // 100] # 獲取三位數碼
def feedback(list_in):
"""檢查數碼並反饋"""
times_F, times_P = 0, 0
if list_in == list_tar:
sys.exit(f'Nice, you get it! {num_target}')
else:
for i in range(3):
if list_in[i] == list_tar[i]:
times_F += 1
elif list_in[i] in list_tar:
times_P += 1
if times_F == 0 and times_P == 0:
print('Bagels ')
else:
print('Fermi '*times_F+'Pico '*times_P)
for i in range(10):
try:
num_input = int(input('Guess a number(100~999):'))
if num_input > 999 or num_input < 100: # 檢查輸入值域
raise ValueError # 在輸入無效時主動拋出異常
list_in = [num_input % 10, num_input//10 % 10, num_input // 100]
except ValueError:
print('Three digits number, please!!!')
continue
feedback(list_in)
print(f'The number is {num_target}, you fool!\n')
比對數碼時, 需要拆出每一位的數碼, 就使用整除//和求模%運算, 此外, 沒啥難點.
3.運行
Guess a number(100~999):456
Bagels
Guess a number(100~999):789
Fermi
Guess a number(100~999):449
Fermi
Guess a number(100~999):119
Fermi
Guess a number(100~999):229
Fermi Fermi Pico
Guess a number(100~999):299
Nice, you get it! 299
正常, 無誤.