按X键随机移动播放器

时间:2015-11-21 21:18:51

标签: python pygame

我是一名业余程序员,在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() 

1 个答案:

答案 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之间的数字,而不是减去/添加到当前位置。