import itertools
from collections import defaultdict
COLOR_NAMES = ['红', '蓝', '绿', '黄', '紫', '橙', '白']
def calculate_feedback(guess, answer):
"""计算黑钉和白钉数量"""
blacks = sum(g == a for g, a in zip(guess, answer))
answer_counter = defaultdict(int)
guess_counter = defaultdict(int)
for g, a in zip(guess, answer):
if g != a:
answer_counter[a] += 1
guess_counter[g] += 1
whites = 0
for color in guess_counter:
whites += min(guess_counter[color], answer_counter[color])
return blacks, whites
def get_valid_input(prompt, validator, error_msg):
"""获取并验证用户输入"""
while True:
try:
value = input(prompt)
if validator(value):
return value
print(error_msg)
except:
print("无效输入,请重试")
def main():
print("=== 增强版Mastermind游戏 ===")
print("规则说明:")
print("- 编码者设置1-6个初始条件(每个条件包含猜测和反馈)")
print("- 颜色选项:1:红 2:蓝 3:绿 4:黄 5:紫 6:橙 7:白")
print("- 系统将验证条件一致性并生成唯一解")
print("- 解码者需要在10次尝试内破解密码\n")
conditions = []
n = int(get_valid_input(
"请输入初始条件数量(1-6): ",
lambda x: x.isdigit() and 1 <= int(x) <= 6,
"请输入1-6之间的数字"
))
for i in range(n):
print(f"\n初始条件 {i+1}:")
guess = tuple(map(lambda x: int(x)-1, get_valid_input(
"输入4个颜色数字(1-7,空格分隔): ",
lambda x: len(x.split()) == 4 and all(c in {'1','2','3','4','5','6','7'} for c in x.split()),
"请输入4个1-7之间的数字,用空格分隔"
).split()))
blacks = int(get_valid_input(
"黑钉数量(0-4): ",
lambda x: x in {'0','1','2','3','4'},
"请输入0-4之间的数字"
))
whites = int(get_valid_input(
"白钉数量(0-4): ",
lambda x: x in {'0','1','2','3','4'},
"请输入0-4之间的数字"
))
conditions.append((guess, blacks, whites))
all_answers = list(itertools.product(range(7), repeat=4))
valid_answers = []
for candidate in all_answers:
if all(calculate_feedback(cond[0], candidate) == (cond[1], cond[2]) for cond in conditions):
valid_answers.append(candidate)
if not valid_answers:
print("\n错误:条件矛盾,没有可能的解!")
return
if len(valid_answers) > 1:
print(f"\n错误:存在{len(valid_answers)}个可能的解!")
return
answer = valid_answers[0]
print("\n游戏开始!你共有10次猜测机会")
for attempt in range(1, 11):
guess = tuple(map(lambda x: int(x)-1, get_valid_input(
f"\n尝试 {attempt}/10 - 输入你的猜测: ",
lambda x: len(x.split()) == 4 and all(c in {'1','2','3','4','5','6','7'} for c in x.split()),
"请输入4个1-7之间的数字,用空格分隔"
).split()))
blacks, whites = calculate_feedback(guess, answer)
print(f"反馈:{blacks}黑钉 {whites}白钉")
if guess == answer:
print(f"\n恭喜!你在{attempt}次尝试中破解了密码!")
print("正确答案:", " ".join([str(x+1) for x in answer]))
return
print(f"\n游戏结束!正确答案是: {' '.join([str(x+1) for x in answer])}")
if __name__ == "__main__":
main()