Python Pygame随机移动敌人

Python Pygame随机移动敌人,python,pygame,Python,Pygame,我试着把石头放在随机的位置,我试着: self.x+=random.randint(-5,5) 但这并不好,因为主循环的每一次迭代,都会重新计算随机数,这会产生一种闪烁效果,除了可怕之外,还会阻挡岩石的直角。我怎样才能修好它? 我只是想,从屏幕的高中心开始,岩石以一个随机的角度向下移动,然后我会实现一些反弹,然后创建我的视频游戏,但我陷入了这一点。 这是我第一次在这个论坛上写作,所以如果我做错了什么,我会提前道歉 这是我的代码: import pygame import random imp

我试着把石头放在随机的位置,我试着: self.x+=random.randint(-5,5) 但这并不好,因为主循环的每一次迭代,都会重新计算随机数,这会产生一种闪烁效果,除了可怕之外,还会阻挡岩石的直角。我怎样才能修好它? 我只是想,从屏幕的高中心开始,岩石以一个随机的角度向下移动,然后我会实现一些反弹,然后创建我的视频游戏,但我陷入了这一点。 这是我第一次在这个论坛上写作,所以如果我做错了什么,我会提前道歉

这是我的代码:

import pygame
import random
import time
import math

pygame.init()

display_width = 600
display_height = 500
screen = pygame.display.set_mode( (display_width, display_height) )
fps = 60
font_ubuntumono = pygame.font.SysFont('ubuntumono', 50, True)
rock = pygame.image.load('cave-painting.png').convert_alpha()
rock_width = rock.get_width()
rock_height = rock.get_height()
player = pygame.image.load('wizard.png').convert_alpha()

def initialize():
    global speed_rock, rocks, playerX, playerY
    speed_rock = 2
    playerX = display_width//2
    playerY = 400
    rocks = []
    rocks.append( RockClass() )

class RockClass:
    def __init__(self):
        self.x = display_width//2
        self.y = 0

    def continueDraw(self, a, b):
        self.x += **???**
        self.y += speed_rock
        screen.blit( rock, (self.x, self.y) )

    def collision(self, player, playerX, playerY):
        tolerability = 5
        right_player = playerX + player.get_width() - tolerability
        left_player = playerX + tolerability
        up_player = playerY + tolerability
        right_rock = self.x + rock_width
        left_rock = self.x
        down_rock = self.y + rock_height

        #check collision
        if down_rock > up_player and 
           ( ( left_player < left_rock and left_rock < right_player) or 
               ( right_player > right_rock and right_rock > left_player) ):
            #delete the rock from the screen
            self.x = 5000

initialize()

def update():
    pygame.display.update()
    pygame.time.Clock().tick(fps)

def drawThings():
    #draw background
    screen.fill ( (255, 255, 255) )

    #draw rocks
    for rock2 in rocks:
        rock2.continueDraw(210, 210)

    #draw the player
    screen.blit( player, (playerX, playerY) )

running = True
#main loop
while running:

    #event loop
    for event in pygame.event.get():

        #move player
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                playerX -= 30
            if event.key == pygame.K_RIGHT:
                playerX += 30

        #quit
        if event.type == pygame.QUIT:
            running = False

    #to generate infinite rocks
    if rocks[-1].y > 10:
        rocks.append( RockClass() )

    #check the player-rock collision
    for rock2 in rocks:
        rock2.collision(player, playerX, playerY)

    #bordo alto
    if playerX <= 0:
        playerX = 0
    if playerX >= 600:
        playerX = 600

    #update screen
    drawThings()
    update()
导入pygame
随机输入
导入时间
输入数学
pygame.init()
显示宽度=600
显示高度=500
screen=pygame.display.set_模式((显示宽度、显示高度))
fps=60
font\u ubuntumono=pygame.font.SysFont('ubuntumono',50,True)
rock=pygame.image.load('cave-painting.png')。convert_alpha()
rock_width=rock.get_width()
岩石高度=岩石。获取岩石高度()
player=pygame.image.load('wizard.png')。convert_alpha()
def初始化():
全球速度(摇滚乐,摇滚乐,playerX,playerY)
速度=2
playerX=显示宽度//2
playerY=400
岩石=[]
附加(RockClass())
岩石等级:
定义初始化(自):
self.x=显示宽度//2
self.y=0
def continueDraw(自身、a、b):
self.x+=****
self.y+=speed\u rock
屏幕光点(岩石,(self.x,self.y))
def碰撞(自我、玩家、玩家、玩家):
耐受性=5
右\u player=playerX+player.get\u width()-容差
左玩家=玩家X+容忍度
up\u player=游戏性+耐受性
右侧岩石=自身x+岩石宽度
左_rock=self.x
向下岩石=自身y+岩石高度
#检查碰撞
如果向下摇滚>向上摇滚
((左摇滚<左摇滚>左摇滚<右摇滚)或
(右摇滚>右摇滚>左摇滚)):
#从屏幕上删除岩石
self.x=5000
初始化()
def update():
pygame.display.update()
pygame.time.Clock().tick(fps)
def draw things():
#画背景
screen.fill((255、255、255))
#拉石头
对于岩石中的岩石2:
岩石2.连续拉锯(210210)
#吸引玩家
blit(player,(playerX,playerY))
运行=真
#主回路
运行时:
#事件循环
对于pygame.event.get()中的事件:
#移动播放器
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_左:
playerX-=30
如果event.key==pygame.K_RIGHT:
playerX+=30
#退出
如果event.type==pygame.QUIT:
运行=错误
#产生无限的岩石
如果岩石[-1].y>10:
附加(RockClass())
#检查玩家的岩石碰撞
对于岩石中的岩石2:
岩石2.碰撞(玩家、玩家、玩家)
#博尔多奥托酒店
如果playerX=600:
playerX=600
#更新屏幕
drawThings()
更新()

我建议在
岩石的构造函数中生成x轴的随机速度:

岩石类:
定义初始化(自):
self.x=显示宽度//2
self.y=0
self.speed_x=随机均匀(-2,2)
self.speed\ux
添加到
continueDraw
中的
self.x

岩石类:
# [...]
def continueDraw(自身、a、b):
self.x+=self.speed\u x
self.y+=speed\u rock
屏幕blit(rock_img,(self.x,self.y))

我建议在碰撞检测中分别使用:

岩石类:
# [...]
def碰撞(自我、玩家、玩家、玩家):
耐受性=5
player_rect=pygame.rect(playerX+容忍度,playerY,
player.get_width()-2*公差,player.get_height())
rock_rect=pygame.rect(self.x,self.y,rock_宽度,rock_高度)
#检查碰撞
如果玩家直接碰撞(摇滚):
#从屏幕上删除岩石
self.x=5000

我建议在
岩石的构造函数中生成x轴的随机速度:

岩石类:
定义初始化(自):
self.x=显示宽度//2
self.y=0
self.speed_x=随机均匀(-2,2)
self.speed\ux
添加到
continueDraw
中的
self.x

岩石类:
# [...]
def continueDraw(自身、a、b):
self.x+=self.speed\u x
self.y+=speed\u rock
屏幕blit(rock_img,(self.x,self.y))

我建议在碰撞检测中分别使用:

岩石类:
# [...]
def碰撞(自我、玩家、玩家、玩家):
耐受性=5
player_rect=pygame.rect(playerX+容忍度,playerY,
player.get_width()-2*公差,player.get_height())
rock_rect=pygame.rect(self.x,self.y,rock_宽度,rock_高度)
#检查碰撞
如果玩家直接碰撞(摇滚):
#从屏幕上删除岩石
self.x=5000

在初始化每块岩石时,你需要创建一个随机角度,然后在每个刻度上沿该方向移动岩石,并说明从侧面反弹的原因。谢谢回复,我不知道如何沿角度方向移动岩石。你能发布原始代码吗?此代码不可执行。您认为原始代码是什么意思?我试着复制各种游戏,现在我试着自己做,所以这是原始代码,我没有复制它。编辑:可能您无法运行它,因为您没有资源(图像)。我发布了enitre代码,idk://C-Gian否,
rocks
未在全局命名空间中定义,因为
global rocks