微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python中的while循环和随机数问题

如何解决python中的while循环和随机数问题

我正在制作一个游戏,其中忍者必须躲避面前的障碍物,计算机使用 random.randint() 方法中的 choose() 方法随机选择障碍物障碍类。问题在于,choose() 方法在主循环的每次迭代中都会选择一个随机数。我希望如果障碍物的 x 位置为 0 那么它应该选择另一个随机数。

记住我是初学者

这是我的代码

import pygame,time,random #import

pygame.init() #pygame initialization

screen = pygame.display.set_mode((0,0))
pygame.quit()
pygame.init()

clock = pygame.time.Clock()

canvas = pygame.display.set_mode((1000,780)) #creating screen
caption = pygame.display.set_caption("Ninja Run") #creating caption

iconImage = pygame.image.load("C:/Garv/python/pygame/Ninja Game/Ninja_logo.png")
icon = pygame.display.set_icon(iconImage) #drawing icon image

land = pygame.image.load("C:/Garv/python/pygame/Ninja Game/land.jfif") #land image
sky = pygame.image.load("C:/Garv/python/pygame/Ninja Game/sky.jfif") # sky image

x = 50
y = 594

start = time.time()
ninjaRun = [pygame.image.load("C:/Garv/python/pygame/Ninja Game/ninja running 1.jpg"),pygame.image.load("C:/Garv/python/pygame/Ninja Game/ninja running 2.jpg")] #ninja images
ninjaimage = ninjaRun[0]
ninjaState = "Run"

ninjaStars = [pygame.image.load("C:/Garv/python/pygame/Ninja Game/ninja star 2.jfif"),pygame.image.load("C:/Garv/python/pygame/Ninja Game/ninja star.jfif")]
tyre = pygame.image.load("C:/Garv/python/pygame/Ninja Game/tyre.jfif")
rock = pygame.image.load("C:/Garv/python/pygame/Ninja Game/rock.jfif")

rockX = 1000
rockY = 605

starX1 = 1050
starY1 = 580

starX2 = 1000
starY2 = 650

tyreX = 550
tyreY = 500

class obstacles:
    def __init__(self,stars,tyre,rock,canvas,rockX,rockY,starX1,starX2,starY1,starY2,tyreX,tyreY):
        self.stars = stars
        self.tyre = tyre
        self.rock = rock
        self.canvas = canvas
        self.rockX = rockX
        self.rockY = rockY
        self.starX1 = starX1
        self.starX2 = starX2
        self.starY1 = starY1
        self.starY2 = starY2
        self.tyreX = tyreX
        self.tyreY = tyreY
        # self.rand = rand
    def choose(self):
        self.rand = random.randint(1,3)
        if self.rand == 1:
            self.rockImage()
        if self.rand == 2:
            self.starsImage()
        if self.rand == 3:
            self.tyreImage()
    
    def rockImage(self):
        self.canvas.blit(self.rock,(self.rockX,self.rockY))
        self.rockX -= 1
        if self.rockX == 0:
            self.choose()
        
    def starsImage(self):
        self.canvas.blit(self.stars[0],(self.starX1,self.starY1))
        self.canvas.blit(self.stars[1],(self.starX2,self.starY2))
        self.starX1 -= 1
        self.starX2 -= 1
        if self.starX1 == 0 and self.starX2 == 0:
            self.choose()
    def tyreImage(self):
        self.canvas.blit(self.tyre,(self.tyreX,self.tyreY))
        self.tyreX -= 1
        if self.tyreX == 0:
            self.choose()
        

tim = 10
class Ninja:
    def __init__(self,start,run,image,x,y,time): #Initializing of variables
        self.canvas = canvas
        self.start = start
        self.run = run
        self.image = image
        self.x = x
        self.y = y
        self.time = time
    def ninja(self): #ninja movement method
        self.image = ninjaRun[0]
        self.sec = int((time.time()-self.start)*self.time)
        if self.sec % 2 != 0:
            self.image = ninjaRun[0]
        elif self.sec % 2 == 0:
            self.image = ninjaRun[1]
            
        self.canvas.blit(self.image,(self.x,self.y)) #ninja draw
        
        
player = Ninja(canvas,ninjaRun,ninjaRun[0],tim) #calling Ninja class
obstacle = obstacles(ninjaStars,tyreY)#obstacle class

cnt = 0

startTime = time.time()

count = 1
        
while True: #main loop
    if player.y == y:
        ninjaState = "Run"
    elif player.y != y:
        ninjaState = "Jump"
    # print(player.time)
    for event in pygame.event.get(): #event handler
        if event.type == pygame.QUIT: #quit handler
            pygame.quit()
            import sys
            sys.exit()
        if event.type == pygame.KEYDOWN: #keydown
            if event.key == pygame.K_SPACE:                 
                        
                count += 1
                if ninjaState == "Jump":
                    pass
                elif ninjaState == "Run":
                    player.y -= 300
        if event.type == pygame.KEYUP: #keyup
            if event.key == pygame.K_SPACE:
                spaceEnd = pygame.time.get_ticks()/1000
                player.y += 300
    canvas.blit(sky,(0,0))#sky drawing
    canvas.blit(land,718))#land drawing
    player.ninja() #ninja drawing
    obstacle.choose()
    
    pygame.display.update() #display update
    clock.tick(100)

解决方法

在构建物体时选择一个随机数,如果障碍物的x位置为0,则更改数字:

class obstacles:
    def __init__(self,stars,tyre,rock,canvas,rockX,rockY,starX1,starX2,starY1,starY2,tyreX,tyreY):
        # [...]

        self.new_rand()

    def choose(self):
        if self.rockX <= 0:
            self.new_rand()

    def new_rand(self):
        self.rand = random.randint(1,3)
        if self.rand == 1:
            self.rockImage()
        if self.rand == 2:
            self.starsImage()
        if self.rand == 3:
            self.tyreImage()
,

这是我后来得到的答案:

import pygame,time,random #import


pygame.init() #pygame initialization

screen = pygame.display.set_mode((0,0))
pygame.quit()
pygame.init()

clock = pygame.time.Clock()

canvas = pygame.display.set_mode((1000,780)) #creating screen
caption = pygame.display.set_caption("Ninja Run") #creating caption

iconImage = pygame.image.load("C:/Garv/python/pygame/Ninja Game/Ninja_logo.png")
icon = pygame.display.set_icon(iconImage) #drawing icon image

land = pygame.image.load("C:/Garv/python/pygame/Ninja Game/land.jfif") #land image
sky = pygame.image.load("C:/Garv/python/pygame/Ninja Game/sky.jfif") # sky image

x = 50
y = 594

start = time.time()
ninjaRun = [pygame.image.load("C:/Garv/python/pygame/Ninja Game/ninja running 1.jpg"),pygame.image.load("C:/Garv/python/pygame/Ninja Game/ninja running 2.jpg")] #ninja images
ninjaImage = ninjaRun[0]
ninjaState = "Run"

ninjaStars = [pygame.image.load("C:/Garv/python/pygame/Ninja Game/ninja star 2.png"),pygame.image.load("C:/Garv/python/pygame/Ninja Game/ninja star.png")]
tyre = pygame.image.load("C:/Garv/python/pygame/Ninja Game/tyre.png")
rock = pygame.image.load("C:/Garv/python/pygame/Ninja Game/stone.png")
acid = pygame.image.load("C:/Garv/python/pygame/Ninja Game/acid.png")

rockX = 1000
rockY = 625

starX1 = 1050
starY1 = 580

starX2 = 1000
starY2 = 650

tyreX = 1000
tyreY = 590

acidX = 1000
acidY = 718

class obstacles: # obstacle class
    def __init__(self,tyreY,acid,acidX,acidY):
        self.stars = stars
        self.tyre = tyre
        self.rock = rock
        self.canvas = canvas
        self.rockX = rockX
        self.rockY = rockY
        self.starX1 = starX1
        self.starX2 = starX2
        self.starY1 = starY1
        self.starY2 = starY2
        self.tyreX = tyreX
        self.tyreY = tyreY
        self.acid = acid
        self.acidX = acidX
        self.acidY = acidY
    def choose(self):
        self.rand = random.randint(1,4)
    def rockImage(self): # drawing rock
        self.canvas.blit(self.rock,(self.rockX,self.rockY))
        if self.rockX == -161:
            self.choose()
            self.rockX = 1000
        elif self.rockX != -161:
            self.rockX -= 1
        
    def starsImage(self): # drawing ninjaStar
        self.canvas.blit(self.stars[0],(self.starX1,self.starY1))
        self.canvas.blit(self.stars[1],(self.starX2,self.starY2))
        if self.starX1 == -50 and self.starX2 == -100:
            self.choose()
            self.starX1 = 1050
            self.starX2 = 1000
        elif self.starX1 != -50 and self.starX2 != -100:
            self.starX1 -= 1
            self.starX2 -= 1
    def tyreImage(self): # drawing tyre
        self.canvas.blit(self.tyre,(self.tyreX,self.tyreY))
        if self.tyreX == -120:
            self.choose()
            self.tyreX = 1000
        elif self.tyreX != -120:
            self.tyreX -= 1
    def acidImage(self):# drawing acid
        self.canvas.blit(self.acid,(self.acidX,self.acidY))
        if self.acidX == -144:
            self.choose()
            self.acidX = 1000
        elif self.acidX != -144:
            self.acidX -= 1

tim = 10
class Ninja: # ninja class
    def __init__(self,start,run,image,x,y,ninjaState): #Initializing of variables
        self.canvas = canvas
        self.start = start
        self.run = run
        self.image = image
        self.x = x
        self.y = y
        self.time = time
        self.ninjaState = ninjaState
    def ninja(self): #ninja movement method
        self.image = ninjaRun[0]
        self.sec = int((time.time()-self.start)*self.time)
        if self.sec % 2 != 0:
            self.image = ninjaRun[0]
            if ninjaState == "Jump":
                self.image = pygame.image.load("C:/Garv/python/pygame/Ninja Game/ninja jumping.jpg")
            elif ninjaState == "Run":
                self.image = ninjaRun[0]
        elif self.sec % 2 == 0:
            self.image = ninjaRun[1]
            if ninjaState == "Jump":    
                self.image = pygame.image.load("C:/Garv/python/pygame/Ninja Game/ninja jumping.jpg")
            elif ninjaState == "Run":
                self.image = ninjaRun[1]
            
        self.canvas.blit(self.image,(self.x,self.y)) #ninja draw
        
player = Ninja(canvas,ninjaRun,ninjaRun[0],tim,ninjaState) #calling Ninja class
obstacle = obstacles(ninjaStars,acidY)#calling obstacle class

obstacle.choose()

def decide(): # calling draw functions
    if obstacle.rand == 1:
        obstacle.rockImage()
    elif obstacle.rand == 2:
        obstacle.starsImage()
    elif obstacle.rand == 3:
        obstacle.tyreImage()
    else:
        obstacle.acidImage()
while True: #main loop
    if player.y == y:
        ninjaState = "Run"
    elif player.y < y:
        ninjaState = "Jump"
    for event in pygame.event.get(): #event handler
        if event.type == pygame.QUIT: #quit handler
            pygame.quit()
            import sys
            sys.exit()
        if event.type == pygame.KEYDOWN: #keydown
            if event.key == pygame.K_SPACE:
                ninjaDirect = "up"
                player.y -= 100
                if player.y < 100:
                    player.y += 100
                    ninjaDirect = "down"
        if event.type == pygame.KEYUP: #keyup
            if event.key == pygame.K_SPACE:
                player.y += 100
    canvas.blit(sky,(0,0))#sky drawing
    canvas.blit(land,718))#land drawing
    decide() # obstacle drawing
    player.ninja() #ninja drawing
    pygame.display.update() #display update
    clock.tick(60)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。