import sys
import time
from settings import Settings
import pygame
from ship import Ship
from bullet import Bullet
from alien import Alien
from random import randint
from button import Button
from game_status import GameStatus
from time import sleep
from scoreboard import Scoreboard
import pygame.font
from text_board import TextBoard
import jsonUtils
from time_board import TimeBoard
from setting_button import SettingButton
from setting_screen import SetScreen
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.display.set_caption("Alien Invasion")
self.ship = Ship(self)
self.bullets = pygame.sprite.Group()
self.aliens = pygame.sprite.Group()
self.status = GameStatus(self)
self.sb = Scoreboard(self)
self.alien_time = 0
self.set_but = SettingButton(self)
# self._creat_fleet()
# 历史最高分
self.json_data = self._get_json_data()
# 左上角的最大分数
self.best_score = TextBoard(self, 20, 20)
self.best_score.prep_score('最高分:' + str(self.json_data['best']['score']))
# 是否全屏
self.full_screen = False
# 时钟对象
self.clock = pygame.time.Clock()
# 创建play按钮
self.play_button = Button(self, "Play")
# 左上角显示游戏进行多少秒
self.game_time = TimeBoard(self)
def run_game(self):
"""开始游戏的主循环"""
while True:
self.clock.tick(self.settings.max_fps)
self._check_events()
if self.status.game_active:
self.ship.update()
self._update_aliens()
self._update_bullets()
self._update_screen()
def _check_events(self):
"""响应案件和鼠标事件"""
# 监视键盘和鼠标事件
for event in pygame.event.get():
if event.type == 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:
mouse_pos = pygame.mouse.get_pos()
self._check_play_button(mouse_pos)
self._check_settings_button(mouse_pos)
def _check_settings_button(self, mouse_pos):
"""在玩家点击设置之后打开设置界面"""
button_clicked = self.set_but.rect.collidepoint(mouse_pos)
if button_clicked:
pass
## 砍了
# self.set_screen = SetScreen(self)
def _check_play_button(self, mouse_pos):
"""在玩家点击Play之后开始游戏"""
button_clicked = self.play_button.rect.collidepoint(mouse_pos)
if button_clicked and not self.status.game_active:
self.status.reset_status()
self.status.game_active = True
self.sb.prep_score()
self.game_time.reset()
self.aliens.empty()
self.bullets.empty()
# 隐藏鼠标
pygame.mouse.set_visible(False)
def _check_keydown_events(self, event):
"""响应按键"""
if event.key == pygame.K_RIGHT:
# 向右移动飞船
self.ship.moving_right = True
elif event.key == pygame.K_LEFT:
# 向右移动飞船
self.ship.moving_left = True
elif event.key == pygame.K_UP:
# 向上移动飞船
self.ship.moving_up = True
elif event.key == pygame.K_DOWN:
# 向下移动飞船
self.ship.moving_down = True
elif event.key == pygame.K_ESCAPE:
self._exit_before()
sys.exit()
elif event.key == pygame.K_BACKQUOTE:
# 按~切换是否全屏
self.full_screen ^= True
if self.full_screen:
self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
self.settings.screen_width = self.screen.get_rect().width
self.settings.screen_height = self.screen.get_rect().height
else:
self.settings.screen_width = self.settings.screen_width_default
self.settings.screen_height = self.settings.screen_height_default
self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
self._update_settings()
elif event.key == pygame.K_SPACE:
self._fire_bullet()
def _check_keyup_events(self, event):
"""响应松开"""
if event.key == pygame.K_RIGHT:
self.ship.moving_right = False
elif event.key == pygame.K_LEFT:
self.ship.moving_left = False
elif event.key == pygame.K_DOWN:
self.ship.moving_down = False
elif event.key == pygame.K_UP:
self.ship.moving_up = False
def _fire_bullet(self):
"""创建一颗子弹,并加入到编组bullets中"""
if len(self.bullets) < self.settings.bullet_allowed:
new_bullet = Bullet(self)
self.bullets.add(new_bullet)
def _update_screen(self):
"""更新屏幕上的图像,并切换到新屏幕"""
# 每次循环时都重绘屏幕
self.screen.fill(self.settings.bg_color)
self.ship.blitme()
for bullet in self.bullets.sprites():
bullet.draw_bullet()
self.aliens.draw(self.screen)
self.sb.show_score()
self.game_time.show()
self.best_score.show_score()
self.set_but.draw_button()
#
if not self.status.game_active:
self.play_button.draw_button()
# 让最近绘制的屏幕可见
pygame.display.flip()
def _get_json_data(self):
return jsonUtils.read_json('data.json')
def _update_settings(self):
"""更新屏幕大小"""
self.ship.screen = self.screen
self.ship.screen_rect = self.screen.get_rect()
self.ship.settings = self.settings
# 可以优化使得比例不变
self.ship.rect.bottom = self.screen.get_rect().bottom
def _update_bullets(self):
"""更新子弹位置并删除消失的子弹"""
collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)
if collisions:
for aliens in collisions.values():
self.status.score += self.settings.alien_points * len(aliens)
self.sb.prep_score()
self.bullets.update()
# 删除超过屏幕的子弹
for bullet in self.bullets.copy():
if bullet.rect.bottom <= 0:
self.bullets.remove(bullet)
def _update_aliens(self):
"""更新外星人位置信息和生成外星人"""
self.aliens.update()
if pygame.sprite.spritecollideany(self.ship, self.aliens):
self._alien_hit()
# 一定时间后随机生成一个外星人
self.alien_time += 1
if self.alien_time >= self.settings.alien_speed_add:
self.alien_time %= self.settings.alien_speed_add
self._creat_alien()
# 判定击中情况
for alien in self.aliens.copy():
if alien.rect.bottom >= self.settings.screen_height:
if self.settings.ships_left > 1:
self._alien_hit()
else:
self.status.game_active = False
# 一局游戏结束,计算成绩
self._exit_before()
pygame.mouse.set_visible(True)
self.aliens.remove(alien)
elif alien.rec
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【资源说明】 基于python开发的外星人入侵小游戏源码+详细注释+项目说明.zip 已完成功能 - 方向键控制飞船上下左右运动 - 飞船发射子弹 - 开始按钮 - 计分系统 - ~ 切换全屏和恢复 - 可以用子弹消灭外星人 - 外星人初始的方向随机 - 可以设置最大帧率 - 保存游戏记录 - JSON保存 - JSON存储过去游戏记录,最高分 - 显示游戏时间 - 左上角显示时间 - 游戏重置时会把飞船重新放在屏幕最底下的中间 - 飞船碰到外星人会扣血 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
资源推荐
资源详情
资源评论



















收起资源包目录































共 26 条
- 1
资源评论

- fgyjy2023-11-03这个资源对我启发很大,受益匪浅,学到了很多,谢谢分享~

onnx
- 粉丝: 1w+
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 信息化技术在档案管理中的应用.docx
- 互联网医美行业研究报告.pdf
- PLC基本编程实例.docx
- VB程序实现算法三种基本结构.ppt
- 光通信:第07章光放大器教学案例.ppt
- (基于二维Arnold变换非等长数字图像置乱算法研究)(可编辑修改word版).docx
- 财税实务:计算机记账的基本要求.pdf
- 网络通信技术现状与发展趋势说课材料.ppt
- 2023年全套知识点练习计算机应用基础网络统考选择题共题全面.docx
- 基于服务器集群的Web-QoS控制研究的开题报告.docx
- DB21_T_2091_2013_蛋鸡健康安全养殖饲料配制与使用技术规范.pdf
- JB T 9233.12-1999 工业自动化仪表通用试验方法.加速寿命试验.pdf
- 电气控制与PLC应用期末总复习.doc
- 2021年全国7月高等教育自学考试04742通信概论试题及答案.doc
- mapgis操作手册上.doc
- 南开大学2021年9月《移动电子商务》作业考核试题及答案参考4.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
