1
這裏是我的所有代碼:如何使對象在按鍵上通過一組對象移動?
import random as random
import pygame as pygame
pygame.init() # initialize
clock = pygame.time.Clock() # framerate limit
Screen = pygame.display.set_mode([1000, 1000]) # Create screen object and Window Size
Done = False
MapSize = 25
TileWidth = 20
TileHeight = 20
TileMargin = 4
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
class MapTile(object):
def __init__(self, Name, xlocation, ylocation):
self.Name = Name
self.xlocation = xlocation
self.ylocation = ylocation
class Character(object):
def __init__(self, Name, HP, Allegiance, xlocation, ylocation):
self.Name = Name
self.HP = HP
self.Allegiance = Allegiance
self.xlocation = xlocation
self.ylocation = ylocation
def Move(self, Direction):
if Direction == "UP":
self.ylocation += 1
elif Direction == "LEFT":
self.xlocation -= 1
elif Direction == "RIGHT":
self.xlocation += 1
elif Direction == "DOWN":
self.ylocation -= 1
self.Location()
def Location(self):
print("Coordinates: " + str(self.xlocation) + ", " + str(self.ylocation))
class Map(object):
Grid = []
global MapSize
for Row in range(MapSize): # Creating grid
Grid.append([])
for Column in range(MapSize):
Grid[Row].append([])
for Row in range(MapSize): #Filling grid with grass
for Column in range(MapSize):
TempTile = MapTile("Grass", Row, Column)
Grid[Row][Column].append(TempTile)
for Row in range(MapSize): #Rocks
for Column in range(MapSize):
TempTile = MapTile("Rock", Row, Column)
if Row == 1:
Grid[Row][Column].append(TempTile)
for i in range(10): #Random trees
RandomRow = random.randint(0, MapSize - 1)
RandomColumn = random.randint(0, MapSize - 1)
TempTile = MapTile("Tree", Row, Column)
Grid[RandomRow][RandomColumn].append(TempTile)
def update(self):
for Row in range(MapSize):
for Column in range(MapSize):
for i in range(len(Map.Grid[Row][Column])):
if Map.Grid[Row][Column][i].xlocation != Column:
print("BOOP")
Map.Grid[Row][Map.Grid[Row][Column][i].xlocation].append(Map.Grid[Row][Column][i])
Map.Grid.remove(Map.Grid[Row][Column][i])
if Map.Grid[Row][Column][i].ylocation != Row:
print("BOOP")
Map.Grid[Row][Map.Grid[Row][Column][i].xlocation].append(Map.Grid[Row][Column][i])
else:
break
RandomRow = random.randint(0, MapSize - 1)
RandomColumn = random.randint(0, MapSize - 1)
Hero = Character("boop", 10, "Friendly", RandomRow, RandomColumn)
Grid[RandomRow][RandomColumn].append(Hero)
Map = Map()
while not Done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
Done = True
elif event.type == pygame.MOUSEBUTTONDOWN:
Pos = pygame.mouse.get_pos()
Column = Pos[0] // (TileWidth + TileMargin)
Row = Pos[1] // (TileHeight + TileMargin)
print(str(Row) + ", " + str(Column))
for i in range(len(Map.Grid[Row][Column])):
print(str(Map.Grid[Row][Column][i].Name))
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
Map.Hero.Move("LEFT")
if event.key == pygame.K_RIGHT:
Map.Hero.Move("RIGHT")
if event.key == pygame.K_UP:
Map.Hero.Move("UP")
if event.key == pygame.K_DOWN:
Map.Hero.Move("DOWN")
Map.update()
Screen.fill(BLACK)
for Row in range(MapSize): # Drawing grid
for Column in range(MapSize):
Color = WHITE
if len(Map.Grid[Row][Column]) == 2:
Color = RED
for i in range(0, len(Map.Grid[Row][Column])):
if Map.Grid[Row][Column][i].Name == "boop":
Color = GREEN
if Map.Grid[Row][Column][i].Name == "MoveTile":
Color = BLUE
pygame.draw.rect(Screen, Color, [(TileMargin + TileWidth) * Column + TileMargin,
(TileMargin + TileHeight) * Row + TileMargin,
TileWidth,
TileHeight])
clock.tick(60)
pygame.display.flip()
pygame.quit()
和相關的位:
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
Map.Hero.Move("LEFT")
if event.key == pygame.K_RIGHT:
Map.Hero.Move("RIGHT")
if event.key == pygame.K_UP:
Map.Hero.Move("UP")
if event.key == pygame.K_DOWN:
Map.Hero.Move("DOWN")
Map.update()
移動功能:
def Move(self, Direction):
if Direction == "UP":
self.ylocation += 1
elif Direction == "LEFT":
self.xlocation -= 1
elif Direction == "RIGHT":
self.xlocation += 1
elif Direction == "DOWN":
self.ylocation -= 1
而且更新功能,問題所在:
def update(self):
for Row in range(MapSize):
for Column in range(MapSize):
for i in range(len(Map.Grid[Row][Column])):
if Map.Grid[Row][Column][i].xlocation != Column:
print("BOOP")
Map.Grid[Row][Map.Grid[Row][Column][i].xlocation].append(Map.Grid[Row][Column][i])
Map.Grid.remove(Map.Grid[Row][Column][i])
if Map.Grid[Row][Column][i].ylocation != Row:
print("BOOP")
Map.Grid[Row][Map.Grid[Row][Column][i].xlocation].append(Map.Grid[Row][Column][i])
else:
break
更新函數的預期行爲是檢查網格中的每個對象並查看它是否已經移動(如果對象的內部座標與其在網格上的當前位置之間存在差異),並將其替換爲網格中的它的正確位置。它通過在新位置追加新版本的對象並刪除舊對象來實現此目的。
我得到的錯誤是:
Traceback (most recent call last):
File "/Users/kosay.jabre/Desktop/Monster.py", line 136, in <module>
Map.update()
File "/Users/kosay.jabre/Desktop/Monster.py", line 93, in update
Map.Grid.remove(Map.Grid[Row][Column][i])
ValueError: list.remove(x): x not in list
我如何能最好的達到預期的行爲?
你得到的錯誤是因爲'Map.Grid.remove()'只查找在列表中,只包含代表第二個維度其他列表的第一個維度的價值 - 所以它永遠不會找到引用相應的MapTile實例。你需要遍歷每個子列表,然後'try'去除目標(如果你這樣做,就退出循環)。 – martineau
你能幫我一下這樣做的語法嗎?另外,我不想刪除MapTile,而是刪除Hero。我想通過將他追加到新位置並移除舊實例來移動英雄。 – Kos