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

Python卡牌游戏不使用类存储卡牌名称与属性的实现问题求助

问题核心原因
  • 你当前代码的核心问题是每次循环都复用completeCard字典的同一个"name:"键,每次赋值都会直接覆盖上一轮的内容,自然只能存储最后一次迭代的卡牌数据
  • 你定义的completeCard是单个字典结构,不适合存储多组卡牌数据,需要调整存储结构
修正后的实现方案

不需要使用类,有两种常用的无类存储方案可选:

方案1:用列表存储所有卡牌字典(适合批量遍历卡牌场景)

每个卡牌单独存为一个字典,所有字典放到统一列表中,代码如下:

import random

def cardValueGen():
    # 四个属性可根据你的实际需求调整对应命名
    return {
        "star": random.randint(1,5),
        "power": random.randint(1,100),
        "attack": random.randint(1,10),
        "defense": random.randint(1,10)
    }

def fileReader():
    all_cards = []
    # with语法会自动处理文件关闭,避免资源泄露
    with open("message.txt", "r", encoding="utf-8") as f:
        for line in f:
            # 去掉每行末尾的换行符和多余空白
            card_name = line.strip()
            # 跳过文本中的空行,避免生成无效卡牌
            if not card_name:
                continue
            single_card = {
                "name": card_name,
                "attributes": cardValueGen()
            }
            all_cards.append(single_card)
    return all_cards

# 调用示例
complete_cards = fileReader()
# 遍历验证所有卡牌
for card in complete_cards:
    print(card)

方案2:用总字典存储,键为卡牌名(适合按名称快速查询卡牌场景)

如果需要经常通过卡牌名检索对应属性,可以用总字典直接做名称到属性的映射:

import random

def cardValueGen():
    return [
        random.randint(1,5),
        random.randint(1,100),
        random.randint(1,10),
        random.randint(1,10)
    ]

def fileReader():
    all_cards = {}
    with open("message.txt", "r", encoding="utf-8") as f:
        for line in f:
            card_name = line.strip()
            if not card_name:
                continue
            all_cards[card_name] = cardValueGen()
    return all_cards

# 调用示例
complete_cards = fileReader()
# 按名称查询属性示例:print(complete_cards.get("目标卡牌名"))
额外优化说明
  • 读取文本行时调用strip()方法可以去掉换行符、首尾空格,避免卡牌名称携带多余无效字符
  • 新增空行跳过逻辑,可以避免文本中的空行生成无效的空白卡牌

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:24:03