如何在太空入侵者游戏中添加五排入侵者 [英] How to add five rows of invaders in space invader game

查看:44
本文介绍了如何在太空入侵者游戏中添加五排入侵者的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的太空入侵者游戏中目前有 1 行 11 个入侵者,并希望再添加 5 行,我需要在下面的当前代码中添加什么代码?

i currently have 1 row of 11 invaders in my space invader game and wish to add 5 more rows, what code would i need to add on to my current code below?

import sys
import pygame
import Invader
import Missile
from pygame.locals import *

class SpaceInvaders:

    # Constructor of the basic game class.
    # This constructor calls initialize and main_loop method.
    def __init__(self):
        self.initialize()
        self.main_loop()

    # Initialization method. Allows the game to initialize different
    # parameters and load assets before the game runs
    def initialize(self):
        pygame.init()
        pygame.key.set_repeat(1, 1)

        self.width = 1024
        self.height = 768
        self.screen = pygame.display.set_mode((self.width, self.height))

        self.caption = "Space Invader!!"
        pygame.display.set_caption(self.caption)

        self.framerate = 30

        self.clock = pygame.time.Clock()
        self.missileXPos = -1
        self.missileYPos = -1

        self.missileFired = False

        self.gameState = 1
        self.font = pygame.font.Font(None, 40)
        self.explosionSound = pygame.mixer.Sound("explosion.wav")
        self.initializeGameVariables()

    def initializeGameVariables(self):
        self.starfieldImg = pygame.image.load('Starfield1024x768.png')
        self.invaderImg = pygame.image.load('inv1.png')
        self.altInvaderImg = pygame.image.load('inv12.png')
        self.rocketLauncherImg = pygame.image.load('LaserBase.png')        
        self.missileImg = pygame.image.load('bullet.png')

        self.rocketXPos = 512

        self.alienDirection = -1            
        self.alienSpeed = 20

        self.ticks = 0

        self.invaders = []
        xPos = 512



        for i in range(11):
           invader = Invader.Invader()
           invader.setPosX(xPos)
           invader.setPosY(100)
           self.invaders.append(invader)            
           xPos += 32


        self.missileFired = None
        self.playerScore = 0


    # main loop method keeps the game running. This method continuously
    # calls the update and draw methods to keep the game alive.
    def main_loop(self):
        self.clock = pygame.time.Clock()
        while True:
            gametime = self.clock.get_time()
            self.update(gametime)
            self.draw(gametime)
            self.clock.tick(self.framerate)


    def updateStarted(self, gametime):        
        '''add action statements for start screen'''
        events = pygame.event.get()

        for event in events:
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_s:
                    self.gameState = 2
                    break


    def updatePlaying(self, gametime):
        events = pygame.event.get()

        for event in events:
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    self.rocketXPos = self.rocketXPos + 4
                elif event.key == pygame.K_LEFT:
                    self.rocketXPos = self.rocketXPos - 4
                elif event.key == pygame.K_SPACE:
                    self.missileFired = Missile.Missile(self.rocketXPos, 650)

        isInvaderRemaining = False
        for i in range(11):
            if self.invaders[i] != None:
                isInvaderRemaining = True
                break
        if isInvaderRemaining == False:
            self.gameState = 3
            return

        if self.missileFired != None:
            self.missileFired.move()

        if self.rocketXPos < 100:
            self.rocketXPos = 100

        if self.rocketXPos > 924:
            self.rocketXPos = 924

        self.ticks = self.ticks + gametime

        if self.ticks > 500:
            for i in range(11):
                if self.invaders[i] != None:
                    self.invaders[i].moveHorizontal(self.alienSpeed * self.alienDirection)

            leftMostInvader = None
            rightMostInvader = None

            for i in range(11):
                if self.invaders[i] != None:
                    leftMostInvader = self.invaders[i]
                    break

            for i in range(10, -1, -1):
                if self.invaders[i] != None:
                    rightMostInvader = self.invaders[i]
                    break

            if leftMostInvader.getPosX() < 96:
                self.alienDirection = +1

                xPos = 96
                for i in range(11):
                    if self.invaders[i] != None:
                        self.invaders[i].moveVertical(4)
                        self.invaders[i].setPosX(xPos)
                    xPos = xPos + self.invaderImg.get_width()

            if rightMostInvader.getPosX() > 924 :
                self.alienDirection = -1

                xPos = 924 - self.invaderImg.get_width() * 10 
                for i in range(11):
                    if self.invaders[i] != None:
                        self.invaders[i].moveVertical(4)
                        self.invaders[i].setPosX(xPos)
                    xPos = xPos + self.invaderImg.get_width()

            self.ticks = 0

        if self.missileFired != None:
            rectMissile = pygame.Rect(self.missileFired.getPosX(), self.missileFired.getPosY(), self.missileImg.get_width(), self.missileImg.get_height())
            for i in range(11):
                if self.invaders[i] != None:
                    rectInvader = pygame.Rect(self.invaders[i].getPosX(), self.invaders[i].getPosY(), self.invaderImg.get_width(), self.invaderImg.get_height())
                    if rectMissile.colliderect(rectInvader):
                        self.missileFired = None
                        self.invaders[i] = None

                        self.playerScore = self.playerScore + 100
                        self.explosionSound.play()
                        break

    def updateEnded(self, gametime):
        '''add action statements for end screen'''
        events = pygame.event.get()
        for event in events:
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_x:
                    pygame.quit()
                    sys.exit()
                elif event.key == pygame.K_r:
                    self.initializeGameVariables()
                    self.gameState = 1



    # Update method contains game update logic, such as updating the game
    # variables, checking for collisions, gathering input, and
    # playing audio.
    def update(self, gametime):        
        if self.gameState == 1:
            self.updateStarted(gametime)
        elif self.gameState == 2:
            self.updatePlaying(gametime)
        elif self.gameState == 3:
            self.updateEnded(gametime)


    def drawStarted(self, gametime):
        '''add drawing statements for start screen'''
        self.screen.blit(self.starfieldImg, (0,0))

        width, height = self.font.size("S P A C E  I N V A D E R S!")
        text = self.font.render("S P A C E  I N V A D E R S!", True, (255, 0, 0))
        xPos = (1024 - width)/2
        self.screen.blit(text, (xPos, 200))

        width, height = self.font.size("P R E S S 'S' T O   S T A R T")
        text = self.font.render("P R E S S  'S' T O  S T A R T", True, (255, 0, 0))
        xPos = (1024 - width)/2
        self.screen.blit(text, (xPos, 400))
        pygame.display.flip()

    def drawPlaying(self, gametime):
        self.screen.blit(self.starfieldImg, (0,0))

        score_text = self.font.render("Score : %d" %self.playerScore, True, (255, 0, 0))
        self.screen.blit(score_text, (10, 10))
        self.screen.blit(self.rocketLauncherImg, (self.rocketXPos, 650))
        if self.missileFired != None:
            self.screen.blit(self.missileImg, (self.missileFired.getPosX(), self.missileFired.getPosY() - self.missileImg.get_height()))
        for i in range(11):
            if self.invaders[i] != None:
                self.screen.blit(self.invaderImg, self.invaders[i].getPosition())
        pygame.display.flip()    


    # Draw method, draws the current state of the game on the screen                        
    def draw(self, gametime):              
        if self.gameState == 1:
            self.drawStarted(gametime)
        elif self.gameState == 2:
            self.drawPlaying(gametime)
        elif self.gameState == 3:
            self.drawEnded(gametime)        

    def drawEnded(self, gametime):
        '''add drawing statements for end screen'''
        self.screen.blit(self.starfieldImg, (0,0))

        width, height = self.font.size("P R E S S  'R' T O  R E S T A R T  G A M E")
        text = self.font.render("P R E S S 'R'  T O  R E S T A R T  G A M E", True, (255, 0, 0))
        xPos = (1024 - width)/2
        self.screen.blit(text, (xPos, 200))

        width, height = self.font.size("P R E S S   'X'  T O   E X I T   G A M E")
        text= self.font.render("P R E S S   'X' T O  E X I T  G A M E", True, (255, 0, 0))
        xPos = (1024 - width)/2
        self.screen.blit(text, (xPos, 300))

        pygame.display.flip()


if __name__ == "__main__":
    game = SpaceInvaders()

类入侵者:def init(自我):self.__alienPosX = 0self.__alienPosY = 0

class Invader: def init(self): self.__alienPosX = 0 self.__alienPosY = 0

def setPosX(self, x):
    self.__alienPosX = x

def setPosY(self, y):
    self.__alienPosY = y

def getPosX(self):
    return self.__alienPosX

def getPosY(self):
    return self.__alienPosY

def getPosition(self):
    return (self.__alienPosX, self.__alienPosY)

def moveHorizontal(self, amount):
    self.__alienPosX = self.__alienPosX + amount

def moveVertical(self, amount):
    self.__alienPosY = self.__alienPosY + amount    

推荐答案

从表面上看,您只需要创建一个嵌套循环

From what it seems, you would just need to make a nested loop

for b in range(5):
   XPos = #insert original starting value
   for i in range(11):
       invader = Invader.Invader()
       invader.setPosX(xPos)
       invader.setPosY(20 * b) #adjust y values to your preference
       self.invaders.append(invader)            
       xPos += 32

这将创建 5 行,每行 11.确保将值更改为您的偏好并设置我评论的起始 x 位置.

This will create five rows of 11. Make sure you change the values to your preference and set the starting x Position where i commented.

这篇关于如何在太空入侵者游戏中添加五排入侵者的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆