Python猜歌游戏代码故障修复及文件数据层级化展示咨询
Python猜歌游戏问题修复与数据层级化展示方案
问题概述
这是一款基于Python的猜歌游戏,程序从music文件中随机选取歌曲数据,玩家凭借歌手名和歌曲名单词首字母猜测歌名。目前存在两个问题:
- 玩家首次猜错后再答对,程序会直接终止,无法进入下一轮猜歌
- 需要实现文件数据的层级化排序展示
当前代码
import random score = 0 # 玩家信息设置 username = input("Please enter a username:") password = input("Please enter a password:") # 玩家验证 player_usr = input("Enter your username") player_pass = input("Enter your password") if player_usr == username: if player_pass == password: start = True else: print("Acces denied. Wrong details.") start = False else: print("Acces denied. Wrong details") start = False # 主游戏循环 while start == True: t = True while t == True: lines = open("music").read().splitlines() myline = random.choice(lines) # 从文件选歌 chosensong = myline artist = chosensong.rsplit(",", 1)[1] print(artist) # 输出歌手名 song = chosensong.rsplit(",",1)[0] for word in song.split(): print(word[0]) # 输出歌名每个单词首字母 t = False target = chosensong.rsplit(",",1)[0] guess = None guesses = 0 answer = input("Enter guess:") guess = answer.lower() # 答案验证与计分 while guesses != 2: if guess == target: if guesses == 0: score = score + 3 print("you were correct") break else: score = score + 1 print("you were right") break else: print("please try again") guesses = guesses + 1 answer = input("Enter guess:") guess = answer.lower() start = False print(score)
一、猜歌流程终止问题修复
问题根源
在答错分支中错误设置了start = False,导致哪怕后续答对,主循环的start已经为False,直接终止游戏。同时存在大小写不匹配、文件重复读取的效率问题。
修复后的完整代码
import random score = 0 # 玩家信息设置 username = input("请输入用户名:") password = input("请输入密码:") # 玩家验证 player_usr = input("输入你的用户名:") player_pass = input("输入你的密码:") start = False if player_usr == username and player_pass == password: start = True else: print("访问拒绝,账号信息错误") # 提前读取所有歌曲数据,避免重复IO with open("music", "r", encoding="utf-8") as f: all_songs = f.read().splitlines() # 主游戏循环 while start: # 随机选歌 chosensong = random.choice(all_songs) song_name, artist = chosensong.rsplit(",", 1) # 输出提示信息 print(f"\n歌手: {artist.strip()}") print("歌名首字母: ", end="") for word in song_name.strip().split(): print(word[0], end=" ") print() target = song_name.strip().lower() guesses = 0 is_correct = False # 猜测循环 while guesses < 2: guess = input("输入你的猜测:").strip().lower() if guess == target: if guesses == 0: score += 3 print("答对了!加3分") else: score += 1 print("答对了!加1分") is_correct = True break else: guesses += 1 if guesses < 2: print("猜错了,再试一次") # 两次机会用完则结束游戏 if not is_correct: print("两次机会都用完了,游戏结束") start = False print(f"\n最终得分: {score}")
关键修改点
- 移除答错分支的
start = False,仅在两次机会用完且未答对时终止游戏 - 统一将歌名和猜测转为小写,避免大小写匹配错误
- 提前读取所有歌曲数据到内存,减少重复文件读取的开销
- 优化代码结构,简化嵌套逻辑
二、文件数据层级化排序展示
假设music文件每行格式为歌曲名,歌手名,以下代码实现按歌手分组、字母排序的层级化展示:
def display_hierarchical_songs(): song_data = {} # 读取并解析文件 with open("music", "r", encoding="utf-8") as f: for line in f.read().splitlines(): if not line.strip(): continue song_name, artist = line.rsplit(",", 1) song_name = song_name.strip() artist = artist.strip() # 按歌手分组 if artist not in song_data: song_data[artist] = [] song_data[artist].append(song_name) # 按歌手名字母排序 sorted_artists = sorted(song_data.keys()) print("层级化歌曲列表:\n") for artist in sorted_artists: print(f"📀 {artist}") # 按歌曲名字母排序 sorted_songs = sorted(song_data[artist]) for idx, song in enumerate(sorted_songs, 1): print(f" {idx}. {song}") print() # 调用展示函数 display_hierarchical_songs()
功能说明
- 读取文件并将歌曲按歌手分组存储
- 对歌手名按字母顺序排序
- 每个歌手下的歌曲也按字母顺序排序后展示
- 跳过空行,避免无效数据干扰
内容的提问来源于stack exchange,提问作者Laboratory gaming
相关产品推荐
相关产品推荐

