通过游戏编程学Python
通过游戏编程学Python(2)— 脑筋急转弯
通过游戏编程学Python(1)— 猜数字
文章目录
前言
大家好,上节课我们囫囵吞枣般地完成了第一个小游戏的创作,不知道大家有没有亲自动手把代码抄写一遍试试呢?虽然游戏很简单,甚至可以说是有点无聊,但其中涉及到的编程知识点并不少。然而,我们却并没有对每个知识点进行旁征博引般地讲解。问哥这样做的原因有二:1,这套学习笔记的目标读者是初学者,而很多人在入门的时候还是以兴趣为主,如果能够实际动手敲上几行代码,看到效果在自己眼前实现,已经是进步了,需要及时地自我鼓励,而过深的讲解反而会劝退很多人;2,很多时候我们实现某些功能,也并不需要知道多么深的计算机科学知识,只要了解必要的功能就足够了,这也是Python所提倡的“简洁、优雅”,就好像制作冰激凌并不需要知道冰箱是怎么工作的,抓住个别知识点耗费过多精力去了解许多并不常用的功能,在现阶段有点吃力不讨好。归根究底,问哥是想让更多人,更多非计算机专业的人(比如.问哥自己),了解到编程并不是什么神秘的事情。而一旦了解了编程、实际动手做几个小程序以后,大家在生活或工作中遇到类似的功能自然会想到,用程序来实现会不会更加便捷。这对提高自己的生活或工作质量的确是很有帮助的。
在该系列后面的笔记里,问哥也会尽量以初学者的角度,去思考每一个项目如何实现,再同时添加进新的知识点,与大家共同进步!
一、知识点
- 空的input()函数
- 字符串转义
- print()函数的end可选参数
二、第二个游戏 —— 脑筋急转弯
1. 玩法简介
《Python游戏编程快速上手》里这一章叫做“Jokes”,问哥这里将它本地化,于是变成了“脑筋急转弯”,但核心内容是没有变化的,甚至是一样无聊的:通过按回车键,由电脑依次读出每个脑筋急转弯,再回车,显示答案,如此反复。
2. 游戏流程
三、程序代码
全部代码如下:
print('有一个老太太上了公交汽车。为什么没有人让座?')
input()
print('因为车上还有空座。')
input()
print('一天,有两人在马路上走着,一人说“你看前面有辆车”,另一个人却说“没车”。为什么?')
input()
print("因为那是一辆'煤'车。")
input()
print('小狗怎么才能一下子变大呢?')
input()
print('把"犬"上的点去掉。')
input()
print("有一只小白猫掉进河里了,一只小黑猫把它救了上来,请问:小白猫上岸后的第一句话是什么?")
input()
print("小白猫说:\"喵。\"")
input()
print('''一个聋哑人到五金商店买钉子,他把左手的食指和中指分开做成夹着钉子的样子,
然后伸出右手作锤子状。服务员给他拿出锤子,他摇了摇头,给他拿来钉子,他满意地买了。
接着来了一个盲人,请问,他怎样才能买到剪子?''')
input()
print("盲人会说话,直接告诉服务员。")
print('''树有心眼,西下美女,手扶下巴,人在尔边,心死相依,言及自己,
十件家具,白色勺子,儿女双全,又住一起''', end='')
input()
print('这是哪句歌词?')
input()
print('想要把你忘记真的好难。')
四、代码详细分析
1. 空的input()函数
大家还记得上节课里说过input()是一个玩家向计算机输入指令的函数,而print()是电脑向玩家输出/打印/显示信息的函数。在上节课的例子里我们用一个变量,将用户从键盘输入的任何信息以字符串的形式保存在其中。
# 用户键盘输入任意字符,保存在变量“姓名”中
姓名 = input()
# 用户键盘输入任意字符(游戏中先通过print暗示用户输入一个整数)
print('猜猜看')
数字 = input()
这里电脑将input()获得的信息保存在变量之中,是为了在后面的程序里根据该信息作进一步的处理和判断,根据不同的信息显示不同的结果,从而实现一定的人机交互。
而input()这个函数实际上并不要求一定要有变量接收,比如:
print('小狗怎么才能一下子变大呢?')
input()
本例中程序运行到input()时光标会停在那里等待用户输入,而当用户输入任何信息按下回车,甚至什么也不输入,只是按下回车后,程序将不做任何处理,继续执行后面的语句。实际上,在这里,input()实现的仅仅类似一个“大喘气”的效果。让程序暂停一下,等待用户按下回车后继续。
2.字符串转义
上节课我们提到过Python既可以使用双引号" ",也可以使用单引号’ '表示一串字符串,但是如果字符串中需要使用双引号,则两边只能使用单引号,反之亦然。
print("因为那是一辆'煤'车。")
print('把"犬"上的点去掉。')
如果遇到必须同时表示单引号和双引号的字符串,就必须使用转义符了。参考以下示例。
Python定义的转义符有很多,常用的一些如下表所示。当在字符串中出现以下组合时("\"加上一个字母或符号),Python默认会执行它的特殊意义(这也是为什么其被称为“转义符”)。
转义字符 | 实际显示的内容 |
---|---|
\n | 回车或换行 |
\t | 制表符,等同于Tab |
\’ | 单引号 |
\" | 双引号 |
\\ | 反斜杠 |
所以当我们需要在一对单(双)引号括起来的字符串里正确显示/打印出单(双)引号的时候,使用转义符是最简便的方法(当然还有其他方法,我们以后会介绍)。仔细观察一下本节课使用的例子:
print("小白猫说:\"喵。\"")
3.多行字符串
当我们需要一次性输入很多字符串,并不想使用多条print()语句,却想要它们在屏幕上分段显示的时候,我们可以使用刚刚介绍过的 \n 换行转义符。
print('一个聋哑人到五金商店买钉子,他把左手的食指和中指分开做成夹着钉子的样子,\n然后伸出右手作锤子状。服务员给他拿出锤子,他摇了摇头,给他拿来钉子,他满意地买了。\n接着来了一个盲人,请问,他怎样才能买到剪子?')
这样,当Python执行这条命令时,\n会被当做一个回车/换行,显示效果如下:
但是这样程序却写得很长(你也注意到,需要拉动滚动条才能看到右边写了什么),于是Python提供了另一种方法:使用左右三个单引号将一串字符串括起来。这样就可以在写程序的时候将字符串中任意换行了,如下的写法显示效果与上面的例子相同。
print('''一个聋哑人到五金商店买钉子,他把左手的食指和中指分开做成夹着钉子的样子,
然后伸出右手作锤子状。服务员给他拿出锤子,他摇了摇头,给他拿来钉子,他满意地买了。
接着来了一个盲人,请问,他怎样才能买到剪子?''')
这种三个单引号的使用方法也引申出了另一种用法:注释。
上节课我们也介绍过,Python程序执行的时候,跟在"#“后面的字符将会被忽略,所以我们可以利用这个特点为程序添加注释,也可以在暂时不需要某条语句、却又不想删除的时候,在前面加个”#“将其注释掉,不再执行。但是”#"的作用范围仅仅一行,于是当我们需要注释掉很多语句的时候就会显得非常麻烦。
这个时候我们可以曲线救国,使用三个单引号,将不需要的一大段语句括起来。这样,这段内容将会被程序当成一个多行字符串,但是因为没有赋值(“=”)或打印(print())等操作,所以实际的效果就相当于“没有被执行”,如此一来,也就等同于注释了多行语句。
4.print()函数的end参数
不知大家有没有注意到倒数第三个print()语句,我们除了使用多行字符串以外,还在print()的括号里增加了一个值为空的end参数。
print('''树有心眼,西下美女,手扶下巴,人在尔边,心死相依,言及自己,
十件家具,白色勺子,儿女双全,又住一起''', end='')
print()函数会在屏幕上将括号里的内容显示出来,然后默认在最后一个字符的后面添加换行。但是如果指定了end=’ ‘,Python会在print()内容输出以后,跟上end=’ ‘引号里指定的内容,且不换行(实际上,如果没有指定end,相当于end=’\n’,请读者体会一下)。在需要某些特殊显示的时候,比如重复调用函数,将某些字符串连续地在同一行显示(而不是换行),就可以使用end参数,如下例:
这在后面的程序里也会用到,到时候我们再详细解释。
总结与思考
这节课的知识点相对比较少,也比较基础。同时问哥也在想,较少的内容也许更能够为初学者所接受,但同时却又舍弃了一些“完成了一个完整程序”的成就感。当后面介绍到稍微复杂一点的程序的时候,可能不得不将一个程序示例进行拆分,在多篇文章中连载。而问哥会尽可能在“冗长”与“成就感”之间做一个平衡,也欢迎各位朋友在评论区提出改进意见。
本章的内容十分简单,你也可以将输入的脑筋急转弯换成其他笑话、故事、歇后语等有趣的内容,也可以放入无限多的内容,程序会一直按顺序执行(伴随着用户的回车键),直到所有内容都被显示。那么可以进一步思考一下,如何在这样简单的代码中添加一些代码,把计算机变成一个故事大王,在我们需要的时候,随机抽取若干条笑话或故事,供我们消遣呢?感兴趣的朋友不妨思考一下。
我们下次再见咯~