You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}")

关键修改点

  1. 移除答错分支的start = False,仅在两次机会用完且未答对时终止游戏
  2. 统一将歌名和猜测转为小写,避免大小写匹配错误
  3. 提前读取所有歌曲数据到内存,减少重复文件读取的开销
  4. 优化代码结构,简化嵌套逻辑

二、文件数据层级化排序展示

假设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()

功能说明

  1. 读取文件并将歌曲按歌手分组存储
  2. 对歌手名按字母顺序排序
  3. 每个歌手下的歌曲也按字母顺序排序后展示
  4. 跳过空行,避免无效数据干扰

内容的提问来源于stack exchange,提问作者Laboratory gaming

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:18:29