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

如何用elif语句为文本类游戏实现手动全进度存档?

手动存档功能修复与实现

问题说明

制作文本类宠物游戏时,需要在玩家选择第8项“Save Game”时手动保存所有游戏进度,现有代码的存档功能存在若干问题导致无法正常工作。

现有代码的问题

  • 全局变量访问问题:save函数未声明使用全局变量,直接访问pet_name、energy等会引发未定义错误。
  • 换行符错误:写入文件时使用了/n,正确的换行符应为\n。
  • 类型不兼容:energy、hunger等数值类型变量无法直接与字符串拼接,需先转换为字符串。
  • 文件关闭错误:f.close缺少括号,应为f.close()才能正确执行关闭操作。
  • 缺少存档反馈:存档完成后没有提示,玩家无法确认是否成功。
  • 缺少读档功能:菜单中有“Load Game”选项,但未实现对应逻辑。

修复后的完整代码

# Imports
import time
import sys

# Func's
def typingPrint(text):
    for character in text:
        sys.stdout.write(character)
        sys.stdout.flush()
        time.sleep(0.05)
  
def typingInput(text):
    for character in text:
        sys.stdout.write(character)
        sys.stdout.flush()
        time.sleep(0.05)
    value = input()  
    return value 

def typingAscii(text):
    for character in text:
        sys.stdout.write(character)
        sys.stdout.flush()
        time.sleep(0.08)

def save():
    # 声明使用全局变量
    global pet_name, energy, hunger, health, training, pet_food, money, animal
    save_data = [
        pet_name,
        str(energy),
        str(hunger),
        health,
        str(training),
        str(pet_food),
        str(money),
        animal
    ]
    with open("load.txt", "w") as f:
        for item in save_data:
            f.write(item + "\n")
    typingPrint("游戏已成功存档!\n")

def load():
    global pet_name, energy, hunger, health, training, pet_food, money, animal
    try:
        with open("load.txt", "r") as f:
            save_data = f.read().splitlines()
            # 按顺序读取存档内容并赋值给全局变量
            pet_name = save_data[0]
            energy = int(save_data[1])
            hunger = int(save_data[2])
            health = save_data[3]
            training = int(save_data[4])
            pet_food = int(save_data[5])
            money = int(save_data[6])
            animal = save_data[7]
        typingPrint("游戏已成功读档!\n")
        # 读档后显示当前状态
        typingPrint ('当前状态:\n')
        print('Health:', health)
        print ('Pet energy (0-10):', energy)
        print ('Hunger (0 = full 5 = starving):', hunger)
        print ('Training (max 10):', training)
        print('Pet food:', pet_food)     
        print ('Money:', money)
        print(f'你的宠物是{animal},名字叫{pet_name}。\n')
    except FileNotFoundError:
        typingPrint("找不到存档文件!\n")
    except IndexError:
        typingPrint("存档文件损坏!\n")

# Var's
health = 'good'
energy = 8
hunger = 0
training = 0
pet_food = 10
things_at_store = ('bone', 'yarn', 'sunken boat', 'mini cave', 'fake tree')
done_choosing = False
choice = 0
choice2 = 0
money = 100
animal = 'None'
print("------------------------------------------------------------------------------------------")

words = ("""                                                                    
                                              888                                 
 8888b.  .d8888b   .d8888b 888 888     .d8888b  88888b.   .d88b.   .d88b.  88888b.  
    "88b 88K      d88P"    888 888     88K      888 "88b d8P  Y8b d8P  Y8b 888 "88b 
.d888888 "Y8888b. 888      888 888     "Y8888b. 888  888 88888888 88888888 888  888 
888  888      X88 Y88b.    888 888          X88 888  888 Y8b.     Y8b.     888 d88P 
"Y888888  88888P'  "Y8888P 888 888      88888P' 888  888  "Y8888   "Y8888  88888P"  
                                                                           888      
                                                                           888  """)

for line in words.split('\n'):
    time.sleep(0.2)
    sys.stdout.write(line + '\n')
    sys.stdout.flush()

print("------------------------------------------------------------------------------------------")
time.sleep(1)
typingPrint('选择宠物:')   
print("\n")
typingPrint('1. 绵羊')
print("\n")

# 选择宠物,直到输入有效选项
while not done_choosing:
    choice = typingInput('你选哪个?(输入数字)')
    if choice == '1':
        animal = '绵羊'
        done_choosing = True 
    else:
        typingPrint ('抱歉,这不是有效选项,请重新输入。\n')
        
# 给宠物命名
pet_name = typingInput ("你想给宠物起什么名字? ")
print ('好的,你现在有一只叫', pet_name, '的', animal, '了。')
print('')
print ('你的', animal, '当前健康状态是', health, ',你可以随时查看状态。')

# 显示选项列表
print('')
typingPrint('1. 喂宠物')
print('')
typingPrint('2. 买更多食物')
print('')
typingPrint('3. 带宠物散步')
print('')
typingPrint('4. 和宠物玩游戏')
print('')
typingPrint('5. 训练宠物')
print('')
typingPrint('6. 休息并查看状态(宠物健康、金钱等)')
print('')
typingPrint('7. 给宠物买玩具')
print('')
typingPrint("8. 保存游戏")
print('')
typingPrint("9. 读取游戏")

# 主循环
while True:
    print('')
    choice = typingInput('你想做什么?')

# 喂宠物
    if choice == '1':
        if pet_food > 5:
            if hunger > 0:
                pet_food -= 5
                hunger -= 1
                print("------------------------------------------------------------------------------------------")
                typingPrint('你的宠物已经吃饱了!')
                print("------------------------------------------------------------------------------------------")
                print('你现在还有', pet_food, '份宠物粮,宠物的饥饿值是', hunger, '。')
                
            else:
                print("------------------------------------------------------------------------------------------")
                print(pet_name, '蹲在食物旁边,不想吃。')
        else:
            print("------------------------------------------------------------------------------------------")
            typingPrint("你得先去买些食物才行...")

# 买更多食物
    elif choice == '2':
        if money > 9:
            money -= 10
            pet_food += 5
            print("------------------------------------------------------------------------------------------")
            print('食物已购买!金钱 = ', money, '宠物粮 = ', pet_food)
            print("------------------------------------------------------------------------------------------")
        else:
            typingPrint("你的钱不够买食物!\n")

# 带宠物散步
    elif choice == '3':
        if animal == '绵羊':
            if energy > 5:
                energy -= 3
                hunger += 1 
                print('你和' + pet_name + '一起愉快地散步了。你的宠物现在精力值是', energy, ',饥饿值是', hunger, '。')
            else: 
                print('你的', animal, '今天看起来有点累,不想散步。')
        else:
            print('你的', animal, '盯着你,好像觉得你疯了。')

# 和宠物玩游戏
    elif choice == '4':
        if energy > 5:
            energy -= 3
            hunger += 2 
            print('你和' + pet_name + '一起玩游戏!', pet_name, '现在的精力值是', energy, ',饥饿值是', hunger, '。')
        else:
            typingPrint("你的宠物太累了,没法玩游戏!\n")

# 训练宠物
    elif choice == '5':
        print('')
        typingPrint("训练功能待实现\n")

# 休息并查看状态
    elif choice == '6':
        print('')
        typingPrint ('好的,这是当前状态。')
        print('Health:', health)
        print ('Pet energy (0-10):', energy)
        print ('Hunger (0 = 吃饱 5 = 饿死):', hunger)
        print ('Training (max 10):', training)
        print('Pet food:', pet_food)     
        print ('Money:', money)
        energy += 2
        typingPrint("休息后宠物精力恢复了2点!\n")

# 给宠物买玩具
    elif choice == '7':
        print('商店里的商品有:', things_at_store)
        typingPrint("购物功能待实现\n")

# 保存游戏
    elif choice == '8':
        save()

# 读取游戏
    elif choice == '9':
        load()

# 无效选项
    else:
        typingPrint ('抱歉,这不是有效选项,请重新输入。\n')

关键修改点说明

  • 全局变量声明:在save和load函数开头添加global关键字,确保能访问并修改全局游戏变量。
  • 类型转换:将数值类型变量转换为字符串后再写入文件,读取时转换回对应类型。
  • 正确换行符:把/n替换为\n,保证存档文件每行存储一个变量。
  • 上下文管理器:使用with open(...)自动管理文件关闭,避免资源泄漏。
  • 存档反馈:添加存档/读档成功的提示信息,提升玩家体验。
  • 读档功能实现:补充load函数,处理文件不存在、损坏等异常情况,读档后显示当前状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:18:18