2

我是 Django 的新手,我正在尝试创建一个 Battleship 游戏。我想为我的战舰板创建一个模型,它将是 10 行和 10 列,每个点的坐标为 [x,y]。我不确定要使用哪个模型字段。到目前为止,这是我的 Board 类的代码:

class Board(models.Model):
    ships_left = models.IntegerField()
    available_spots = models.???  #This is to contain [x,y] coordinates of open spots
4

3 回答 3

1

您可能需要考虑将板表示为一个或多个NumPy二维数组。例如,您可以使用布尔二维数组来跟踪玩家已经开火的坐标,并使用整数数组来表示各种船只的位置,方法是为每种船只类型指定一个唯一的整数值(例如,0 表示公海, 1 代表驱逐舰,2 代表航母,等等)。这将使查找攻击是否被击中以及攻击的船只类型变得非常容易。

将数组序列化到数据库中需要一些工作;我先看看这篇文章;它将向您展示要考虑覆盖哪些模型方法。在评论中,建议仅将 cPickle 与django-picklefield一起使用,为简单起见,这是我首先尝试的路线。

于 2013-01-15T02:45:12.253 回答
1

一种可能性是创建一个Coordinate类,并表示每个可能的坐标对:

class Coordinate(models.Model):
    x = models.IntegerField()
    y = models.IntegerField()
    board = models.ForeignKey(Board)
    hit = models.BooleanField(default=False)
    ship = models.ForeignKey(Ship, null=True)  # assumes you have Ship objects somewhere

您可以按如下方式点击一个位置(假设board是一个Board对象):

x = 2
y = 3
location = board.coordinate_set.filter(x=x, y=y)
if location.ship != None:
    # hit a ship! Do something with location.ship object
# either way, save that it was hit
location.hit = True
location.save()

这对于大型网格来说效率不高,但在这种情况下,每个板只有 100 个坐标,因此它可能是合理且直观的。

于 2013-01-15T01:37:26.150 回答
0

如果是一对一的关系,我只需将坐标拆分为 2 个字段:

class Board(models.Model):
    ships_left = models.IntegerField()
    x = models.IntegerField()
    y = models.IntegerField()

问题解决了。我认为不需要构建另一个模型并将其与外键链接。使事情复杂化并导致再次加入,这是真正的成本。

于 2013-01-15T02:18:38.593 回答