Python项目1“外星人入侵”游戏(完整)及pyinstaller打包过程(含几种报错解决办法)

一、项目环境背景介绍

1.Pycharm版本:社区2017.2.7版本

在这里插入图片描述

2.对应python版本:3.6.4版本

在这里插入图片描述
环境搭建的帖子(这位哥们写得很细的 点赞):https://blog.csdn.net/wardseptember/article/details/79965836

3.基于以上环境开发一个游戏

在游戏《外星人入侵》中,玩家控制着一艘最初出现在屏幕底部中央的飞船。玩家可以使用箭头键左右移动飞船,还可使用空格键进行射击。游戏开始时,一群外星人出现在天空中,他们在屏幕中向下移动。玩家的任务是射杀这些外星人。玩家将所有外星人都消灭干净后,将出现一群新的外星人,他们移动的速度更快。只要有外星人撞到了玩家的飞船或到达了屏幕底部,玩家就损失一艘飞船。玩家损失三艘飞船后,游戏结束。(本游戏附加各种音效)

4.游戏项目的目录结构如下
>D\Python-Projects
	>a book of py
		>Projects
			>Project 1(alien_invasion) chapter 12-14
				>alien_invasion
					>images	
						>alien.bmp
						>ship.bmp
					>musics
						>Bullet_biu.wav
						>Explo_Large.wav
						>Explo_Small.wav
						>order_music.mp3
					>alien_invasion.py(主文件)
					>game_functions.py(功能函数)
					>alien.py(外星人)
					>ship.py(飞船)
					>bullet.py(子弹)
					>button.py(play按钮)
					>settings.py(游戏属性设置)
					>scoreboard.py(分数)
					>game_stats.py(游戏状态)
					>music.py(音效)
					>Max_score.json(历史最高分记录文件)

二、项目过程中所有的.py文件代码

1.alien_invasion.py(主文件)
# coding: UTF-8
# 项目1:外星人入侵

# 系统自带的类或函数
# import sys  # 退出游戏----集中在game_functions.py中使用,故这注释掉
import pygame   # 含有开发游戏所需功能
from pygame.sprite import Group     # 存储所有有效子弹的类

# 自定义的类或函数
from settings import Settings   # 对《外星人入侵》游戏中所有设置的类,如屏幕宽高…
from ship import Ship   # 创建飞船的类
from button import Button   # 创建按钮的类
from game_stats import Game_Stats   # 创建跟踪游戏统计信息的类
from scoreboard import Scoreboard   # 创建得分类
from music import bg_music  # 背景音乐
import game_functions as gf     # 所有的功能函


def run_game():
    # 初始化游戏并创建一个屏幕对象
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("外星人入侵")

    # 初始化声音播放模块
    pygame.mixer.init()

    # 创建Play按钮
    play_button = Button(ai_settings, screen, "Play")

    # 创建一艘飞船
    ship = Ship(ai_settings, screen)

    # 创建一个用于存储子弹的编组
    bullets = Group()

    # 创建一个用于存储外星人的编组
    aliens = Group()

    # 创建存储游戏统计信息的实例
    game_stats = Game_Stats(ai_settings)

    # 创建记分牌
    scoreb = Scoreboard(ai_settings, screen, game_stats)

    # 创建外星人群
    gf.create_fleet(ai_settings, screen, ship, aliens)

    # 加载背景音乐
    bg_music()

    # 开始游戏的主循环
    while True:

        # 调用响应鼠标和键盘事件的函数
        gf.check_events(ai_settings, screen, game_stats, scoreb, play_button, ship, aliens, bullets)

        if game_stats.game_active:

            # 调用背景音乐
            gf.play_bg_music()
            # 调用飞船水平持续移动的函数
            ship.update()

            # 调用关于子弹相关操作的函数
            gf.update_bullets(ai_settings, screen, game_stats, scoreb, ship, aliens, bullets)

            # 调用外星人向右移动的函数
            gf.update_aliens(ai_settings, game_stats, scoreb, screen, ship, aliens, bullets)

        # 调用更新屏幕上的图像并切换到新屏幕的函数
        gf.update_screen(ai_settings, screen, game_stats, scoreb, ship, aliens, bullets, play_button)


run_game()  # 此时运行的话 会弹出一个pygame窗口

2.game_functions.py(功能函数)
# coding: UTF-8
# 《外星人入侵》运行的所有函数

import sys
import pygame

from bullet import Bullet
from alien import Alien
from time import sleep
import json
import music


def play_bg_music():
    """背景音乐"""
    if not pygame.mixer.music.get_busy():
        pygame.mixer.music.play()


def check_keydown_events(event, ai_settings, screen, ship, bullets, game_stats, scoreb, aliens):
    """"
        响应鼠标按下操作
    """
    # 按右箭头飞船向右移动
    if event.key == pygame.K_RIGHT:
        ship.moving_right = True
    # 按左箭头飞船向左移动
    elif event.key == pygame.K_LEFT:
        ship.moving_left = True

    # 按空格键创建一颗子弹并将其加入到编组bullets中
    elif event.key == pygame.K_SPACE:
        fire_bullet(ai_settings, screen, ship, bullets)

    # 按p开始游戏
    elif event.key == pygame.K_p:
        start_game(ai_settings, screen, ship, bullets, game_stats, scoreb,
                   aliens)

    # 按z暂停游戏3s
    elif event.key == pygame.K_z:
        sleep(2)

    # 按q退出游戏并把最高分写入文件
    elif event.key == pygame.K_q:
        with open('Max_score.json', 'w', encoding='UTF-8') as file:
            json.dump(game_stats.high_score, file)
        sys.exit()


def fire_bullet(ai_settings, screen, ship, bullets):
    """
        按照要求发射子弹数量
    """
    if len(bullets) < ai_settings.bullet_allowed:
        music.bullet_biu()                              # 发射子弹的声音
        new_bullet = Bullet(ai_settings, screen, ship)  # 如果还没有到达限制,就发射一颗子弹
        bullets.add(new_bullet)                         # 创建一颗子弹,并将其加入到编组bullets中


def start_game(ai_settings, screen, ship, bullets, game_stats, scoreb,
               aliens):
    """
        P264中动手试一试14-1的练习:让玩家按p开始游戏
    """
    # 重置游戏统计信息
    game_stats.reset_stats()
    game_stats.game_active = True

    # 重置记分牌图像
    scoreb.prep_score()
    scoreb.prep_high_score()
    scoreb.prep_level()
    scoreb.prep_ships()

    # 清空外星人列表和子弹列表
    aliens.empty()
    bullets.empty()

    # 创建一群新的外星人,并让飞船居中
    create_fleet(ai_settings, screen, ship, aliens)
    ship.center_ship()

    # 暂停让用户反应一会
    sleep(0.5)


def 
  • 10
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值