IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 【python】使用pygame制作简单的飞机大战游戏 -> 正文阅读

[游戏开发]【python】使用pygame制作简单的飞机大战游戏

游戏截图

代码部分?

import pygame
import random

# 设置标题、背景和图标
pygame.init ()
screen = pygame.display.set_mode ( (800 , 600) )
pygame.display.set_caption ( '飞机大战BETA' )
icon = pygame.image.load ( 'fly.png' )
pygame.display.set_icon ( icon )

# 设置背景、玩家、敌人和子弹的图片
bgImg = pygame.image.load ( 'bg.jpeg' )
playerImg = pygame.image.load ( 'fly.png' )
monsterImg = pygame.image.load ( 'monster.png' )
bulletImg = pygame.image.load ( 'bullet.png' )


# 定义飞机类(玩家)
class fly:
    def __init__(self):
        self.x = 380
        self.y = 500
        self.step = 0

    # 方法:实现玩家飞机左右移动
    def move(self):
        # 如果飞机在界内,则可以通过键盘的左右方向键操控
        if self.x <= 750 and self.x >= 0:
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    self.step = 1
                elif event.key == pygame.K_LEFT:
                    self.step = -1
            if event.type == pygame.KEYUP:
                self.step = 0
        # 防止出界
        elif self.x > 750:
            self.step = 0
            self.x = 750
        else:
            self.step = 0
            self.x = 1

    # 方法:飞机发射子弹
    def shoot(self):
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:  # 按空格键可以发射(准确的说是创建)子弹
                bullets.append ( bullet ( self.x + 10 , self.y - 30 ) )

    # 方法:判断飞机是否与敌人相撞,如果发生则游戏结束
    def destroy(self):
        for m in monsters:
            distance = ((self.x - m.x) ** 2 + (self.y - m.y) ** 2) ** 0.5  # distance代表玩家飞机与敌人的距离
            if distance <= 20:  # 距离过劲则会坠机,游戏结束
                return True


# 创建玩家对象
player1 = fly ()

game_is_over = False


# 方法:判断敌人是否与玩家相撞,如果相撞则游戏结束,显示游戏结束画面
def gameOver(destroy):
    global game_is_over
    if destroy:
        game_is_over = True
    if game_is_over:
        fail_text = f'Game over!'
        fail_render = font2.render ( fail_text , True , (255 , 0 , 0) )
        screen.blit ( fail_render , (300 ,250 ) )
        monsters.clear ()
        return True


# 方法:判断是否击杀了足够数量(波数)的敌人,游戏胜利,显示游戏胜利画面
def gameWin(wave):
    if wave >= 5:
        win_text = f'You Win!'
        win_render = font2.render ( win_text , True , (0 , 255 , 0) )
        screen.blit ( win_render , (300 , 250) )
        monsters.clear ()
        return True


# 创建子弹类
bullets = []  # 创建列表bullets来装载子弹对象


class bullet:
    def __init__(self , x , y):
        self.x = x
        self.y = y
        self.speed = 1  # 子弹飞行速度(y轴)


# 方法:显示子弹并使其向前飞行
def show_bullet():
    for b in bullets:
        screen.blit ( bulletImg , (b.x , b.y) )
        b.y -= b.speed
        if b.y < 0:
            bullets.remove ( b )


# 方法:判断子弹是否接触敌人,如果接触则消灭敌人,同时子弹消失
def eliminate():
    for b in bullets:
        for m in monsters:
            distant = ((b.x - m.x) ** 2 + (b.y - m.y) ** 2) ** 0.5  # distance代表子弹与敌人的距离,如果距离过近则成功消灭敌人
            if distant <= 20:
                bullets.remove ( b )  # 移除本发子弹
                monsters.remove ( m )  # 消灭被击中的敌人
                return True


# 创建怪物类(敌人)
monster_numbers = 6  # 初始敌人数量


class monster:
    def __init__(self , step):
        self.x = random.randint ( 50 , 750 )
        self.y = random.randint ( 50 , 150 )
        self.step = step  # 怪物移动速度(x轴)
        self.Left_or_Right = random.randint ( 0 , 1 )  # 怪物移动方向

    # 方法:实现怪物左右移动,在移动到左右边界时,向下移动一段距离
    def move(self):
        if self.Left_or_Right:
            self.x += self.step
            if self.x > 780:  # 判断是否到达左右边界
                self.x = 780
                self.y += 30  # 向下移动,更加接近玩家
                self.Left_or_Right = 0  # 改变左右移动方向
        else:
            self.x -= self.step
            if self.x < 0:
                self.x = 0
                self.y += 30
                self.Left_or_Right = 1


# 方法:显示怪物
def show_monster():
    for m in monsters:
        screen.blit ( monsterImg , (m.x , m.y) )
        m.move ()


# 方法:当场上怪物不足时,补充新的一波敌人
def monster_add():
    for i in range ( 6 ):
        monsters.append ( monster ( 0.3 ) )
    show_monster ()


# 初始化敌人数量,首波敌人
monsters = []
for i in range ( monster_numbers ):
    monsters.append ( monster ( 0.3 ) )


# 定义计分类
class record:
    def __init__(self):
        self.kill = 0  # 击杀敌人数
        self.score = 0  # 得分数
        self.wave = 0

    def show(self):
        kill_text = f'kill:{self.kill}'
        score_text = f'score:{self.score}'
        wave_text = f'wave:{self.wave}'
        kill_render = font1.render ( kill_text , True , (255 , 0 , 0) )
        score_render = font1.render ( score_text , True , (0 , 255 , 0) )
        wave_render = font1.render ( wave_text , True , (0 , 0 , 255) )
        screen.blit ( kill_render , (10 , 10) )
        screen.blit ( score_render , (10 , 35) )
        screen.blit ( wave_render , (10 , 60) )


# 创建计分对象
r = record ()
# 杂项显示
font1 = pygame.font.Font ( None, 24 )
font2 = pygame.font.Font ( None , 60 )

# def pause():
#     pygame.time.Clock().tick(30)

if __name__ == '__main__':

    # 游戏控制器
    running = True
    # 开始游戏
    while running:
        screen.blit ( bgImg , (0 , 0) )  # 加载背景图片
        for event in pygame.event.get ():
            if event.type == pygame.QUIT:
                running = False
            player1.move ()  # 玩家移动
            player1.shoot ()  # 玩家开火
        show_bullet ()  # 显示子弹
        if eliminate ():  # 判断消灭敌人
            monster_numbers -= 1
            r.kill += 1
            r.score += 10

        show_monster ()  # 显示首波敌人
        if len ( monsters ) == 0 and not game_is_over and not gameWin ( r.wave ):  # 敌人补充判断
            monster_add ()
            r.wave += 1
        r.show ()  # 显示计分

        gameOver ( player1.destroy () )  # 判断游戏结束或胜利
        gameWin ( r.wave )

        screen.blit ( playerImg , (player1.x , player1.y) )
        player1.x += player1.step

        pygame.display.update ()

?游戏说明

游戏名称:飞机大战 V0.1

介绍:经典的横轴清关游戏(简化版),由玩家操控飞机,消灭不断靠近的敌人,直到存活到游戏结束即为胜利!

控制方法:玩家:“←”、“→”左右移动,”空格键“射击

胜利条件:消灭5波敌人并存活

失败条件:敌人接触到玩家飞机

设计

基本玩法:玩家操控敌军,通过发射子弹来消灭不断左右移动(会前进)的敌人,而敌人通过固定的移动,不断进行左右横移以及前进,来试图接近玩家。如果敌人接触了玩家,则gameover,反之,如果玩家消灭了一定数目的敌人,则游戏胜利!

玩家:战斗机造型,一台只能左右横移的飞机,方向朝上,可以向上发射子弹

敌人:外星飞船造型,出场时会随机左右移动,到达左右边界,调转方向,同时向前移动一段距离

子弹:也可以看做炮弹、导弹,由玩家飞机发射,向上飞行,与敌人接触时会消灭该敌人,一发子弹只能消灭一个敌人,暂无溅射贯穿效果

怪物出场:从屏幕上面出现,位置与左右移动方向随机,一波生成6个

玩家生成:从屏幕下面出现,位置固定

游戏胜利:暂时设定为消灭5波(即30个敌人)

计分:左上角有计分牌,分别为kill(击杀数),score(得分,消灭一个敌人得10分),wave(波数)

技术

主要编程语言:python

实现技术包括:

python基础(if...else判断、for循环、列表、运算表达式等等)

random(创建随机数,来实现随机效果)

*pygame(重点,绝大部分事件、行为和元件都是使用pygame模组)

关于图片

背景图片:bg.jpg

(以下均为ps简单制作,有点丑2333)?

玩家飞机:fly.png

敌人飞机:monster.png

?

?子弹:bullet.png

?

ps:博主是python新司机,还请大佬们多多指教(-_-)

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-10-03 17:21:42  更:2021-10-03 17:23:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 2:39:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码