0

ファイアーエムブレムのようなターンベースの戦略を pygame を使用して Python でプログラミングしていますが、プレイヤーの動きに問題があります。それが機能する方法は、プレーヤーを選択すると、許可されたすべての動きが青色で強調表示されますが、私の問題は、可能なすべての動きのリストを作成するのに問題があることです.

def showPerson(tilex, tiley, personAtTile):
global ALLOWEDMOVES
ALLOWEDMOVES = []
prepare = {k:v for v,k in PLAYERSPOSITION.items()}
z = PLAYERDISTANCE[personAtTile]
#get all coords for the possible moves
currentNewSpots = []
oldSpots = []
a = PLAYERSPOSITION[personAtTile][0]
b = PLAYERSPOSITION[personAtTile][1]
c = a + 1
test = findTileLetter(c, b)
if test:
    currentNewSpots.append((c, b))
    ALLOWEDMOVES.append((c, b))
c = a -1
test = findTileLetter(c, b)
if test:
    currentNewSpots.append((c, b))
    ALLOWEDMOVES.append((c, b))
c = b + 1
test = findTileLetter(a, c)
if test:
    currentNewSpots.append((a, c))
    ALLOWEDMOVES.append((a, c))
c = b - 1
test = findTileLetter(a, c)
if test:
    currentNewSpots.append((a, c))
    ALLOWEDMOVES.append((a, c))

for x in range(PLAYERDISTANCE[prepare[(tilex, tiley)]]):
    for y in range(len(currentNewSpots) - 1):
        a = currentNewSpots[y][0]
        b = currentNewSpots[y][1]
        c = a + 1
        test = findTileLetter(c, b)
        if test and ((c, b)) not in ALLOWEDMOVES:
            currentNewSpots.append((c, b))
            ALLOWEDMOVES.append((c, b))
        c = a -1
        test = findTileLetter(c, b)
        if test and ((c, b)) not in ALLOWEDMOVES:
            currentNewSpots.append((c, b))
            ALLOWEDMOVES.append((c, b))
        c = b + 1
        test = findTileLetter(a, c)
        if test and ((c, b)) not in ALLOWEDMOVES:
            currentNewSpots.append((a, c))
            ALLOWEDMOVES.append((a, c))
        c = b - 1
        test = findTileLetter(a, c)
        if test and ((c, b)) not in ALLOWEDMOVES:
            currentNewSpots.append((a, c))
            ALLOWEDMOVES.append((a, c))
4

1 に答える 1

1

何を考えているのかわからないので、次の仮定の下で進めます。

  • findTileLetter(x, y)の正方形(x, y)がまずまずかどうかを教えてくれます。つまり、ユニットがそのマスを通過できるか、またはターンを終了できるかどうかがわかります。
  • ユニットはPLAYERDISTANCE[unit] + 11 ターンに最大 3 回ステップアップできます。各ステップは、上下左右に移動できます。斜めのステップは許可されていません。

それを念頭に置いて、次のことに注意してください。

for y in range(len(currentNewSpots) - 1):

の必要な要素よりも 1 つ少ない要素を反復処理するため、前のループで最後に追加された要素からのステップ実行を省略したcurrentNewSpotsすべてのループ。したがって、潜在的な目的地の正方形を除外します。xcurrentNewSpotsx

行を次のように変更します

for y in range(len(currentNewSpots))

この問題を修正します。

さらに、yループ内の delta-y テストは正しくありません。

    c = b + 1
    test = findTileLetter(a, c)
    if test and ((c, b)) not in ALLOWEDMOVES: ### <--- should be (a, c)
        currentNewSpots.append((a, c))
        ALLOWEDMOVES.append((a, c))

動作するテスト コードの塊が続きます。は、タイルのgrid世界を定義します。0タイルは通行できませんが、1タイルは通行できます。MY_XとはMY_Y、どこから検索するかを定義します。すべてのステップの後、マ​​ップを stdout に出力し、これまでに見つかった正方形を示します。

import sys

MY_X = 3
MY_Y = 4
MY_RNG = 2

grid = [
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
    [0, 0, 1, 1, 1, 1, 0, 0, 1, 0],
    [0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [0, 0, 1, 1, 0, 1, 1, 0, 0, 1],
    [0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
    [0, 0, 0, 0, 1, 1, 1, 1, 1, 0],
    [0, 0, 0, 1, 1, 1, 1, 0, 0, 0],
    [0, 1, 1, 1, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
]

def findTileLetter(x, y):
    return grid[y][x]

class Person:
    pass

def showMap():
    for y in range(len(grid)):
        for x in range(len(grid[y])):
            if grid[y][x] == 0:
                sys.stdout.write(' ')
            elif x == MY_X and y == MY_Y:
                sys.stdout.write('x')
            elif (x, y) in ALLOWEDMOVES:
                sys.stdout.write('o')
            else:
                sys.stdout.write('-')
        sys.stdout.write('\n')

me = Person()

ALLOWEDMOVES = []

PLAYERDISTANCE = {}
PLAYERDISTANCE[me] = MY_RNG

PLAYERSPOSITION = {}
PLAYERSPOSITION[me] = (MY_X, MY_Y)

def showPerson(tilex, tiley, personAtTile):
    global ALLOWEDMOVES
    ALLOWEDMOVES = []
    prepare = {k:v for v,k in PLAYERSPOSITION.items()}
    z = PLAYERDISTANCE[personAtTile]
    #get all coords for the possible moves
    currentNewSpots = []
    oldSpots = []
    a = PLAYERSPOSITION[personAtTile][0]
    b = PLAYERSPOSITION[personAtTile][1]
    c = a + 1
    test = findTileLetter(c, b)
    if test:
        currentNewSpots.append((c, b))
        ALLOWEDMOVES.append((c, b))
    c = a -1
    test = findTileLetter(c, b)
    if test:
        currentNewSpots.append((c, b))
        ALLOWEDMOVES.append((c, b))
    c = b + 1
    test = findTileLetter(a, c)
    if test:
        currentNewSpots.append((a, c))
        ALLOWEDMOVES.append((a, c))
    c = b - 1
    test = findTileLetter(a, c)
    if test:
        currentNewSpots.append((a, c))
        ALLOWEDMOVES.append((a, c))

    showMap()

    for x in range(PLAYERDISTANCE[prepare[(tilex, tiley)]]):
        for y in range(len(currentNewSpots)):
            a = currentNewSpots[y][0]
            b = currentNewSpots[y][1]
            c = a + 1
            test = findTileLetter(c, b)
            if test and ((c, b)) not in ALLOWEDMOVES:
                currentNewSpots.append((c, b))
                ALLOWEDMOVES.append((c, b))
            c = a - 1
            test = findTileLetter(c, b)
            if test and ((c, b)) not in ALLOWEDMOVES:
                currentNewSpots.append((c, b))
                ALLOWEDMOVES.append((c, b))
            c = b + 1
            test = findTileLetter(a, c)
            if test and ((a, c)) not in ALLOWEDMOVES:
                currentNewSpots.append((a, c))
                ALLOWEDMOVES.append((a, c))
            c = b - 1
            test = findTileLetter(a, c)
            if test and ((a, c)) not in ALLOWEDMOVES:
                currentNewSpots.append((a, c))
                ALLOWEDMOVES.append((a, c))
        showMap()

showPerson(MY_X, MY_Y, me)
print ALLOWEDMOVES
于 2013-10-24T23:50:01.863 に答える