2016-09-23 4 views
1

Ich habe einen Space Invaders-Klon in Python mit den PyGame-Modulen erstellt, aber es bereitet mir Schwierigkeiten, sie zusammen zu bewegen, wenn ich den Rand des Spielbildschirms erreiche.PyGame Space Invaders Spiel - Außerirdische bewegen sich zusammen

Wie würde ich es so machen, wenn die Aliens den Rand des Spielbildschirms erreichen, ändern sie alle gleichzeitig die Richtung und senken ein Level ab?

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() 

Danke. hier

+1

Bei Klassen benennen Sie sie mit einem Großbuchstaben für jedes Wort. Zum Beispiel 'SpaceInvader' anstatt oder' spaceInvader'. Bei Attributen und Variablen benennen Sie sie mit nur Kleinbuchstaben und Unterstrichen, um jedes Wort zu trennen. Zum Beispiel 'self.alien_type' anstelle von' self.AlienType' und 'y_coord' anstelle von' yCoord'. Auf diese Weise folgen Sie den Python-Namenskonventionen und erleichtern es anderen Programmierern, schnell zu identifizieren, was eine Klasse ist und was ein Attribut oder eine Variable ist. –

Antwort

4

Ihr Problem liegt:

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 

Ich nehme die Aliens noch einzeln fallen nach unten?

Sie müssen dies so ändern, dass, wenn ein Alien diese if-Anweisungen auslöst, alle Alien y und direction richtig eingestellt sind, nicht nur der, der die Seite trifft.

+0

In der Tat waren sie. Habe wie gesagt und eine zweite for-Schleife hinzugefügt, funktioniert jetzt einwandfrei. Vielen Dank! – 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

Der Code selbst ist keine gute Antwort. https://stackoverflow.com/help/how-to-answer – sg7

Verwandte Themen