Python游戏设计案例实战
上QQ阅读APP看书,第一时间看更新

1.1 Python语言概述

1.1.1 Python语言简介

Python于1989年年底由吉多范罗·苏姆(Guido van Rossum)开发,被广泛应用于处理系统管理任务和科学计算,是最受欢迎的程序设计语言之一。2011年1月,它被TIOBE编程语言排行榜评为2010年度语言。自2004年以后,Python的使用率呈线性增长,在TIOBE公布的2017年编程语言指数排行榜中,Python的排名处于第四位(前3位是Java、C和C++)。2018年8月,根据IEEE Spectrum发布的研究报告显示,Python在2017年已经成为世界上最受欢迎的语言。

Python支持命令式编程、函数式编程,完全支持面向对象程序设计,语法简洁清晰,并且拥有大量的扩展库,几乎支持所有领域的编程开发。

Python为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容。使用Python进行开发,许多功能不必从零编写,直接使用现成的即可。除了内置的库外,Python还有大量的第三方库,也就是其他开发者开发的,可供开发者直接使用。Python就像“胶水”一样,可以把多种不同语言编写的程序融合到一起实现无缝拼接,更好地发挥不同语言和工具的优势,满足不同应用领域的需求。因此,Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入学习下去,也可以编写更加复杂的程序。

Python同时也支持伪编译将Python源程序转换为字节码来优化程序和提高运行速度,还可以在没有安装Python解释器和相关依赖包的平台上运行。

Python语言的应用领域主要包括如下几种。

(1)Web开发。Python语言支持网站开发,比较流行的开发框架有web2py、Django等。许多大型网站就是用Python开发的,如YouTube、Instagram等。很多大公司,如Google、Yahoo等,甚至NASA(美国航空航天局)都大量地使用Python进行开发。

(2)网络编程。Python语言提供了socket模块,对socket接口进行了两次封装,支持对socket接口的访问;还提供了urllib、httplib、scrapy等大量模块,用于对网页内容进行读取和处理,并结合多线程编程以及其他相关模块可以快速开发网页爬虫等应用程序。

(3)科学计算与数据可视化。Python中用于科学计算与数据可视化的模块很多,如NumPy、SciPy、Matplotlib、Traits、TVTK、Mayavi、VPython、OpenCV等,涉及的应用领域包括数值计算、符号计算、二维图表、三维数据可视化、三维动画演示、图像处理以及界面设计等。

(4)数据库应用。Python数据库模块有很多,例如,可以通过内置的sqlite3模块访问SQLite数据库,使用pywin32模块访问Access数据库,使用pymysql模块访问MySQL数据库,使用pywin32和pymssql模块访问SQL Sever数据库。

(5)多媒体开发。PyMedia模块可以对WAV、MP3、AVI等多媒体格式文件进行编码、解码和播放;PyOpenGL模块封装了OpenGL应用程序编程接口,通过该模块可在Python程序中集成二维或三维图形;Python图形库(Python Imaging Library,PIL)为Python提供了强大的图像处理功能,并提供广泛的图像文件格式支持。

(6)电子游戏应用。Pygame就是用来开发电子游戏软件的Python模块。使用Pygame模块,可以在Python程序中创建功能丰富的游戏和多媒体程序。

Python有大量的第三方库,很多功能都能通过相应的Python库便捷地实现。

目前,Python有两个版本,一个是2.x版,另一个是3.x版,这两个版本是不兼容的。由于3.x版越来越普及,本书将以最新的Python 3.5版本为基础进行讲解。

1.1.2 安装Python

1. 在Mac上安装Python

如果使用的Mac系统是OS X 10.8~10.10,那么系统自带的Python版本是2.7。要安装最新的Python 3.5,有如下两个方法。

方法一,从Python官网上下载Python 3.5的安装程序,双击运行并安装;

方法二,如果安装了Homebrew,直接通过命令brew install python3安装即可。

2. 在Linux上安装Python

如果使用的是Linux系统(需要用户具有Linux系统管理经验),那么先下载Python-3.5.0b4.tgz,再使用解压命令tar -zxvf Python-3.5.0b4.tgz,然后切换到解压的安装目录,执行:

[root@www python]#cd Python-3.5.0 
[root@www Python-3.5.0]#./configure 
[root@www Python-3.5.0]#make 
[root@www Python-3.5.0]#makeinstall

至此,安装完成。

输入python,如果出现下面的提示:

Python 3.5.0 (#1, Aug 06 2015, 14:04:52) 
[GCC 4.1.1 20061130 (Red Hat 4.1.1-43)] on linux2 
Type "help", "copyright", "credits" or "license" for more information.

出现此提示说明安装成功了。不同Linux系统下,显示的第二行有可能不同。

3. 在Windows上安装Python

首先,根据你的Windows版本(64位还是32位)从Python的官方网站下载Python 3.5对应的64位安装程序或32位安装程序,然后,运行下载的EXE安装包,安装界面如图1-1所示。

图1-1 在Windows上安装Python 3.5的界面

特别要注意在图1-1中勾选“Add Python 3.5 to PATH”,然后单击“Install Now”即可完成安装。

安装成功后,使用cmd打开命令提示符窗口,输入python后,会出现图1-2所示的命令提示符窗口。若在窗口中看到Python的版本信息,就说明Python安装成功。

图1-2 命令提示符窗口

提示符“>>>”表示我们已经在Python交互式环境中了,可以输入任何Python代码,按回车键后会立刻得到执行结果。现在,输入exit()并按回车键,就可以退出Python交互式环境(或者也可以直接关掉命令行窗口)。

1.1.3 Python开发环境IDLE的启动

安装Python后,我们可以从“开始”菜单→“所有程序”→“Python 3.5”→“IDLE(Python 3.5)”来启动IDLE。IDLE启动后的初始窗口如图1-3所示。

图1-3 IDLE的交互式编程模式(Python shell)

如图1-3所示,启动IDLE后首先映入我们眼帘的是Python Shell,我们通过它可以在IDLE内部使用交互式编程模式来执行Python命令。

如果使用交互式编程模式,那么直接在IDLE提示符“>>>”后面输入相应的命令并按回车键执行即可;如果执行成功的话,马上就可以看到执行结果,否则会抛出异常。

例如,查看已安装版本的方法(在所启动的IDLE界面标题栏也可以直接看到):

>>> import sys
>>> sys.version

结果:'3.5.1(v3.5.1:37a07cee5969, Dec 6 2015, 01:38:48)[MSC v.1900 32 bit(Intel)]'

>>>3+4
结果:7
>>>5/0
Traceback(most recent call last):
 File "<pyshell#3>", line 1, in <module>
   5/0
ZeroDivisionError: division by zero

除此之外,IDLE含有一个编辑器,可用来编辑Python程序(或者脚本)文件;还含有一个调试器来调试Python脚本。下面我们从IDLE的编辑器开始介绍。

可在IDLE界面中使用菜单“File”→“New File”命令启动编辑器(见图1-4),来创建一个程序文件,输入代码并保存为文件(务必要保证扩展名为“.py”)。

1.1.4 利用IDLE创建Python程序

IDLE为开发人员提供了许多有用的特性,如自动缩进、语法高亮显示、单词自动完成以及命令历史等,这些功能能够有效地提高我们的开发效率。下面我们通过一个实例来对这些特性分别加以介绍。示例程序的源代码如下所示。

#示例一
p = input("Please input your password:\n")
if p!="123":
  print("password error!")

由图1-4可见,不同部分颜色不同,这就是语法高亮显示,即对代码不同的元素使用不同的颜色进行显示。使用默认设置时,关键字显示为橘红色,注释显示为红色,字符串为绿色,解释器的输出显示为蓝色。在键入代码时,会自动应用这些颜色并突出显示。语法高亮显示的好处是,可以更容易区分不同的语法元素,从而提高可读性;与此同时,语法高亮显示还降低了出错的可能性。比如,如果输入的变量名显示为橘红色,那么,开发人员就需要注意了,这说明该名称与预留的关键字冲突,所以必须对变量更换名称。

图1-4 IDLE的编辑器

单词自动完成是指,当用户输入单词的一部分后,从“Edit”菜单选择“Expand word”项,或者直接按【Alt+/】组合键自动完成该单词。

当用户在if关键字所在行的冒号后面按回车键之后,IDLE将自动进行缩进。在一般情况下,IDLE将代码缩进一级,即四个空格。如果想改变这个默认的缩进量的话,可以从“Format”菜单选择“New indent width”项来进行修改。初学者需要注意的是,尽管自动缩进功能非常方便,但是不能完全依赖它,因为有时候自动缩进未必完全满足实际需求,所以还需要仔细检查一下。

创建好程序之后,从“File”菜单中选择“Save”保存程序。如果是新文件,则会弹出“Save as”对话框,可以在该对话框中指定文件名和保存位置。保存后,文件名会自动显示在屏幕顶部的蓝色标题栏中。如果文件中存在尚未存盘的内容,则标题栏的文件名前后会有星号出现。

1.1.5 在IDLE中运行和调试Python程序

1. 运行Python程序

要使用IDLE执行程序的话,可以从“Run”菜单中选择“Run Module”菜单项(或按【F5】键),该菜单项的功能是执行当前文件。对于示例一的程序,执行情况如图1-5所示。

图1-5 运行界面

用户输入的密码是“777”,由于密码错误,会出现输出"password error!"。

2. 使用IDLE的调试器

在软件开发的过程中,总免不了出现这样或那样的错误,其中有语法方面的,也有逻辑方面的。对于语法错误,Python解释器能很容易地检测出来,这时它会停止程序的运行并给出错误提示。对于逻辑错误,解释器就无能为力了,这时程序会一直执行下去,但是得到的运行结果往往却是错误的。因此,我们常常需要对程序进行调试。

最简单的调试方法是直接显示程序数据,例如,可以在某些关键位置用print语句显示出变量的值,从而确定有没有出错。但是这个办法比较麻烦,因为开发人员必须在所有可疑的地方都插入打印语句。在程序调试完后,还必须将这些打印语句全部清除。

除此之外,用户还可以使用调试器来进行调试。利用调试器,用户可以分析被调试程序的数据,并监视程序的执行流程。调试器的功能包括暂停程序执行、检查和修改变量、调用方法而无须更改程序代码等。IDLE也提供了一个调试器,帮助开发人员来查找逻辑错误。

下面简单介绍IDLE的调试器的使用方法。在“Python Shell”窗口中单击“Debug”菜单中的“Debugger”菜单项,就可以启动IDLE的交互式调试器。这时,IDLE会打开图1-6所示的“Debug Control”窗口,并在“Python Shell”窗口中输出“[DEBUG ON]”与“>>>”。

图1-6 “Debug Control”调试窗口

我们可以在“Debug Control”窗口查看局部变量和全局变量等有关内容。如果要退出调试器,则可以再次单击“Debug”菜单中的“Debugger”菜单项,IDLE会关闭“Debug Control”窗口,并在“Python Shell”窗口中输出“[DEBUG OFF]”。

1.1.6 Python基本输入

用Python进行程序设计,输入是通过input()函数来实现的,input()函数的一般格式为:

x=input('提示:')

该函数返回输入的对象。可输入数字、字符串和其他任意类型对象。

尽管Python 2.7和Python 3.5形式一样,但Python 2.x和Python 3.x对该函数的解释略有不同。在Python 2.7中,该函数返回结果的类型由输入值时所使用的界定符来决定,如下面的Python 2.7代码:

>>> x = input("Please input:")
Please input:3                      #没有界定符,整数
>>> print type(x)
<type 'int'>
>>> x = input("Please input:")
Please input:'3'                    #单引号,字符串
>>> print type(x)
<type 'str'>

在Python 2.7中,还有另外一个内置函数raw_input()也可以用来接收用户输入的值。与input()函数不同的是,无论用户使用什么界定符,raw_input()函数返回结果的类型一律为字符串。

在Python 3.5中,不存在raw_input()函数,只提供了input()函数用来接收用户的键盘输入。在Python 3.5中,不论用户输入数据时使用什么界定符,input()函数的返回结果都是字符串,需要将其转换为相应的类型再进行处理(相当于Python 2.7中的raw_input()函数)。如下面的Python 3.5代码:

>>> x = input('Please input:') 
Please input:3 
>>> print(type(x)) 
<class 'str'> 
>>> x = input('Please input:') 
Please input:'1' 
>>> print(type(x)) 
<class 'str'> 
>>> x = input('Please input:') 
Please input:[1,2,3] 
>>> print(type(x)) 
<class 'str'>

1.1.7 Python基本输出

Python 2.7和Python 3.5的输出方法也不完全一致。在Python 2.7中,使用print语句进行输出,而Python 3.5中使用print()函数进行输出。

另外一个重要的不同之处是,对Python 2.7而言,在print语句之后加上逗号“,”则表示输出内容之后不换行,例如:

for i in range(10): 
        print i, 

结果:0 1 2 3 4 5 6 7 8 9

在Python 3.x中,为了实现上述功能则需要使用下面的方法:

for i in range(10,20): 
       print(i, end=' ')  #不换行,输出结束时输出空格

结果:10 11 12 13 14 15 16 17 18 19

print()函数基本格式如下:

print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

print()函数输出时,由sep参数将多个输出对象value分隔,输出结束时输出end参数。sep的默认值是一个空格,end默认值是换行,file的默认值是标准输出流,flush的默认值是非。如果想要自定义sep、end和file,就必须对这几个关键词进行赋值。

>>> print(123,'abc',45,'book',sep='#') #指定用'#'作为输出分隔符
123#abc#45#book 
>>> print('price');print(100)            
#默认以回车换行符作为输出结束符号,即在输出最后会换行
price 
100 
>>> print('price', end='=');print(100)  
#指定用'='作为输出结束符号,所以输出在一行
price=100

1.1.8 Python代码规范

1. 缩进

Python程序是依靠代码块的缩进来体现代码之间的逻辑关系的,缩进结束就表示一个代码块结束了。类定义、函数定义、选择结构、循环结构,行尾的冒号表示缩进的开始。同一个级别的代码块的缩进量必须相同。

例如:

for i in range(10):       #循环输出数字0~9 
      print (i, end=' ')

一般而言,以4个空格为基本缩进单位,可以在IDLE开发环境中通过以下的操作实现代码块的缩进和反缩进,无须使用制表符【Tab】:

Fortmat菜单→“Indent Region”/“Dedent Region”命令。

2. 注释

一个用户友好的、可读性强的程序一般包含20%以上的注释。常用的注释方式主要有以下两种。

(1)方法一:以#开始,表示本行#之后的内容为注释。

#循环输出数字0~9 
for i in range(10):  
       print (i, end=' ')

(2)方法二:包含在一对三引号'''…'''或"""…"""之间且不属于任何语句的内容将被解释器认为是注释。

'''循环输出0~9的整数,可以多行文字'''
for i in range(10):
   print(i, end=' ')

在IDLE开发环境中,可以通过下面的操作快速注释/解除注释大段内容:

Format菜单→“Comment Out Region”/“Uncomment Region”命令。

3. 导入

使用import可导入模块。建议一次只导入一个模块,而不要一次导入多个模块。

>>>import math             #导入math数学模块
>>>math.sin(0.5)           #求0.5的正弦
>>>import random           #导入random随机模块
>>>x=random.random( )      #获得[0,1) 内的随机小数
>>>y=random.random( ) 
>>>n=random.randint(1,100) #获得[1,100]上的随机整数

import math, random语句可一次导入多个模块,但不提倡使用。

import的次序是,先import Python内置模块,再import第三方模块,最后import自己开发的项目中的其他模块。

不要使用from module import *,除非是import常量定义模块,或其他确保不会出现命名空间冲突的模块。

4. 换行

如果一行语句太长,可以在行尾加上反斜杠“\”来换行,将语句分成多行,但是更建议使用括号来包含多行内容。

x = '这是一个非常长非常长非常长非常长 \
       非常长非常长非常长非常长非常长的字符串'    #用“\”来换行
x = ('这是一个非常长非常长非常长非常长 '
       '非常长非常长非常长非常长非常长的字符串')   #圆括号中的行会连接起来

又如:

if (width == 0 and height == 0 and 
          color == 'red' and emphasis == 'strong'):  #圆括号中的行会连接起来
         y='正确' 
   else: 
         y= '错误'

5. 必要的空格与空行

运算符两侧、函数参数之间、逗号两侧建议使用空格分开。不同功能的代码块之间、不同的函数定义之间建议增加一个空行以增加可读性。

6. 常量名

常量名的所有字母大写,用下画线连接各个单词,类名首字母大写。如:

WHITE = 0XFFFFFF
THIS_IS_A_CONSTANT = 1

1.1.9 Python帮助

使用Python的帮助对学习和开发都是很重要的。在Python中可以使用help()方法来获取帮助信息。使用格式如下:

help(对象)

1. 查看内置函数和类型的帮助信息

>>> help(max)        #可以获取内置函数max的帮助信息
>>> help(list)       #可以获取list列表类型的成员方法
>>> help(tuple)      #可以获取tuple元组类型的成员方法

2.查看模块中的成员函数信息

>>> import os 
>>> help(os.fdopen)

上例查看os模块中的fdopen成员函数信息,得到如下提示:

Help on function fdopen in module os: 
fdopen(fd, *args, **kwargs) 
    #Supply os.fdopen() 

3. 查看整个模块的信息

使用help(模块名)能查看整个模块的帮助信息。注意先使用import导入该模块。例如,查看math模块方法:

>>> import math 
>>> help(math) 

查看Python中所有的modules:

>>> help("modules")