我是一名业余程序员,在Pygame非常新。这是我用Pygame编写的程序,类似于Minecraft。在过去的一小时里,我一直试图设置一个代码,让我的玩家在按下X键时移动到随机区块。如果不是所有的网站和搜索引擎都在寻找,我已经筋疲力尽了。我设法完成了我的一半任务;当按下X键时,化身移动到随机图块但它移出窗口/显示器。拜托,您能看看我的代码,看看我能做些什么来改进它?
import pygame, sys, random
from pygame.locals import *
LTBLUE = (125, 221, 255)
GREEN = (42, 106, 24)
YELLOW = (247, 243, 59)
GREY = (150, 150, 150)
WHITE = (255, 255, 255)
PINK = (251, 175, 224)
WATER = 0
SEAWEED = 1
SAND = 2
ROCKS = 3
PEARL = 4
CORAL = 5
PLAYER = pygame.image.load("mermaid.gif")
playerPos=[0,0]
#colors = {SAND: YELLOW, SEAWEED: GREEN, WATER: LTBLUE, PEARL: WHITE, ROCKS: GREY, CORAL: PINK}
textures = { WATER: pygame.image.load("water.png"),
SEAWEED: pygame.image.load("seaweed.png"),
SAND: pygame.image.load("sand.png"),
ROCKS: pygame.image.load("rocks.png"),
PEARL: pygame.image.load("pearl.png"),
CORAL: pygame.image.load("coral3.png")
TILESIZE = 40
MAPWIDTH = 15
MAPHEIGHT = 15
resources = [SAND, WATER, SEAWEED, PEARL, ROCKS, CORAL]
tilemap=[]
for h in range(MAPHEIGHT):
myrow=[]
for w in range(MAPWIDTH):
if(h==0 or h==14 or w==0 or w==14):
myrow.append(CORAL);
else:
randomindex = random.randint(0,5)
myrow.append(randomindex);
tilemap.append(myrow)
print(tilemap)
pygame.init()
DISPLAYSURF = pygame.display.set_mode((MAPWIDTH*TILESIZE, MAPHEIGHT*TILESIZE))
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
#rmove = random.randint(0,15)
if event.key == K_RIGHT:
playerPos[0]+=1
elif event.key == K_LEFT:
playerPos[0]-=1
elif event.key == K_UP:
playerPos[1]-=1
elif event.key == K_DOWN:
playerPos[1]+=1
elif event.key == K_x:
if(movex<14 and movey<14):
playerPos[0]-=movex
playerPos[0]+=movex
playerPos[1]-=movey
playerPos[1]+=movey
for row in range(MAPHEIGHT):
for column in range(MAPWIDTH):
DISPLAYSURF.blit(textures[tilemap[row][column]],(column*TILESIZE, row*TILESIZE))
DISPLAYSURF.blit(PLAYER, (playerPos[0]*TILESIZE, playerPos[1]*TILESIZE))`
pygame.display.update()
答案 0 :(得分:0)
我认为你在x事件之后遗漏了一小部分代码,如:
movex = random.randint(0,14)
movey = random.randint(0,14)
无论如何,据我了解你的问题,并猜测movex和movey是从0到14的随机数,问题应该在这里:
if(movex<14 and movey<14):
playerPos[0]-=movex
playerPos[0]+=movex
playerPos[1]-=movey
playerPos[1]+=movey
如果你从0 14中提取一个随机数并且总和/减去玩家位置,你无法保证新位置在网格内。 您应该添加一些逻辑以防止播放器从可见屏幕中消失。 即使使用其他控制键,你也可以看到问题的作用:当你的角色位于屏幕的左边缘时(如果位置变为(-1,0)),如果你按下左按钮,你的角色就会消失。 我建议在event.key.K _ *:
之后用一个简单的条件开始if event.key == K_RIGHT:
if playerPos[14] == 14:
playerPos[0]= playerPos[0]
else:
playerPos[0]+=1
if event.key == K_LEFT:
if playerPos[0] == 0:
playerPos[0]= playerPos[0]
else:
playerPos[0]-=1
你应该能够对其余部分进行排序。
P.S。
为了更清楚,您希望指定 0到14之间的数字,而不是减去/添加到当前位置。