python小游戏—摧毁基地

python小游戏—摧毁基地

前言

python新手。最近用python写了一款小游戏,只能算是对大佬的拙劣模仿。代码冗杂,后面有时间会进行优化。如需引用请附上本文地址,有时间会进行不定期更改。请大佬轻喷。

import pygame
import random
import time
import math

SCREEN_WIDTH = 800  # 窗口宽度
SCREEN_HEIGHT = 600  # 窗口高度
BG_COLOR = pygame.Color(0, 0, 0)  # 窗口背景颜色
FG_COLOR = pygame.Color(255, 255, 255)  # 前景颜色
'''摧毁基地'''


class MainGame:
    window = None
    Attacker1 = None
    count = 0
    randNum = 0
    baseList = []
    protectorList = []
    myBulletList = []
    baseBulletList = []  # 基地子弹列表

    def start(self):
        """游戏开始"""
        pygame.display.init()
        MainGame.window = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
        self.createBase()
        self.createProtector()
        self.createAttacker()
        pygame.display.set_caption("摧毁基地")
        while True:
            time.sleep(0.02)
            MainGame.window.fill(BG_COLOR)
            self.getEvent()
            for base in MainGame.baseList:
                if MainGame.Attacker1:
                    MainGame.window.blit(self.showText("boss剩余生命值{0}                                              "
                                                       "攻击者剩余生命值{1}".format(base.hp, MainGame.Attacker1.hp)), (5, 5))
            self.blitBase()
            self.blitProtector()
            self.blitAttacker()
            self.blitBullet()
            if MainGame.count > 50:
                self.createBaseBullet()
                MainGame.count = 0
            MainGame.count += 1
            MainGame.randNum += 1
            self.blitBaseBullet()
            if MainGame.Attacker1:
                if not MainGame.Attacker1.stop:
                    MainGame.Attacker1.move()
            pygame.display.update()

    def createBase(self):
        """基地创建"""
        base = Base(SCREEN_WIDTH / 2 - 100, 25)
        MainGame.baseList.append(base)

    def blitBase(self):
        """显示基地"""
        for base in MainGame.baseList:
            if base.live:
                base.displayBase()
                base.randMove()
            else:
                MainGame.baseList.remove(base)

    def createProtector(self):
        """创建保护者"""
        for i in range(10):
            left = random.randint(0, 300)
            top = 30 * random.randint(5, 12)
            protector = Protector(left, top)
            MainGame.protectorList.append(protector)

    def blitProtector(self):
        """显示保护者"""
        for protector in MainGame.protectorList:
            protector.displayProtector()
            protector.randMove()

    def createAttacker(self):
        """创建攻击者"""
        top = 480
        left = random.randint(0, 700)
        MainGame.Attacker1 = Attacker(left, top)

    def blitAttacker(self):
        """显示攻击者"""
        if MainGame.Attacker1:
            if MainGame.Attacker1.live:
                MainGame.Attacker1.displayAttacker()
            else:
                del MainGame.Attacker1
                MainGame.Attacker1 = None

    def blitBullet(self):
        """显示子弹"""
        for myBullet in MainGame.myBulletList:
            if myBullet.live:
                myBullet.displayBullet()
                myBullet.move()
                myBullet.hitProtector()
                myBullet.hitBase()
            else:
                MainGame.myBulletList.remove(myBullet)

    def createBaseBullet(self):
        """创建基地子弹"""
        for i in range(3):
            speed = 5
            for base in MainGame.baseList:
                baseBullet = BaseBullet(speed, base)
                MainGame.baseBulletList.append(baseBullet)

    def blitBaseBullet(self):
        """显示基地子弹"""
        num = 0
        for baseBullet in MainGame.baseBulletList:
            num += 1
            if baseBullet:
                if baseBullet.live:
                    baseBullet.displayBaseBullet()
                    for base in MainGame.baseList:
                        baseBullet.move(num, base)
                    baseBullet.hitAttacker()
                else:
                    pass

    def showText(self, text):
        """显示基地生命值"""
        pygame.font.init()
        font = pygame.font.SysFont("kaiti", 20)
        textSurface = font.render(text, True, FG_COLOR)
        return textSurface

    def getEvent(self):
        """获取点击事件"""
        eventList = pygame.event.get()
        for event in eventList:
            if event.type == pygame.QUIT:  # 判断事件是否为退出键(即窗口右上角的叉)
                self.endGame()
            if event.type == pygame.KEYDOWN:  # 判断事件是否为按下按键操作
                if not MainGame.Attacker1:
                    if event.key == pygame.K_ESCAPE:  # 判断按键是否为Esc键
                        self.createAttacker()
                elif MainGame.Attacker1.live:
                    if event.key == pygame.K_LEFT:  # 判断按键是否为左键
                        print("左")
                        MainGame.Attacker1.direction = 'L'
                        MainGame.Attacker1.stop = False
                    elif event.key == pygame.K_RIGHT:  # 判断按键是否为右键
                        print("右")
                        MainGame.Attacker1.direction = 'R'
                        MainGame.Attacker1.stop = False
                    elif event.key == pygame.K_SPACE:  # 判断按键是否为空格键
                        print("发射子弹")
                        if len(MainGame.myBulletList) < 8:
                            myBullet = Bullet(MainGame.Attacker1)
                            MainGame.myBulletList.append(myBullet)
            elif event.type == pygame.KEYUP:  # 判断事件是否为释放按键操作
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    if MainGame.Attacker1:
                        MainGame.Attacker1.stop = True

    def endGame(self):
        """结束游戏"""
        exit()


class Base:
    def __init__(self, left, top):
        self.image = pygame.image.load('./img/boss1.gif')  # 加载图片
        self.rect = self.image.get_rect()
        self.rect.left = left
        self.rect.top = top
        self.direction = 'L'
        self.step = 60
        self.speed = 5
        self.live = True
        self.hp = 20  # 设置基地生命

    def randShot(self):
        """随机射击"""
        return Bullet(self)

    def displayBase(self):
        """显示基地"""
        MainGame.window.blit(self.image, self.rect)

    def randDirection(self):
        """产生基地的随机移动方向"""
        a = random.randint(1, 2)
        if a == 1:
            return 'L'
        elif a == 2:
            return 'R'

    def randMove(self):
        if self.step <= 0:
            self.direction = self.randDirection()
            self.step = 60
        else:
            self.move()
            self.step -= 1

    def move(self):
        if self.direction == 'L':
            if self.rect.left > 0:
                self.rect.left -= self.speed
        elif self.direction == 'R':
            if self.rect.left < SCREEN_WIDTH - self.rect.width:
                self.rect.left += self.speed


class Protector:
    def __init__(self, left, top):
        self.image = pygame.image.load('./img/protector.gif')
        self.rect = self.image.get_rect()
        self.step = 60
        self.speed = 5
        self.direction = 'L'
        self.rect.left = left
        self.rect.top = top
        self.oldLeft = self.rect.left
        self.oldTop = self.rect.top

    def randDirection(self):
        a = random.randint(1, 2)
        if a == 1:
            return 'L'
        elif a == 2:
            return 'R'

    def randMove(self):
        self.oldLeft = self.rect.left
        self.oldTop = self.rect.top
        if self.step <= 0:
            self.direction = self.randDirection()
            self.step = 60
        else:
            self.move()
            self.step -= 1

    def move(self):
        if self.direction == 'L':
            if self.rect.left > 0:
                self.rect.left -= self.speed
        elif self.direction == 'R':
            if self.rect.left < SCREEN_WIDTH - self.rect.width:
                self.rect.left += self.speed

    def displayProtector(self):
        MainGame.window.blit(self.image, self.rect)


class Attacker:
    def __init__(self, left, top):
        self.image = pygame.image.load('./img/attacker2.gif')
        self.rect = self.image.get_rect()
        self.direction = 'L'
        self.rect.left = left
        self.rect.top = top
        self.speed = 7
        self.stop = True
        self.hp = 5
        self.live = True

    def shot(self):
        return Bullet(self)

    def move(self):
        if self.direction == 'L':
            if self.rect.left > 0:
                self.rect.left -= self.speed
        elif self.direction == 'R':
            if self.rect.left < SCREEN_WIDTH - self.rect.width:
                self.rect.left += self.speed

    def displayAttacker(self):
        MainGame.window.blit(self.image, self.rect)


class Bullet:
    def __init__(self, attacker):
        self.image = pygame.image.load('./img/enemymissile.gif')
        self.rect = self.image.get_rect()
        self.speed = 10
        self.rect.left = attacker.rect.left + 0.5 * attacker.rect.width - 0.5 * self.rect.width
        self.rect.top = attacker.rect.top + self.rect.height
        self.live = True

    def move(self):
        if self.rect.top > 0:
            self.rect.top -= self.speed
        else:
            self.live = False

    def displayBullet(self):
        MainGame.window.blit(self.image, self.rect)

    def hitProtector(self):
        for protector in MainGame.protectorList:
            if pygame.sprite.collide_rect(self, protector):  # 检测self与protecter是否发生碰撞
                self.live = False

    def hitBase(self):
        for base in MainGame.baseList:
            if pygame.sprite.collide_rect(self, base):
                self.live = False
                base.hp -= 1
                if base.hp <= 0:
                    base.live = False


class BaseBullet:
    def __init__(self, speed, base):
        self.image = pygame.image.load('./img/enemymissile.gif')
        self.rect = self.image.get_rect()
        self.speed = speed
        self.rect.left = base.rect.left + 0.5 * base.rect.width - 0.5 * self.rect.width
        self.rect.top = base.rect.top + base.rect.height
        self.live = True
        self.mark = True

    def move(self, num, base):
        if self.rect.top < SCREEN_HEIGHT:
            if self.rect.left > 0:
                if self.rect.left < SCREEN_WIDTH:
                    if num % 3 == 1:
                        self.rect.top += self.speed
                    elif num % 3 == 2:
                        if self.mark:
                            self.rect.left = base.rect.left + 0.5 * base.rect.width - 0.5 * self.rect.width - 50
                            self.mark = False
                        self.rect.top += self.speed
                    elif num % 3 == 0:
                        if self.mark:
                            self.rect.left = base.rect.left + 0.5 * base.rect.width - 0.5 * self.rect.width + 50
                            self.mark = False
                        self.rect.top += self.speed
                else:
                    self.live = False
            else:
                self.live = False
        else:
            self.live = False

    def hitAttacker(self):
        if MainGame.Attacker1:
            if pygame.sprite.collide_rect(self, MainGame.Attacker1):
                self.live = False
                MainGame.Attacker1.hp -= 1
                if MainGame.Attacker1.hp <= 0:
                    MainGame.Attacker1.live = False

    def displayBaseBullet(self):
        MainGame.window.blit(self.image, self.rect)


if __name__ == '__main__':
    MainGame().start()

python小游戏—摧毁基地

上一篇:Python游戏开发,pygame模块,Python实现化学滑雪小游戏


下一篇:飞机大战.py