2

我正在 Django 中做一个基于文本的多人纸牌游戏,其中每张牌都允许每个玩家做出一些标准动作(抽更多牌,获得金币,获得积分等),也许还有一些其他能力(比如摧毁一张牌)从对手手中,给对手减分等等)。

我创建了一个 Card 类:

class Card(models.Model):
    name = models.CharField(max_length=255, verbose_name="Name")
    description = models.TextField(verbose_name="Description")
    victory = models.BooleanField("Victory Card")
    action = models.BooleanField("Action Card")
    reaction = models.BooleanField("Reaction Card")
    treasure = models.BooleanField("Treasure Card")
    attack = models.BooleanField("Attack Card")

    plus_action = models.IntegerField(max_length=2, verbose_name="Plus actions", null=True, blank=True)
    plus_card = models.IntegerField(max_length=2, verbose_name="Plus cards", null=True, blank=True)
    plus_buy = models.IntegerField(max_length=2, verbose_name="Plus buy", null=True, blank=True)
    plus_gold = models.IntegerField(max_length=2, verbose_name="Plus gold", null=True, blank=True)
    plus_victory = models.IntegerField(max_length=2, verbose_name="Plus victory", null=True, blank=True)

    cost = models.IntegerField(max_length=2, verbose_name="Cost")

我的问题是我不知道如何表示其他能力。我已经考虑过属性,但我不确定这是要走的路还是如何去做。

你们有什么建议吗?提前致谢!

问候,
安德里

4

2 回答 2

0

我猜这个答案已经太晚了,无法直接使用,但对于其他试图做类似事情的人来说......

我认为您正在执行 Dominion 的实现,并且您正在尝试表示卡片的文本能力。显然,您不想在主引擎中实现每张卡片的机制,因此您需要存储卡片效果的脚本并改为执行它们。

您可以将代码存储在 TextField 中并执行以下操作:

如何在 Python 中执行包含 Python 代码的字符串?

于 2011-02-18T07:46:07.073 回答
0

如果你想要你的模型有很多复杂的属性,并且不需要任何类型的搜索或过滤它们的值,你可以实现类似的东西 class CardPropetry(object): ... ,它将包含所有需要的值。

然后您可以将此类的实例序列化/反序列化( django docs )到/从 db.TextField

更新:

我不测试这段代码,但类似的东西应该可以工作

模型.py:

import yaml
import pickle
from django.db import models

class CardProperties(onbject):
    pass

class Card(models.Model):

    properties = models.TextField()

    def set_properties(self, obj):
        self.properties = pickle.dumps(obj)

    def get_properties(self):
        return pickle.loads(self.properties)

视图.py:

def view(request):

    card = Card.objects.get(pk=key)
    properties = card.get_properties()

    properties.god_mode = True

    card.set_properties(properties)

    card.save()
于 2010-08-26T14:50:57.267 回答