问题描述
我正在制作一个游戏,其中忍者必须躲避面前的障碍物,计算机使用 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)