Pygame を使用して、Python でアドベンチャー ゲームを作成しています。私の主な問題は、部屋の境界を定義し、毎回境界にぶつかることなく主人公を歩き回らせる方法です。悲しいことに、私はアルゴリズムを勉強したことがないので、パスを計算する方法についての手がかりがありません。この質問は非常に一般的で答えるのが難しいことを知っていますが、正しい方向へのポイントは非常に高く評価されます. ありがとう!
4 に答える
このようなゲームに適した境界を定義する簡単な方法が 2 つあります。
より簡単な方法は、領域をグリッドに分割し、2D 配列を使用して、グリッド内のどの正方形が通行可能かを追跡することです。通常、この配列にはマップ情報も格納されるため、各位置には、その正方形に草、壁、道路、山などが含まれているかどうか (したがって、どの画像を表示するか) を示す番号があります。大まかなイメージを与えるには:
######
#.# #
# ## #
# #
######
薄い壁で一種の「迷路」の外観が必要な場合に必要な、より複雑な方法は、グリッドの正方形の間に垂直な壁があるかどうか、および間に水平な壁があるかどうかを示す 2D 配列を使用することです。グリッドの正方形。大まかな図 (ASCII で引き伸ばされたように見えますが、要点がわかると思います):
- - - -
| | |
- -
| |
- - - -
次に決定することは、キャラクターがどの方向に移動できるかです (上下左右が最も簡単ですが、対角線はそれほど難しくありません)。次に、プログラムは基本的に、目的地に出くわすことを期待して、現在の位置から始めて、その領域を「精神的に」探索する必要があります。
上/下/左/右の実装が簡単で、最短経路があればそれを見つける単純な検索は、幅優先検索と呼ばれます。ここにいくつかの擬似コードがあります:
queue = new Queue #just a simple first-in-first-out
queue.push(startNode)
while not queue.empty():
exploreNode = queue.pop()
if isWalkable(exploreNode): #this doesn't work if you use
#"thin walls". The check must go
#where the pushes are instead
if isTarget(exploreNode):
#success!!!
else:
#push all neighbours
queue.push( exploreNode.up )
queue.push( exploreNode.down )
queue.push( exploreNode.left )
queue.push( exploreNode.right )
このアルゴリズムは大規模なマップでは時間がかかりますが、グラフ検索と経路探索の概念に慣れることができます。正しく動作することを確認したら、それを A* などに置き換えてみてください。これにより、同じ結果が短時間で得られるはずです!
A* およびその他の多くの検索アルゴリズムは、FIFO キューの代わりにプライオリティ キューを使用します。これにより、「より可能性の高い」パスを最初に検討できますが、より直接的なパスがブロックされていることが判明した場合は、ラウンドアバウト パスに回避できます。
悲しいことに、私はアルゴリズムを勉強したことがないので、パスを計算する方法についての手がかりがありません。
ゲームを書き始める前に、それらについて自分自身を教育する必要があります。これには最初は少し手間がかかりますが、後で大幅に時間を節約できます。
A*検索アルゴリズムはゲームでパスの問題によく使用されるため、よく読んでおくことをお勧めします。
このゲームが 2 次元 (または 2.5) の場合、衝突のチェックが簡単になるため、タイル システムを使用することをお勧めします。これらを使い始めるためのオンライン情報はたくさんあります。
私は pygame に詳しくありませんが、多くのアプリケーションでは一般的にバウンディング ボリュームを使用して領域の端を定義しています。アイデアは、キャラクターが歩くときに、キャラクターのボリュームが壁のボリュームと交差するかどうかを確認することです。その後、速度を調整するか、キャラクターの動きを止めることができます。さまざまな形状を使用して滑らかな壁を作成し、キャラクターがとがったエッジに引っかからないようにします。
これらの概念は、迅速なエッジと境界の検出を必要とするあらゆるアプリケーションに使用できます。