简介

根据《Python编程:从入门到实践》这本书的指导所编写的,基本没有改动,只是增加了上下移动和p键开始以及历史最高分的记录三个额外功能
因为只是按照书上知道编写,所以详细的内容其实并没有学会,只是为了熟悉流程和一部分知识,其中历史最高分的记录必须一开始在文档里输入起始值才可以运行游戏(这里是懒得继续调试了)
另外有很多的不足之处也没有改,但基本的功能都实现了,大家如果有按照这本书敲代码的可以试着参考一下。
一共十个程序,两个图片,txt文件没有放的必要

程序部分

  • 简介
  • alien_invasion.py(主程序)
  • alien.py
  • bullet.py
  • button.py
  • game_function.py(最重要的部分,函数功能基本都集中在这里)
  • game_stats.py
  • scoreboard.py
  • settings.py(基本设置参数)
  • ship.py
  • show_the_key.py
  • 图片
  • the_highest_score为txt文件,记录历史最高分,一开始其中输入了0

alien_invasion.py(主程序)

import pygamefrom settings import Settings
from game_stats import GameStats
from button import Button
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
from scoreboard import  Scoreboarddef run_game():#初始化游戏并创建一个屏幕对象pygame.init()ai_settings = Settings()screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))pygame.display.set_caption("Alien Invasion_楚")play_button = Button(ai_settings, screen, "Play")stats = GameStats(ai_settings)sb = Scoreboard(ai_settings, screen, stats)ship = Ship(ai_settings,screen)bullets = Group()aliens = Group()gf.create_fleet(ai_settings, screen, ship, aliens)bg_color = (230, 230, 230)#change the colorwhile True:#用来监视键盘和鼠标活动gf.check_events(ai_settings, screen, stats, sb, play_button, ship,aliens, bullets)if stats.game_active == True:ship.update()gf.update_bullets(ai_settings, screen, stats, sb, ship,aliens, bullets)gf.update_aliens(ai_settings, screen, stats, sb, ship,aliens, bullets)gf.update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets,play_button)run_game()

alien.py

import pygame
from pygame.sprite import Spriteclass Alien(Sprite):def __init__(self, ai_settings, screen):super().__init__()self.screen = screenself.ai_settings = ai_settingsself.image = pygame.image.load('images/alien.bmp')self.rect = self.image.get_rect()self.rect.x = self.rect.widthself.rect.y = self.rect.heightself.x = float(self.rect.x)def blitme(self):self.screen.blit(self.image, self.rect)def update(self):self.x += (self.ai_settings.alien_speed_factor *self.ai_settings.fleet_direction)self.rect.x = self.xdef check_edges(self):screen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right:return Trueelif self.rect.left <= 0:return True

bullet.py

import pygame
from pygame.sprite import Spriteclass Bullet(Sprite):def __init__(self, ai_settings, screen, ship):super().__init__()self.screen = screenself.rect = pygame.Rect(0, 0, ai_settings.bullet_width,ai_settings.bullet_height)self.rect.centerx = ship.rect.centerxself.rect.top = ship.rect.topself.y = float(self.rect.y)self.color = ai_settings.bullet_colorself.speed_factor = ai_settings.bullet_speed_factordef update(self):self.y -= self.speed_factorself.rect.y = self.ydef draw_bullet(self):pygame.draw.rect(self.screen,self.color,self.rect)

button.py

import pygame.fontclass Button:def __init__(self, ai_settings, screen, msg):self.screen = screenself.screen_rect = screen.get_rect()self.width, self.height = 200, 50self.button_color = (0, 255, 0)self.text_color = (255, 255, 255)self.font = pygame.font.SysFont(None, 48)self.rect = pygame.Rect(0, 0, self.width, self.height)self.rect.center = self.screen_rect.centerself.prep_msg(msg)def prep_msg(self, msg):self.msg_image = self.font.render(msg, True, self.text_color, self.button_color)self.msg_image_rect = self.msg_image.get_rect()self.msg_image_rect.center = self.rect.centerdef draw_button(self):self.screen.fill(self.button_color, self.rect)self.screen.blit(self.msg_image, self.msg_image_rect)

game_function.py(最重要的部分,函数功能基本都集中在这里)

import sys
import pygame
from bullet import Bullet
from alien import Alien
from time import sleepdef check_keydown_events(event, ai_settings, screen, stats, sb, play_button,ship, aliens, bullets):if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueif event.key == pygame.K_UP:ship.moving_up = Trueelif event.key == pygame.K_DOWN:ship.moving_down = Trueelif event.key == pygame.K_SPACE:fire_bullet(ai_settings, screen, ship, bullets)elif event.key == pygame.K_q:pygame.quit()sys.exit()elif event.key == pygame.K_p:start_game(ai_settings, screen, stats, sb, play_button, ship, aliens,bullets)def check_keyup_events(event,ship):if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = Falseif event.key == pygame.K_UP:ship.moving_up = Falseelif event.key == pygame.K_DOWN:ship.moving_down = Falsedef check_events(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets):for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:check_keydown_events(event, ai_settings, screen, stats, sb,play_button, ship,aliens, bullets)elif event.type == pygame.KEYUP:check_keyup_events(event,ship)elif event.type == pygame.MOUSEBUTTONDOWN:mouse_x, mouse_y = pygame.mouse.get_pos()check_play_button(ai_settings, screen, stats, sb, play_button, ship,aliens, bullets, mouse_x, mouse_y)def update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets,play_button):screen.fill(ai_settings.bg_color)for bullet in bullets.sprites():bullet.draw_bullet()ship.blitme()aliens.draw(screen)sb.show_score()if not stats.game_active:play_button.draw_button()pygame.display.flip()def update_bullets(ai_settings, screen, stats, sb, ship, aliens, bullets):bullets.update()for bullet in bullets.copy():if bullet.rect.bottom <= 0:bullets.remove(bullet)check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship,aliens, bullets)def fire_bullet(ai_settings, screen, ship, bullets):if len(bullets) <= ai_settings.bullets_allowed:new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet)def create_fleet(ai_settings, screen, ship, aliens):alien = Alien(ai_settings, screen)number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)number_rows = get_number_rows(ai_settings, ship.rect.height,alien.rect.height)for row_number in range(number_rows):for alien_number in range(number_aliens_x):create_alien(ai_settings, screen, aliens, alien_number,row_number)def get_number_aliens_x(ai_settings, alien_width):available_space_x = ai_settings.screen_width - 2 * alien_widthnumber_aliens_x = int(available_space_x / (2 * alien_width))return number_aliens_xdef create_alien(ai_settings, screen, aliens, alien_number, row_number):alien = Alien(ai_settings, screen)alien_width = alien.rect.widthalien.x = alien_width + 2 * alien_width * alien_numberalien.rect.x = alien.xalien.rect.y = alien.rect.height + 2 * alien.rect.height * row_numberaliens.add(alien)def get_number_rows(ai_settings, ship_height, alien_height):available_space_y = (ai_settings.screen_height - (3 * alien_height)- ship_height)number_rows = int(available_space_y / (2 * alien_height))return number_rowsdef update_aliens(ai_settings, screen, stats, sb, ship, aliens, bullets):check_fleet_edges(ai_settings, aliens)aliens.update()if pygame.sprite.spritecollideany(ship, aliens):ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets)check_aliens_bottom(ai_settings, screen, stats, sb, ship, aliens, bullets)def check_fleet_edges(ai_settings, aliens):for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(ai_settings, aliens)breakdef change_fleet_direction(ai_settings, aliens):for alien in aliens.sprites():alien.rect.y += ai_settings.fleet_drop_speedai_settings.fleet_direction *= -1def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship,aliens, bullets):collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)if collisions:for aliens in collisions.values():stats.score += ai_settings.alien_points * len(aliens)sb.prep_score()check_high_score(stats, sb)if len(aliens) == 0:bullets.empty()ai_settings.increase_speed()stats.level += 1sb.prep_level()create_fleet(ai_settings, screen, ship, aliens)def ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets):if stats.ships_left > 0:stats.ships_left -= 1sb.prep_ships()aliens.empty()bullets.empty()create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()sleep(0.5)else:stats.game_active = Falsepygame.mouse.set_visible(True)def check_aliens_bottom(ai_settings, screen, stats, sb, ship, aliens, bullets):screen_rect = screen.get_rect()for alien in aliens.sprites():if alien.rect.bottom >= screen_rect.bottom:ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets)breakdef check_play_button(ai_settings, screen, stats, sb, play_button, ship, aliens,bullets, mouse_x, mouse_y):button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)if button_clicked and not stats.game_active:start_game(ai_settings, screen, stats, sb, play_button,ship,aliens,bullets)def start_game(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets):ai_settings.initialize_dynamic_settings()pygame.mouse.set_visible(False)stats.reset_stats()stats.game_active = Truesb.prep_score()sb.prep_high_score()sb.prep_level()sb.prep_ships()aliens.empty()bullets.empty()create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()def check_high_score(stats, sb):if stats.score > stats.high_score:stats.high_score = stats.scoresb.prep_high_score()with open("The highest score.txt",'w') as f:f.write(str(stats.score))

game_stats.py

class GameStats():def __init__(self, ai_settings):self.ai_settings = ai_settingsself.reset_stats()self.game_active = Falsewith open ('The highest score.txt') as f:self.high_score = int(f.read())def reset_stats(self):self.ships_left = self.ai_settings.ship_limitself.score = 0self.level = 1

scoreboard.py

import pygame.font
from pygame.sprite import Group
from ship import Shipclass Scoreboard():def __init__(self, ai_settings, screen, stats):self.screen = screenself.screen_rect = screen.get_rect()self.ai_settings = ai_settingsself.stats = statsself.text_color = (30, 30, 30)self.font = pygame.font.SysFont(None, 48)self.prep_score()self.prep_high_score()self.prep_level()self.prep_ships()def prep_score(self):rounded_score = int(round(self.stats.score, -1))score_str = "{:,}".format(rounded_score)self.score_image = self.font.render(score_str, True, self.text_color,self.ai_settings.bg_color)self.score_rect = self.score_image.get_rect()self.score_rect.right = self.screen_rect.right - 20self.score_rect.top = 20def show_score(self):self.screen.blit(self.score_image, self.score_rect)self.screen.blit(self.high_score_image, self.high_score_rect)self.screen.blit(self.level_image, self.level_rect)self.ships.draw(self.screen)def prep_high_score(self):high_score = int(round(self.stats.high_score, -1))high_score_str = "{:,}".format(high_score)self.high_score_image = self.font.render(high_score_str, True,self.text_color, self.ai_settings.bg_color)self.high_score_rect = self.high_score_image.get_rect()self.high_score_rect.centerx = self.screen_rect.centerxself.high_score_rect.top = self.score_rect.topdef prep_level(self):self.level_image = self.font.render(str(self.stats.level),  True,self.text_color, self.ai_settings.bg_color)self.level_rect = self.level_image.get_rect()self.level_rect.right = self.score_rect.rightself.level_rect.top = self.score_rect.bottom + 10def prep_ships(self):self.ships = Group()for ship_number in range(self.stats.ships_left):ship = Ship(self.ai_settings, self.screen)ship.rect.x = 10 + ship_number * ship.rect.widthship.rect.y = 10self.ships.add(ship)

settings.py(基本设置参数)

class Settings():def __init__(self):self.screen_width = 1200self.screen_height = 800self.bg_color = (230,230,230)self.bullet_width = 3self.bullet_height = 15self.bullet_color = 60,60,60self.bullets_allowed = 3self.fleet_drop_speed = 5self.ship_limit = 3self.speedup_scale = 1.1self.score_scale = 1.5self.initialize_dynamic_settings()def initialize_dynamic_settings(self):self.ship_speed_factor = 1.5self.bullet_speed_factor = 3self.alien_speed_factor = 0.1self.fleet_direction = 1self.alien_points = 50def increase_speed(self):self.ship_speed_factor *= self.speedup_scaleself.bullet_speed_factor *= self.speedup_scaleself.alien_speed_factor *= self.speedup_scaleself.alien_points = int(self.alien_points * self.score_scale)

ship.py

import pygame
from pygame.sprite import Spriteclass Ship(Sprite):def __init__(self,ai_settings,screen):super().__init__()self.screen = screenself.ai_settings = ai_settingsself.image = pygame.image.load('images/ship.bmp')self.rect = self.image.get_rect()self.screen_rect = screen.get_rect()self.rect.centerx = self.screen_rect.centerxself.rect.bottom = self.screen_rect.bottomself.center = float(self.rect.centerx)self.bottom = float(self.rect.bottom)self.moving_right = Falseself.moving_left = Falseself.moving_up = Falseself.moving_down = Falsedef update(self):if self.moving_right and self.rect.right < self.screen_rect.right:self.center += self.ai_settings.ship_speed_factorif self.moving_left and self.rect.left > 0:self.center -= self.ai_settings.ship_speed_factorif self.moving_up and self.rect.top > 0:self.bottom -= self.ai_settings.ship_speed_factorif self.moving_down and self.rect.bottom < self.screen_rect.bottom:self.bottom += self.ai_settings.ship_speed_factorself.rect.centerx = self.centerself.rect.bottom = self.bottomdef blitme(self):self.screen.blit(self.image, self.rect)def center_ship(self):self.center = self.screen_rect.centerxself.bottom = self.screen_rect.bottom

show_the_key.py

import pygame
import sysdef run_game():pygame.init()screen = pygame.display.set_mode((1200,800))pygame.display.set_caption("how will you do")while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:print(event.key)
run_game()

图片


the_highest_score为txt文件,记录历史最高分,一开始其中输入了0

python编程,外星人飞船相关推荐

  1. 《Python编程从入门到实践》外星人入侵游戏——添加 飞船 图片和外星人 图片,素材

    <Python编程从入门到实践>在本书里学到的.本篇主要介绍该游戏中所需要的两个图片.分别为飞船和外星人图片. 1.首先去到 http://www.ituring.com.cn/book/ ...

  2. python编程入门到实践学习笔记——外星人入侵游戏pygame(二 外星人)

    python编程入门到实践学习笔记--外星人 前言 创建外星人类 创建外星人实例 创建一群外星人 让外星人群移动 移动方向设置 击杀外星人 生成新的外星人群 结束游戏 前言 接着上个做飞船和子弹的文章 ...

  3. python随机出现外星人飞船_python外星人入侵游戏如何改变飞船的大小

    Python从入门到实践里的<外星人入侵> Python外星人入侵问题分享助世界上从来不缺少风景,缺少的只是欣赏的心情. Python项目外星人入侵添加爆照效果有没有原码<Pytho ...

  4. python编程入门到实践学习笔记——外星人入侵游戏pygame(一 武装飞船)

    python编程--外星人入侵游戏pygame(一) 外星人入侵游戏一:武装飞船 安装Pygame 创建窗口及响应用户输入 更改屏幕背景色 创建设置类 创建ship飞船类 重构game_functio ...

  5. 关于在《python编程从入门到实践》书中练习“外星人大战”报错“AttributeError: ‘AlienInvasion‘ object has no attribute ‘blit‘”

    关于在<python编程从入门到实践>书中练习"外星人大战"报错"AttributeError: 'AlienInvasion' object has no ...

  6. Python项目实战学习 外星人入侵 创建外星人飞船并实现外星人动态移动效果

    外星人入侵 本篇博客紧接上一篇博客:设置飞船发出子弹https://blog.csdn.net/Ace_bb/article/details/104845723 本篇博客实现在游戏窗口中添加动态的外星 ...

  7. 《Python编程:从入门到实践 》[Eric Matthes著] 中文pdf非扫描版

    下载地址:网盘下载 内容简介  · · · · · · 本书是一本针对所有层次的Python 读者而作的Python 入门书.全书分两部分:第一部分介绍用Python 编程所必须了解的基本概念,包括m ...

  8. python编程入门与案例详解-Python零基础必看的入门书藉:Python编程从入门到实践...

    提取码:sc9i 本书是一本针对所有学习Python读者而作的Python 入门书.全书分两部分:第一部分介绍用Python编程所必须了解的基本概念,包括matplotlib.NumPy 和Pygal ...

  9. python编程入门-Python编程:从入门到实践 PDF 中文扫描版

    给大家带来的一篇关于Python3.5编程相关的电子书资源,介绍了关于Python入门.Python实践.Python编程方面的内容,本书是由中国工信出版集团出版,格式为PDF,资源大小9.85M,埃 ...

最新文章

  1. ​多大分辨率图像做分类更适合?浙大华为国科大等提出Dynamic Resolution Network,降低计算量还提性能!...
  2. 面向小姐姐的编程——JAVA面向对象之封装(二)
  3. android.net.wifi的简单使用方法
  4. qc成果报告范例_株洲水务集团QC成果再获省一等奖
  5. (android实战)创建查看试卷答案功能(类似于疯狂小鸟的选关)
  6. [学习css系列]纯css实现移入移出效果
  7. Linux内核分析——第四周学习笔记
  8. lammps教程:推荐几个比较实用的lammps自带函数(2)
  9. python代码设置环境变量
  10. 百度开发者搜索及个人搜索方式总结
  11. 辐射强度和辐射亮度_如何在“辐射4”中隐藏“创意俱乐部新闻”垃圾邮件
  12. golang数据结构初探之管道chan
  13. Shell--如何定义及遍历数组、字符串数组【工作笔记】
  14. 我们对区块链游戏的期望太高了
  15. 攻防世界-MISC:glance-50
  16. 灾备联盟牵头研制《云灾备技术发展趋势与应用白皮书》
  17. Prometheus(一)——概述、监控体系、生态组件、部署
  18. linux 系统启动故障处理(an error occurred during the file system check)
  19. 中创算力员工生日会︱夏末初秋,与你一同庆生
  20. Node.js笔记:SerialPort(串口)模块使用(基于10.x.x)

热门文章

  1. WEB应用之网页数据分析工具
  2. linux进程与它的堆栈空间
  3. BootLoader引导程序制作及移植(一)
  4. 结构struct(值类型)在实际应用要注意的二点:
  5. mongodb 监控项详解(mms)
  6. canvas-color的几种设置
  7. SGU 269. Rooks(DP)
  8. C++基础与面向对象
  9. 大数阶乘的位数和精确值计算
  10. 【New】SAPUI5开发环境配置步骤