• 安装pygame包,把安装好的包copy一份到pycharm工程目录下,不然找不到pygame包

    抄一遍书上的代码:

settings.py

class Settings():def __init__(self):self.screen_width = 1200self.screen_height = 800self.bg_color = (255, 255, 255)self.ship_speed_factor = 1.5

ship.py

import pygame
class Ship():def __init__(self, ai_settings, screen):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()    #屏幕矩形,左上角原点,右下角如1200,800self.rect.centerx = self.screen_rect.centerx    #图像x中心,在屏幕中心self.rect.bottom = self.screen_rect.bottom  #图像底边,在屏幕底边self.center = float(self.rect.centerx)  #图像x中心坐标转成浮点型,存在center中self.moving_right = Falseself.moving_left = 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_factorself.rect.centerx = self.centerdef blitme(self):self.screen.blit(self.image, self.rect) #blit实现动画效果

game_functions.py

import sys
import pygame
def check_keydown_events(event, ship):  #检测键盘按下事件if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Truedef check_keyup_events(event, ship):    #检测键盘松开事件if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = Falsedef check_events(ship):for event in pygame.event.get():if event.type == pygame.QUIT:   #退出事件sys.exit()elif event.type == pygame.KEYDOWN:  #键盘按下事件check_keydown_events(event, ship)elif event.type == pygame.KEYUP:    #键盘松开事件check_keyup_events(event, ship)def update_screen(ai_settings, screen, ship):screen.fill(ai_settings.bg_color)   #屏幕填充背景色ship.blitme()   #ship的动画效果pygame.display.flip()   #让动画尽可能流畅

alien_invasion.py

import sys
import pygame
from settings import Settings
from ship import Ship
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("Alien Invasion")    #设置标题ship = Ship(ai_settings, screen)    #创建游戏对象while True:gf.check_events(ship)   #检测事件ship.update()   #更新ship位置gf.update_screen(ai_settings, screen, ship) #刷新屏幕run_game()


练习题:
1.火箭上下左右移动

2.创建一个程序,显示一个空屏幕。在事件循环中,每当检测到 pygame.KEYDOWN 事件时都打印属性event.key。运行这个程序,并按各种键,看看Pygame如何响应

import pygame
import sys
def check_events(screen):for event in pygame.event.get():if event.type == pygame.QUIT:   #退出事件sys.exit()elif event.type == pygame.KEYDOWN:  #键盘按下事件while True:font = pygame.font.SysFont("宋体", 80)    #设置字体font_surface = font.render(str(event.key), True, (0, 0, 0), (255, 255, 255))    #渲染内容为面pygame.image.save(font_surface, "text.bmp") #面保存成图片image = pygame.image.load("text.bmp")   #获取图片image_rect = image.get_rect()   #获取图片的矩形image_rect.centerx = 200    #设置图片矩形位置image_rect.centery = 150screen.blit(image, image_rect)  #屏幕呈现该图片pygame.display.flip()   #屏幕刷新显示出来if pygame.event.poll().type == pygame.KEYUP:    #键盘松开break   #退出
def run_game():pygame.init()pygame.font.init()screen = pygame.display.set_mode((400, 300))pygame.display.set_caption("测试按键......")    #设置标题while True:screen.fill((255, 255, 255))  # 屏幕填充背景色pygame.display.flip()   #刷新屏幕check_events(screen)   #检测事件run_game()


添加子弹模块后的代码
settings.py

class Settings():def __init__(self):self.screen_width = 1200self.screen_height = 800self.bg_color = (255, 255, 255)self.ship_speed_factor = 1.5    #飞船速度self.bullet_speed_factor = 1    #子弹速度self.bullet_width = 3           #子弹宽高self.bullet_height = 15self.bullet_color = 60, 60, 60  #子弹颜色self.bullets_allowed = 2        #屏幕中允许的子弹数量

ship.py 不变
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.centerx   #子弹x与飞船相同self.rect.top = ship.rect.top   #子弹从飞船顶部起飞self.y = float(self.rect.y)     # y存一份浮点的,可以精调位置self.color = ai_settings.bullet_color   #子弹颜色self.speed_factor = ai_settings.bullet_speed_factor #子弹速度def update(self):self.y -= self.speed_factor #位置更新self.rect.y = self.y    #浮点y位置付给矩形图形def draw_bullet(self):pygame.draw.rect(self.screen, self.color, self.rect)    #把子弹矩形画到屏幕上

game_functions.py

import sys
import pygame
from bullet import Bullet
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 check_keydown_events(event,ai_settings, screen, ship, bullets):  #检测键盘按下事件if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueelif event.key == pygame.K_SPACE:   #按下空格键,发射子弹fire_bullet(ai_settings, screen, ship, 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 = Falsedef check_events(ai_settings, screen, ship, bullets):for event in pygame.event.get():if event.type == pygame.QUIT:   #退出事件sys.exit()elif event.type == pygame.KEYDOWN:  #键盘按下事件check_keydown_events(event, ai_settings, screen, ship, bullets)elif event.type == pygame.KEYUP:    #键盘松开事件check_keyup_events(event, ship)def update_screen(ai_settings, screen, ship, bullets):screen.fill(ai_settings.bg_color)   #屏幕填充背景色for bullet in bullets.sprites():    #把每个子弹画在屏幕上bullet.draw_bullet()ship.blitme()   #ship的动画效果pygame.display.flip()   #刷新,让动画尽可能流畅def update_bullets(bullets):bullets.update()    #更新子弹位置for bullet in bullets.copy():   #删除飞出屏幕的子弹if bullet.rect.bottom <= 0:bullets.remove(bullet)

alien_invasion.py

import sys
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
from pygame.sprite import Group
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("Alien Invasion")    #设置标题ship = Ship(ai_settings, screen)    #创建游戏飞船对象bullets = Group()   #创建子弹组while True:gf.check_events(ai_settings, screen, ship, bullets)   #检测事件ship.update()   #更新ship位置gf.update_bullets(bullets)  #更新子弹位置,删除飞出去的子弹# print(len(bullets))   #调试时,确认子弹飞出屏幕后被删除gf.update_screen(ai_settings, screen, ship, bullets) #刷新屏幕run_game()


作业3:更改上述代码,使之横向发射子弹
添加 pygame.transform.rotozoom(surface, angle, scale) (缩放和旋转)
代码连接 https://github.com/hitskyer/course/tree/master/python/chenmingming/pygame_project/alien_invasion

python--从入门到实践--chapter 12 pygame_Alien_Invasion相关推荐

  1. Python从入门到实践

    Python从入门到实践 文章目录 Python从入门到实践 第2章 变量和简单的数据类型 2.2 变量的命名规则 2.3 字符串 2.4 数字 1.整数 2.浮点数 3.使用str( )避免类型错误 ...

  2. 《python数据挖掘入门与实践》决策树预测nba数据集

    前言: 学到决策树预测球队输赢时,按照书中网址去下载数据集,无奈怎么也没下载成功.即使下载了excel文件也是破损的.咱可是学了python的银,那好吧,我就把它爬取下来.(资源在下面) 代码: '' ...

  3. python从入门到实践13章答案

    系列文章目录  python从入门到实践12章答案 python从入门到实践14章答案 目录 前言 一.13-1星星 二.13-2更逼真的星星 三.13-3雨滴 四.13-4连绵细雨 五.13-5 侧 ...

  4. Python数据挖掘入门与实践---用决策树预测获胜球队

    数据集来源:1.  2013-14 NBA Schedule and Results 2.2013年 NBA 赛季排名情况 参考书籍:<Python数据挖掘入门与实践> 1.加载数据集: ...

  5. python从入门到实践和从入门到精通-Python从入门到实践之列表|第1天

    User:你好我是森林 Date:2018-02-14 Mark:<Python从入门到实践> 列表 本章主要从列表的概念入手,逐步深入到对列表的操作. 列表 概念 列表由一系列按特定顺序 ...

  6. Python数据挖掘入门与实践-OneR分类算法

    Python数据挖掘入门与实践-OneR分类算法 OneR算法 OneR算法是根据已有的数据中,具有相同特征值的个体最可能属于哪个类别进行分类. 在本例中,只需选区Iris是个特征中分类效果最好的一个 ...

  7. Python从入门到实践第9章课后作业

    Python从入门到实践第9章课后作业 编写过程中不知道如何将列表传入子类中,下面实例中均没有使用 #9-1 # class Restaurant(): # """模拟饭 ...

  8. 《Python程序设计入门与实践》219道课后习题答案

    适用教材:Python程序设计入门与实践 I S B N:978-7-5606-5960-2 作    者:董付国 页    数:319页 例题数量:73个 演示代码:200段(不含例题代码) 习题数 ...

  9. python从入门到实践19章答案

    目录 前言 一.博客 1.建立项目 2.创建应用程序 3.Django管理网站 4.让用户输入数据 二.博客账户 1.应用程序users 2.登录页面 3.注销 4.注册页面 三.重构 四.保护页面n ...

最新文章

  1. python redis连接池获取后关闭_python通过连接池连接redis,操作redis队列
  2. 查看windows系统当前使用的字符集
  3. 机器学习方法三要素-阿里云大学
  4. MFC+OPENCV实现角点检测
  5. android之PackageManager简单介绍
  6. 黄学长模拟day1 球的序列
  7. SPSS 项目分析(图文+数据集)【SPSS 032期】
  8. 网页版 QQ授权登录
  9. hilbert谱 matlab,转 matlab 信号处理——Hilbert变换及谱分析
  10. 【随】BIDS 怪异现象
  11. SMTP 发送邮件错误码和解决方法
  12. 冉宝的每日一题--8月6日、8月7日--今天想学会拓扑排序
  13. GTK、GDK、GLIB三者的关系 - 阿堂的专栏 - 博客频道 - CSDN.NET
  14. 计算机的新兴技术在测绘工程领域的应用,测绘新技术在测绘工程测量中应用探讨.doc...
  15. Linux驱动子系统之I2C(一)
  16. vue酒店房间管理系统
  17. C++ 模板与泛型详解
  18. 迭代器模式(实际运用比较少)
  19. 谷歌浏览器禁止打开某些网站
  20. MTF模块 PX4 光流模块详细配置

热门文章

  1. php环境编译成品,PHPweb成品网站安装环境要求和安装方法
  2. c#利用定时器自动备份数据库(mysql)
  3. CS190.1x Scalable Machine Learning
  4. 写 一个PHP脚本遇到的问题总结
  5. Java的几个同步辅助类
  6. 对一个 复杂的json结果进行取值的例子
  7. 视频参数(流媒体系统,封装格式,视频编码,音频编码,播放器)对比
  8. 从入门到深入Fiddler 2 (二)
  9. git命令:修改已经commit的注释
  10. TCP通信过程大讨论