Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pygame:找到空的空间?_Python_Random_Pygame - Fatal编程技术网

Python Pygame:找到空的空间?

Python Pygame:找到空的空间?,python,random,pygame,Python,Random,Pygame,我正在做一个洞穴探索式的游戏,电脑随机生成一个洞穴,然后让玩家进去探索。问题是,我需要玩家在洞穴中没有障碍的地方创造一些空间。我试过这个: #do generation px=0 py=0 for b in blocks: while b.rect.collidepoint(px,py): px=randrange(1,640) py=randrange(1,480) player=Player(px,py) 但这似乎不起作用,有人有什么

我正在做一个洞穴探索式的游戏,电脑随机生成一个洞穴,然后让玩家进去探索。问题是,我需要玩家在洞穴中没有障碍的地方创造一些空间。我试过这个:

#do generation
px=0
py=0
for b in blocks:
    while b.rect.collidepoint(px,py):
        px=randrange(1,640)
        py=randrange(1,480)
        player=Player(px,py)
但这似乎不起作用,有人有什么建议吗

代码如下:

import pygame
from pygame.locals import *
from collections import namedtuple
from random import randrange,choice
pygame.init()
screen=pygame.display.set_mode((640,480))
Move = namedtuple('Move', ['up', 'left', 'right'])
max_gravity=50
class Block(object):
    def __init__(self,x,y):
        self.x=x
        self.y=y
        self.rect=pygame.Rect(self.x,self.y,16,16)
class CaveMaker(object):
    def __init__(self):
        self.active=1
        self.x=randrange(1,640)
        self.y=randrange(1,480)
        self.direction=(choice([25,0,-25]),choice([25,0,-25]))
        self.rect=pygame.Rect(self.x,self.y,60,60)
        self.timeout=choice([30,50,70,90,110])
        self.destroytime=randrange(200,360)
    def Update(self):
        if self.active==1:
            self.x+=self.direction[0]
            self.y+=self.direction[1]
            self.timeout-=1
            if self.timeout==0:
                self.direction=(choice([25,0,-25]),choice([25,0,-25]))
                self.timeout=choice([30,50,70,90,110])
            self.destroytime-=1
            if self.destroytime==0:
                self.active=0
            self.rect=pygame.Rect(self.x,self.y,60,60)
class Player(object):
    def __init__(self, x, y):
        self.rect = pygame.Rect(x,y,16,16)
        self.on_ground = True
        self.xvel = 0
        self.yvel = 0
        self.jump_speed = 7
        self.move_speed = 3

    def update(self, move, blocks):
        if move.up and self.on_ground:
            self.yvel -= self.jump_speed
        if move.left:
                self.xvel = -self.move_speed
        if move.right:
                self.xvel = self.move_speed
        if not self.on_ground:
            self.yvel += 0.3
            # but not too fast
            if self.yvel > max_gravity: self.yvel = max_gravity
        if not (move.left or move.right):
            self.xvel = 0
        self.rect.left += self.xvel
        self.collide(self.xvel, 0, blocks)
        self.rect.top += self.yvel
        self.on_ground = False;
        self.collide(0, self.yvel, blocks)

    def collide(self, xvel, yvel, blocks):
        for block in [blocks[i] for i in self.rect.collidelistall(blocks)]:
            if xvel > 0:
                    self.rect.right = block.rect.left
            if xvel < 0:
                    self.rect.left = block.rect.right

            if yvel > 0:
                self.rect.bottom = block.rect.top
                self.on_ground = True
                self.yvel = 0
            if yvel < 0: self.rect.top = block.rect.bottom;self.yvel=0
blocks=[]
cavemakes=[]
gen=1
genx=0
geny=0
cavemakes.append(CaveMaker());cavemakes.append(CaveMaker());cavemakes.append(CaveMaker());cavemakes.append(CaveMaker());
while True:
    key=pygame.key.get_pressed()
    if gen==1:
        blocks.append(Block(genx,geny))
        geny+=16
        if geny>480:
            geny=0
            genx+=16
            if genx>640:
                gen=2
    elif gen==2:
        screen.fill((5,80,200))
        for b in blocks:
            pygame.draw.rect(screen, (90,90,90), b.rect, 0)
        for c in cavemakes:
            if c.active==0:
                gen='done'
                player=Player(32,32)
            c.Update()
            for b in blocks:
                if b.rect.colliderect(c.rect):
                    blocks.remove(b) 
        pygame.display.flip()
    if gen=='done':
        screen.fill((5,80,200))
        for b in blocks:
            pygame.draw.rect(screen, (90,90,90), b.rect, 0)
        for e in pygame.event.get():
            if e.type==QUIT:
                exit()
        move = Move(key[K_w], key[K_a], key[K_d])
        player.update(move,blocks)
        pygame.draw.rect(screen, (5,200,5), player.rect, 3)
        pygame.display.flip()
导入pygame
从pygame.locals导入*
从集合导入namedtuple
从随机输入范围,选择
pygame.init()
screen=pygame.display.set_模式((640480))
Move=namedtuple('Move',['up','left','right']))
最大重力=50
类块(对象):
定义初始化(self,x,y):
self.x=x
self.y=y
self.rect=pygame.rect(self.x,self.y,16,16)
类CaveMaker(对象):
定义初始化(自):
自激活=1
self.x=randrange(1640)
self.y=随机范围(1480)
方向=(选择([25,0,-25]),选择([25,0,-25]))
self.rect=pygame.rect(self.x,self.y,60,60)
self.timeout=选择([30,50,70,90110])
自我销毁时间=随机范围(200360)
def更新(自我):
如果self.active==1:
self.x+=self.direction[0]
自y+=自方向[1]
self.timeout-=1
如果self.timeout==0:
方向=(选择([25,0,-25]),选择([25,0,-25]))
self.timeout=选择([30,50,70,90110])
自我毁灭时间-=1
如果self.destroytime==0:
self.active=0
self.rect=pygame.rect(self.x,self.y,60,60)
类播放器(对象):
定义初始化(self,x,y):
self.rect=pygame.rect(x,y,16,16)
self.on_地面=真
self.xvel=0
self.yvel=0
自跳速度=7
自移动速度=3
def更新(自我、移动、块):
如果向上移动并在地面上自行移动:
self.yvel-=self.jump\u速度
如果向左移动:
self.xvel=-self.move\u速度
如果向右移动:
self.xvel=self.move\u速度
如果不在地面上,则:
self.yvel+=0.3
#但不要太快
如果self.yvel>最大重力:self.yvel=最大重力
如果不是(向左移动或向右移动):
self.xvel=0
self.rect.left+=self.xvel
self.collide(self.xvel,0,块)
self.rect.top+=self.yvel
self.on_地面=假;
self.collide(0,self.yvel,块)
def碰撞(自身、xvel、yvel、块):
对于[blocks[i]中的block,对于self.rect.collidestall(blocks)]中的i:
如果xvel>0:
self.rect.right=block.rect.left
如果xvel<0:
self.rect.left=block.rect.right
如果yvel>0:
self.rect.bottom=block.rect.top
self.on_地面=真
self.yvel=0
如果yvel<0:self.rect.top=block.rect.bottom;self.yvel=0
块=[]
cavemakes=[]
gen=1
genx=0
geny=0
append(CaveMaker());append(CaveMaker());append(CaveMaker());append(CaveMaker());
尽管如此:
key=pygame.key.get_pressed()
如果gen==1:
Block.append(Block(genx,geny))
geny+=16
如果geny>480:
geny=0
genx+=16
如果genx>640:
gen=2
elif gen==2:
筛选填充((5,80200))
对于块中的b:
pygame.draw.rect(屏幕,(90,90,90),b.rect,0)
对于cavemakes中的c:
如果c.active==0:
gen='done'
玩家=玩家(32,32)
c、 更新()
对于块中的b:
如果b.rect.collide rect(c.rect):
块。删除(b)
pygame.display.flip()
如果gen==“完成”:
筛选填充((5,80200))
对于块中的b:
pygame.draw.rect(屏幕,(90,90,90),b.rect,0)
对于pygame.event.get()中的e:
如果e.type==退出:
退出()
移动=移动(键[K_w]、键[K_a]、键[K_d])
玩家更新(移动,阻挡)
pygame.draw.rect(屏幕,(5200,5),player.rect,3)
pygame.display.flip()
您的代码

for b in blocks:
    while b.rect.collidepoint(px,py):
        px=randrange(1,640)
        py=randrange(1,480)
将循环通过每个块,确保该点不会仅与该块重叠。因此,您的最终点不会与最后一个块碰撞,而是可能与其他块碰撞。尝试:

while any(b.rect.collidepoint(px, py) for b in blocks):