python--从入门到实践--chapter 12 pygame_Alien_Invasion

  • 安装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
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实时事理学习与搜索平台DemoV1.0正式对外发布

我们团队探索了一种将事件、概念、逻辑、实时学习、多类知识库实时更新串起来的知识服务新模式。一个面向事理的实时学习和搜索系统Demo&#xff0c;取名叫“学迹”&#xff0c;取自“学事理&#xff0c;知行迹”。 项目地址&#xff1a;https://xueji.zhiwenben.com 一、 “学…

卖萌屋算法工程师思维导图part3—深度学习篇

卖萌屋的妹子们&#xff08;划掉&#xff09;作者团整理的算法工程师思维导图&#xff0c;求职/自我提升/查漏补缺神器。该手册一共分为数据结构与算法、数学基础、统计机器学习和深度学习四个部分。下面是第三部分深度学习的内容~公众号后台回复【思维导图】获取完整手册&…

论文浅尝 | Zero-Shot Transfer Learning for Event Extraction

事件抽取的目标是在非结构化的文本中确认事件的触发词&#xff08;Eventtrigger&#xff09;和参与者&#xff08;Event argument&#xff09;&#xff0c;并判断触法词的事件类型&#xff08;Eventtype&#xff09;&#xff0c;判断参与者在事件中的扮演的角色&#xff08;Arg…

今日头条Java后台Java研发三面题目

最近有同学在优知学院留言区留言是否能发布今日头条的面试题目&#xff0c;这位同学&#xff0c;题目来了哦~ 一面 concurrent包下面用过哪些&#xff1f; countdownlatch功能实现 synchronized和lock区别&#xff0c;重入锁 thread和runnable的区别 AtomicInteger实现原理…

实时事理逻辑知识库(事理图谱)终身学习项目-EventKGNELL(学迹)

EventKGNELL EventKGNELL, event knowlege graph never end learning system, a event-centric knowledge base search system&#xff0c;实时事理逻辑知识库终身学习和事件为核心的知识库搜索项目。包括事件概念抽取、事件因果逻辑抽取、事件数据关联推荐与推理。 项目地址&…

python--从入门到实践--chapter 15 16 17 生成数据/下载数据/web API

1.随机漫步 random_walk.py from random import choice class RandomWalk():def __init__(self, num_points5000):self.num_points num_pointsself.x_value [0]self.y_value [0]def fill_walk(self):while len(self.x_value) < self.num_points:x_direction choice([1…

ACL2020 | 基于Knowledge Embedding的多跳知识图谱问答

一只小狐狸带你解锁 炼丹术&NLP 秘籍作者&#xff1a;舒意恒&#xff08;南京大学硕士生&#xff0c;知识图谱方向&#xff09;背景什么是知识图谱问答&#xff1f;知识图谱&#xff08;KG&#xff09;是一个多关系图&#xff0c;其中包含数以百万计的实体&#xff0c;以及…

论文浅尝 | 基于超平面的时间感知知识图谱嵌入

链接&#xff1a;http://talukdar.net/papers/emnlp2018_HyTE.pdf本文主要关注 KG embedding 中三元组成立的时间有效性问题&#xff0c;比如三元组(Cristiano Ronaldo, playsFor, Manchester United)&#xff0c;其成立的有效时间段是2003年到2009年&#xff0c;这个使三元组有…

Java面试进阶:Dubbo、Zookeeper面试题锦集

Dubbo面试题锦集 1、默认也推荐使用netty框架&#xff0c;还有mina。 2、默认是阻塞的&#xff0c;可以异步调用&#xff0c;没有返回值的可以这么做。 3、推荐使用zookeeper注册中心&#xff0c;还有redis等不推荐。 4、默认使用Hessian序列化&#xff0c;还有Duddo、FastJ…

POJ 1064 分割线缆(二分查找)

题目链接&#xff1a;http://poj.org/problem?id1064 题目大意&#xff1a;多根电缆切成指定段数&#xff08;每段相同长度&#xff09;&#xff0c;求每段线缆的最大长度&#xff08;精确到0.01&#xff09; 这题精度控制是难点&#xff0c;方法很简单&#xff0c;二分查找…

Learning to rank基本算法小结

原文链接&#xff1a;https://zhuanlan.zhihu.com/p/26539920 Learning to rank基本算法小结最近工作中需要调研一下搜索排序相关的方法&#xff0c;这里写一篇水文&#xff0c;总结一下几天下来的调研成果。包括Learning to rank 基本方法Learning to rank 指标介绍LambdaMART…

命名实体识别难在哪?

亚里士多德在《形而上学》中认为&#xff0c;对于存在&#xff0c;最重要的问题&#xff0c;就是给世间万物的存在基于语言来分层和分类。从神说要有光起&#xff0c;到基友给你取了个外号叫狗蛋。你会发现&#xff0c;创造与命名&#xff0c;在历史中往往等同。名字是自我概念…

论文浅尝 | 面向简单知识库问答的模式修正强化策略

链接&#xff1a;http://aclweb.org/anthology/C18-1277知识库问答研究旨在利用结构化事实回答自然语言问题&#xff0c;在网络中&#xff0c;简单问题占据了相当大的比例。本文提出在完成模式抽取和实体链接后&#xff0c;构建一个模式修正机制&#xff0c;从而缓解错误积累问…

最全BAT数据库面试89题:mysql、大数据、redis

数据库 mysql面试题目&#xff1a; MySQL InnoDB、Mysaim的特点&#xff1f; 乐观锁和悲观锁的区别&#xff1f;&#xff1f; 行锁和表锁的区别&#xff1f; 数据库隔离级别是什么&#xff1f;有什么作用&#xff1f; MySQL主备同步的基本原理。 如何优化数据库性能&#…

POJ 3481 Double Queue

题目链接&#xff1a;http://poj.org/problem?id3481 题目大意&#xff1a; 给你0-3四个指令&#xff1a; 0 退出 1 添加优先级为P 的 K值&#xff0c;进入队列 2 最高优先级出队 3 最低优先级出队 思路&#xff1a; 利用map数据对key默认升序排列。 AC代码如下&#xff…

理解 Word Embedding,全面拥抱 ELMO

原文链接&#xff1a;https://www.infoq.cn/article/B8-BMA1BUfuh5MxQ687T 理解 Word Embedding&#xff0c;全面拥抱 ELMO DataFun社区 阅读数&#xff1a;4238 2019 年 6 月 15 日提到 Word Embedding &#xff0c;如果你的脑海里面冒出来的是 Word2Vec &#xff0c;Glove &…

肝了1W字!文本生成评价指标的进化与推翻

一只小狐狸带你解锁 炼丹术&NLP 秘籍作者&#xff1a;林镇坤&#xff08;中山大学研一&#xff0c;对文本生成和猫感兴趣&#xff09;前言文本生成目前的一大瓶颈是如何客观&#xff0c;准确的评价机器生成文本的质量。一个好的评价指标&#xff08;或者设置合理的损失函数…

美团大脑 | 知识图谱的建模方法及其应用

本文转载自公众号: 美团技术团队.作为人工智能时代最重要的知识表示方式之一&#xff0c;知识图谱能够打破不同场景下的数据隔离&#xff0c;为搜索、推荐、问答、解释与决策等应用提供基础支撑。美团大脑围绕吃喝玩乐等多种场景&#xff0c;构建了生活娱乐领域超大规模的知识图…

最全Java面试208题,涵盖大厂必考范围!强烈建议收藏~

这些题目是去百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目,熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。 一.java基础面试知识点 java中和equals和hashCode的区别 int、char、long各占多少字节数 int与integer的区别…

大规模事理常识知识系统“学迹”的定位、应用与不足

我们于3月16正式对外发布了一个面向事理的实时学习和搜索系统Demo&#xff0c;取名叫“学迹”&#xff0c;取自“学事理&#xff0c;知行迹”(https://xueji.zhiwenben.com)。“学迹”的发布&#xff0c;进一步拓宽了现有知识库的门类&#xff0c;为进一步获取特定事件的概念解…