系列文章目录
第一章:武装飞船
09重构check_events()
一、重构
1.重构原因
随着游戏的开发,方法_check_events()将越来越长。因此将其部分代码放在两个方法中,其中一个处理KEYDOWN事件,另一个处理KEYUP事件:
2.重构的方法
我们创建了两个新的辅助方法:_check_keydown_events()和_check_keyup_events()。它们都包含形参self和event。这两个方法的代码是从_check_events()中复制而来的,因此将方法_check_events()中相应的代码替换成了对这两个新方法的调用。现在,方法_check_events()更简单,代码结构也更清晰,在其中响应玩家输入时将更容易。
二、代码及演示
1.修改game_functions
修改文件:game_functions.py
点击查看代码
#渗透小红帽python的学习之路
#外星人入侵小游戏
#game_functions.py
#存储让游戏运行的函数
import sys
import pygame
#响应键盘函数
def check_keydown_events(event,ship):
if event.key == pygame.K_RIGHT:
# 移动飞船
ship.moving_right = True
# 玩家按下右箭头键时标志设为true
elif event.key == pygame.K_LEFT:
ship.moving_left = True
# 玩家按下左箭头键时标志设为true
#响应松开按键的函数
def check_keyup_events(event,ship):
if event.key == pygame.K_RIGHT:
ship.moving_right = False
# 玩家松开右箭头键时标志设为false
elif event.key == pygame.K_LEFT:
ship.moving_left = False
# 玩家松开左箭头键时标志设为false
def check_events(ship): # 在玩家按右箭头时需要将飞船向右移动,
# 所以给函数加上了形参ship
for event in pygame.event.get(): # 监听键盘和鼠标事件
if event.type == pygame.QUIT:
sys.exit()
#修改alien_invasion.py,使其导入game_functions
#并将事件循环替换为对函数check_events()的调用
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() # 每次循环时重新绘制飞船
pygame.display.flip() # 让最近绘制的屏幕可见
#飞船移动功能编写完毕
2.运行效果
飞船可以任意向左向右移动,直到移动到游戏界面边界时停止。
点击下方链接观看运行效果视频
有什么不懂的地方在评论区留言哦!希望我的文章能对你有所帮助,如果喜欢我的文章,请点赞收藏并关注!你的认可是对我创作最大的鼓励!
2022-08-24 19:38:53 星期三
Original: https://www.cnblogs.com/Penetration-redhat/p/16621359.html
Author: 渗透小红帽
Title: Python小游戏——外星人入侵(保姆级教程)第一章 09重构check_events()
相关阅读1
Title: Python从门到精通(一):基础-附-开发一个python脚本
Python从门到精通(一):基础-附-开发一个python脚本
原创
文章标签 python linux命令 解析器 脚本 文章分类 Python 编程语言
©著作权归作者所有:来自51CTO博客作者生而为人我很遗憾的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、基础内容
本章中介绍一个编写脚本可能用到的一个方法
1.1、脚本接收
import fileinputwith fileinput.input('/etc/passwd') as f: for line in f: print(f.filename(), f.lineno(), line, end='')
1.2、程序退出
import syssys.stderr.write('It failed!\n')raise SystemExit(1)
1.3、密码验证
import getpassuser = getpass.getuser()passwd = getpass.getpass()def svc_login(user, passwd): return Trueif svc_login(user, passwd): print('Success!')else: print('Fail!')user = input('Enter your username: ')
1.5、执行Linux命令
import subprocessout_bytes = subprocess.check_output(['netstat','-a'])out_text = out_bytes.decode('utf-8')try: out_bytes = subprocess.check_output(['cmd','arg1','arg2'])except subprocess.CalledProcessError as e: out_bytes = e.output code = e.returncode out_bytes = subprocess.check_output(['cmd','arg1','arg2'], stderr=subprocess.STDOUT)try: out_bytes = subprocess.check_output(['cmd','arg1','arg2'], timeout=5)except subprocess.TimeoutExpired as e: ...out_bytes = subprocess.check_output('grep python | wc > out', shell=True)
1.6、打开浏览器
import webbrowserwebbrowser.open('http://www.python.org')webbrowser.open_new('http://www.python.org')webbrowser.open_new_tab('http://www.python.org')c = webbrowser.get('chrome')c.open('http://www.python.org')c.open_new_tab('http://docs.python.org')
二、资源限制
import signalimport resourceimport osdef time_exceeded(signo, frame): print("Time's up!") raise SystemExit(1)def set_max_runtime(seconds): soft, hard = resource.getrlimit(resource.RLIMIT_CPU) resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard)) signal.signal(signal.SIGXCPU, time_exceeded)if __name__ == '__main__': set_max_runtime(20) while True: passdef limit_memory(maxsize): soft, hard = resource.getrlimit(resource.RLIMIT_AS) resource.setrlimit(resource.RLIMIT_AS, (maxsize, hard))if __name__ == '__main__': limit_memory(1) set_max_runtime(20) while True: pass
三、命令行解析器
import argparseparser = argparse.ArgumentParser(description='Search some files')parser.add_argument(dest='filenames',metavar='filename', nargs='*')parser.add_argument('-p', '--pat',metavar='pattern', required=True, dest='patterns', action='append', help='text pattern to search for')parser.add_argument('-v', dest='verbose', action='store_true', help='verbose mode')parser.add_argument('-o', dest='outfile', action='store', help='output file')parser.add_argument('--speed', dest='speed', action='store', choices={'slow','fast'}, default='slow', help='search speed')args = parser.parse_args()
执行 python orderParser.py -h 输出如下:
usage: order_parser.py [-h] -p pattern [-v] [-o OUTFILE] [--speed {slow,fast}] [filename ...]Search some filespositional arguments: filenameoptional arguments: -h, --help show this help message and exit -p pattern, --pat pattern text pattern to search for -v verbose mode -o OUTFILE output file --speed {slow,fast} search speed
- 赞
- 收藏
- 评论
- *举报
上一篇:Python从门到精通(五):文件处理-06-ini文件处理
Original: https://blog.51cto.com/arch/5415629
Author: 生而为人我很遗憾
Title: Python从门到精通(一):基础-附-开发一个python脚本
相关阅读2
Title: Python 关于TCP简介以及与UDP的区别
仅用学习参考
TCP介绍
TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
TCP通信需要经过 创建连接、数据传送、终止连接三个步骤。
TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话""
TCP特点
1. 面向连接
通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输。
双方间的数据传输都可以通过这一个连接进行。
完成数据交换后,双方必须断开此连接,以释放系统资源。
这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。
2. 可靠传输
1) TCP采用发送应答机制
TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功
2) 超时重传
发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。
TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。
3) 错误校验
TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
- 流量控制和阻塞管理
流量控制用来避免主机发送得过快而使接收方来不及完全收下。
TCP与UDP的不同点
- 面向连接(确认有创建三方交握,连接已创建才作传输。)
- 有序数据传输
- 重发丢失的数据包
- 舍弃重复的数据包
- 无差错的数据传输
- 阻塞/流量控制
udp通信模型
udp通信模型中,在通信开始之前,不需要建立相关的链接,只需要发送数据即可,类似于生活中,"写信""
TCP通信模型
udp通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话""
tcp的3次握手
tcp的4次挥手
tcp注意点
- tcp服务器一般情况下都需要绑定,否则客户端找不到这个服务器
- tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port等信息就好,本地客户端可以随机
- tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的
- 当客户端需要链接服务器时,就需要使用connect进行链接,udp是不需要链接的而是直接发送,但是tcp必须先链接,只有链接成功才能通信
- 当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
- listen后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的
- 关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。
- 关闭accept返回的套接字意味着这个客户端已经服务完毕
- 当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线
关注微信公众号,回复【资料】、Python、PHP、JAVA、web,则可获得Python、PHP、JAVA、前端等视频资料。
Original: https://blog.51cto.com/u_11239407/5505971
Author: 海洋的渔夫
Title: Python 关于TCP简介以及与UDP的区别
相关阅读3
Title: 7 天找个 Go 工作,Gopher 要学的条件语句,循环语句 ,第3篇
本篇博客重点内容
来到 Go 语言学习的第 3 篇博客,本篇将涉及两种 Go 语句,其一是分支,即条件判断,其二是循环。
条件判断语句又细分为 if 语句,if else 语句,if 嵌套语句,switch 语句,select 语句,对于以往的 Python 学习者,
上述内容只有 switch 和 select 语句需要反复学习一下。
select 语句类似于 switch 语句,只是 select 会随机选择一个可运行的 case 执行。
由于有其它语言的经验,这里重点看的就是语法结构。
语法结构如下所示:
if 布尔表达式{
/* 待执行内容 */
}
带上 else
之后,语法结构如下所示:
if 布尔表达式{
/* TODO */
}
else{
/* TODO */
}
if 嵌套相关知识和其它语言一致,可以直接学习。
该语句在 Python 中不存在,但其它语言基本都有,语法结构如下所示:
switch vari{
case vari1:
//TODO
case vari2:
//TODO
}
switch 的 case 子句,默认带 break 语句,所以匹配到其中任意一个分支,都会终止语句,进入 switch 代码后继续运行。
switch 语句还可以用 type-switch
来判断变量类型,语法结构如下所示:
switch var1.(type){
case type:
// TODO
case type:
// TODO
}
在 Go 语言中,case 是一个独立的代码块,而且执行完毕不会像 C 语言一样继续执行下一个 case,如果希望实现,可以使用 fallthrough
关键字实现,不过以橡皮擦的经验看,这个知识点不用刻意掌握,毕竟 switch 设计的初衷,就是不希望出现跨 case 运行的情况出现。
select 与 switch 语句类似,它会随机执行一个可运行的 case,如果没有 case,就会阻塞,这里有一个新的概念,叫做 Go Channel,这部分我们预留一下,后续学到在细聊。
循环语句看了一下,并无太多特殊点,而且 Go 只支持 for 循环,知识点减少了一些,不过 Go 循环的语法与 Python 有一些差异,例如下述 Demo。
package main
import "fmt"
func main() {
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
}
抽象一下语法结构,得到下述格式:
for init;condition;post { }
其中各参数说明如下:
init
:赋值表达式,给控制变量赋值;condition
:关系表达式或逻辑表达式,控制条件;post
:也是赋值表达式,对init
进行增减控制。
其中 init
和 post
为可选参数,可以省略,即下述代码正常运行。
package main
import "fmt"
func main() {
sum := 1
for ;sum
上述 for
语句后面的分号 ;
可以省略,即下述代码。
for sum
这里与其它语言不同的是 for
后面的内容不需要括号,如果希望实现类似 while
的无限循环,直接省略 for
后面的内容即可。
package main
func main() {
sum := 0
for {
sum++
if sum > 100 {
break
}
}
}
这里必须要注意如下内容,其中涉及了 Go 的语法格式。
- for 后面的大括号,必须与 for 在同一行;
- Go 语言中也支持 continue 和 break 控制循环,而且有一个更高级的 break 用法,可以终止指定循环(即终止标号 label 所在的循环);
package main
import "fmt"
func main() {
// 不使用标记 label
fmt.Println("使用 break 标记")
for i := 1; i 5 {
break re
}
}
}
continue
标记与 break
用法一致,只是其含义表示跳出当前循环,进入下一循环。
Original: https://blog.51cto.com/cnca/5565833
Author: 梦想橡皮擦
Title: 7 天找个 Go 工作,Gopher 要学的条件语句,循环语句 ,第3篇