用于示例编程课程的包含源代码的游戏集合。
项目描述
PythonStdioGames
一组用于简单、基于文本的游戏和模拟的Python 3源代码,可作为示例程序使用。
安装: pip install --user gamesbyexample
(在macOS和Linux上使用pip3
。)
运行启动器: python -m gamesbyexample
目前不接受pull请求,但请随时留下评论或向al@inventwithpython.com发送建议
如果您需要安装Python的帮助,请访问https://installpython3.com/
我刚找到这个网页,我该如何玩游戏呢?
首先,安装Python解释器。这包含基本的IDLE编辑器。您还可以使用其他编辑器。在Windows上,您还可以使用Visual Studio Code编辑器。PyCharm社区版是适用于Windows、Linux和macOS的编辑器。您还可以使用基于浏览器的编辑器,如REPL.it。这些都是免费的。
然后,点击本仓库中的 src
和 gamesbyexample
文件夹,以找到各种 Python 游戏的 .py
文件。例如,这是 snailrace.py 的代码。每个游戏的代码全部在一个 .py
文件中,因此您可以直接将代码复制到您的编辑器中。我建议您手动输入代码,而不是使用复制粘贴。这将使您对代码的每一部分都有“肌肉记忆”。(尽管有些游戏需要在您的 .py
文件相同的文件夹中下载数据文件。)然后您就可以运行程序了。如果您收到错误消息,注意错误消息中的行号,并检查您是否犯有拼写错误。
在学习了基本语法后,许多程序员都想继续学习下一步,看看这些编程概念是如何在“真实”的程序中使用的。大多数开源项目都太大太复杂了。这些游戏被设计得既短又简单,又有趣。您可以用它们作为学习示例,看看如何制作您自己的程序。
请注意,有些程序需要您从本仓库中下载额外的文件。例如,游戏 [sudoku.py](https://github.com/asweigart/PythonStdioGames/blob/master/src/gamesbyexample/sudoku.py)
从 [sudokupuzzles.txt](https://github.com/asweigart/PythonStdioGames/blob/master/src/gamesbyexample/sudokupuzzles.txt)
文件中加载其拼图。
关于本系列
当初学者学习了 Python 的语法和基本编程概念(循环、分支、函数等)后,他们往往会遇到瓶颈:“我该如何提高我的编程技能?”在这个时候,人们会告诉他们做一些自己的练习项目(这使他们不知道要做什么以及如何做)或者为开源项目做出贡献(这可能很难找到,理解其代码库,并获得有关如何贡献的指导)。
帮助我学习编码的是找到一些小项目,我复制了它们的源代码,并对它们进行了小的调整。这使我了解了循环、分支和函数是如何结合在一起形成实际程序的。
为了帮助其他人在相同的道路上前进,我创建了一系列旨在让初学者容易复制和理解示例程序。这些程序(主要是游戏)有以下限制:
- 它们很短,代码行数限制为 256 行。这使得它们可以一次性阅读和理解。越短越好。“256”这个数字是任意选择的,但这也意味着程序可以适合 4 或 5 页打印。
- 它们可以放入单个源代码文件中,没有安装程序。这使得这些游戏通过复制粘贴代码到剪贴板网站变得极其简单。可以使用数据/图像/保存文件,但源代码应该链接到其注释中的示例。
- 它们只使用 Python 标准库。安装的东西越少,兼容性越广,在环境设置过程中失败的可能性也越小。
- 它们只使用 stdio 文本;Python 中的
print()
和input()
。输出与文本源代码在相同的文本介质中,这使得它不那么抽象,更容易看到代码和输出之间的因果关系。这意味着没有图形或鼠标输入,但这使得将这些程序移植到其他语言变得简单,因为它们都支持 stdio 文本。 - 它们必然是回合制的。依赖于
input()
意味着程序必须等待用户输入文本,这意味着我们不能有对单个按键做出响应的实时程序。 - 它们有很好的注释。注释应该针对初学者,并且会更加详细。256 行的限制包括注释和空白。如果程序太长而无法包含丰富的注释和合理的空白,应该简化程序,而不是注释。
- 它们尽可能少地使用编程概念。如果类、列表推导式、递归对于程序不是必需的,那么它们就不会被使用。
- 优雅且高效的代码,若与易于理解和阅读的代码相比,则毫无价值。这些程序是为了教育目的,而非用于生产。例如,不使用全局变量等标准最佳实践,可以忽略以使理解更容易。
- 它们进行输入验证且无错误。使用错误输入或边缘情况使程序崩溃应该是不可能的。
- 所有函数都有文档字符串。这是一个良好的文档编写实践,同时也使
help()
函数能够在交互式外壳中工作。
其他指南
其他指南包括
- 不要使用f-string。截至2019年,树莓派预装了Python 3.5,而f-string是在3.6版本中引入的。这些程序的一个指导原则是尽可能具有广泛的兼容性。
- 一些程序使用了
bext
模块,该模块增加了类似于curses的特性,如颜色、清屏和移动光标。 - 请包含一个指向https://pythontutor.com上程序演示的链接,以便学生可以看到程序是如何运行的。
- 比短变量名更长的、更具描述性的变量名更好。除了
i
和j
,或x
和y
之外,避免使用单个字母的变量名。 - 用注释标记
# (!)
描述它们可以做出的微小更改(增加健康,改变难度等)。 - 使用jsdifflib创建在线差异。这是一个学生发现自己在复制代码时的错别字的好方法。示例在此:https://inventwithpython.com/invent4thed/diff/
- 使用
assert
语句来捕获学生在输入代码时犯的常见错误,特别是对于他们可能修改的常量。 - 使用Python 3。唯一适合使用Python 2的情况是存在大量现有代码库。但这是为新程序员在绿地项目上工作而准备的。
- 坚持使用WGL4字符集,这基本上是CP 1252,包括西里尔文、希腊文、土耳其文和波罗的海字符的代码页,以及MS-DOS时代的CP437 "扩展ASCII"编码。Windows的命令行是限制因素;它无法显示所有UTF-8字符。
- 源代码必须是可输入的。不要直接将框线或扩展ASCII字符放入源代码,而是使用chr()调用而不是这些字符。
- 即使程序不是实时程序,时间也可能是一个因素。您可以在调用
input()
之间检查时间或添加暂停,但请注意,当用户在键入时,您将无法中断。 - 可以使用
pyperclip
模块与剪贴板进行交互。可以使用剪贴板将大量文本输入到程序中或从程序中输出。 - 我使用%s字符串插值而不是f-string。虽然我喜欢f-string,但它们是在Python 3.6中引入的,我不想限制这些程序的兼容性版本。
- 对于所有字典,我都有一个简短的注释来解释键和值的类型。例如,# Keys=places, values=strings of the suspect & item there。
- 使用"DOS框线"字符来绘制复杂的棋盘游戏。尽管坚持使用+、-和|来绘制线条也很好,因为它们更简单。
- 玩家对玩家的游戏通常比玩家对计算机的游戏更简单、更短。这必然意味着多人游戏必须是“完全信息”游戏,因为两个玩家都可以看到屏幕。
- 不要在函数中修改可变对象(例如列表)以将信息传入/传出函数;仅使用参数和返回值。这可以使您的程序对不熟悉Python数据模型的某人看起来很神奇。
- 当玩家输掉游戏时,不要侮辱玩家。这是我从小孩编程课程中学到的东西。他们对于像“游戏结束,傻瓜!”这样的信息反应很差,即使这些信息对成年人来说似乎是无害的。
制作了几个这样的程序后,我注意到了各种“类别”的程序复杂度。程序可以是零个或多个这些类别。
- 初学者级别。 没有函数,没有嵌套数据结构,避免嵌套循环。仅使用简单的分支和循环。
- 选择你的冒险。 程序不使用数据结构来模拟事物,而是主要使用流程控制。
- 仅STDIO。 无法撤销之前打印的内容(除了“打印”退格字符来擦除当前行上的字符)。输出就像一个只可追加的日志文件。
- 类似Curses。 需要
bext
模块,但可以清除/刷新屏幕,以彩色在屏幕上的任意位置绘制,等等。 - 修改源代码运行。 不是从
input()
获取输入,而是用户编辑文件顶部的变量来更改程序中的设置。
我推荐的额外模块
bext
用于彩色文本和控制文本光标的定位。blessings
用于改进的curses版本。pyperclip
用于通过剪贴板复制/粘贴文本。playsound
用于播放音频文件。pyttsx3
用于文本到语音。pytextcavas
用于可以绘制的2D字符串。pyrect
用于矩形数据结构。pybresenham
用于各种线条绘制函数。
本集合中的完成程序
字母排序测验 - 一个基于时间的测验游戏,看看你多快可以按字母顺序排序字母。
字母排序单词测验 - 一个基于时间的测验游戏,看看你多快可以按字母顺序排序单词。
模拟时钟 - 一个模拟时钟动画。按Ctrl-C停止。
贝果 - 一个推理逻辑游戏,你必须根据线索猜测一个数字。
生日悖论模拟 - 探索“生日悖论”的数学。更多信息请访问 https://en.wikipedia.org/wiki/Birthday_problem
21点 - 一种被称为21点的纸牌游戏。更多信息请访问: https://en.wikipedia.org/wiki/Blackjack
弹跳球 - 一个弹跳球动画。按Ctrl-C停止。
弹跳线 - 一个弹跳线动画。按Ctrl-C停止。
日历生成器 - 创建月历,保存到文本文件并适合打印。
机会检查者 - 检查者游戏,但你可以每回合移动3个随机检查者。这些检查者是随机决定的,可以是玩家的检查者或对手的,但你不能移动对手的升格检查者。在这个版本中,捕获不是强制性的。
戴莱克斯 - 尝试让机器人相互碰撞。
检查者 - 经典的国际象棋棋盘游戏。在这个版本中,捕获不是强制性的。
Chomp - 一个危险的美味逻辑游戏。受Frederik Schuh和David Gale谜题的启发,该谜题由Martin Gardner在《科学美国人》杂志(1973年1月)上出版。更多信息请访问: https://en.wikipedia.org/wiki/Chomp
点击诱饵标题生成器 - 为你的无灵魂内容农场生成点击诱饵标题。
抛硬币模拟器 - 模拟大量抛硬币。
Collatz序列 - 根据起始数字生成Collatz序列的数字。
Collatz序列统计 - 找出各种Collatz序列有多长。
四子棋 - 一个棋盘游戏,要在一行中放四个棋子。
康威生命游戏 - 经典的细胞自动机模拟。按Ctrl-C停止。更多信息请访问: https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life
康威生命游戏(终端) - 经典的细胞自动机模拟。按Ctrl-C停止。更多信息请访问: https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life
倒计时 - 使用七段显示器显示倒计时计时器动画。按Ctrl-C停止。更多信息请访问 https://en.wikipedia.org/wiki/Seven-segment_display 需要我们的sevseg.py程序。
对角迷宫 - 打印一个随机的、对角线的迷宫。受10 PRINT CHR$(205.5+RND(1)); : GOTO 10程序的启发。
骰子投掷器 - 使用《龙与地下城》的标记来模拟掷骰子。
数字时钟 - 使用七段显示器显示当前时间。按Ctrl-C停止。更多信息请访问 https://en.wikipedia.org/wiki/Seven-segment_display 需要我们的sevseg.py程序。
DNA - DNA双螺旋的简单动画。按Ctrl-C停止。感谢matoken的灵感: https://asciinema.org/a/155441
恩尼-米尼-莫尼-摩 - 多人消除游戏。按Ctrl-C停止。更多信息请访问 https://en.wikipedia.org/wiki/Eeny,_meeny,_miny,_moe 更多信息请访问 https://en.wikipedia.org/wiki/Josephus_problem
画图板 - 在屏幕上绘制拖尾线条。
分解因数 - 找出数字的所有因数。
萤火虫 - 美丽的萤火虫动画。按Ctrl-C停止。
鱼缸 - 安静的鱼缸动画。按Ctrl-C停止。
FizzBuzz计算 - 计算FizzBuzz编程问题的答案。
FizzBuzz游戏 - 一场数字游戏,你还要与时间赛跑。
翻转棋(翻转棋克隆版) - (需要Pygame)与电脑对战,尝试翻转他们的棋子。
洪水填充 - “洪水填充”算法的示例。这是递归和迭代洪水填充算法的基本演示。这个算法在像MS Paint或Photoshop这样的图形程序的“填充工具”中常用。这个算法也用于floodit.py游戏中。
洪水填色 - 一个尝试用单种颜色填满棋盘的彩色游戏。
森林火灾模拟 - 森林中火灾蔓延的模拟。按Ctrl-C停止。受Nicky Case的Emoji Sim启发 http://ncase.me/simulating/model/
四子棋 - (需要Pygame)与电脑对战,落下棋子以连接四个。
非均匀分形树绘制器 - 使用海龟图形绘制非均匀分形树。
分形树绘制器 - 使用海龟图形绘制分形树。
2048游戏 - 一个滑动拼图游戏,可以组合指数增长的数字。受Gabriele Cirulli的2048启发,它是Veewo Studios的1024的克隆,而1024又是Threes!游戏的克隆。更多信息请访问 https://en.wikipedia.org/wiki/2048_(video_game)
宝石宝石(宝石迷阵克隆版) - (需要Pygame)一个上瘾的宝石匹配游戏。
幽灵腿彩票 - 跟踪线索以查看谁赢了!更多信息请访问: https://en.wikipedia.org/wiki/Ghost_Leg
猜数字 - 在给出提示的情况下,尝试猜测秘密数字。
断头台 - 与不同的图形不同的《Hangman》的法国变体。哦,拉拉!
黑客 - 来自“Fallout 3”的迷你黑客游戏。
汉谟拉比 - Doug Dyment的经典游戏汉谟拉比.bas,由David Ahl推广。
汉堡包 - 制作愚蠢复数的程序。按Ctrl-C停止。
Hangman - 一个猜词游戏。
随机字母的Hangman - 一个完全不公平的猜词游戏。(这是一个玩笑程序。)
硬编码的井字棋 - 与电脑玩井字棋。这个程序已经将所有可能的移动硬编码在内。该程序有5700行长。这是一个玩笑程序,实际上不要这样编写代码。
希尔伯特曲线 - 使用海龟图形绘制希尔伯特曲线分形。更多信息请访问: https://en.wikipedia.org/wiki/hilbertCurve 空间填充曲线的优秀视频: https://youtu.be/RU0wScIj36o 和 https://youtu.be/3s7h2MHQtxc
沙漏动画 - 一个充满落沙的沙漏动画。按Ctrl-C停止。
傻瓜 - 如何让傻瓜忙碌数小时。(这是一个玩笑程序。)
墨水溢出(洪水仿制) - (需要Pygame)尝试将整个区域变成同一种颜色。
J'ACCUSE! - 一款悬疑游戏,讲述一只失踪的猫的故事。灵感来源于Homestar Runner的“在哪里找到鸡蛋?”游戏
科赫雪花 - 使用海龟图形绘制科赫雪花分形。
兰顿蚂蚁 - 一个细胞自动机动画。按Ctrl-C停止。更多信息:https://en.wikipedia.org/wiki/Langton%27s_ant
割草机 - 观看草被割掉后又重新生长。按Ctrl-C停止。灵感来源于Jules Villard的《割草机》,https://asciinema.org/a/21743 https://bitbucket.org/jvillard/tondeuse/src/default/
Leetspeak - 将英文信息翻译成l33t5p34t。
Luhn校验算法 - 信用卡号码背后的数学。更多信息:https://en.wikipedia.org/wiki/Luhn_algorithm 更多信息:https://youtu.be/Erp8IAUouus
魔球 - 询问你关于未来的问题。
魔六边形 - 在六边形中放置数字,使得每一行加起来等于38。更多信息:https://en.wikipedia.org/wiki/Magic_hexagon 更多信息:https://www.youtube.com/watch?v=ZkVSRwFWjy0
曼康拉 - 古老的播种棋盘游戏。规则请见http://www.mancalarules.com/ 更多信息:https://en.wikipedia.org/wiki/Mancala
匹配括号 - 括号/括号/花括号匹配算法。
迷宫生成器 - 使用递归回溯算法制作迷宫。更多信息:https://en.wikipedia.org/wiki/Maze_generation_algorithm#Recursive_backtracker 动画演示:https://scratch.mit.edu/projects/17358777/
迷宫跑者 - 在迷宫中移动并尝试逃脱。
3D迷宫 - 在迷宫中移动并尝试逃脱...在3D中!
HTML迷宫跑者 - 在迷宫中移动并尝试逃脱...在3D和你的网络浏览器中!
记忆游戏 - (需要Pygame)一个简单的记忆匹配游戏。
中间字母打乱器 - 打乱单词的中间字母,但不是第一个和最后一个字母。
百万次掷骰子统计 - 模拟一百万次掷骰子。
蒙娜丽莎 - 使用海龟图形绘制类似安迪·沃霍尔的蒙娜丽莎画像。
蒙德里安艺术生成器 - 随机生成蒙德里安风格的艺术。
蒙提霍尔问题 - 蒙提霍尔游戏问题的模拟。更多信息:https://en.wikipedia.org/wiki/Monty_Hall_problem
莫尔斯电码 - 在英语和莫尔斯电码之间进行翻译。更多信息:https://en.wikipedia.org/wiki/Morse_code
乘法表 - 打印乘法表。
乘法持久性 - 一个有趣的数学挑战。有关该主题的更多信息,请参阅https://youtu.be/Wim9WJeDTHQ
墙上有99瓶啤酒 - 打印这首最长的歌曲之一的全歌词!按Ctrl-C停止。
穿针引线 - 一个单人跳针游戏,旨在消除所有针。更多信息:https://en.wikipedia.org/wiki/Peg_solitaire
五格拼图 - (需要Pygame)类似于Pygame,但使用5格方块。
元素周期表 - 显示所有元素的原子信息。
猪拉丁语 - 将英文信息翻译成Igpay Atinlay。
多边形 - 一个海龟程序,用于绘制多边形。每条线的长度相同。
进度条 - 一个可以用于其他程序的进度条动画示例。
Python绘图 - 使用turtle图形绘制蟒蛇。
栅栏密码 - 用于加密文本的“栅栏”密码。更多信息请参阅:[https://en.wikipedia.org/wiki/Rail_fence_cipher](https://en.wikipedia.org/wiki/Rail_fence_cipher)
彩虹 - 显示一个简单的彩虹动画。按Ctrl-C停止。
彩虹2 - 显示一个简单的波浪彩虹动画。按Ctrl-C停止。
随机游走 - 使用“随机游走”算法生成喷溅艺术。按Ctrl-C停止。更多信息请参阅:[https://en.wikipedia.org/wiki/Random_walk](https://en.wikipedia.org/wiki/Random_walk)
翻转棋 - 一种翻转棋盘的游戏,也称为翻转棋。更多信息请参阅:[https://en.wikipedia.org/wiki/Reversi](https://en.wikipedia.org/wiki/Reversi)
石头剪刀布 - 一种运气手游戏。
石头剪刀布(永不输) - 一种运气手游戏,但你不会输。
ROT13密码 - 用于加密和解密文本的最简单密码。更多信息请参阅:[https://en.wikipedia.org/wiki/ROT13](https://en.wikipedia.org/wiki/ROT13)
旋转立方体 - 一个旋转立方体动画。按Ctrl-C停止。
旋转立方体(最佳版本) - 一个旋转立方体动画。按Ctrl-C停止。
旋转球体 - 一个旋转球体动画。按Ctrl-C停止。
rush hour - 一个滑动拼图游戏,用于将汽车移出道路。原始游戏由Nob Yoshihagara设计。更多信息请参阅:[https://www.michaelfogleman.com/rush/](https://www.michaelfogleman.com/rush/)
沙落 - 一个下落沙子的动画。受启发于:[https://asciinema.org/a/6515](https://asciinema.org/a/6515)
沙落(最佳版本) - 一个下落沙子的动画。受启发于:[https://asciinema.org/a/6515](https://asciinema.org/a/6515)
七段显示器 - 一个七段显示器模块。更多信息请参阅:[https://en.wikipedia.org/wiki/Seven-segment_display](https://en.wikipedia.org/wiki/Seven-segment_display)
壳游戏 - 一种随机赌博游戏。
Sierpinksi游戏 - Sierpinksi的“游戏”是一个使用turtle图形绘制Sierpinksi三角形的算法。更多信息请参阅:[https://en.wikipedia.org/wiki/Chaos_game](https://en.wikipedia.org/wiki/Chaos_game)
Sierpinski方阵 - 使用turtle图形绘制Sierpinski方阵(也称为地毯)。更多信息请参阅:[https://en.wikipedia.org/wiki/Sierpinski_carpet](https://en.wikipedia.org/wiki/Sierpinski_carpet)
Sierpinski三角形 - 使用turtle图形绘制Sierpinski三角形的分形。
模拟(Simon克隆) - (需要Pygame)尽可能长时间地复制闪烁灯的图案。
滑动拼图 - (需要Pygame)经典的15个拼图拼图。
15个滑动拼图 - 将编号的瓷砖滑动到正确的顺序。
蜗牛赛跑 - 快速的蜗牛赛跑动作!
Sokoban克隆 - 经典的推箱游戏。
声纳寻宝 - 尝试定位隐藏在波浪下的宝藏。
算盘 - 一种日本算盘计算器的模拟。更多信息请参阅:[https://en.wikipedia.org/wiki/Soroban](https://en.wikipedia.org/wiki/Soroban)
螺旋 - 绘制一个简单的正方形螺旋。
sPoNgEtExT - 将英文消息翻译成sPOnGEtExT。
松鼠吃松鼠 - (需要Pygame)一只松鼠吃另一只松鼠并变得异常巨大。
星推手(Sokoban克隆) - (需要Pygame)一个推星到目标的益智游戏。
粘手 - 一款宝石盗窃、移动拼图游戏。
数独 - 经典的9x9数字放置谜题。更多信息请参阅:[https://en.wikipedia.org/wiki/Sudoku](https://en.wikipedia.org/wiki/Sudoku)
四联体(俄罗斯方块克隆) - (需要Pygame)来自苏联的经典方块下降谜题。
四联体(白痴版) - (需要Pygame)俄罗斯方块,但...更简单。
三张牌魔术 - 在卡片被交换后找到红桃皇后。(在现实生活中的版本中,骗子将红桃皇后藏起来,所以你总是输。)更多信息请参阅https://zh.wikipedia.org/wiki/三张牌魔术
井字棋 - 经典的桌面游戏。
井字棋(面向对象编程版) - 经典的桌面游戏。(面向对象编程版本。)
汉诺塔谜题 - 必须将一座塔的圆盘移动到另一座塔上的谜题。更多信息请参阅https://zh.wikipedia.org/wiki/汉诺塔
乌拉姆螺旋 - 乌拉姆螺旋是一个神秘的数学图案,用于显示素数,使用海龟图形。更多信息请参阅https://zh.wikipedia.org/wiki/乌拉姆螺旋
水桶谜题 - 倒水谜题。更多信息:https://zh.wikipedia.org/wiki/倒水谜题
虫虫 - (需要Pygame)引导绿色的蛇在屏幕上吃红色的苹果。
之字形 - 一个简单的之字形动画。按Ctrl-C停止。
项目详情
gamesbyexample-2020.12.30.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 389d27b8b41710036be8c8e1bc803d890993a794d44b19a5ec7c6fa9b7fa024a |
|
MD5 | fe774b602375d09065bbfacf9c31945a |
|
BLAKE2b-256 | 2eb50fd54d2c2746f2804aeb896a58b7d12ecb66ede8250f48ac2c5e71d3a7e8 |