编辑代码

# coding:utf-8
#JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。 
#print("Hello world!   -  python.jsrun.net .")
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()