零基础学 Python(2023 版)
尹会生
太乙人工智能技术合伙人 & 项目总监
60050 人已学习
新⼈⾸单¥68
课程目录
已完结/共 124 讲
结束语 & 结课测试 (2讲)
零基础学 Python(2023 版)
登录|注册
留言
24
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 37|小试牛刀:如何设计一个飞机大战的程序?
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
课程介绍:这次我们都做了哪些升级?
内容综述:明确学习目的
01|如何配置 Python 开发环境?
02 | 常用 IDE:如何提高开发效率?
03 | 如何站在官方文档的肩膀上自己“造轮子”?
04 | 怎样运行你的第一行代码?
05 | 怎样使用 Gitee 管理你的代码?
06 | 学习编程有问题?去这里找答案!
07|跨越门槛:Python 开发环境总结及实现原理
08 | 修炼基本功:浅析输入输出
09 | 变量:如何让计算机临时存储数据?
10|字符串(上):Python 是如何处理单词的?
11|字符串(下):Python 是如何处理单词的?
12|存储数字应该采用哪种数据类型?
13|何时使用数,何时使用字符串?
14|注释:如何写程序的说明书?
15|小试牛刀:如何制作简单计算器?
16|变量命名规范:如何编写优雅的程序?
17|告别新手村:Python 编程基础知识
18|内置数据类型包括哪几种?
19|列表如何处理同类数据?
20|常见常新:列表的常见操作
21|元组:如何处理一次性数据?
22|常见常新:集合的常见操作
23|字典:如何处理映射类型的数据?
24|常见常新:字典的常见操作(上)
25|常见常新:字典的常见操作(下)
26|小试牛刀:如何利用类型转换实现手机通讯录?(上)
27|小试牛刀:如何利用类型转换实现手机通讯录?(下)
28|常见的内置数据类型都何时使用?
29|避坑指南:内置数据类型的常见错误
30|内置数据类型参考:如何使用官方文档与帮助?
31|再回首:“内置数据类型”单元小结
32|if 语句:数据流程出现分支时,怎样编写程序?
33|match 语句:如何通过 match 关键字来处理程序的分支逻辑?
34|while 循环:需要多次重复执行某段程序时,怎么做?
35|for 循环:如何遍历一个对象里的所有元素?
36|语句嵌套:如何处理多重循环的问题?
37|小试牛刀:如何设计一个飞机大战的程序?
38|避坑指南:判断和循环中的常见错误
39|再回首:“判断循环”单元小结
40|输入:如何接收用户通过键盘输入的数据?
41|格式化输出:如何将执行结果通过屏幕输出?
42|F-strings:如何通过定义好的格式进行输出?
43 | 常见常新:文件的打开
44|文件编码:如何解决不同操作系统的文件乱码问题?
45|常见常新:文件的读写
46|常见常新:文件的关闭
47|小试牛刀:如何使用 Python 合并多个文件?
48|再回首:“输入输出与文件操作”单元小结
49|函数的定义:如何优雅地反复引用同一段代码?
50|函数的参数:怎样实现函数与外部数据通信?
51|函数的参数:当函数操作对象不固定时怎么处理?
52|函数的返回值:如何得到函数的执行结果?
53|小试牛刀:如何利用函数实现电商购物车功能?
54|避坑指南:列表作为参数传递出错了怎么办?
55|高阶函数:函数对象与函数调用的用法区别
56|装饰器:函数嵌套的定义与调用的区别
57|再回首:“函数”单元小结
58|编程思想不同会导致怎样的代码差异?
59|类与实例:如何使用面向对象的思想编写程序?
60|类的继承:如何解决代码重用的问题?
61|类的装饰器:如何改变类方法的功能?
62|小试牛刀:如何开发自动咖啡机?
63|避坑指南:类的常见错误
64|init 方法:如何为对象传递参数?
65|再回首:“类”单元小结
66 | 模块的导入:如何使用其他人编写好的代码功能?
67 | 标准库:Python 默认提供的便捷功能有哪些?
68 | 自定义模块:如何编写一个完整功能?
69 | 第三方模块的使用:如何使用其他人编写的代码?
70 | 小试牛刀:如何使用 Python 为函数求导?
71|再回首:“模块与标准库”单元小结
72|初识异常:异常的产生与分类
73|异常捕获:出现异常时,如何利用程序进行处理?
74|自定义异常捕获:如何定义业务异常?
75|避坑指南:编写捕获异常程序时经常出现的问题
76|再回首:“异常处理”单元小结
77|扩展数据类型:怎样使用更复杂的数据类型?
78|魔术方法:怎样通过类构造自己需要的数据类型?
79|怎样将 Python 和 C++ 结合起来混合编程?
80|怎样将已有算法改造成符合项目的特定算法?
81|设计模式:怎样合理组合多个函数和类?
82|Redis 数据库:怎样使用 NoSQL 数据库?
83|关系型数据库:怎样使用关系型数据库?
84|计算资源充足时,如何通过并行设计提高效率?
85|多进程间如何通信?
86|再回首:“高级数据类型与算法”单元小结
87|理论盘点:数据分析的流程及对应的 Python 库
88|理论盘点:数据采集的方法与 HTTP 协议
89|理论盘点:任务的并行执行原理
90|理论盘点:非规范化数据处理的基础与正则表达式
91|如何获取网页上的数据并存储到文件?
92|小试牛刀:如何将数据进行图形化展示?
93|再回首:“数据分析”单元小结
94|理论盘点:文件类型与对应的 Python 函数库
95|如何批量读取 Excel 文件?
96|如何实现数据的批量格式转换?
97|如何扩展数据类型?
98|再回首:“办公自动化”单元小结
99|理论盘点:Web 客户端与服务端
100|理论盘点:MVC 模型是什么?
101|如何使用Django搭建简单的Web服务器?
102|如何使用Django-admin实现文章上传?
103|如何使用Django实现文章发布?
104|再回首:“Web开发”单元小结
105|理论盘点:人脸识别的一般步骤
106|理论盘点:人脸识别常用的 Python 库有哪些?
107|怎样通过 OpenCV 采集视频信号?
108|如何训练人脸模型?
109|怎样设计人脸识别系统?
110|再回首:“计算机视觉”单元小结
111|聚焦异同:物联网与互联网有啥不一样?
112|理论盘点:基础但不简单的 TCP 协议
113|理论盘点:物模型与模组
114|如何为 ESP32 安装 MicroPython?
115|怎样通过 MQTT 协议构建消息队列?
116|小试牛刀:在 OLED 屏幕和手机远程同时显示室内温度
117|再回首:“物联网”单元小结
118|结束语:人生苦短,我用Pyhon
结课测试|来赴一场满分之约吧!
直播加餐|与AI共同编程,用ChatGPT学Python
直播加餐|用OpenAI API理解Python数据类型
直播加餐|掌握Gradio框架:为 AI Agent 程序定制界面
本节摘要

课后习题
请参考本节案例代码,通过 +、- 符号,实现飞机大战的血量恢复和血量扣除功能,每次按键随机增加或减少 100 以内的整数,当血量为 0 时游戏结束。

举例:初始血量为 100,按一次 +,由于最大血量为 100,无变化。再按一次 -,随机减少 100 以内整数,并显示剩余血量。过程中,可以反复按 +、-,直到血量为 0,提示游戏结束。

课程代码、课件及其他相关资料地址
https://gitee.com/wilsonyin/zero-basics-python

登录 后留言

全部留言(24)

  • 最新
  • 精选
梅美美🥰
为什么向下的时候第一层循环时2,1,0,不是0,1,2?

作者回复: 用print()将坐标打印出来,你会发现如果是012,判断的时候会遇到判断条件不完整的问题,得再增加额外的判断条件。所以我偷懒,反过来使用了210

2022-12-15
1
Geek_a7c1fb
你好,我这个为什么安装不了pynput呢

作者回复: 要把报错信息一起提交,我才能帮你分析错误原因,安装不上的原因非常多,甚至会因为网络超时导致安装失败

2023-09-27
yanyu-xin
from pynput.keyboard import Key, Listener, KeyCode import random volume = 100 # 初始血量 print(f'初始血量是:{volume}') def on_press(key): global volume #血量为全局变量 if key == KeyCode.from_char('+'): # 按键 ‘+’ 处理部分 ran_valume = random.randint(1, 100) # 随机数 volume = volume + ran_valume # 加血 if volume > 100 : # 大于100,按100处理 volume = 100 print(f'血量为:{ volume} ') elif key == KeyCode.from_char('-'): # 按键 ‘-’ 处理部分 ran_valume = random.randint(1, 100) # 随机数 volume = volume - ran_valume # 减血 if volume < 0 : # 小于0,按0处理 volume = 0 print(f'血量为:{ volume} ') if volume == 0 : # 小于等于 0 结束 print('游戏结束') exit(-1) # 退出程序 elif key == KeyCode.from_char('q'): # 按 q 键退出程序 exit(-1) with Listener(on_press=on_press) as listener: # 按键处理 listener.join()
2023-01-24
1
2
江江儿嘛哩哄
from pynput.keyboard import Key, Listener, KeyCode import random import sys #sys为结束整个程序 number = 100 def on_press(key): #gobal用来申明number为全局变量,可在函数内对函数外对number进行操作 global number if key == KeyCode.from_char('+'): number = number + int(random.randint(1,100)) if number >= 100: number = 100 print(f"已达到最大血量{number},游戏继续") else: print(f"血量增加,现在血量:{number},游戏继续") if key == KeyCode.from_char('-'): number =number - int(random.randint(1,100)) if number <= 0 : number = 0 print("血量已耗尽,游戏结束!") sys.exit() #此时自动结束并退出游戏 else: print(f"血量减少,现在血量:{number},游戏继续") print() with Listener(on_press = on_press) as listener: listener.join()
2022-12-29
1
Calvin
import random import sys from pynput.keyboard import Listener, KeyCode bg: list[list[int | str]] = [[0, 0, 0], [0, 'x', 0], [0, 0, 0]] blood = 100 def print_bg(): for x in bg: print(x[0], x[1], x[2]) print_bg() def on_press(key): global blood if key == KeyCode.from_char('a'): for i in 0, 1, 2: for j in 0, 1, 2: if bg[i][j] == 'x' and j > 0: bg[i][j] = 0 bg[i][j - 1] = 'x' elif key == KeyCode.from_char('d'): for i in 0, 1, 2: for j in 2, 1, 0: if bg[i][j] == 'x' and j < 2: bg[i][j] = 0 bg[i][j + 1] = 'x' elif key == KeyCode.from_char('w'): for i in 0, 1, 2: for j in 0, 1, 2: if bg[i][j] == 'x' and i > 0: bg[i][j] = 0 bg[i - 1][j] = 'x' elif key == KeyCode.from_char('s'): for i in 2, 1, 0: for j in 0, 1, 2: if bg[i][j] == 'x' and i < 2: bg[i][j] = 0 bg[i + 1][j] = 'x' elif key == KeyCode.from_char('+'): blood += random.randint(0, 100) if blood > 100: blood = 100 print(f"血量增加,当前血量 {blood},游戏继续 :-)") elif key == KeyCode.from_char('-'): blood -= random.randint(0, 100) if blood < 0: blood = 0 print(f"血量不足,当前血量 {blood},游戏结束 :'-(") sys.exit() print(f"血量减少,当前血量 {blood},游戏继续 :-(") print() print_bg() with Listener(on_press=on_press) as listener: listener.join()
2022-12-16
1
Geek_c131f7
import random from pynput.keyboard import Key, Listener, KeyCode Blut = 100 def on_press(key): global Blut if key == KeyCode.from_char('+'): add = random.randint(1,100) if Blut >= 100: print("血量已满") else: Blut += add if Blut >= 100: Blut = 100 print("血量已满") else: print(f"剩余血量为:{Blut}") elif key == KeyCode.from_char('-'): Blut -= random.randint(1,100) if Blut <= 0: print("游戏结束") return False else: print(f"剩余血量为:{Blut}") with Listener(on_press=on_press) as listener: listener.join()
2024-03-08
杨帆
为什么向下第一层循环采用0,1,2的时候,当x的坐标为[0][1]的时候按下s向下直接x的坐标变成了[1][2]?
2024-01-09
1
一只会编程的二哈
plane_data = [ [0, 0, 0], [0, "x", 0], [0, 0, 0] ] plane_idx = [] plane_num = 100 for i in enumerate(plane_data): print(i[1]) try: targetPlane = i[1].index("x") plane_idx = [i[0], targetPlane] except ValueError: continue def on_press(key): next_idx = [] global plane_num if KeyCode.from_char("w") == key: if plane_idx[0] != 0: next_idx = [plane_idx[0] - 1, plane_idx[1]] elif KeyCode.from_char("s") == key: if plane_idx[0] < len(plane_data) - 1: next_idx = [plane_idx[0] + 1, plane_idx[1]] elif KeyCode.from_char("a") == key: if plane_idx[1] != 0: next_idx = [plane_idx[0], plane_idx[1] - 1] elif KeyCode.from_char("d") == key: if plane_idx[1] < len(plane_data[plane_idx[1]]) - 1: next_idx = [plane_idx[0], plane_idx[1] + 1] elif KeyCode.from_char("+") == key: add_num = int(random.random() * 100 + 1) plane_num += add_num if plane_num > 100: plane_num = 100 elif KeyCode.from_char('-') == key: cut_num = int(random.random() * 100 + 1) plane_num -= cut_num if plane_num < 0: print("游戏结束 你的血没了") exit(-1) else: return if len(next_idx) != 0: plane_data[plane_idx[0]][plane_idx[1]] = 0 plane_data[next_idx[0]][next_idx[1]] = "x" plane_idx[0] = next_idx[0] plane_idx[1] = next_idx[1] for x in plane_data: print(x) print(plane_num)
2023-12-09
Geek_0c747b
# 需要使用global关键字 hp_init = 100 def add_hp(hp_init): add_hp = hp_init random_hp = random.randint(1, 100) add_hp = hp_init + random_hp if add_hp > 100: add_hp = 100 hp_init = 100 print(f"hp --> {hp_init} random_hp -->{random_hp} add_hp --> 100[血满了,不能再加了]") return hp_init else: print(f"hp --> {hp_init} random_hp -->{random_hp} add_hp --> {add_hp}") return add_hp def subtract_hp(hp_init): subtract_hp = hp_init random_hp = random.randint(1, 100) subtract_hp = hp_init - random_hp print(f"hp --> {hp_init} random_hp -->{random_hp} subtract_hp --> {subtract_hp}") if subtract_hp == 0 or subtract_hp < 0: print('游戏结束') exit() return subtract_hp def on_press(key): global hp_init if key == KeyCode.from_char('w'): hp_init = add_hp(hp_init) for i in 0,1,2: for j in 0,1,2: if background[i][j] == 'x' and i > 0: background[i][j] = '0' background[i-1][j] = 'x' break elif key == KeyCode.from_char('s'): hp_init = subtract_hp(hp_init) for i in 2,1,0: for j in 0,1,2: if background[i][j] == 'x' and i < 2: background[i][j] = '0' background[i+1][j] = 'x' break elif key == KeyCode.from_char('a'): for i in 0,1,2: for j in 0,1,2: if background[i][j] == 'x' and j > 0: background[i][j] = '0' background[i][j-1] = 'x' break elif key == KeyCode.from_char('d'): for i in 0,1,2: for j in 0,1,2: if background[i][j] == 'x' and j < 2: background[i][j] = '0' background[i][j+1] = 'x' break with Listener(on_press=on_press) as listener: listener.join()
2023-12-01
杜少星
测试没问题 # pip3 install pynput from pynput.keyboard import Key, Listener, KeyCode from random import randint initial_value = 100 print(f"初始血量为 ",initial_value) def on_press(key): global initial_value if key == KeyCode.from_char('+') : initial_value += randint(1, 100) if initial_value > 100: initial_value = 100 print(f"血量为: ",initial_value) elif key == KeyCode.from_char('-') : initial_value -= randint(1, 100) print(f"血量为: ",initial_value) if initial_value < 0: print("game over") exit() # 按esc退出 elif key == Key.esc : exit() with Listener(on_press=on_press) as listener: listener.join()
2023-11-28
收起评论