跳转到主要内容

用于示例编程课程的包含源代码的游戏集合。

项目描述

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。这些都是免费的。

然后,点击本仓库中的 srcgamesbyexample 文件夹,以找到各种 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上程序演示的链接,以便学生可以看到程序是如何运行的。
  • 比短变量名更长的、更具描述性的变量名更好。除了ij,或xy之外,避免使用单个字母的变量名。
  • 用注释标记# (!)描述它们可以做出的微小更改(增加健康,改变难度等)。
  • 使用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/RU0wScIj36ohttps://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 (3.0 MB 查看哈希值

上传时间 源代码

由以下提供支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面