13岁Python开发者写给青少年的多人游戏编程(上)

511 查看

这篇博客的作者是一名13岁的Python开发者Julian Meyer。你可以在Google+Twitter上找到他。

我确定,你一定曾和你的朋友们一起玩过在线多人游戏。但是你是否想过这些游戏的内部是怎样实现的呢,游戏是怎样在计算机中运行的呢?

在这个教程中,你将通过编写一个简单的游戏来学习有关多人游戏编程。与此同时,你也将学习到面向对象程序设计的思想。

在这个教程中,你将会使用Python语言和它的PyGame模块。如果你刚接触Python或PyGame模块,你应该先阅读一下这篇文章,将告诉你关于PyGame的基础知识。

着手开始吧

首先,你需要安装PyGame模块。你可以在这个链接here上下载一个mac版的PyGame模块安装程序。如果你的系统是Mac OS 10.7或以上,请下载Lion版的安装程序,其它的,则下载Snow Leopard版本。

你也可以按以下的方法下载和安装PyGame:

如果你使用MacPorts工具,那么请用如下命令来安装:sudo port install python2.7 py27-game

如果你使用Fink,那么请使用如下命令:sudo fink install python27 pygame-py27

如果你使用Homebrew和pip,那么请在这个链接here中查找下载和安装PyGame的命令。

如果你使用的是windows操作系统,那么你可以在这里here找到PyGame的安装程序。

提示:如果你在上面的安装教程中遇到问题,那么请确保你在系统上安装了32位版本的Python。如果你使用的是64位的系统,那么你应该使用python2.7-32来运行Python。

最后,在这里下载我们这个项目所需的文件download the resources for this project,(访问这个链接需要翻墙),这些文件包括游戏所需的图像和声音。

我们的“游戏规则”

我们给教程中将要制作的游戏取名为“Boxes”。也许,你在学校中已经和你的朋友们在纸上玩过这个游戏了。

也许你对游戏规则并不那么熟悉,在这里,就先介绍一下游戏规则:

1.游戏的棋盘包含7×7个网格点,如果你将这些点用线段连起来,将得到6×6个立方格。

2.轮到每个玩家玩时,玩家将垂直或水平相邻的两个点用线段连接起来。

3. 如果一个玩家在网格中连接一条线后,网格中便组成了一个新格子,那么这个玩家就拥有这个新格子,并获得1分。

4 在游戏的最后,拥有格子数最多或分数最高的玩家就是胜利者。

虽然游戏的规则非常简单,但这个游戏玩起来却非常有趣,特别是当你无聊的时候。但是,如果能在线上和其他玩家玩这个游戏,是不是会更有趣呢?

 

面向对象程序设计简介

在我们开始编写游戏之前,先讨论一下你将在本教程中用到的面向对象程序设计思想。

面向对象程序设计,也被称为OOP,它是一个基于对象的编程方式。对象是由许多数据和与这些数据相关的逻辑组成。例如,你有一个“狗”对象,那么这个对象就包含了一些数据(例如,狗的名字、它最大的乐趣等),以及相关逻辑(例如,使狗发出叫声的指令)。

对象是由叫做“类”的模板实例化而成的,类定义了对象所包含的数据,以及这个对象能做的事情。对象的数据和它能做的事情分别称为对象的属性和方法。

方法即是一些函数,你可通过调用函数使对象完成某一任务。例如你可将car.drive()这行代码,理解为是告诉“汽车(car)”这个对象“开车(drive)”。属性是一些属于对象的变量。继续上一个例子,你的汽车“car”也许会有一个名为汽油(gas)的属性,代码car.gas = 100的意思是将汽车的汽油量设置为100.

刚才所说的两个代码操作的是一个已经存在的对象。回想我们刚才提到的,汽车(car)类是一个模板,它定义了怎样实例化一个汽车(car)对象,这个定义包括了对象的属性和方法。在对方法的定义中,你会看到对象内部的方法操作自己的代码。例如,你会看到这样的代码:self.gas=100,它不同于car.gas=100,self.gas=100的意思是汽车(car)对象告诉自己,将自己的汽油量(gas)设置为100。

OOP包含了许多内容,但是以上介绍的基础知识已经足够我们的教程了。我们用代码将Boxes游戏描述成许多对象的交互。这些对象都包含了我们在类中对其定义的若干属性和方法。当你在编写代码时,应注意,你写的类代码是从类的内部操作自身,还是操作其它外部对象。

 

编写一个简单的面向对象的游戏

有许多面向对象的框架可被用于我们的游戏设计。我们给Boxes游戏设计了两个对象,一个对象负责游戏的客户端,另一个对象负责游戏的服务器,现在,让我们来创建一个客户端的主类,这个类的代码将在用户启动游戏时运行。

在制作每一个游戏之前,我喜欢先为这个游戏程序创建一个文件夹。当你解压刚才下载的项目压缩文件时,将会看到一个名为boxes的文件夹。你需要将你的源文件和图像文件一起放在这个文件夹中。

在这个文件目录下,使用你最喜欢的编辑器创建一个名为boxes.py的文件(如果你没有最喜欢的编辑器,那么我推荐你在mac上使用TextEdit,或者在Windows上使用Notepad)。然后在这个文件中使用import语句:

这条语句导入了PyGame模块,我们在后续编码中,将使用这个模块。在进入下一步之前,你应该首先测试一下,这个模块是否已经正确导入并可以使用了。打开终端,并用cd命令,进入我们的项目文件夹,然后在终端里输入python boxes.py命令,例如,在我的机器上应输入这样的命令:

如果你能成功执行这个命令,就说明PyGame模块已经正确的安装在你的电脑上了。我们就可以进入下一步教程了。

提示:如果你运行上述命令时,收到“No module named pygame”的错误提示,则说明你没有安装PyGame,或者你安装的PyGame版本和你系统中的Python版本不兼容。例如,如果你使用MacPorts来安装Python 2.7和PyGame,那么你将使用这个命令来安装他们:port install python2.7 py27-game PyGame,安装好之后,你需要保证在终端里调用2.7版本的Python:python2.7。如果运行上述代码得到这个错误:

就说明你需要运行32位模式的Python,例如:python2.7-32

接下来,像定义每一个类一样,在boxes.py文件中添加类定义代码:

这段代码的第一行告诉编译器,你将创建一个名叫BoxesGame的新类。第二行定义了一个名叫__init__的方法。init两边的双下划线暗示着这是一个特殊的方法名字。事实上,这个名称__init__确定了这个类的构造方法,这个方法将在你创建或实例化一个类的对象时调用。

现在,你将在init方法中编写初始化PyGame的代码。将以下的代码紧接在原来代码中的注释部分,#put something here…:

请注意输入代码的缩进格式,即刚才输入的代码都要和“#put

something here…”这段代码左对齐。你可以在这个链接中查看更多

关于Python代码缩进的内容:Python Indentation.

接下来我们一段一段解释刚才添加的代码:

1. 首先,你初始化了PyGame和两个变量width、height,这两个变量是用来设置我们游戏窗体的大小的。

2. 接着,用width和height变量设置窗体的宽和高。这段代码也设置了窗体的标题。

3. 最后,你初始化了PyGame的时钟,这个时钟将会用来追踪游戏中的时间。

接下来,我们添加update()方法,这个方法每隔一段时间更新一次游戏,包括重绘界面和接收用户输入。将以下的代码添加在__init__方法之后就能实现这些功能(update代码的左缩进必须和__init__相同):

这是一个简单的循环方法,这个方法定期清除窗体中的内容并检查用户是否想退出游戏。稍后,你会在这个方法中添加更多的内容。目前,你运行这个Python文件并不会见到什么效果,因为现在你做的仅是定义了一个名为BoxesGame的类。你还需要创建这个类的对象,然后使用这个对象运行游戏!

现在,我们已经有了update方法,让我们添加运行游戏主类的方法吧。之后,你会在这个游戏中添加一些基本的图片,例如绘制游戏中的棋盘。

在源文件的末尾添加这些代码来运行我们编写的游戏(代码的左缩进必须与文件的左缩进相同):