pygame飞机大战小游戏(python大作业)

这篇具有很好参考价值的文章主要介绍了pygame飞机大战小游戏(python大作业)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

pygame飞机大战小游戏(python大作业)

 文章来源地址https://www.toymoban.com/news/detail-500254.html

 一、项目背景

python大作业,在查看了老师给的链接发现教学视频不完整,所以借用了同学的《Python编程 从入门到实践》中的一个项目,学习模仿。

二、游戏具体介绍

  • 这是一款由辉辉亲自打造的太空对战小游戏。
  • 游戏背景:在广袤无垠的太空里有一群蓝精灵(不是)有一群邪恶的坏人,你的任务就是驾驶飞船摧毁他们。摧毁一群外星人,你的等级会高一级,同时你的子弹速度以及敌人也会变得更快,努力去超过那个最高分吧!
  • 生命:一共四条,珍惜生命!
  • 玩法:点击键盘的a向左走,点击键盘的d向右走,点击鼠标左键发射子弹。
  • 功能(不建议多按,因为会出死机):i键:控制背景音乐;o键:控制音效;q键:停止游戏。
  • 彩蛋:w键:连续发射子弹;p键:可以召唤超级武器;

三、主要代码

主函数:

# -*- coding: utf-8 -*-
"""
Created on Tue Nov 29 17:44:22 2022

@author: 18705
"""
'''self就是创建可以引用的一个值
可以传递的实参,其他形参靠他。
同时,self.name是属性,self.name()是方法。super是父类等等。'''

import sys
from time import sleep

import pygame

from settings import Settings
from game_stats import GameStats
from scoreboard import Scoreboard
from button import Button
from buttonhelp import ButtonHelp
from ship import Ship
from bg import Bg
from bullet import Bullet
from alien import Alien
from music import Music

class AlienInvasion:
    '''管理游戏资源和行为的类'''
    def __init__(self):
        '''初始化游戏并且创建游戏资源'''
        pygame.init()
        
        self.settings = Settings()
        
        self.screen = pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height),pygame.RESIZABLE)
        icon = pygame.image.load("images/plant.png")
        pygame.display.set_icon(icon)
        pygame.display.set_caption("星球大战")
        #创建一个用于统计游戏信息的示例
        #并创建记分牌
        self.stats = GameStats(self)
        self.sb = Scoreboard(self)
        #外星飞船
        self.bg =Bg(self)
        self.ship = Ship(self)
        self.bullets = pygame.sprite.Group()
        self.aliens = pygame.sprite.Group()
        self.music = Music(self)
        #背景音乐
        #背景音乐的播放不能放到主循环里面
        self.music.bgm2()
        #尝试换音乐,失败了
        '''
        self.control_bgm_t = True
        if self.control_bgm_t:
            self.music.bgm2()
        else:
            self.music.bgm1()
        '''
        self.control_bgm = False
        self.n=False
        #设置背景颜色
        #self.bg_color = (230,230,230)
        #创建外星人群
        self._create_fleet()
        
        #创建Play按钮
        self.play_button = Button(self,'play')
        #创建Help按钮
        self.help_button = ButtonHelp(self,'help')
        #连发子弹
        self.control_bullet = False
        #关闭音效
        self.control_sound = True
        self.nn = False
        #大子弹
        self.control_bullet_big = False
        
    def run_game(self):
        '''开始游戏的主循环'''
        
        while True:
            self._check_events()
            if self.stats.game_active:
                self.ship.update()
                self._update_bullets()
                self._update_aliens()
                
            self._update_screen()
            #自动发射子弹
            if self.control_bullet:
                self._fire_bullet()
            #控制bgm开关
            if self.control_bgm:
                self.music.bgm_pause()
                self.n=True
            elif not self.control_bgm and self.n==True:
                self.music.bgm_unpause()
                self.n= not self.n
    def _check_events(self):
            #监视键盘和鼠标事件
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    #将高分添加到txt中
                    with open('high_score.txt','w') as file_object:
                        file_object.write(str(self.stats.high_score))
                    file_object.close()
                    pygame.quit()
                    sys.exit()
                    #设置长按移动
                elif event.type == pygame.KEYDOWN:
                    self._check_keydown_events(event)
                elif event.type == pygame.KEYUP:
                    self._check_keyup_events(event)
                elif event.type == pygame.MOUSEBUTTONDOWN:
                    self._check_mousebuttondown_events(event)
                    
    def _check_keydown_events(self,event):
        '''相应按键'''
        if event.key == pygame.K_d:
        #向右移动飞船
            self.ship.moving_right = True
        elif event.key == pygame.K_a:
        #向左移动飞船
            self.ship.moving_left = True
        elif event.key == pygame.K_q:
            #将高分添加到txt中
            with open('high_score.txt','w') as file_object:
                file_object.write(str(self.stats.high_score))
            file_object.close()
            pygame.quit()
            sys.exit()
        elif event.key == pygame.K_w:
            self.control_bullet =not self.control_bullet 
        elif event.key == pygame.K_i:
            self.control_bgm = not self.control_bgm           
        elif event.key == pygame.K_o:
            self.control_sound = not self.control_sound 
        #elif event.key == pygame.K_p:
            #self.control_bgm_t = not self.control_bgm_t
        elif event.key == pygame.K_p:
            self.control_bullet_big = not self.control_bullet_big
            
    def _check_keyup_events(self,event):
        '''响应松开'''
        if event.key == pygame.K_d:
        #向右移动飞船
            self.ship.moving_right = False
        elif event.key == pygame.K_a:
        #向右移动飞船
            self.ship.moving_left = False
    
    def _check_mousebuttondown_events(self,event):
        '''响应鼠标'''
        if event.button == 1:
            self._fire_bullet()
        #设置play的功能和help的功能,其实应该封装一下的,哈哈哈哈。偷懒了
        button_clicked = self.play_button.rect.collidepoint(event.pos)
        buttonhelp_clicked = self.help_button.rect.collidepoint(event.pos)
        if button_clicked and not self.stats.game_active:
            #重置游戏设置
            self.settings.initialize_dynamic_settings()
            #重置游戏统计·信息
            self.stats.reset_stats()
            self.stats.game_active = True 
            self.sb.prep_score()
            self.sb.prep_level()
            self.sb.prep_ships()
            #清空余下的外星人和子弹
            self.aliens.empty()
            self.bullets.empty()
            
            #创建一群新外星人并且居中
            self._create_fleet()
            self.ship.center_ship()
            
            #隐藏鼠标光标
            pygame.mouse.set_visible(False)
        if buttonhelp_clicked and not self.stats.game_active:
            with open('help.txt',encoding='utf-8') as helptext:
                content = helptext.read()
            print(content)
            helptext.close()
    def _fire_bullet(self):
        if len(self.bullets)<self.settings.bullets_allowed:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)
            #控制子弹音效
            if self.control_sound:
                self.music.bullet()
                self.nn = True
            elif not self.control_sound and self.nn:
                self.music.bullet_stop()
                self.nn = not self.nn
    def _update_bullets(self):
         self.bullets.update()
            
            #删除消失的子弹
         for bullet in self.bullets.copy():
             if bullet.rect.bottom <=0:
                 self.bullets.remove(bullet)
         #print(len(self.bullets))
         #检查是否有子弹击中外星人
         self._check_bullet_alien_collisions()
    
    def _check_bullet_alien_collisions(self):
        '''响应子弹和外星人碰撞'''
        collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)
        if collisions:
            for aliens in collisions.values():
                #控制子弹和外星人碰撞音效
                if self.control_sound:
                    self.music.alien()
                    self.nn = True
                elif not self.control_sound and self.nn:
                    self.music.alien_stop()
                    self.nn = not self.nn
                self.stats.score += self.settings.alien_points*len(aliens)
                self.sb.prep_score()
                self.sb.check_high_score()
                
        if not self.aliens:
             #删除现有的子弹并新建一群外星人
             self.bullets.empty()
             self._create_fleet()
             self.settings.increase_speed()
             
             #提高等级
             self.stats.level +=1
             self.sb.prep_level()
         
         
    def _update_aliens(self):
        '''更新外星人位置'''
        self._check_fleet_edges()
        self.aliens.update()
        
        #检测外星人和飞船之间的碰撞
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            #print("Ship hit!!!")
            self._ship_hit()
        
        #检查是否有外星人到达了屏幕底端
        self._check_aliens_bottom()
        
    def _create_fleet(self):
        '''创建外星人群。'''
        alien = Alien(self)
        alien_width,alien_height = alien.rect.size
        available_space_x = self.settings.screen_width - (2*alien_width)
        number_aliens_x = available_space_x // (2*alien_width)
        
        #计算屏幕可以容纳多少外星人
        ship_height = self.ship.rect.height
        available_space_y = (self.settings.screen_height - (3*alien_height) 
                             - ship_height)#每行不超过79个字符
        number_rows = available_space_y // (2*alien_height)
        
        #创建外星人群
        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                self._create_alien(alien_number,row_number)
            
    def _create_alien(self,alien_number,row_number):
        alien = Alien(self)
        alien_width,alien_height = alien.rect.size
        alien.x = alien_width + 2*alien_width*alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien.rect.height + 2*alien.rect.height*row_number
        self.aliens.add(alien)
    
    def _check_fleet_edges(self):
        '''有外星人到达边缘采取响应的措施'''
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_fleet_direction()
                break
    def _change_fleet_direction(self):
        '''整群下移,改变方向'''
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *=-1
        
    def _ship_hit(self):
        '''响应飞船被外星人撞到'''
        if self.stats.ships_left >0:
            
        #将ship_left减一并更新记分牌
            self.stats.ships_left -=1
            self.sb.prep_ships()
        #清空余下的外星人和子弹
            self.aliens.empty()
            self.bullets.empty()
        
        #创建一群新的外星人,并将飞船放到屏幕底端的中央
            self._create_fleet()
            self.ship.center_ship()
        #爆炸效果
            self.music.blitme()
            pygame.display.flip()
            #控制飞船和外星人碰撞音效
            if self.control_sound:
                self.music.bow()
                self.nn = True
            elif not self.control_sound and self.nn:
                self.music.bow_stop()
                self.nn = not self.nn
            
        #暂停
            sleep(2)
        else:
            self.stats.game_active = False
            pygame.mouse.set_visible(True)
    
    def _check_aliens_bottom(self):
        '''检查外星人是否到达了屏幕底端'''
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >=screen_rect.bottom:
                #像飞船悲壮一样处理
                self._ship_hit()
                break
        
    
    def _update_screen(self):
                
            #每次循环都重绘屏幕
            self.screen.fill(self.settings.bg_color)
            self.bg.action()
            # 绘制元素图片
            self.bg.blitme()
            #self.bg.blitme()
            self.ship.blitme()
            #让最近绘制的屏幕可见
            for bullet in self.bullets.sprites():
                bullet.draw_bullet()
            self.aliens.draw(self.screen)
            
            #显示得分
            self.sb.show_score()
            
            #如果游戏处于非活动状态,就绘制Play按钮
            if not self.stats.game_active:
                self.play_button.draw_button()
            if not self.stats.game_active:
                self.help_button.draw_button()
            
            pygame.display.flip()
        
if __name__ == '__main__':
    #创建游戏实例并运行游戏
    ai = AlienInvasion()
    ai.run_game()

子弹函数:

# -*- coding: utf-8 -*-
"""
Created on Tue Nov 29 21:42:02 2022

@author: 18705
"""

import pygame
from pygame.sprite import Sprite


class Bullet(Sprite):
    '''管理飞船所发子弹的类'''
    def __init__(self,ai_game):
        '''在飞船当前位置创建一个子弹对象'''
        super().__init__()
        self.screen =ai_game.screen
        self.settings= ai_game.settings
        self.control_bullet_b = ai_game.control_bullet_big
        if  not self.control_bullet_b:
            
            self.color = self.settings.bullet_color
        #在(0,0)处创建一个表示子弹的矩形,再设置正确的位置
            self.rect = pygame.Rect(0,0,self.settings.bullet_width,self.settings.bullet_height)
            self.rect.midtop = ai_game.ship.rect.midtop
        #存储用小鼠表示的子弹位置
            self.y = float(self.rect.y)
        else:
            self.color = self.settings.bullet_color_s
        #在(0,0)处创建一个表示子弹的矩形,再设置正确的位置
            self.rect = pygame.Rect(0,0,self.settings.bullet_width_s,self.settings.bullet_height_s)
            self.rect.midtop = ai_game.ship.rect.midtop
        #存储用小鼠表示的子弹位置
            self.y = float(self.rect.y)
            
    def update(self):
        self.y -= self.settings.bullet_speed
        self.rect.y = self.y
        
    def draw_bullet(self):
        pygame.draw.rect(self.screen, self.color, self.rect)

飞船函数:

# -*- coding: utf-8 -*-
"""
Created on Tue Nov 29 19:41:00 2022

@author: 18705
"""

import pygame
from pygame.sprite import Sprite

class Ship(Sprite):
    '''管理飞船的类'''
    #ai_game就是主函数,可能因为这个函数是个子函数
    def __init__(self,ai_game):
        '''初始化飞船并设置其初始位置'''
        super().__init__()
        self.screen = ai_game.screen
        #self.settings = ai_game.settings
        self.screen_rect = ai_game.screen.get_rect()
        
        #加载飞船图像并获取其外接矩形
        self.image = pygame.image.load('images/ship.bmp')
        #self.image = pygame.transform.scale(self.image, (128, 128))
        self.rect = self.image.get_rect()
        
        #对于没搜辛飞船,都将其放在屏幕底部中央
        self.rect.midbottom = self.screen_rect.midbottom
        
        #在飞船的x属性中存储小数值
        #self.x=float(self.rect.x)
        
        #移动标志
        self.moving_right = False
        self.moving_left = False
    
    def update(self):
        '''根据移动标志调整飞船的位置'''
        #更新飞船而不是rect对象的x值
        if self.moving_right and self.rect.right < self.screen_rect.right:
            self.rect.x += 1
        if self.moving_left and self.rect.left > 0:
            self.rect.x -= 1
        
        #根据self.x更新rect对象
        #self.rect.x = self.x
    
    def blitme(self):
        '''在指定位置绘制飞船'''
        self.screen.blit(self.image,self.rect)
    
    def center_ship(self):
        '''让飞船在屏幕底端居中'''
        self.rect.midbottom = self.screen_rect.midbottom
        self.x = float(self.rect.x)

设置函数:

# -*- coding: utf-8 -*-
"""
Created on Tue Nov 29 19:19:42 2022

@author: 18705
"""

class Settings:
    '''存储游戏里的所有设置类'''
    def __init__(self):
        '''初始化游戏静态设置'''
        #屏幕设置
        self.screen_width = 1200
        self.screen_height = 800
        self.bg_color = (230,230,230)
        
        
        #飞船设置
        #self.ship_speed = 1.5
        self.ship_limit = 3#飞船的数量
        
        #子弹设置
        
        self.bullet_width =5
        self.bullet_height =20
        self.bullet_color =(255,215,0)
        self.bullets_allowed = 15
        
        #超级武器设置
        self.bullet_width_s =600
        self.bullet_height_s =40
        self.bullet_color_s =(255,0,0)
        #外星人设置
        
        self.fleet_drop_speed =10
        
        #加快游戏节奏的速度
        self.speedup_scale = 1.2
        #外行人分数提高速度
        self.score_scale = 2
        
        self.initialize_dynamic_settings()
        
    def initialize_dynamic_settings(self):
        '''初始化随游戏进行而变化的设置'''
        #self.ship_speed = 1.5
        self.bullet_speed =1.5
        self.alien_speed = 1.0
        self.bg_speed = 0.2
         #1是向右,-1是向左
        self.fleet_direction = 1
        #计分
        self.alien_points = 1
        
        
    def increase_speed(self):
        '''提高速度设置和外星人分数'''
        #self.ship_speed *= self.speedup_scale
        self.bullet_speed *= self.speedup_scale
        self.alien_speed *= self.speedup_scale
        self.bg_speed *= self.speedup_scale
        
        self.alien_points = int(self.alien_points * self.score_scale)

想要全部的代码包(记得给我个小星星star哦):

GitHub - huihuihenqiang/aircraft-battle-python-: 这是个用pygame编写的python小游戏,仅供学习使用这是个用pygame编写的python小游戏,仅供学习使用. Contribute to huihuihenqiang/aircraft-battle-python- development by creating an account on GitHub.https://github.com/huihuihenqiang/aircraft-battle-python-

四、github上传项目

点击右上角的“+”

pygame飞机大战小游戏(python大作业)

然后选择New repository

 pygame飞机大战小游戏(python大作业)

 填写自己项目的Repository name 和 Description,其他的默认即可。pygame飞机大战小游戏(python大作业)

 最后点击这个绿色的玩意儿就行。

pygame飞机大战小游戏(python大作业)

 然后点击上传自己的项目就完成了。当然你也可以修改自己的read.me来介绍自己的项目。

pygame飞机大战小游戏(python大作业)

 

到了这里,关于pygame飞机大战小游戏(python大作业)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python课程设计 飞机大战小游戏

    目录 飞机大战小游戏 1.概述 1.1 开发环境及技术 1.2 实现功能描述 1.2.1主要的工作内容 1.2.2 实现功能 1.2.3 功能完善 1.2.4 参考项目 2.项目介绍 2.1 项目内容介绍 2.2 项目介绍 2.2.1 项目代码逻辑 2.2.2 涉及到的知识 2.2.3 遇到的问题 2.3 最终运行效果​编辑 3.附件 3.1 Bullet。py 3.

    2024年01月17日
    浏览(47)
  • 用python写(飞机大战小游戏)

    w\\\'cwc下面我们进入详细教程:   一、首先我们先建一个文件夹 planewars(名字随便取):  然后用我们python中的pycharm打开这个文件,我们飞机大战的项目就在这进行 二、我们要写这个小游戏要用到pygame模         补充: Pygame是一个利用SDL库的写就的游戏库,Pygame就是Python中使用

    2024年02月09日
    浏览(45)
  • 使用Python制作的小游戏---飞机大战

    1.pygame模块 1. 熟悉Python面向对象编程的方法和套路 1.敌机模块 2. 地图模块 3. 得分模块 4 .英雄飞机模块 5. 子弹模块 6. 主模块

    2024年02月03日
    浏览(42)
  • python小游戏毕设 飞机大战设计与实现

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 飞机大战小游戏设计与实现 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:3分 利用Python制作的一个简易版类\\\"飞机大

    2024年02月10日
    浏览(50)
  • Python开发小游戏:写一个飞机大战只需要500行代码!

    ‘’’ :param background_image_path: 背景图片的路径地址 :param size: 游戏窗口的大小 :param title: 游戏窗口的标题 :param font_name: 指定字体 :param font_size: 指定字体大小 :param speed: 背景图滚动整个窗口一次所用时间,单位为ms ‘’’ self.size = size self.screen = pygame.display.set_mode(size) self.tit

    2024年04月11日
    浏览(43)
  • 前端技术搭建飞机大战小游戏(内含源码)

    上周我们实通过前端基础实现了弹珠游戏,当然很多伙伴再评论区提出了想法,后续我们会考虑实现的,今天还是继续按照我们原定的节奏来带领大家完成一个飞机大战游戏,功能也比较简单简单,也是想借助这样一个简单的功能,然后来帮助大家了解我们JavaScript在前端中的

    2024年02月04日
    浏览(43)
  • 【python大作业】pygame实战(python编写2048小游戏)

    本文介绍基于pygame编写的2048小游戏程序 包含四个文件 运行效果: 点击此处下载完整程序,下载即可运行 其中config.py用于设置游戏参数 包括游戏窗口大小,刷新率,方块颜色等 game.py中定义了游戏实现的函数,设置方块的产生,移动与计算,并判断游戏进行的程度,判断游

    2024年02月13日
    浏览(47)
  • python项目分享 - python坦克大战小游戏

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 坦克大战小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取:

    2024年02月03日
    浏览(38)
  • python项目分享 - 坦克大战小游戏设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 坦克大战小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取:

    2024年02月01日
    浏览(46)
  • python项目分享 坦克大战小游戏设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 坦克大战小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取:

    2024年01月25日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包