0

これは、三目並べゲームに関する以前の質問の続きです。私は、三目並べボードのすべての空のグリッド タイルを収集し、それらをリストに返す関数を作成しています。この関数は、行われた移動に隣接する空のグリッド タイルを探し続けるという点で、再帰的です。このようなもの:

<------->
< X O - >
< - - X >
< O X - >
<------->

したがって、ユーザー (または、この場合、コンピューターと対戦するコンピューター用に作成したコード) が、タイルを選択して、どのグリッド タイルが空であるかを知りたいとします。上記の例では、タイルに番号が付けられます

0 1 2
3 4 5 
6 7 8

コンピューターがタイル 1 を選択したとします。隣接するタイル (この場合は上、左、右、下) を検索し、そこに移動できるかどうかを確認します。隣接するタイルが空であることが判明した場合は、すべての可能性を使い果たすまで、そのタイルの隣接するタイルも検索します。そのため、現在のボードと playerMove を使用して関数を呼び出し、隣接する空のタイルを見つけてリストに追加できるようにしたいと考えています。任意のヒント?

def whatIsEmpty(moveList,move):
     emptyTiles = []
     #something that allows you to find the adjacent tiles of the move
     #something that allows you to find the adjacent tiles of the tiles found above, until all are found

これにはいくつかの for ループが必要であることはわかっていますが、開始方法がわかりません。私が知っているのは、架空の 3x3 グリッドの真ん中に移動し、隣接するタイルを見つけてそれらが空かどうかを確認したいということです。したがって、2D リストでは、次のようなものを使用します。

moveList[x-1][y]
moveList[x][y+1]
moveList[x+1][y]
moveList[x][y+1]

それぞれが上、右、左、下に対応し、これは再帰的に使用されます。どんなヒントでも大歓迎です。

4

1 に答える 1

1

このシナリオでは、再帰的な戦略は最適ではない可能性があります。あなた自身が提供した例を考えてみましょう:

<------->
< X O - >
< - - X >
< O X - >
<------->

次の動きが真ん中のタイルで行われたとします。再帰関数が隣接する 4 つのタイルのみをチェックすると、残りの部分から「切り離された」タイル (右下のタイル) を見逃すことになります。また、隣接する 8 つのタイル (斜めに隣接するタイルを含む) をすべてチェックする関数を作成する場合は、繰り返して作成することもできます。

for i in range(3):
   for j in range(3):
      pass # Replace with code to add empty tile to list
于 2013-03-26T01:33:41.177 に答える