2016-09-23 86 views
1

我创建使用pygame的模块Python中的太空侵略者克隆,但我遇到了一些困难,让他们到达游戏画面的边缘时,向下移动到一起。pygame的太空侵略者游戏 - 让外国人一起移动

我怎么会让它所以当外星人到达游戏画面都同时改变方向和下拉一个级别的边缘?

import pygame 
import random 

class spaceInvader(pygame.sprite.Sprite): 

    def __init__(self): 
     self.image = pygame.image.load("spaceInvader.png") 
     self.x = 200 
     self.y = 390 

     self.shots = [] 

    def handle_keys(self): 
     key = pygame.key.get_pressed() 
     dist = 5 
     if key[pygame.K_RIGHT]: 
      self.x+=dist 
     elif key[pygame.K_LEFT]: 
      self.x-=dist 

    def draw(self, surface): 
     surface.blit(self.image,(self.x,self.y)) 
     for s in self.shots: 
      s.draw(screen) 

class Alien(pygame.sprite.Sprite): 

    def __init__(self,x,y,direction,alienType): 
     pygame.sprite.Sprite.__init__(self) 

     self.AlienType = alienType 
     self.Direction = direction 

     if alienType == 1: 
      alienImage = pygame.image.load("alien1.png") 
      self.Speed = 1 
      self.Score = 5 

     if alienType == 2: 
      alienImage = pygame.image.load("alien2.png") 
      self.Score = 15 
      self.Speed = 1 

     if alienType == 3: 
      alienImage = pygame.image.load("alien3.png") 
      self.Score = 10 
      self.Speed = 1 

     if alienType == 4: 
      alienImage = pygame.image.load("alien4.png") 
      self.Score = 20 
      self.Speed = 1 

     if alienType == 5: 
      alienImage = pygame.image.load("alien5.png") 
      self.Score = 25 
      self.Speed = 1 

     self.image = pygame.Surface([26, 50]) 
     self.image.set_colorkey(black) 
     self.image.blit(alienImage,(0,0)) 
     self.rect = self.image.get_rect() 
     self.rect.x = x 
     self.rect.y = y 

    def moveAliens(self): 
     if self.Direction == "right": 
      self.rect.x += self.Speed 
     if self.Direction == "left": 
      self.rect.x -= self.Speed 

pygame.init() 

pygame.mouse.set_visible(False) 
screen = pygame.display.set_mode([400,400]) 

allAliens = pygame.sprite.Group() 
spaceInvader = spaceInvader() 

pygame.display.set_caption("Space Attack") 
background_image = pygame.image.load("Galaxy.png").convert() 
pygame.mouse.set_visible(True) 
done = False 
clock = pygame.time.Clock() 
black =(0, 0, 0) 
white =(255,255,255) 
red = (255, 0, 0) 
score = 0 
enemies = [] 

#For X coords 
spawnPositions = [50,100,150,200,250,300,350] 

yCoord = 10 

for n in range(5): 
    for i in range(len(spawnPositions)): 
     xCoord = spawnPositions[i] 
     alienType = random.randint(1,5) 
     alien = Alien(xCoord, yCoord,"right", alienType) 
     allAliens.add(alien) 
    yCoord = yCoord + 15 

loop = 0 
while done == False: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 

    for alien in (allAliens.sprites()): 
     if alien.rect.x < 0: 
      alien.rect.y = alien.rect.y + 15 
      alien.Direction = "right" 
     if alien.rect.x > 395: 
      alien.rect.y = alien.rect.y + 15 
      alien.Direction = "left" 
     loop =+1 

    for alien in (allAliens.sprites()): 
     alien.moveAliens() 

    spaceInvader.handle_keys() 
    screen.blit(background_image,[0,0]) 
    spaceInvader.draw(screen) 
    allAliens.draw(screen) 
    pygame.display.flip() 
    clock.tick(20) 

pygame.quit() 

谢谢。

+1

对于类,请为每个单词使用大写字母命名。例如'SpaceInvader'而不是'spaceInvader'。对于属性和变量,用小写和下划线来命名它们以分隔每个单词。例如'self.alien_type'而不是'self.AlienType'和'y_coord'而不是'yCoord'。这样你就可以遵循Python的命名约定,并且使其他程序员更容易快速识别什么是类,什么是属性或变量。 –

回答

4

你的问题就在这里:

for alien in (allAliens.sprites()): 
    if alien.rect.x < 0: 
     alien.rect.y = alien.rect.y + 15 
     alien.Direction = "right" 
    if alien.rect.x > 395: 
     alien.rect.y = alien.rect.y + 15 
     alien.Direction = "left" 
    loop =+1 

我认为外星人正在分别下降了吗?

您需要更改此设置,以便当一个外星人触发这些if语句时,所有外星人的ydirection都被恰当地设置,而不仅仅是一个碰到旁边的人。

+0

确实是。按照你所说的加入了第二个循环,现在完美工作。谢谢! – Alex

0
# Space Invader 
import turtle 
import os 
import random 
import math 

# Set up the screen. 
wn = turtle.Screen() 
wn.setup(700,700) 
wn.bgcolor("lightblue") 

wn.title("Space Invaders") 



# Draw border 
border = turtle.Turtle() 
border.speed("fastest") 
border.color("white") 
border.penup() 
border.setposition(-300,-270) 
border.pendown() 
border.pensize(3) 
for side in range(4): 
    border.forward(560) 
    border.left(90) 
border.hideturtle() 

# Set the score to 0. 
score = 0 

# Draw the score. 
score_pen = turtle.Turtle() 
score_pen.speed("fastest") 
score_pen.color("white") 
score_pen.penup() 
score_pen.setposition(-290,260) 
scorestring = "Score: %s" %score 
score_pen.write(scorestring, False, align="left", font = ("Arial",14,"normal")) 
score_pen.hideturtle() 

# Create the player turtle 
player = turtle.Turtle() 
player.color("black") 
player.speed("fastest") 
player.shape("triangle") 
player.penup() 
player.setposition(0,-265) 
player.setheading(90) 


playerspeed = 15 

# Create enemy 
#enemy = turtle.Turtle() 
#enemy.shape("circle") 
#enemy.color("red") 
#enemy.penup() 
#enemy.speed(2) 
#enemy.setposition(-200,250) 

#enemyspeed = 2 

# Choose number of enemies. 
number_of_enemies = 5 
# Create an empty list of enemies. 
enemies = [] 

# Add enemies to list. 
for i in range(number_of_enemies): 
    # Create enemy 
    enemies.append(turtle.Turtle()) 

for enemy in enemies: 
    enemy.shape("circle") 
    enemy.color("red") 
    enemy.penup() 
    enemy.speed(2) 
    x = random.randint(-200,200) 
    y = random.randint(100,250) 
    enemy.setposition(x,y) 

enemyspeed = 2  

# Create the player's bullet. 
bullet = turtle.Turtle() 
bullet.color("yellow") 
bullet.shape("triangle") 
bullet.penup() 
bullet.speed("fastest") 
bullet.setheading(90) 
bullet.shapesize(.5,.5) 
bullet.hideturtle() 

bulletspeed = 20 

# Define bullet state 
# ready - ready to fire 
# fire - bullet is firing 
bulletstate = "ready" 




# Move the player left and right. 
def move_left(): 
    x = player.xcor() 
    x -= playerspeed 
    if x < -280: 
     x = -280 
    player.setx(x) 

def move_right(): 
    x = player.xcor() 
    x += playerspeed 
    if x >250: 
     x = 250 
    player.setx(x) 

def fire_bullet(): 
    # Declare the bulletstate as a global if it needs changed. 
    global bulletstate 
    if bulletstate == "ready": 
     bulletstate = "fire" 
     # Move the bullet just above the player. 
     x = player.xcor() 
     y = player.ycor() + 10 
     bullet.setposition(x,y) 
     bullet.showturtle() 

def isCollision(t1,t2): 
    dx = t1.xcor() - t2.xcor() 
    dy = t1.ycor()- t2.ycor() 
    distance = dx**2 + dy**2 
    distance1 = math.sqrt(distance) 
    if distance1 < 15: 
     return True 
    else: 
     return False 



# Create keyboard bindings 
wn.onkey(move_left, "Left") 
wn.onkey(move_right,"Right") 
wn.onkey(fire_bullet,"space") 
wn.listen() 


# Main game loop 
while True: 


    for enemy in enemies: 

     # Move enemy 
     x = enemy.xcor() 
     x += enemyspeed 
     enemy.setx(x) 

     # Move the enemy back and down 
     if enemy.xcor()>250: 
      # Move all the enemies down 
      for e in enemies: 
       y = e.ycor() 
       y -= 40 
       e.sety(y) 
      # Change the enemy direction 
      enemyspeed *= -1 

     if enemy.xcor()< -280: 
      # Move all the enemies down 
      for e in enemies: 
       y = e.ycor() 
       y -= 40 
       e.sety(y) 
      # change the enemy direction 
      enemyspeed *= -1 
     # Check for the collision between bullet and the enemy. 
     if isCollision(bullet ,enemy): 
      # Reset the bullet 
      bullet.hideturtle() 
      bulletstate = "ready" 
      bullet.setposition(0,-400) 
      # Reset the enemy 
      x = random.randint(-200,200) 
      y = random.randint(100,250) 
      enemy.setposition(x,y) 
      # Update the score. 
      score += 1 
      scorestring = "Score: %s" %score 
      score_pen.clear() 
      score_pen.write(scorestring, False, align = "left",font = ("Arial",14, "normal")) 

     if isCollision(player,enemy): 
      player.hideturtle() 
      enemy.hideturtle() 
      print("Game Over") 
      break 







    # Move the bullet. 
    if bulletstate == "fire": 
     y = bullet.ycor() 
     y += bulletspeed 
     bullet.sety(y) 

    # Check to see if the bullet has gone to the top. 
    if bullet.ycor() > 275: 
     bullet.hideturtle() 
     bulletstate = "ready" 


turtle.mainloop() 
+0

代码本身不是一个好的答案。 https://stackoverflow.com/help/how-to-answer – sg7