2

私は Django が初めてで、戦艦ゲームを作成しようとしています。戦艦ボードのモデルを作成したいと考えています。これは 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

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 に答える
1

ボードを 1 つ以上のNumPy 2 次元配列として表現することを検討してください。たとえば、ブーリアン 2D 配列を使用してプレイヤーがすでに発砲した座標を追跡し、整数配列を使用してさまざまな船の位置を表すことができます。これには、各船の種類に一意の整数値 (外洋の場合は 0 など) を与えます。 、駆逐艦用に 1 基、空母用に 2 基など)。これにより、攻撃がヒットしたかどうか、およびどのタイプの船で発生したかを簡単に調べることができます。

配列をデータベースにシリアライズするには、少し作業が必要です。この記事を読むことから始めます。オーバーライドを検討するモデル メソッドが表示されます。コメントには、簡単にするために、最初に試すルートであるdjango-picklefieldで cPickle を使用することをお勧めします。

于 2013-01-15T02:45:12.253 に答える
0

1 対 1 の関係であれば、座標を 2 つのフィールドに分割するだけです。

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

問題が解決しました。別のモデルを構築して外部キーにリンクする必要はないと思います。物事を複雑にし、実際のコストであるもう 1 つの結合が発生します。

于 2013-01-15T02:18:38.593 に答える