# ====================== 1. 严格匹配史料:40条军情 + 40字密钥诗 ======================# 40条标准军情短语(北宋字验原版)military_phrases = [ "请弓", "请箭", "请料", "请添兵", "请调马", "请攻贼", "请守险", "请战捷", "请解围", "请赏功", "请粮料", "请草料", "请车牛", "请船楫", "请甲仗", "请医药", "请犒赏", "请援兵", "请进军", "请退军", "请固守", "请出战", "请埋伏", "请纵火", "请放水", "请诱敌", "请劫寨", "请夜袭", "请昼攻", "请围守", "未见贼", "贼多", "贼少", "贼进兵", "贼退兵", "将士叛", "士卒病", "都将病", "战不利", "战大捷"]# 密钥诗:孟浩然《过故人庄》40字(1-40号一一对应)key_poem = [ "故", "人", "具", "鸡", "黍", "邀", "我", "至", "田", "家", "绿", "树", "村", "边", "合", "青", "山", "郭", "外", "斜", "开", "轩", "面", "场", "圃", "把", "酒", "话", "桑", "麻", "待", "到", "重", "阳", "日", "还", "来", "就", "菊", "花"]# 构建双向映射字典# 加密:军情短语 → 诗中汉字phrase_to_char = {phrase: charfor phrase, char in zip(military_phrases, key_poem)}# 解密:诗中汉字 → 军情短语char_to_phrase = {char: phrase for phrase, char in zip(military_phrases, key_poem)}# ====================== 2. 加密函数:军情明文 → 密码汉字(宋代密文) ======================def encrypt_military(plain_phrase): """ plain_phrase: 军情明文(必须是40条标准短语之一) return: 加密后的密文(诗中对应汉字) """ if plain_phrase in phrase_to_char: return phrase_to_char[plain_phrase] else: return"❌ 错误:该短语不在40条军情密码本中"# ====================== 3. 解密函数:密码汉字 → 还原军情明文 ======================def decrypt_military(cipher_char): """ cipher_char: 密文(诗中汉字) return: 解密后的军情明文 """ if cipher_char in char_to_phrase: return char_to_phrase[cipher_char] else: return"❌ 错误:该汉字不在密钥诗中"# ====================== 4. 交互运行界面 ======================if __name__ == "__main__": print("=" * 50) print("📜 北宋《武经总要》「字验」军事密码模拟器") print("密钥诗:孟浩然《过故人庄》40字") print("加密:军情短语 → 诗中汉字 | 解密:诗中汉字 → 军情短语") print("=" * 50) while True: print("\n请选择功能:") print("1. 加密(军情明文 → 密码汉字)") print("2. 解密(密码汉字 → 军情明文)") print("3. 查看全部40条军情密码本") print("0. 退出程序") choice = input("\n输入序号:") if choice == "1": plain = input("请输入要加密的军情短语:") result = encrypt_military(plain) print(f"✅ 加密结果(密文汉字):{result}") elif choice == "2": cipher = input("请输入要解密的密码汉字:") result = decrypt_military(cipher) print(f"✅ 解密结果(军情明文):{result}") elif choice == "3": print("\n📋 40条军情-汉字对照表:") for idx, (phrase, char) in enumerate(zip(military_phrases, key_poem), 1): print(f"{idx:2d}: {phrase:<6} → {char}") elif choice == "0": print("程序已退出") break else: print("❌ 输入错误,请选择0-3的序号")