9

私は六角形のタイルでゲームを作っていますが、三角形/六角形のグリッドを使用することにしました。座標を生成するのに役立つこの質問を見つけ、コードをわずかに変更して、すべての座標を「。」の値を持つディクショナリにキーとして保存しました。(床) または "X" (壁) であり、空白以外の各文字が六角形のタイルを表すマップの文字列表現を出力する関数が含まれていました。これは新しいコードです:

deltas = [[1,0,-1],[0,1,-1],[-1,1,0],[-1,0,1],[0,-1,1],[1,-1,0]]
class HexGrid():
    def __init__(self, radius):
        self.radius = radius
        self.tiles = {(0, 0, 0): "X"}
        for r in range(radius):
            a = 0
            b = -r
            c = +r
            for j in range(6):
                num_of_hexas_in_edge = r
                for i in range(num_of_hexas_in_edge):
                    a = a+deltas[j][0]
                    b = b+deltas[j][1]
                    c = c+deltas[j][2]           
                    self.tiles[a,b,c] = "X"

    def show(self):
        l = []
        for y in range(20):
            l.append([])
            for x in range(60):
                l[y].append(".")
        for (a,b,c), tile in self.tiles.iteritems():
            l[self.radius-1-b][a-c+(2*(self.radius-1))] = self.tiles[a,b,c]
        mapString = ""
        for y in range(len(l)):
            for x in range(len(l[y])):
                mapString += l[y][x]
            mapString += "\n"
        print(mapString)

このコードを使用すると、次のように半径内のすべての座標を生成できます。

import hexgrid
hg = hexgrid.HexGrid(radius)

次のような座標にアクセスします。

hg.tiles[a,b,c]

これは今のところ問題なく動作しているように見えますが、この方法でマップを保存することにはいくつかの欠点があるに違いないと確信しています。欠点がある場合は、それらを指摘してください。また、マップを保存するためのより良い方法を提示してください。お時間をいただきありがとうございます。

4

4 に答える 4

14

ストレージに配列を使用すると、CPU 時間をいくらか節約できるかもしれませんが、その差はおそらく無視できるものです。

ただし、このようなマップを管理するための非常に簡単な方法がありませんでした。セルの形状がわずかに異なるだけで、行と列であると考えてください。

+--+--+--+--+--+--+--+
 \/ \/ \/ \/ \/ \/ \/    Even row

  /\ /\ /\ /\ /\ /\ /\   Odd row
 +--+--+--+--+--+--+--+

または六角形の場合:

  __    __    __    __
 /  \__/  \__/  \__/  \__ Even row
 \__/  \__/ A\__/  \__/   Odd  row
 /  \__/ F\__/ B\__/  \__ Even row
 \__/  \__/ X\__/  \__/   Odd  row
 /  \__/ E\__/ C\__/  \__ Even row
 \__/  \__/ D\__/  \__/   Odd  row
 /  \__/  \__/  \__/  \__ Even row
 \__/  \__/  \__/  \__/   Odd  row

その後、データを通常の 2D 配列として保存できます。奇数行は右に .5 オフセットされており、次の隣接ステップを把握する必要がありますX: 上: A = (0,-2)、右上: B = (1,-1)、右下: C = (1,1)、下:D = (0,2),左下: E = (0,1)、左上:F = (0,-1)

少しのメモリを浪費しても問題ない場合は、他のすべての列を空のままにしておくこともできます。これにより、隣接関係が少し単純になります。(0,-2), (1,-1), (1,-1), (0,-2), (-1,-1), (-1,1)

于 2012-07-07T08:41:56.503 に答える
0

hg.tiles[a,b,c] を使用しないでください。

この方法でタイルを 3 次元リストにする hg.tiles = [[[z for z in range(10)] for y in range(10)] for x in range(10)] と、次を使用してタイルにアクセスできるようになります。hg.tiles[a][b][c]

PS:他の課題についても同様であるa = a+deltas[j][0]必要がありますa += deltas[j][0]

于 2012-07-07T08:20:33.463 に答える