You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

C#开发卡牌游戏:无需数据库跟踪玩家存储堆卡牌顺序

解决方案:无数据库跟踪玩家存储堆卡牌顺序

嘿,我来给你捋捋这个问题的解决方案——既然不能用数据库,那咱们就用内存数据结构+面向对象设计来搞定全程跟踪玩家存储堆的卡牌顺序,完全贴合你的游戏规则和需求。

核心思路

  1. Player类扩展存储堆的内存结构,用嵌套列表来维护每个堆的卡牌顺序(列表的插入顺序就是卡牌的存储顺序)
  2. 封装回合结束的强制存储逻辑,确保规则被遵守
  3. 用一个Game类来维护所有玩家实例,实现游戏全程的全局跟踪

具体代码实现(以Python为例)

1. 基础卡牌类

先定义一个简单的Card类来表示卡牌:

class Card:
    def __init__(self, card_id, name):
        self.card_id = card_id  # 唯一标识卡牌
        self.name = name        # 卡牌名称

    def __repr__(self):
        # 方便打印查看卡牌信息
        return f"Card({self.card_id}, '{self.name}')"

2. 扩展后的Player类

在原有的storeCard()方法基础上,增加存储堆的管理逻辑,同时实现回合结束的强制存储:

class Player:
    MAX_STORE_HEAPS = 4  # 最多支持4个存储堆

    def __init__(self, player_id, name):
        self.player_id = player_id
        self.name = name
        # 初始化4个存储堆:用字典映射堆索引到卡牌列表,列表顺序=存储顺序
        self.store_heaps = {heap_idx: [] for heap_idx in range(self.MAX_STORE_HEAPS)}

    def store_card(self, heap_index, card):
        """将卡牌存入指定存储堆,自动维护存储顺序"""
        if not 0 <= heap_index < self.MAX_STORE_HEAPS:
            raise ValueError(f"存储堆索引必须在0-{self.MAX_STORE_HEAPS-1}范围内")
        # 按存入顺序添加到列表末尾,先存的卡牌在列表前面
        self.store_heaps[heap_index].append(card)

    def end_turn(self, heap_index, card):
        """回合结束时必须调用的方法,强制执行卡牌存储操作"""
        self.store_card(heap_index, card)

    def get_heap_card_order(self, heap_index):
        """获取指定存储堆的卡牌顺序(从先存到后存),返回列表副本避免内部数据被修改"""
        if heap_index not in self.store_heaps:
            return []
        return self.store_heaps[heap_index].copy()

    def get_all_heap_data(self):
        """获取当前玩家所有存储堆的卡牌顺序"""
        return {idx: self.get_heap_card_order(idx) for idx in self.store_heaps}

3. Game类:全局跟踪所有玩家

Game类来管理游戏全程的玩家实例,方便随时获取任意玩家的存储堆数据:

class Game:
    def __init__(self):
        self.players = {}  # 用字典存储玩家:key=player_id,value=Player实例

    def add_player(self, player):
        """添加玩家到游戏"""
        self.players[player.player_id] = player

    def get_player_store_data(self, player_id):
        """获取指定玩家的所有存储堆卡牌顺序"""
        player = self.players.get(player_id)
        if not player:
            return None
        return player.get_all_heap_data()

使用示例

# 初始化游戏
game = Game()

# 创建玩家
player_alice = Player(1, "Alice")
player_bob = Player(2, "Bob")

# 将玩家加入游戏
game.add_player(player_alice)
game.add_player(player_bob)

# 模拟回合流程
card_fire = Card(101, "火焰法术")
card_shield = Card(102, "防御护盾")
card_heal = Card(103, "治疗药水")

# Alice回合结束,把火焰法术存入堆0
player_alice.end_turn(0, card_fire)
# Alice下一回合结束,把治疗药水存入堆0
player_alice.end_turn(0, card_heal)
# Bob回合结束,把防御护盾存入堆1
player_bob.end_turn(1, card_shield)

# 查看Alice的堆0卡牌顺序
print("Alice的堆0顺序:", player_alice.get_heap_card_order(0))
# 输出:[Card(101, '火焰法术'), Card(103, '治疗药水')]

# 查看Bob的所有存储堆数据
print("Bob的所有存储堆数据:", game.get_player_store_data(2))
# 输出:{0: [], 1: [Card(102, '防御护盾')], 2: [], 3: []}

补充:持久化支持(可选)

如果需要游戏退出后再次启动时恢复数据,可以用文件序列化(比如JSON)来保存,完全不需要数据库:

import json

def save_player_to_file(player, file_path):
    """将玩家的存储堆数据保存到JSON文件"""
    heap_data = {}
    for idx, cards in player.store_heaps.items():
        # 将卡牌转换为可序列化的字典
        heap_data[idx] = [{"card_id": c.card_id, "name": c.name} for c in cards]
    player_data = {
        "player_id": player.player_id,
        "name": player.name,
        "store_heaps": heap_data
    }
    with open(file_path, 'w', encoding='utf-8') as f:
        json.dump(player_data, f, indent=2)

def load_player_from_file(file_path):
    """从JSON文件加载玩家数据"""
    with open(file_path, 'r', encoding='utf-8') as f:
        player_data = json.load(f)
    player = Player(player_data["player_id"], player_data["name"])
    # 恢复存储堆的卡牌顺序
    for idx, card_list in player_data["store_heaps"].items():
        idx = int(idx)
        for card_info in card_list:
            card = Card(card_info["card_id"], card_info["name"])
            player.store_card(idx, card)
    return player

这样整个游戏全程的玩家存储堆顺序都能被跟踪,完全不需要任何数据库,而且逻辑清晰、易于维护。

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

火山引擎 最新活动