0
点赞
收藏
分享

微信扫一扫

用python实现简单的飞机大战小游戏

small_Sun 2022-04-24 阅读 47
python

1、下载一个包

PySide2-5.15.2.1-5.15.2-cp35.cp36.cp37.cp38.cp39.cp310-none-win_amd64

如果下载错误,就先下载shiboken2-5.15.2.1-5.15.2-cp35.cp36.cp37.cp38.cp39.cp310-none-win_amd64补丁,然后再下载Pyside2。

记得都放在同一个工程下。

2、准备好飞机大战中所需要的图片资源

(1)自身飞机

(2)飞机子弹

(3)背景

 

(4)敌机

 

将准备好的图片放入工程中的images文件夹中,且命名好

3、代码

我们一共准备六个模块

(1)主函数main模块.py

from PySide2 import QtCore, QtWidgets, QtGui
from settings import Settings
from map import Map
from hero import Hero
from enemy import Enemy
from random import randint

class MainScene(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.settings = Settings()
        self.setWindowTitle(self.settings.game_title)
        self.setWindowIcon(QtGui.QIcon(self.settings.game_ico))
        self.setFixedSize(self.settings.game_width, self.settings.game_height)

        self.map = Map() # 构造一个地图对象
        self.hero = Hero() # 构造一个英雄对象
        # 初始化敌机
        self.enemys = []
        self.enemy_interval = 0
        for i in range(self.settings.enemy_num):
            self.enemys.append(Enemy())

        self.timer_main = QtCore.QTimer(self)
        self.timer_main.setInterval(20)
        self.timer_main.timeout.connect(self.run)
        self.timer_main.start()

        self.presskeys = []
        self.timer_key = QtCore.QTimer(self)
        self.timer_key.setInterval(50)
        self.timer_key.timeout.connect(self.handleKey)
        

    def enemyToScene(self):
        self.enemy_interval += 1
        if self.enemy_interval < 30:
            return 
        self.enemy_interval = 0

        for i in range(self.settings.enemy_num):
            if self.enemys[i].free:
                self.enemys[i].free = False
                self.enemys[i].x = randint(0, self.settings.game_width-self.enemys[i].img.width())
                self.enemys[i].y = -self.enemys[i].img.height()   
                break     

    def collisionDetect(self):
        for i in range(self.settings.enemy_num):
            if self.enemys[i].free:
                continue

            for j in range(self.settings.bullet_num):
                if self.hero.bullets[j].free:
                    continue
                if self.enemys[i].rect.intersects(self.hero.bullets[j].rect):
                    self.enemys[i].free = True
                    self.hero.bullets[j].free = True


    def handleKey(self):
        x = self.hero.x 
        y = self.hero.y 
        if self.presskeys.count(QtCore.Qt.Key_Left) > 0:
            x -= self.hero.speed
        if self.presskeys.count(QtCore.Qt.Key_Right) > 0:
            x += self.hero.speed
        if self.presskeys.count(QtCore.Qt.Key_Space) > 0:
            self.hero.shoot()
        if self.presskeys.count(QtCore.Qt.Key_Q) > 0:
            self.close()

        self.hero.move(x, y)

    def keyPressEvent(self, event):
        '''按键按下时,自动调用此函数'''
        self.presskeys.append(event.key())
        if not self.timer_key.isActive():
            self.timer_key.start()

    def keyReleaseEvent(self, event):
        '''松开按键时,自动调用'''
        if self.timer_key.isActive() and len(self.presskeys) == 0:
            self.timer_key.stop()
            self.handleKey()
        
        while event.key() in self.presskeys:
            self.presskeys.remove(event.key())


    def updatePosition(self):
        self.map.move()
        '''更新子弹的位置'''
        for i in range(self.settings.bullet_num):
            if not self.hero.bullets[i].free:
                self.hero.bullets[i].move()
        '''更新敌机位置'''
        for i in range(self.settings.enemy_num):
            if not self.enemys[i].free:
                self.enemys[i].move()


    def run(self):
        self.enemyToScene()
        self.updatePosition()
        self.update()
        self.collisionDetect()


    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        painter.drawPixmap(0, self.map.y1, self.map.img1)
        painter.drawPixmap(0, self.map.y2, self.map.img2)   
        painter.drawPixmap(self.hero.x, self.hero.y, self.hero.img)     
        '''绘制子弹'''
        for i in range(self.settings.bullet_num):
            if not self.hero.bullets[i].free:   
                painter.drawPixmap(self.hero.bullets[i].x, self.hero.bullets[i].y, self.hero.bullets[i].img)

        '''绘制敌机'''
        for i in range(self.settings.enemy_num):
            if not self.enemys[i].free:
                painter.drawPixmap(self.enemys[i].x, self.enemys[i].y, self.enemys[i].img)


if __name__ == "__main__":
    app = QtWidgets.QApplication([])

    w = MainScene()
    w.show()

    app.exec_()

(2)资源调用模块setting.py

class Settings:
    def __init__(self):
        self.game_title = "python飞机大战"
        self.game_ico = r"D:\周末实训\飞机大战\images\app.ico"
        self.game_width = 512
        self.game_height = 700

        self.map_path = r"D:\周末实训\飞机大战\images\img_bg_level_2.jpg"
        self.map_speed = 2

        self.hero_path = r"D:\周末实训\飞机大战\images\hero2.png"
        self.hero_speed = 20

        self.bullet_path = r"D:\周末实训\飞机大战\images\bullet_11.png"
        self.bullet_speed = 10
        self.bullet_num = 10

        self.enemy_path = r"D:\周末实训\飞机大战\images\img-plane_5.png"
        self.enemy_speed = 3
        self.enemy_num = 10

(3)地图模块map.py

from PySide2 import QtGui
from settings import Settings


class Map:
    def __init__(self):
        self.settings = Settings()
        self.img1 = QtGui.QPixmap(self.settings.map_path)
        self.img2 = QtGui.QPixmap(self.settings.map_path)

        self.y1 = -self.settings.game_height
        self.y2 = 0

    def move(self):
        self.y1 += self.settings.map_speed
        if self.y1 >= 0:
            self.y1 = -self.settings.game_height

        self.y2 += self.settings.map_speed   
        if self.y2 >= self.settings.game_height:
            self.y2 = 0         


(4)自身飞机操作模块hero.py

from PySide2 import QtGui
from settings import Settings
from bullet import Bullet

class Hero:
    def __init__(self):
        self.settings = Settings()
        self.img = QtGui.QPixmap(self.settings.hero_path)
        self.x = self.settings.game_width*0.5 - self.img.width()*0.5
        self.y = self.settings.game_height - self.img.height()
        self.speed = self.settings.hero_speed

        # 创建一个弹夹,放入10颗子弹
        self.bullets = []
        for i in range(self.settings.bullet_num):
            self.bullets.append(Bullet())

    def move(self, x, y):
        '''飞机移动'''
        self.x = x 
        self.y = y

    def shoot(self):
        '''飞机发射子弹,按空格键时,调用此函数'''
        for i in range(self.settings.bullet_num):
            if self.bullets[i].free:
                self.bullets[i].free = False
                self.bullets[i].x = self.x + self.img.width()*0.5 - self.bullets[i].img.width()*0.5
                self.bullets[i].y = self.y - 30
                break

(5)发射子弹模块bullet.py

from PySide2 import QtGui
from settings import Settings

class Bullet:
    def __init__(self):
        self.settings = Settings()
        self.img = QtGui.QPixmap(self.settings.bullet_path)
        self.rect = self.img.rect()
        self.speed = self.settings.bullet_speed
        self.x = 0
        self.y = 0
        self.free = True

    def move(self):
        if self.free:
            return 
        
        self.y -= self.speed
        self.rect.moveTo(self.x, self.y)
        if self.y <= -self.rect.height():
            self.free = True

(6)敌机模块enemy.py

from PySide2 import QtGui
from settings import Settings

class Enemy:
    def __init__(self):
        self.settings = Settings()
        self.img = QtGui.QPixmap(self.settings.enemy_path)
        self.rect = self.img.rect()
        self.x = 0
        self.y = 0
        self.free = True
        self.speed = self.settings.enemy_speed

    def move(self):
        if self.free:
            return 
        self.y += self.speed
        self.rect.moveTo(self.x, self.y)
        if self.y >= self.settings.game_height:
            self.free = True

4、注意

代码没有问题,在同一工程目录下建6个.py文件然后将代码复制进去就行了

如果有报错,一般就是我上面说的包没有下载或者调用成功,

也可能是图片路径问题。

代码比较少,功能也不是很多,相比于正规游戏这个肯定是没得比的,如果有问题,还望各位大佬多加指点

操作方式:飞机方向由左右两键控制,空格发射子弹,Q退出游戏

举报

相关推荐

0 条评论