Python小游戏——外星人入侵(保姆级教程)第一章 09重构check_events()

Python66

系列文章目录

第一章:武装飞船

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()  # 让最近绘制的屏幕可见
#飞船移动功能编写完毕

Python小游戏——外星人入侵(保姆级教程)第一章 09重构check_events()

2.运行效果

飞船可以任意向左向右移动,直到移动到游戏界面边界时停止。
点击下方链接观看运行效果视频

Python小游戏——外星人入侵飞船移动效果

有什么不懂的地方在评论区留言哦!希望我的文章能对你有所帮助,如果喜欢我的文章,请点赞收藏并关注!你的认可是对我创作最大的鼓励!
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 ©著作权

文章标签 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文件处理

下一篇:Python从门到精通(六):线程-04-锁

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用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

  1. 流量控制和阻塞管理

流量控制用来避免主机发送得过快而使接收方来不及完全收下。

TCP与UDP的不同点

  • 面向连接(确认有创建三方交握,连接已创建才作传输。)
  • 有序数据传输
  • 重发丢失的数据包
  • 舍弃重复的数据包
  • 无差错的数据传输
  • 阻塞/流量控制

udp通信模型

udp通信模型中,在通信开始之前,不需要建立相关的链接,只需要发送数据即可,类似于生活中,"写信""

Python小游戏——外星人入侵(保姆级教程)第一章 09重构check_events()

Python小游戏——外星人入侵(保姆级教程)第一章 09重构check_events()

TCP通信模型

udp通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话""

Python小游戏——外星人入侵(保姆级教程)第一章 09重构check_events()

tcp的3次握手

Python小游戏——外星人入侵(保姆级教程)第一章 09重构check_events()

tcp的4次挥手

Python小游戏——外星人入侵(保姆级教程)第一章 09重构check_events()

tcp注意点

  • tcp服务器一般情况下都需要绑定,否则客户端找不到这个服务器
  • tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port等信息就好,本地客户端可以随机
  • tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的
  • 当客户端需要链接服务器时,就需要使用connect进行链接,udp是不需要链接的而是直接发送,但是tcp必须先链接,只有链接成功才能通信
  • 当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
  • listen后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的
  • 关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。
  • 关闭accept返回的套接字意味着这个客户端已经服务完毕
  • 当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线

Python小游戏——外星人入侵(保姆级教程)第一章 09重构check_events()

关注微信公众号,回复【资料】、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 进行增减控制。

其中 initpost 为可选参数,可以省略,即下述代码正常运行。

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篇