当前位置: 首页 > 知识库问答 >
问题:

按X键随机移动玩家

舒宏富
2023-03-14

我是一个业余程序员,在Pyplay非常新。这是我用Pyplay编写的程序,类似于我的世界。在过去的一个小时里,我一直在尝试设置一个代码,让我的玩家在按下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个答案

叶裕
2023-03-14

我认为你在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

你应该能把其余的分类放在一起。

附笔。

为了更清楚,您希望为当前位置分配一个从0到14的数字,而不是减法/加法。

 类似资料:
  • 刚开始使用pygame,当你按住箭头键时,试图让一个简单的点在屏幕上移动。目前,它只在你按键时移动,但你必须重复按键。 此外,我很感激你对我目前的代码有任何建议,可以改进或改变,使之更有效。

  • 问题内容: 我有一本字典,其中每个键都有一个可变长度的列表,例如: 是否有一种干净的方法来获取随机字典密钥,并对其值的长度进行加权? 会平均分配按键的权重,但在上述情况下,我希望大约一半的时间返回。 问题答案: 这将工作:

  • 问题内容: 目前,每次按键时,精灵仅移动1个像素。按住左右键时,如何使水暖工精灵不断移动? 问题答案: 您可以使用pygame.key.get_pressed来做到这一点。 例:

  • 我对Android/Java编程比较陌生。我正在创建一个基于文本的社交游戏,并创建了一个包含ID、名称和角色的SQLite数据库。 角色将由应用程序分配并存储在相关的SQLite表中。 由于角色是随机的,我想也许一个随机数生成器从1-7(2个独特的角色,2个相同的角色和3个相同的角色) 我被困在哪里开始和如何实现此功能,任何帮助/建议将不胜感激。

  • 我知道已经有一些关于墙壁碰撞的问题了,但是这些答案中的技术都没有帮助我。我正在做一个没有重力的自上而下的探索游戏。运动很好,但是一旦我制造了墙壁和碰撞,它就开始出现故障并传送。我已经包含了(并大大减少了)我认为问题所在的两个功能,在底部我包含了整个代码。 根据pygame精灵墙碰撞的建议,我分割了x和y墙碰撞代码。墙壁碰撞代码基于https://github.com/marcusmoller/py

  • 问题内容: 我一直在谷歌上寻找答案,但似乎找不到一个万无一失的东西,而且真的负担不起将其弄乱(进入生产站点)。 我所拥有的是具有20多个过滤器的高级搜索,它返回一个包含ID和Distance的数组。我需要做的是将这些结果混洗以每次随机显示。目前我得到的数组是: 我需要做的是每次都对它们进行随机化或排序,但要保持id和距离对,即: 谢谢 :) 问题答案: 在第一个用户后下的文件: 在保留键,值对的同