2014-05-10 3 views
1

우주 침략자와 비슷한 작은 파이 게임을 만들려고 노력하고 있습니다. 무작위로 적을 생성하려고하는데, 내가 알고있는 것은 3 명의 적을 생성하고 수동으로 스크린을 시작해야하는 곳으로 전달합니다. 그러나 이것은 그것이 살인을 얻으면 그것이 반복해서 반응 할 것을 원하지 않는다는 것을 의미합니다. 여기 내 코드입니다 : 난 그냥 사방 쉽게 외계인에 대한 임의의 장소를 얻기 위해, 또한 내가 무작위라는 새 모듈을 가져와야 변경 주석하기로 결정했습니다 그래서 아래무작위로 적을 생성 파이 게임

#!/usr/bin/env python 

from helpers import * 


class Space1(pygame.sprite.Sprite): 
    def __init__(self, i):      
     pygame.sprite.Sprite.__init__(self) 
     self.image, self.rect = load_image("space.png", 10) 
     self.dx = -5 
     self.reset(i) 

    def update(self, i): 
     self.rect.top += self.dx 
     if i == 1: 
      if self.rect.top <= -600: 
       self.__init__(i) 
     else: 
      if self.rect.top <= -1200: 
       self.__init__(i) 

    def reset(self, i): 
     if i == 1: 
      self.rect.top = 1 
     else: 
      self.rect.top = 300 

class Space2(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image, self.rect = load_image("space.png", 10) 
     self.dx = -5 
     self.reset() 

    def update(self): 
     self.rect.top += self.dx 
     if self.rect.top <= -1200: 
      self.__init__() 

    def reset(self): 
     self.rect.top = 600 

class Player(pygame.sprite.Sprite): 

    def __init__(self): 

     pygame.sprite.Sprite.__init__(self) 

     self.image, self.rect = load_image('ship.gif', -1) 
     self.x_dist = 5 
     self.y_dist = 5 
     self.lasertimer = 0 
     self.lasermax = 5 
     self.rect.centery = 400 
     self.rect.centerx = 400 

    def update(self): 
     key = pygame.key.get_pressed() 

     # Movement 
     if key[K_UP]: 
      self.rect.centery += -3 
     if key[K_DOWN]: 
      self.rect.centery += 3 
     if key[K_RIGHT]: 
      self.rect.centerx += 3 
     if key[K_LEFT]: 
      self.rect.centerx += -3 

     # Lasers 
     if key[K_SPACE]: 
      self.lasertimer = self.lasertimer + 1 
      if self.lasertimer == self.lasermax: 
       laserSprites.add(Laser(self.rect.midtop)) 
       self.lasertimer = 0 

     # Restrictions 
     self.rect.bottom = min(self.rect.bottom, 600) 
     self.rect.top = max(self.rect.top, 0) 
     self.rect.right = min(self.rect.right, 800) 
     self.rect.left = max(self.rect.left, 0) 

class Laser(pygame.sprite.Sprite): 
    def __init__(self, pos): 
     pygame.sprite.Sprite.__init__(self) 
     self.image, self.rect = load_image("laser.png", -1) 
     self.rect.center = pos 

    def update(self): 
     if self.rect.right > 800: 
      self.kill() 
     else: 
      self.rect.move_ip(0, -15) 

class Enemy(pygame.sprite.Sprite): 
    def __init__(self, centerx): 
     pygame.sprite.Sprite.__init__(self) 
     self.image, self.rect = load_image("alien.png", -1) 
     self.rect = self.image.get_rect() 
     self.dy = 8 
     self.reset() 

    def update(self): 
     self.rect.centerx += self.dx 
     self.rect.centery += self.dy 
     if self.rect.top > 600: 
      self.reset() 

     # Laser Collisions  
     if pygame.sprite.groupcollide(enemySprites, laserSprites, 1, 1): 
      explosionSprites.add(EnemyExplosion(self.rect.center)) 

     # Ship Collisions 
     if pygame.sprite.groupcollide(enemySprites, playerSprite, 1, 1): 
      explosionSprites.add(EnemyExplosion(self.rect.center)) 
      explosionSprites.add(PlayerExplosion(self.rect.center)) 

    def reset(self): 
     self.rect.bottom = 0 
     self.rect.centerx = random.randrange(0, 600) 
     self.dy = random.randrange(5, 10) 
     self.dx = random.randrange(-2, 2) 

class EnemyExplosion(pygame.sprite.Sprite): 
    def __init__(self, pos): 
     pygame.sprite.Sprite.__init__(self) 
     self.image, self.rect = load_image("enemyexplosion.png", -1) 
     self.rect.center = pos   
     self.counter = 0 
     self.maxcount = 10 

    def update(self): 
     self.counter = self.counter + 1 
     if self.counter == self.maxcount: 
      self.kill() 

class PlayerExplosion(pygame.sprite.Sprite): 
    def __init__(self, pos): 
     pygame.sprite.Sprite.__init__(self) 
     self.image, self.rect = load_image("enemyexplosion.png", -1) 
     self.rect.center = pos   
     self.counter = 0 
     self.maxcount = 10 

    def update(self): 
     self.counter = self.counter + 1 
     if self.counter == self.maxcount: 
      self.kill() 
      exit() 

def main():  
# Initialize Everything 

    pygame.init() 

    screen = pygame.display.set_mode((800, 600)) 

    pygame.display.set_caption('UoN Invaders') 

# Create The Backgound 

    background = pygame.Surface(screen.get_size()) 

    background = background.convert() 

    background.fill((000, 000, 000)) 

# Display The Background 

    screen.blit(background, (0, 0)) 

    pygame.display.flip() 

# Start Music 

    music = pygame.mixer.music.load ("data/spacequest.mp3") 
    pygame.mixer.music.play(-1) 



# Initialize Game Objects 
    global clock 

    clock = pygame.time.Clock() 

    i = 0 
    i += 1 

    space1 = Space1(i) 
    space2 = Space2() 
    global player 

    player = Player() 


# Render Objects 
    # Space 
    space1 = pygame.sprite.RenderPlain((space1)) 
    space2 = pygame.sprite.RenderPlain((space2)) 

    # Player 
    global playerSprite 
    playerSprite = pygame.sprite.RenderPlain((player)) 

    # Enemy 
    global enemySprites 
    enemySprites = pygame.sprite.RenderPlain(()) 
    enemySprites.add(Enemy(200)) 
    enemySprites.add(Enemy(300)) 
    enemySprites.add(Enemy(400))  

    # Projectiles  
    global laserSprites 
    laserSprites = pygame.sprite.RenderPlain(()) 

    # Collisions 
    global enemyExplosion 
    enemyExplosion = pygame.sprite.RenderPlain(()) 
    global playerExplosion 
    playerExplosion = pygame.sprite.RenderPlain(()) 
    global explosionSprites 
    explosionSprites = pygame.sprite.RenderPlain(()) 


# Main Loop 

    going = True 

    while going: 

     clock.tick(60) 



     # Input Events 

     for event in pygame.event.get(): 

      if event.type == QUIT: 

       going = False 

      elif event.type == KEYDOWN and event.key == K_ESCAPE: 

       going = False 

     # Update 
     space1.update(i) 
     space2.update() 
     player.update() 
     enemySprites.update() 
     laserSprites.update() 
     enemyExplosion.update() 
     playerExplosion.update() 
     explosionSprites.update() 



     screen.blit(background, (0, 0)) 


     # Draw 
     space1.draw(screen) 
     space2.draw(screen)   
     playerSprite.draw(screen) 
     enemySprites.draw(screen) 
     laserSprites.draw(screen) 
     enemyExplosion.draw(screen) 
     playerExplosion.draw(screen) 
     explosionSprites.draw(screen) 


     pygame.display.flip() 



    pygame.quit() 

if __name__ == '__main__': 

    main() 
+0

당신은 이런 식으로하는 방법을 찾아 봤어? – KodyVanRy

+0

네,하지만 논리가 확실하지 않습니다. 목록에있는 모든 적을 넣고 추가해야한다고 생각합니다.하지만 논리가 확실하지 않습니다. – Tuytuy

+0

네가 올바른 길을 가고있다. 전역 변수 (목록)를 추가 한 다음 목록의 길이를 테스트하십시오. 내가 답을 털어 놓을 지 말지, 내가 어떻게 할 것인지 보여주지. – KodyVanRy

답변

0

/적을 게임에 스폰합니다.

#!/usr/bin/env python 

import random #as explained above 
from helpers import * 

class Space1(pygame.sprite.Sprite): 
    def __init__(self, i):      
     pygame.sprite.Sprite.__init__(self) 
     self.image, self.rect = load_image("space.png", 10) 
     self.dx = -5 
     self.reset(i) 

    def update(self, i): 
     self.rect.top += self.dx 
     if i == 1: 
      if self.rect.top <= -600: 
       self.__init__(i) 
     else: 
      if self.rect.top <= -1200: 
       self.__init__(i) 

    def reset(self, i): 
     if i == 1: 
      self.rect.top = 1 
     else: 
      self.rect.top = 300 

class Space2(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image, self.rect = load_image("space.png", 10) 
     self.dx = -5 
     self.reset() 

    def update(self): 
     self.rect.top += self.dx 
     if self.rect.top <= -1200: 
      self.__init__() 

    def reset(self): 
     self.rect.top = 600 

class Player(pygame.sprite.Sprite): 

    def __init__(self): 

     pygame.sprite.Sprite.__init__(self) 

     self.image, self.rect = load_image('ship.gif', -1) 
     self.x_dist = 5 
     self.y_dist = 5 
     self.lasertimer = 0 
     self.lasermax = 5 
     self.rect.centery = 400 
     self.rect.centerx = 400 

    def update(self): 
     key = pygame.key.get_pressed() 

     # Movement 
     if key[K_UP]: 
      self.rect.centery += -3 
     if key[K_DOWN]: 
      self.rect.centery += 3 
     if key[K_RIGHT]: 
      self.rect.centerx += 3 
     if key[K_LEFT]: 
      self.rect.centerx += -3 

     # Lasers 
     if key[K_SPACE]: 
      self.lasertimer = self.lasertimer + 1 
      if self.lasertimer == self.lasermax: 
       laserSprites.add(Laser(self.rect.midtop)) 
       self.lasertimer = 0 

     # Restrictions 
     self.rect.bottom = min(self.rect.bottom, 600) 
     self.rect.top = max(self.rect.top, 0) 
     self.rect.right = min(self.rect.right, 800) 
     self.rect.left = max(self.rect.left, 0) 

class Laser(pygame.sprite.Sprite): 
    def __init__(self, pos): 
     pygame.sprite.Sprite.__init__(self) 
     self.image, self.rect = load_image("laser.png", -1) 
     self.rect.center = pos 

    def update(self): 
     if self.rect.right > 800: 
      self.kill() 
     else: 
      self.rect.move_ip(0, -15) 

class Enemy(pygame.sprite.Sprite): 
    def __init__(self, centerx): 
     pygame.sprite.Sprite.__init__(self) 
     self.image, self.rect = load_image("alien.png", -1) 
     self.rect = self.image.get_rect() 
     self.dy = 8 
     self.reset() 

    def update(self): 
     self.rect.centerx += self.dx 
     self.rect.centery += self.dy 
     if self.rect.top > 600: 
      self.reset() 

     # Laser Collisions  
     if pygame.sprite.groupcollide(enemySprites, laserSprites, 1, 1): 
      explosionSprites.add(EnemyExplosion(self.rect.center)) 
      ################################################### 
      ###---LOOK HERE - I've added two lines here ---### 
      ###---First you need to replace this sprite ---### 
      ###---before removing it, then you need to ---### 
      ###---remove this sprite from the group  ---### 
      ################################################### 
      enemySprites.add(Enemy(random.randint(1, 800)) ###--- add new sprite with random position between 1 and 800 
      self.remove() ###--- remove this sprite from the group 

     # Ship Collisions 
     if pygame.sprite.groupcollide(enemySprites, playerSprite, 1, 1): 
      explosionSprites.add(EnemyExplosion(self.rect.center)) 
      explosionSprites.add(PlayerExplosion(self.rect.center)) 

    def reset(self): 
     self.rect.bottom = 0 
     self.rect.centerx = random.randrange(0, 600) 
     self.dy = random.randrange(5, 10) 
     self.dx = random.randrange(-2, 2) 

class EnemyExplosion(pygame.sprite.Sprite): 
    def __init__(self, pos): 
     pygame.sprite.Sprite.__init__(self) 
     self.image, self.rect = load_image("enemyexplosion.png", -1) 
     self.rect.center = pos   
     self.counter = 0 
     self.maxcount = 10 

    def update(self): 
     self.counter = self.counter + 1 
     if self.counter == self.maxcount: 
      self.kill() 

class PlayerExplosion(pygame.sprite.Sprite): 
    def __init__(self, pos): 
     pygame.sprite.Sprite.__init__(self) 
     self.image, self.rect = load_image("enemyexplosion.png", -1) 
     self.rect.center = pos   
     self.counter = 0 
     self.maxcount = 10 

    def update(self): 
     self.counter = self.counter + 1 
     if self.counter == self.maxcount: 
      self.kill() 
      exit() 

def main():  
# Initialize Everything 

    pygame.init() 

    screen = pygame.display.set_mode((800, 600)) 

    pygame.display.set_caption('UoN Invaders') 

# Create The Backgound 

    background = pygame.Surface(screen.get_size()) 

    background = background.convert() 

    background.fill((000, 000, 000)) 

# Display The Background 

    screen.blit(background, (0, 0)) 

    pygame.display.flip() 

# Start Music 

    music = pygame.mixer.music.load ("data/spacequest.mp3") 
    pygame.mixer.music.play(-1) 



# Initialize Game Objects 
    global clock 

    clock = pygame.time.Clock() 

    i = 0 
    i += 1 

    space1 = Space1(i) 
    space2 = Space2() 
    global player 

    player = Player() 


# Render Objects 
    # Space 
    space1 = pygame.sprite.RenderPlain((space1)) 
    space2 = pygame.sprite.RenderPlain((space2)) 

    # Player 
    global playerSprite 
    playerSprite = pygame.sprite.RenderPlain((player)) 

    # Enemy 
    global enemySprites 
    enemySprites = pygame.sprite.RenderPlain(()) 
    ###---LOOK HERE I SWITCHED SOME THINGS ---### 
    ###---not that much. random.randint ---### 
    ###---just takes a sudo-random integer ---### 
    ###---which is why it's called rand-int---### 
    ###---  or random integer   ---### 
    enemySprites.add(Enemy(random.randint(1, 800))) 
    enemySprites.add(Enemy(random.randint(1, 800))) 
    enemySprites.add(Enemy(random.randint(1, 800)))  

    # Projectiles  
    global laserSprites 
    laserSprites = pygame.sprite.RenderPlain(()) 

    # Collisions 
    global enemyExplosion 
    enemyExplosion = pygame.sprite.RenderPlain(()) 
    global playerExplosion 
    playerExplosion = pygame.sprite.RenderPlain(()) 
    global explosionSprites 
    explosionSprites = pygame.sprite.RenderPlain(()) 


# Main Loop 

    going = True 

    while going: 

     clock.tick(60) 



     # Input Events 

     for event in pygame.event.get(): 

      if event.type == QUIT: 

       going = False 

      elif event.type == KEYDOWN and event.key == K_ESCAPE: 

       going = False 

     # Update 
     space1.update(i) 
     space2.update() 
     player.update() 
     enemySprites.update() 
     laserSprites.update() 
     enemyExplosion.update() 
     playerExplosion.update() 
     explosionSprites.update() 



     screen.blit(background, (0, 0)) 


     # Draw 
     space1.draw(screen) 
     space2.draw(screen)   
     playerSprite.draw(screen) 
     enemySprites.draw(screen) 
     laserSprites.draw(screen) 
     enemyExplosion.draw(screen) 
     playerExplosion.draw(screen) 
     explosionSprites.draw(screen) 


     pygame.display.flip() 



    pygame.quit() 

if __name__ == '__main__': 

    main() 

그래서 그래서 적어도 당신이이 경우에 약간의 쉬운 방법이 있었지만, 바로 스프라이트를 저장하는 방법에 대한 생각으로 내가 이전에 요청 우주 질문 다르게 약간에 갔다이 하나, 그것을 성취합니다. 이 점에 대해 배웠 으면하고, 이것에 관해 질문이 있으면 말해주십시오. 그리고 가능한 빨리 연락 드리겠습니다.

건배!