Pygame:我如何生成随机出现和倒下的东西?

2024-09-29 18:43:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着建立一个游戏,比如,球随机落下,而在底部的男孩接球。我用随机的方式在上面做了一排球,但我不知道如何让它们随机出现,然后各自落下。在

棒球_游戏.py在

import sys
import pygame
from pygame.sprite import Group
from settings import Settings
from boy import Boy
from ball import Ball
import game_functions as gf


def run_game():
    # Initialize pygame, settings, and screen object.
    pygame.init()
    bg_settings = Settings()
    screen = pygame.display.set_mode(
            (bg_settings.screen_width, bg_settings.screen_height))
    pygame.display.set_caption("Catch the Baseball!")

    # Make a boy
    boy = Boy(bg_settings, screen)
    balls = Group()


    # Create the fleet of aliens.
    gf.create_fleet(bg_settings, screen, boy, balls)


    # Make a ball
    ball = Ball(bg_settings, screen)

    # Set the background color.
    bg_color = (217, 208, 187)

    # Start the main loop for the game.
    while True:
        gf.check_events(boy)
        boy.update()
        gf.update_balls(balls)
        gf.update_screen(bg_settings, screen, boy, balls)


run_game()

在球.py在

^{pr2}$

游戏_函数.py在

import sys
import pygame
from ball import Ball
from random import randint
random_number = randint(-15, 39)


def check_events(boy):
    """Respond to keypresses and mouse events."""
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
             sys.exit()
        elif event.type == pygame.KEYDOWN:
            check_keydown_events(event, boy)
        elif event.type == pygame.KEYUP:
            check_keyup_events(event, boy)


def check_keydown_events(event, boy):
    """Respond to keypresses."""
    if event.key == pygame.K_RIGHT:
        boy.moving_right = True
    elif event.key == pygame.K_LEFT:
        boy.moving_left = True
    elif event.key == pygame.K_q:
        sys.exit()

def check_keyup_events(event, boy):
    """Respond to key releases."""
    if event.key == pygame.K_RIGHT:
        boy.moving_right = False
    elif event.key == pygame.K_LEFT:
        boy.moving_left = False

def update_screen(bg_settings, screen, boy, balls):
    """Update images on the screen and flip to the new screen."""
    # Redraw the screen during each pass through the loop.
    screen.fill(bg_settings.bg_color)
    boy.blitme()
    balls.draw(screen)

    # Make the most recently drawn screen visible.
    pygame.display.flip()

def get_number_balls_x(bg_settings, ball_width):
    """Determine the number of aliens that fit in a row."""
    available_space_x = bg_settings.screen_width - 2 * ball_width
    number_balls_x = int(available_space_x / (2 * ball_width))
    return number_balls_x

def create_ball(bg_settings, screen, balls, ball_number):
    """Create a ball and place it in the row."""
    ball = Ball(bg_settings, screen)
    ball_width = ball.rect.width
    ball.x = ball_width + 2 * ball_width * ball_number
    ball.rect.x = ball.x
    balls.add(ball)

def create_fleet(bg_settings, screen, boy, balls):
    ball = Ball(bg_settings, screen)
    number_balls_x = get_number_balls_x(bg_settings, ball.rect.width)

    for ball_number in range(number_balls_x):
         create_ball(bg_settings, screen, balls, ball_number)

def update_balls(balls):
    """Update the positions of all balls in the fleet."""
     balls.update()

所以第一排球被随机地放在上面,但是我如何使它看起来不是一下子全部出现,而是分开落下呢?在


Tags: thefromimporteventnumbersettingsdefevents
3条回答

既然你提到你想让球单独落下,我们可以认为每个球有两种状态:“坠落”和“不坠落”。我们可以相应地调整update__init__函数,用于ball.py

class Ball(Sprite):
    def __init__(self, bg_settings, screen)
        # ... all your other properties
        self.is_falling = False # the ball is not falling when first created

    # ...

    def update(self):
        if self.is_falling:
            self.y += self.bg_settings.ball_speed_factor
            self.rect.y = self.y

现在我们只需要一些随机触发每个球下落属性的方法。游戏中_函数.py,你有一个更新球的方法。我们可以在那里添加一些函数,以随机决定是否要让一个球落下,以及要落下哪个球:

^{pr2}$

如果某个条件是True(在下面的例子中是if random.randrange(100) < 2:),您可以只向组添加新的Ball实例。如果应该有一个最大数量的球,添加and len(balls) < max_balls:。在

另外,别忘了当精灵离开屏幕时^{}。在

import random
import pygame
from pygame.sprite import Sprite


class Ball(Sprite):
    """A class to represent a single ball."""

    def __init__(self, bg_settings, screen):
        """Initalize the ball and set its starting position."""
        super(Ball, self).__init__()
        self.screen = screen
        self.bg_settings = bg_settings
        self.image = pygame.Surface((30, 30))
        self.image.fill((100, 200, 0))
        self.rect = self.image.get_rect()
        # Start each new ball.
        self.rect.x = random.randint(-10, self.bg_settings.screen_width)
        self.rect.y = random.randint(-100, -40)
        # Store the ball's exact position.
        self.y = float(self.rect.y)

    def update(self):
        """Move the ball down."""
        self.y += 1
        self.rect.y = self.y

        if self.rect.top > self.bg_settings.screen_height:
            self.kill()


class Settings:
    screen_width = 640
    screen_height = 480
    bg_color = pygame.Color('gray12')


def run_game():
    pygame.init()
    clock = pygame.time.Clock()
    bg_settings = Settings()
    screen = pygame.display.set_mode(
        (bg_settings.screen_width, bg_settings.screen_height))
    balls = pygame.sprite.Group()

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return

        balls.update()
        if random.randrange(100) < 2:
            balls.add(Ball(bg_settings, screen))

        screen.fill(bg_settings.bg_color)
        balls.draw(screen)

        pygame.display.flip()
        clock.tick(60)


run_game()

生成一个名为RNG的变量,并将其设置为在-50和{}之间的任意范围内生成随机数。然后您可以创建一个名为RNG_CASES[]的数组,并在您为RNG设置的范围内给它们任意的常量值。最后,制作一个条件结构:

if(RNG in RNG_CASES[]): 
    fall();
else: 
    pass; #(pass not needed, only for pseudocode).

相关问题 更多 >

    热门问题