通过游戏编程学Python
通过游戏编程学Python(1)— 猜数字
文章目录
- 通过游戏编程学Python
- 前言
- 一、知识点
- 二、第一个游戏 —— 猜数字
- 1. 玩法简介
- 2. 游戏流程
- 三、程序代码
- 三、代码详细分析
- 1. import语句
- 2.输入与输出
- 3.While循环
- 4.代码段
- 5.变量类型转换
- 6.判断语句与比较操作符
- 7.输出结果
- 总结与思考
前言
很多人使用Python来编写游戏,然而问哥作为一个非专业选手,却是为了编写游戏而从零开始学习了Python。在这个过程中,临摹与研习别人的代码必不可少。其中的收获不可谓不丰,但也走了不少弯路,有时候为了搞懂其中某个知识点,需要四处搜索相关资料。于是问哥想把一些学习的经验总结并分享出来,一方面,可以巩固自己薄弱的编程功底,另一方面,如果同时能够帮助到同样零基础的你,那就再好不过了。
本系列文章使用Al Sweigart编写的《Python游戏编程快速上手》为教程,所以也可以说是一系列学习笔记。同时,为了易懂易记,我将代码中的注释和变量都换成了中文。笔记重点在代码分析,自然也略过了前面较为简单且基础的环境安装部分。如果问哥以后能够坚持写完本系列的话,再考虑补全这部分(笑)。
兴趣是最好的老师,愿我们学有所成。
一、知识点
- 模块的导入
- 输入与输出
- 缩进与代码块
- 基本变量类型及类型转换
- 流程控制语句while, if, break
二、第一个游戏 —— 猜数字
1. 玩法简介
电脑随机“想”一个数字(1到20之间的整数),玩家共有6次机会进行猜测。如果猜的数字比电脑的数字小,电脑提示“低了哦”,反之则提示“高了哦”。如果在6次以内猜中,则祝贺玩家并显示实际猜了几次。如果6次机会用完,电脑公布正确数字。
2. 游戏流程
三、程序代码
全部代码如下:
# 这是一个猜数字的游戏
import random次数 = 0print('你好,你叫什么名字?')
姓名 = input()随机数 = random.randint(1, 20)
print('好的,' + 姓名 + ',猜猜看我想的数字是多少?提示:1到20之间的整数')while 次数 < 6:print('猜猜看') # 注意前面有4个空格,同一列的代码都处于while代码块数字 = input()数字 = int(数字)次数 = 次数 + 1if 数字 < 随机数:print('低了哦') # 注意前面有8个空格,同一列的代码都处于if代码块if 数字 > 随机数:print('高了哦')if 数字 == 随机数:breakif 数字 == 随机数:次数 = str(次数)print('干得好,' + 姓名 + '!你用了' + 次数 + '次就猜对了!')if 数字 != 随机数:随机数 = str(随机数)print('很遗憾,我想的数字是' + 随机数)
三、代码详细分析
1. import语句
# 这是一个猜数字的游戏
import random
随机数 = random.randint(1, 20)
Python有很多内置的函数可以直接调用,但是也有一些更为常用和强大的函数保存在某些外部模块文件中。当用到这些函数时,需要先使用import语句调用相应的模块。其实这些模块也是Python程序,系统自带的模块都可以在C:\Python安装目录\Lib\子文件夹下找到。
本例中需要随机生成一个整数,作为计算机“想”的数字。于是用到了random模块中的randint()函数。该函数接收两个参数(例子中为1和20),表示在1和20之间(包括1和20)随机得出一个数,然后赋值给一个名叫“随机数”的变量中。
有时候为了调用方便,我们也可以只导入某个模块中的特定函数,这样后面在使用函数的时候就不用指定模块名了。比如以下语句实现的效果与示例中相同,但不需要在函数randint前写出模块的名称random。
from random import randint
随机数 = randint(1, 20)
2.输入与输出
使用input()与print()函数可以向电脑输入信息,或将信息显示(打印)在屏幕上。这样就可以实现与电脑互动的效果。
print('你好,你叫什么名字?')
姓名 = input()
当运行这两条语句时,电脑会先在屏幕上显示字符串“你好,你叫什么名字?”,然后默认换行,再通过input()函数等待用户的键盘输入,并将用户输入的文本以字符串的形式赋值给变量“姓名”。
然后电脑使用“姓名”这个变量,打印出欢迎语句。
print('好的,' + 姓名 + ',猜猜看我的数字是多少?提示:1到20之间的整数')
这里的加号“+”用来拼接字符串,表示将前后的字符串(变量“姓名”的值也是字符串)连接在一起,形成一个新的字符串。
Python既可以使用双引号" ",也可以使用单引号’ '表示一串字符串,之所以如此,是为了方便在字符串中正常使用单双引号。如果字符串中既含有单引号,也含有双引号,则需要使用符号“\”将字符串中的引号转义。参考以下示例。
3.While循环
增加一个变量“次数”,用来计算玩家猜了多少次。然后使用While循环使玩家不停地猜。在游戏开始之前,“次数”为0。
次数 = 0
while 次数 < 6:# 省略部分代码次数 = 次数 + 1
上面语句中当(While)次数小于6的时候,冒号(:)后面同一代码块的语句会反复执行。注意:必须在代码块中改变变量“次数”的值,不然“次数”永远为0,程序也将会陷入死循环。该代码中,每循环一次(用户猜一次数字),“次数”变量的值加1。
变量自身进行数学运算,再赋值给自身的操作可以使用简化写法。比如上面的赋值语句可以简写如下:
次数 += 1
其他数学运算符号同理。
4.代码段
Python使用缩进来标记代码所在的段落。连续、同一缩进的语句为一个代码段。默认使用4个空格,或Tab来缩进。
while 次数 < 6:print('猜猜看')数字 = input()数字 = int(数字)次数 = 次数 + 1if 数字 < 随机数:print('低了哦')if 数字 > 随机数:print('高了哦')if 数字 == 随机数:break
本例中while语句后面所有循环体的语句均缩进4个空格,表示包括if语句在内的所有语句均属于while代码段。而if语句后面缩进了8个空格,以表示这些语句属于if代码段。
在IDE以及各种编程环境(Pycharm,VSCode等)中,电脑会在循环、判断、函数、类等语句后面自动缩进代码段,所以大部分情况下无须担心。但仍需小心检查某些语句属于哪个代码段,以免造成逻辑错误。
5.变量类型转换
游戏开始后,电脑在屏幕中显示“猜猜看”,然后使用input()等待用户输入一个整数,以字符串的形式赋值给变量“数字”。但是后面要用该整数与电脑得到的随机数进行比较大小,而字符串是不能直接与数字比较大小的,于是使用int()函数将用户输入的字符串整数转换为整数类型。
while 次数 < 6:print('猜猜看')数字 = input()数字 = int(数字)次数 = 次数 + 1
在程序的后半部分,需要进行拼接字符串操作的时候,同样又使用了另一个类型转换函数str()将整数转换成了字符串。
次数 = str(次数)随机数 = str(随机数)
这里也可以发现,Python中同一变量的类型可以自由变化,在某些时候保存的是整数,在需要的时候,又可以改变类型,保存字符串。原因是Python的变量中保存的其实是实际数值的内存地址,至于那个地址里保存的是整数还是字符串还是其他类型,变量自身不做限制。可以随时通过赋值语句“=”改变变量中保存的内存地址,从而指向不同的数据类型。
6.判断语句与比较操作符
为了判断用户猜的数字(储存在变量“数字”中)是否就是电脑产生的“随机数”,使用了三条if判断语句,依次判断数字是否小于、大于、等于随机数:
if 数字 < 随机数:print('低了哦')if 数字 > 随机数:print('高了哦')if 数字 == 随机数:break
但是上面语句即使满足了第一个条件,还是会继续比下去,显然没有意义。所以其实可以转换为以下if…elif…else的格式,在本例中实现的功能相同。
if 数字 < 随机数:print('低了哦')elif 数字 > 随机数:print('高了哦')else:break
当猜中正确的数字(“数字”等于“随机数”)时,程序使用了break语句跳出while循环,即不用再循环到“次数”为0,即可继续执行while后面的语句。
在while和if关键字后面使用了比较运算符连接的表达式。比较运算符共有6种。
比较符 | 意义 |
---|---|
> | 大于 |
< | 小于 |
== | 等于 |
>= | 大于等于 |
<= | 小于等于 |
!= | 不等于 |
如果等式成立,则返回一个布尔(Bool)类型的True,反之返回False。
换句话说,while和if其实是判断后面的比较运算式返回的结果是True还是False。如果是True,则继续向下运行,反之则跳过。
7.输出结果
当玩家猜中数字、或猜错次数达到6次后,程序自动跳出循环,继续执行后面的语句。并通过比较“数字”与“随机数”(运算符==或!=),判断玩家是否猜对,再执行相应的代码,拼接字符串以显示不同的结果。
if 数字 == 随机数:次数 = str(次数)print('干得好,' + 姓名 + '!你用了' + 次数 + '次就猜对了!')if 数字 != 随机数:随机数 = str(随机数)print('很遗憾,我的数字是' + 随机数)
总结与思考
通过一个简单的游戏,我们学习了Python编程的一些基本语句和规范,如代码块、字符串拼接、比较运算符、变量的类型转换等等。
Python本身的编程哲学也是追求简洁易懂,所以很多语句比如while循环、if判断都可以直接读出意思。而放在游戏中,我们更要考虑的是如何实现游戏的过程。当读到他人的代码时,借鉴别人如果简洁高效地实现我们想要的效果,这一点尤为重要。
当然,也许出于教学的目的,一些程序还留有很大的优化空间,以及潜在的bug。大家可以想一想,有没有更简洁的代码可以实现本例中的猜数字的游戏呢?
另外,示范代码并没有对用户猜的数字进行格式上的要求,而是默认用户会“听话”地输入1到20的整数。而如果用户输入的不是整数,而是其他类型的文本,比如小数、中文数字,甚至是任意的字符串,程序都是报错并退出。原因便是其中用到的int()函数无法应用到除了整数型之外的字符串类型上。我们怎样才能在输入的时候加上一个判断语句,来辨别出这些“非法”字符,并要求用户重新输入呢?
这些都是值得思考的,我们可以带着问题继续学习,相信有一天,我们一定可以写出更加完美、好玩的游戏。
下次再见!