문제

I would like help on stopping a python program after a certain time, as it says on the title. My program is a little fun program that i was trying. The code:

import pygame, sys, random, time, os

skier_images = ["puffle_down.png", "puffle_down.png", "puffle_down.png",
                 "puffle_down.png", "puffle_down.png"]

class SkierClass(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("puffle_down.png")
        self.rect = self.image.get_rect()
        self.rect.center = [320, 100]
        self.angle = 0

    def turn(self, direction): 
        self.angle = self.angle + direction
        if self.angle < -2:  self.angle = -2
        if self.angle >  2:  self.angle =  2 
        center = self.rect.center
        self.image = pygame.image.load(skier_images[self.angle])
        self.rect = self.image.get_rect()
        self.rect.center = center
        speed = [self.angle, 6 - abs(self.angle) * 2]
        return speed

    def move(self, speed):
        self.rect.centerx = self.rect.centerx + speed[0]
        if self.rect.centerx < 20:  self.rect.centerx = 100
        if self.rect.centerx > 620: self.rect.centerx = 620 

class ObstacleClass(pygame.sprite.Sprite):
    def __init__(self, image_file, location, type):
        pygame.sprite.Sprite.__init__(self) 
        self.image_file = image_file        
        self.image = pygame.image.load(image_file)
        self.location = location
        self.rect = self.image.get_rect()
        self.rect.center = location
        self.type = type
        self.passed = False

    def scroll(self, terrainPos):
        self.rect.centery = self.location[1] - terrainPos

def create_map(start, end):
    obstacles = pygame.sprite.Group()
    locations = []
    gates = pygame.sprite.Group()
    for i in range(10):                
        row = random.randint(start, end)
        col = random.randint(0, 9)
        location  = [col * 64 + 20, row * 64 + 20] 
        if not (location in locations):        
            locations.append(location)          
            type = random.choice(["tree", "flag"])
            if type == "tree": img = "puffle_bomb.png"
            elif type == "flag":  img = "puffle-o.png"
            obstacle = ObstacleClass(img, location, type)
            obstacles.add(obstacle)
    return obstacles


def animate():
    screen.fill([255, 255, 255])
    pygame.display.update(obstacles.draw(screen)) 
    screen.blit(skier.image, skier.rect)
    screen.blit(score_text, [10, 10])
    pygame.display.flip()    

def updateObstacleGroup(map0, map1):
    obstacles = pygame.sprite.Group()
    for ob in map0:  obstacles.add(ob)
    for ob in map1:  obstacles.add(ob)
    return obstacles


pygame.init()
screen = pygame.display.set_mode([640,640])
clock = pygame.time.Clock()
skier = SkierClass()
speed = [0, 6]
map_position = 0
points = 0
map0 = create_map(20, 29)
map1 = create_map(10, 19)
activeMap = 0


obstacles = updateObstacleGroup(map0, map1)


font = pygame.font.Font(None, 50)


while True:
    clock.tick(30)
    for event in pygame.event.get():
        if event.type == pygame.QUIT: os._exit(0)
        if event.type == pygame.KEYDOWN:          
            if event.key == pygame.K_LEFT:        
                speed = skier.turn(-1)
            elif event.key == pygame.K_RIGHT:     
                speed = skier.turn(1)
    skier.move(speed)
    map_position += speed[1]                      

    if map_position >=640 and activeMap == 0:
        activeMap = 1
        map0 = create_map(20, 29)
        obstacles = updateObstacleGroup(map0, map1)
    if map_position >=1280 and activeMap == 1:                        
        activeMap = 0
        for ob in map0:
            ob.location[1] = ob.location[1] - 1280   
        map_position = map_position - 1280           
        map1 = create_map(10, 19)
        obstacles = updateObstacleGroup(map0, map1)

    for obstacle in obstacles:
        obstacle.scroll(map_position)

    hit =  pygame.sprite.spritecollide(skier, obstacles, False)
    if hit:
        if hit[0].type == "tree" and not hit[0].passed:  
            points = points - 100
            skier.image = pygame.image.load("puffle_crash.jpg")  
            animate()  
            pygame.time.delay(1000)
            skier.image = pygame.image.load("puffle_down.png")  
            skier.angle = 0
            speed = [0, 6]
            hit[0].passed = True
        elif hit[0].type == "flag" and not hit[0].passed:   
            points += 100
            obstacles.remove(hit[0])                    

    score_text = font.render("Score: " +str(points), 1, (0, 0, 0))
    animate()

I am not sure what module to use, and how. Would I use the Time module, and how? So basically, that's it.

Note: Just saying, I know there are other questions like this, but I am a new programmer, so i would like a more basic answer.

도움이 되었습니까?

해결책

Use the pygame.time module. Save the time at the start of the game (or whenever). Then, constantly check the current time during the main while loop. If the difference between the two times is greater then some threshold, terminate the program.

Here is a shortened segment of your code to serve as an example -- the program should terminate after 60 seconds:

import sys
import pygame

pygame.init()

def end_game():
    pygame.quit()
    sys.exit(0)    # Use sys.exit, not os._exit

screen = pygame.display.set_mode([640,640])
clock = pygame.time.Clock()

start_time = pygame.time.get_ticks()   # Time in milliseconds
stop_after = 60 * 1000                 # Stop after 60 seconds of gameplay    

while True:
    clock.tick(30)
    for event in pygame.event.get():
        if event.type == pygame.QUIT: 
            end_game()

    current_time = pygame.time.get_ticks()
    if (current_time - start_time) >= stop_after:
        end_game()
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top