0

コマンド ラインから実行して、単語が含まれるファイルを読み取り、それらの単語から WordSearch ゲームを生成するプログラムに取り組んでいます。

いくつかの関数を定義しましたが、問題があるのは word_place 関数です。この関数は、最初にピリオドで満たされたグリッドまたは 2D 配列を取ることになっています。

width = 20
height = 20
grid = [['.' for i in range(0,width)] for j in range(0,height)]

単語は、パズルの幅と高さに収まる限り、前後、縦、横、斜めのいずれかのランダムな場所にランダムに配置されます。

def word_place(word,grid):
global width, height

word = random.choice([word,word[::-1]])

direction = random.choice([[1,0],[0,1],[1,1]])
xsize = width if direction[0] == 0 else width - len(word)
ysize = height if direction[1] == 0 else height - len(word)

x = random.randrange(0,xsize)
y = random.randrange(0,ysize)

for i in range(0,len(word)):
    grid[y + direction[1]*i][x + direction[0]*i] = word[i]

return grid

ご覧のとおり、単語が交差すると、最後に配置された単語が交差する単語の文字を上書きします。

プログラムに実行させたいのは、2D 配列の各「座標」をチェックすることです。

たとえば、単語の最初の文字がたまたま にあるとしgrid[5][8]ます。その位置にピリオドがあるかどうかを確認する必要があります。もしそうなら、それは次の正方形をチェックします。

基本的に、私が配置しようとしている単語の文字が==a.またはインデックスに既にある文字であれば、配置しても問題ありません。

これが長いか不明確である場合は申し訳ありません..さらに情報が必要な場合はお知らせください!

4

2 に答える 2

1

これは、for-else構成要素の場所である可能性があります。

while True:
    x = random.randrange(0,xsize)
    y = random.randrange(0,ysize)

    for i in range(0,len(word)):
        if grid[y + direction[1]*i][x + direction[0]*i] not in ['.',word[i]]:
            break
    else:
        break
for i in range(0,len(word)):
    grid[y + direction[1]*i][x + direction[0]*i] = word[i]

これは変化xy続け、最初の for ループが壊れることなく実行されるまで続きます。最初の for ループは、グリッド内の値が空き領域でも必要な文字 ( ) でもない場合はいつでも壊れますword[i]

于 2015-12-02T21:27:14.067 に答える
0

すべてのスペースが使用可能であることを最初にテストして、インデックスを記録するだけです。空いている場合は、値を挿入します。グリッドの値がそこに配置される文字と一致する場合は、それでも問題ありません。

挿入中にテストする場合は、部分的な単語を '.' に置き換えるためにバックトラックする必要があるため、挿入した場所を記録する必要があります。

于 2015-12-02T21:25:28.380 に答える