Моя цель - переместить «монстра» (mX, mY
) в сетке 2d к игроку (pX, pY
).Монстр может двигаться в 8 разных направлениях.
У меня есть рабочий код для этого, но я очень плохо знаком с Python.У меня есть сильная склонность к тому, что мой код ужасен, и что есть более быстрые способы сделать это.
Я делаю это, создавая массив 3 x 3 вокруг позиции монстра (слот массива 4) и заполняя егос расстоянием от этой позиции массива до игрока.Затем я проверяю, находится ли кто-нибудь ниже, чем текущее расстояние монстров, и если да, переместите монстра к нему.
![enter image description here](https://i.stack.imgur.com/xUCzH.png)
Вот мой текущий код.Извиняюсь, если тебя тошнит, я все еще изучаю веревки.
# get the distance between the monster and player
dist = math.hypot(pX - mX, pY - mY)
if dist > 1.5 and dist < 10:
# make an 'array' grid to store updated distances in
goto = np.full((3, 3), 10, dtype=float)
# if each position in the array passes a
# collision check, add each new distance
if collisionCheck(mID, (mX-1), (mY-1), mMap) == 0:
goto[0][0] = round(math.hypot(pX - (mX-1), pY - (mY-1)), 1)
if collisionCheck(mID, mX, (mY-1), mMap) == 0:
goto[0][1] = round(math.hypot(pX - mX, pY - (mY-1)), 1)
if collisionCheck(mID, (mX+1), (mY-1), mMap) == 0:
goto[0][2] = round(math.hypot(pX - (mX+1), pY - (mY-1)), 1)
if main.collisionCheck(mID, (mX-1), mY, mMap) == 0:
goto[1][0] = round(math.hypot(pX - (mX-1), pY - mY), 1)
# goto[1][1] is skipped since that is the monsters current position
if collisionCheck(mID, (mX+1), mY, mMap) == 0:
goto[1][2] = round(math.hypot(pX - (mX+1), pY - mY), 1)
if collisionCheck(mID, (mX-1), (mY+1), mMap) == 0:
goto[2][0] = round(math.hypot(pX - (mX-1), pY - (mY+1)), 1)
if collisionCheck(mID, mX, (mY+1), mMap) == 0:
goto[2][1] = round(math.hypot(pX - mX, pY - (mY+1)), 1)
if collisionCheck(mID, (mX+1), (mY+1), mMap) == 0:
goto[2][2] = round(math.hypot(pX - (mX+1), pY - (mY+1)), 1)
# get the lowest distance, and its key
lowest = goto.min()
lowestKey = goto.argmin()
# if the lowest distance is lower than monsters current position, move
if lowest < dist:
if lowestKey == 0:
newX = mX - 1
newY = mY - 1
if lowestKey == 1:
newY = mY - 1
if lowestKey == 2:
newX = mX + 1
newY = mY - 1
if lowestKey == 3:
newX = mX - 1
if lowestKey == 5:
newX = mX + 1
if lowestKey == 6:
newY = mY + 1
newX = mX - 1
if lowestKey == 7:
newY = mY + 1
if lowestKey == 8:
newX = mX + 1
newY = mY + 1
Какой самый чистый, простой и быстрый способ сделать то, что я делаю?Это будет проходить через множество монстров одновременно!
РЕДАКТИРОВАТЬ: Добавлено collisionCheck()
:
def collisionCheck(mobID, newX, newY, mapName):
blocked = 0
if mobs.mobPos_arr[mapName][newX,newY] > -1:
blocked = 1
if mapCollision_arr[mapName][newX,newY] > 0:
blocked = 1
return int(blocked)