pygame:比赛开始时球的随机方向

时间:2017-06-15 00:16:17

标签: python algorithm random pygame

我在做Pong游戏。然而,而不是2个玩家,我正在做4个(屏幕两侧各一个)。我需要让球随机“选择”它必须走的方向。

import pygame
import random

class Ball(object):
    @classmethod
    def init(cls, SCREEN_WIDTH, SCREEN_HEIGHT):
        cls.radius = 20
        cls.centerx = SCREEN_WIDTH*0.5
        cls.centery = SCREEN_HEIGHT*0.5

        cls.rect = pygame.Rect(cls.centerx - cls.radius,
                               cls.centery - cls.radius,
                               cls.radius * 2,
                               cls.radius * 2)

    # x , y
    cls.direction = [random.choice([1, -1]), random.choice([1, -1])] 
    cls.speed = [5, 8] # x, y

    # left, right, top, bottom
    cls.hit_edge = [False, False, False, False] 

    @classmethod
    def update(cls, player1, player2, player3, player4, SCREEN_WIDTH,
            SCREEN_HEIGHT):
        cls.centerx += cls.direction[0] * cls.speed[0]
        cls.centery += cls.direction[1] * cls.speed[1]

        cls.rect.center = (cls.centerx, cls.centery)

        #detects if someone losses
        if cls.rect.left <= 0:
            cls.hit_edge[0] = True
        elif cls.rect.right >= SCREEN_WIDTH-1:
            cls.hit_edge[1] = True
        elif cls.rect.top <= 0:
            cls.hit_edge[2] = True
        elif cls.rect.bottom >= SCREEN_HEIGHT-1:
            cls.hit_edge[3] = True

        #detects collision between players & the ball
        if cls.rect.colliderect(player1.rect):
            cls.direction[0] = 1
            cls.up_speed()
        elif cls.rect.colliderect(player2.rect):
            cls.direction[0] = -1
            cls.up_speed()
        elif cls.rect.colliderect(player3.rect):
            cls.direction[1] = 1
            cls.up_speed()
        elif cls.rect.colliderect(player4.rect):
            cls.direction[1] = -1
            cls.up_speed()

    @classmethod
    def up_speed(cls):
        cls.speed[0] += random.uniform(0, 0.25)
        cls.speed[1] += random.uniform(0, 0.25)

    @classmethod
        def render(cls, SCREEN, color):
        pygame.draw.circle(SCREEN, color, cls.rect.center, cls.radius, 0)

要考虑到:我有想法在每个random.choice()中添加一个“0”,虽然如果我这样做只在开始时起作用,那么它将无法在轴上移动“0”。另外我在X和Y中有两种速度,可以通过在random.choice()中放置一个“0.1”来解决,但是当游戏开始时球会变得很慢。正如你所做的那样,球会以随机方向开始(考虑到所有球员在开始时球的速度必须相同。如果球在开始时向左移动,之后(在另一个球中)游戏)当它开始但球上升必须以相同的速度运行)

2 个答案:

答案 0 :(得分:2)

这可能有些过于复杂,但如果你知道球的整体速度,你可以使用这样的东西:

  1. 生成0-1
  2. 之间的随机数
  3. angle = 360 *随机数
  4. xSpeed = startSpeed * sin(angle
  5. ySpeed = startSpeed * cos(angle
  6. 这意味着你的球将始终以相同的速度行进。唯一随机的是它传播的方向。

答案 1 :(得分:0)

我建议使用矢量。对于速度,您可以选择任意的起始速度,如(8,0),然后将矢量旋转一个随机角度。

position += velocity

更新职位:

import sys
import math
from random import randrange
import pygame as pg


class Ball(pg.sprite.Sprite):

    def __init__(self, pos, *groups):
        super().__init__(groups)
        self.image = pg.Surface((30, 30), pg.SRCALPHA)
        col = randrange(256), randrange(256), randrange(256)
        pg.draw.circle(self.image, col, (15, 15), 15)
        self.rect = self.image.get_rect(center=pos)
        self.vel = pg.math.Vector2(8, 0).rotate(randrange(360))
        self.pos = pg.math.Vector2(pos)

    def update(self):
        self.pos += self.vel
        self.rect.center = self.pos
        if self.rect.left < 0 or self.rect.right > 640:
            self.vel.x *= -1
        if self.rect.top < 0 or self.rect.bottom > 480:
            self.vel.y *= -1


def main():
    screen = pg.display.set_mode((640, 480))
    clock = pg.time.Clock()
    sprite_group = pg.sprite.Group()
    ball = Ball((320, 240), sprite_group)

    done = False

    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            elif event.type == pg.MOUSEBUTTONDOWN:
                sprite_group.add(Ball((320, 240)))

        sprite_group.update()
        screen.fill((30, 30, 30))
        sprite_group.draw(screen)

        pg.display.flip()
        clock.tick(30)


if __name__ == '__main__':
    pg.init()
    main()
    pg.quit()
    sys.exit()

这是一个用随机颜色和速度生成球的示例程序。

sudo hciconfig hci0 up
sudo hcitool lescan
gatttool -b [bluetooth_adr] --interactive    # which was successful
connect