簡體   English   中英

Pygame:隨機方向?

[英]Pygame: Random direction?

我正在開發一款以隨機生成的洞穴為特色的游戲。 首先創建一個64x16塊的640x480字段。 然后放置3個CaveMaker實例, CaveMaker會破壞它們觸摸的每個塊,它們應該每隔幾秒移動一次方向以產生隨機的洞穴般的路徑,但是對於我的代碼,它們會像這個垃圾一樣出現:

Eeeewwww

我相信這是因為我寫的非常即興的代碼應該讓它改變方向:

class CaveMaker(object):
    def __init__(self):
        self.active=1
        self.x=randrange(1,640)
        self.y=randrange(1,480)
        #Choose a X speed and Y speed
        self.direction=(choice([20,-20,1,-1,15,0,-15]),choice([20,-20,1,-1,15,0,-15]))
        self.rect=pygame.Rect(self.x,self.y,75,75)
        #Set amount of time to move this direction
        self.timeout=choice([30,50,70,90,110])
        self.destroytime=randrange(200,360)
    def Update(self):
        if self.active==1:
            #Move in a certain direction?
            self.x+=self.direction[0]
            self.y+=self.direction[1]
            self.timeout-=1
            if self.timeout==0:
                #Change direction?
                self.direction=   (choice([20,-20,1,-1,15,0,-15]),choice([20,-20,1,-1,15,0,-15]))
                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)

那么如何告訴對象移動隨機方向?

這是我的完整代碼:

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)
        #Choose a X speed and Y speed
        self.direction=(choice([20,-20,1,-1,15,0,-15]),choice([20,-20,1,-1,15,0,-15]))
        self.rect=pygame.Rect(self.x,self.y,75,75)
        #Set amount of time to move this direction
        self.timeout=choice([30,50,70,90,110])
        self.destroytime=randrange(200,360)
    def Update(self):
        if self.active==1:
            #Move in a certain direction?
            self.x+=self.direction[0]
            self.y+=self.direction[1]
            self.timeout-=1
            if self.timeout==0:
                #Change direction?
                self.direction=(choice([20,-20,1,-1,15,0,-15]),choice([20,-20,1,-1,15,0,-15]))
                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 = 5
        self.move_speed = 2

    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
            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
px=0
py=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'
                while any(b.rect.collidepoint(px, py) for b in blocks):
                    px=randrange(1,630)
                    py=randrange(1,470)
                player=Player(px,py)
            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==KEYUP:
                if e.key==K_r:
                    blocks=[]
                    cavemakes=[]
                    gen=1
                    genx=0
                    geny=0
                    px=0
                    py=0
                    cavemakes.append(CaveMaker());cavemakes.append(CaveMaker());cavemakes.append(CaveMaker());cavemakes.append(CaveMaker());
            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()

一些偽/ C#代碼:

// lets say we have 4 directions
// we generate random number for it    

int randomDirection = Random.Next(0, 4);

// 0:MoveUp()
// 1:MoveDown()
// 2:MoveLeft()
// 3:MoveRight()

// then we check what random direction number we got 
// and execute specific method for it

switch(randomDirection)
{
    case 0:
    player.MoveUp();
    break;

    case 1:
    player.MoveDown();
    break;

    case 3:
    player.MoveDown();
    break;

    case 4:
    player.MoveDown();
    break;
}

我剛剛發現Python中沒有case / switch語句。 檢查此問題以了解如何更換它。

我不太明白你想要什么。 你想要一系列相連的隧道嗎? 你想要一組隨機的未連接清除圓圈嗎? 你想要清除通過隧道連接的圓圈嗎?

不過,這里有一些一般性的建議。

首先,您的代碼包含太多硬編碼數字。 您應該創建一個名為Board或類似的類,將所有數字保存為常量變量,然后使用這些數字:

class Board(object):
    def __init__(self, width, height, block_size):
        assert width % block_size == 0
        assert height % block_size == 0
        self.width = width
        self.height = height
        self.block_size = block_size
        self.w = width // self.block_size
        self.h = height // self.block_size

現在,一旦你有了上述內容,你可以這樣做:

x = random.randint(0, board.w - 1)
y = random.randint(0, board.h - 1)
xpos = x * board.block_size
ypos = y * board.block_size

我的建議是使用上面的代碼來選擇洞穴所在的位置,並在添加每個洞穴時繪制一個隧道來連接它。 不是繪制一堆隨機線,而是選擇隨機洞穴,然后用線連接洞穴。 讓您的代碼使用連接洞穴的直線,然后如果您不喜歡直線,請重新編寫代碼以繪制具有一些隨機性的線條。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM