在过去的两周,通过对python基础知识的学习以及通过一个具体的小游戏的练习,大概对Python有了一个初步的了解,在这里做一个总结,希望对今后的进一步学习有帮助。
之前学习过C语言,在学习了Python之后,给我最大的感觉就是Python更加简洁易学,语句更加易读,并且可以通过载入各种库来实现很多功能,因此功能也更加强大。而Python和C语言也有很多相似的地方,下面总结一些Python比较独特的地方。
1. 分号“;”的使用
C语言中分号是必须作为每句语句的结束标志,而在Python中,分号则没有那么重要了,Python一般通过换行来表示语句的结束,但要在一行中输入多条语句,也就是一行物理行中包括多个逻辑行,就必须使用分号来分隔语句,而Python一般不推荐使用分号,换行来区分每条语句更加简洁明了。
2. 缩进
缩进在Python中是非常重要的,Python中通过缩进来确定各个语句的分组,每一块语句必须要有相同的缩进,一般的编辑器会自动完成缩进,一般是四个空格。
3. 数据类型
数据类型大多和C语言相同,包括字符串、布尔类型、整数、浮点数、数字,比较特殊的有列表、元组、字典。Python在定义一个变量时不需要像C语言一样限定它的类型,变量会根据附给它的值自动决定它的类型,但是也可以强制转换类型,例如int(x)就是把x转型成整数。
(1)列表
列表list是一个是一个可变的有序表,是Python内置的一种数据类型,可以随时添加、删除、替换其中的元素。其用中方括号包围、逗号隔开的一组元素,且列表中的元素可以是不同的类型。
(2)元组
除了序列以外的另一种有序表称为元组tuple,但是元组一旦初始化便不能修改,在定义时,元组的元素就被确定了。这样能让代码更加安全。
(3)字典
字典Dict,能够快速查找信息。在字典中,名字叫做“键(key)”,对应的内容信息叫做“值(value)”。字典就是一个键值对的集合。键值对用冒号分割,每个对之间用逗号分割,整个字典包括在花括号中。
4. for...in...语句
Python中的for循环与C语言中的for循环完全不同,通过它可以遍历序列中的每一个项目。常见的有for i in range(1,5),表示i由1循环到4。
5. 模块
Python之所以功能强大,主要是因为它自带功能丰富的标准库,以及数量庞大的第三方库,使用这些功能的基本方法就是使用模块。通过函数,可以在程序里重用代码;通过模块,则可以重用别的程序中的代码。模块可以理解为是一个包含了函数和变量的py文件。在你的程序中引入了某个模块,就可以使用其中的函数和变量。通过import引入。
6. 类
类似常见的int类型,我们也可以通过类能够创建一个新的类型,其中的对象就是实例,类通过关键字class创建,一般都包含一个__init__()函数以及self参数,用来初始化对象。
同时我们也可以创建基类和子类,创建子类时类名后的括号里应包含基类类名。
在学习了Python的基本知识后,通过做一个俄罗斯方块小游戏进一步练习和学习Python。这里需要先安装一个pygame库,安装完成后,需要在开始时输入from pygame.locals import * 即引入pygame中的所有常量,之后便可以使用pygame了。下面总结一些比较重要的地方。
首先要创建一个游戏窗口,使用pygam.display.set_mode()方法创建,然后设置游戏中一个方块的的大小,也就是一个方块对应20个像素点,俄罗斯方块中每个砖块是由四个小方块组成,但在设计过程中,我用5*5的列表来表示砖块模板,是因为这样表示在之后为方块上色时将小方块坐标转换成像素坐标时更加方便。通过引入random模块来随机产生不同类型的小方块。
再一个就是在游戏窗口内显示文字:首先使用pygame.font.SysFont()创建几种字体font,再调用font.render()方法写字,可以设置要写的文字,文字颜色背景颜色,是否开启抗齿距。之后得到一个Surf,再通过get_rect()方法得到一个Rect,在Rect中设置要在窗口中显示的位置,最后通过bilt(Surf,Rect)方法在在游戏窗口显示文字。
游戏运行还有一个重要的的参数便是帧数,也就是一秒中循环的次数,通过pygame.time.Clock()得到一个对象,再通过tick()方法设置帧数。
循环过程中,要响应按下键盘的事件,通过pygame.event.get()来得到要处理的事件,event.type来处理事件是按下键盘还是键盘弹起,处理完成后,再通过event.key来判断具体是哪个按键。游戏过程中首先要判断是否按下退出键Esc或q,按下则立即退出。
然后响应是否按下方向键,为了能够响应连续按下按键时,方块仍能连续移动,先设置一个时间常量,表示每次持续按下该时间常量时会移动,采用time模块中的time()方法来获得当前时间,与之前按下键时的时间相减,得到的时间大于时间常量经处理便可以实现连续移动。这个处理过程很巧妙,方块每移动一格都会重新设置按下键时的时间,因此可以实现方块的连续移动。
除了要响应移动外,还要响应砖块的旋转,这个处理也十分巧妙,因为砖块的各个模型及其旋转之后的各种模型都储存在列表里,因此可以设置一个参数来表示,每按一次就加一,但如果单纯地这样加,可能会超过总的旋转模型,因此这里用加完的参数模除(%)总的旋转模型,这样一来便不必担心上述问题。
为了使用方便,将砖块的各种模型做成一个字典,用字符串当关键字,值为存着模型的列表。同时通过函数随机得到一个砖块,为了使用方便,同样将其设置为字典,其中包括,砖块的基本类型,各个旋转模型,横纵坐标,以及砖块的颜色。
之后便是在主函数中通过各种功能函数来实现俄罗斯方块游戏。
在编写游戏程序的过程中,由于对各种模块不是很熟悉,写起来很费力,参考了一个博主的程序,之后一个一个对模块和方法查找,即使写完程序,