12岁的少年教你用Python作小游戏

 
 
 
 
 

12岁的少年教你用Python作小游戏

你有没有想过电脑游戏是怎样制做出来的?其实它没有你想象的那样复杂!在这个教程里,你要学作一个叫《兔子和獾》的塔防游戏,兔子做为英雄,须要在城堡里抵御獾的进攻。css

为了写这个游戏的代码,你将会用Python。好吧,我不是指一条大蟒蛇!html

Python是一种计算机语言。咱们在这篇教程里选择Python是由于这门语言很容易上手,学习起来也很简单和有趣。前端

若是你是个Python方面的新手,在开始看教程以前你能够看看这本书《 Think Python: How to Think Like a Computer Scientist》。这能让你看教程的时候不那么吃力。java

在看了那本书后回到这里而且准备好——兔子和獾之间有一场大战爆发,一块儿来加入到这场战斗中来吧!node

 

起步:安装Python

若是你想在Windows PC上尝试这篇教程里讲到的东西,你须要安装Python。确保你安装的是2.7.3版本,而不是3.3.0版本!在安装程序运行完以后,在开始按钮的“全部程序”里就会有IDLE了。首先启动IDLE。python

若是你是用的Mac,上面已是把Python装好了!打开终端,输入python,而后按回车就好了mysql

注意:若是你是安装的从python.org下载的安装包,那么你在Mac上也能够启动IDLE了,它应该是在 /Application/Python2.7 这个文件夹里。linux

若是你按以上的步骤执行了,那么你能够看到一下的东西:android

注意:若是你想迅速终止Python,你能够输入exit()而后按回车,或者是按Control+D。

如今很迅速的把Python环境配置好了,为了测试下Python是否正常工做,输入 print 1+1 而后按回车,应该会打印出2。你刚才就写了一个简单的Python程序!

那么,如今你知道Python已经能正常工做了,为了能用Python来写一个游戏,你须要安装PyGame。

PyGame是一个Python的库,可以让你更容易的写出一个游戏。它提供的功能包括图片处理和声音重放的功能,而且它们能很容易的整合进你的游戏里。

点击这里下载适合你的PyGame安装包。确保你下载的是针对2.7版本的库。

注意:从以上连接下载的PyGame安装包是没法与Mac上安装的Python一块儿正常工做的。你须要从 python.org 上下载一个Python安装包才能使用PyGame。或者,你能够用MacPorts来让你的Python和PyGame正常工做。

为了肯定PyGame是否安装好了,打开IELD或者是在终端里运行Python,而后输入import pygame 而且回车。若是没有打出任何输出,说明没有问题。

可是,若是打出了以下图的输出,那么PyGame就没有被安装上。

若是你发现了这样的错误,把出错的状况发到论坛上,我会帮助你把它运行起来

 

运行文件里的Python代码

如今你已经能在Python快捷终端里写一点代码了,若是你想要写一个更大一点的程序(好比游戏),那么你就须要把代码保存到文件里了。

有好几种运行文件里的Python代码的方法。其中一种方法是使用一个简单的文本编辑器,好比Windows系统上的nodepad,或者Mac上的TextEdit。打开一个新的文本文件,输入Python代码(好比print 1+1)。而后将其保存为XXX.py 。(XXX表示文件名)

在Windows上,双击这个py文件来运行它。在Mac上,打开终端而后输入python,而后把代码文件拖到终端上最后再按回车。

另外一种运行代码的方法是使用IDLE编辑器,这是在这篇教程里主要使用的方法。要运行IDLE,须要在终端里输入idle,而后在菜单里选择新建文件,而后就能够利用这个文本编辑器来写Python代码了。你能够经过 File/Save 来保存文件,经过点击 Run/Run(F5)来运行代码。

要注意运行的菜单在编辑器里打开了文件以后才可用。

 

添加游戏资源

你如今已经基本上准备好来建立一个游戏了。可是哪一个游戏没有很棒的图像和音效呢?我把游戏里须要的图像和音像保存在了zip档案里,点击这里下载。

在下载好文件后,为游戏建立一个文件夹而后把压缩文件解压到这个文件夹的子文件夹里,将其命名为resources,具体以下图:

咱们如今能够开始作兔子和獾这个游戏啦!

 

第一步:你好,兔子

运行IDLE,打开一个新的文本编辑窗口。输入如下的代码:

把文件保存到你的游戏文件夹里,把它命名为 game.py 。咱们如今看看这段代码作了什么:

  1. 导入pygame库,这一步能让你使用库里提供的功能
  2. 初始化pygame,设置展现窗口
  3. 加载做为兔子的图片
  4. 不停地循环执行接下来的部分
  5. 在给屏幕画任何东西以前用黑色进行填充
  6. 在屏幕的(100,100)坐标出添加你加载的兔子图片
  7. 更新屏幕
  8. 检查一些新的事件,若是有退出命令,则终止程序的执行。

在运行这段代码后,你会看到一下的画面:

能够看到一个兔子在这里,准备好要战斗了!

可是暂时兔子看起来仍是很孤独的,背景上只有它一个。如今是时候让它更进一步了。

 

第二步:添加背景

咱们如今开始给游戏的背景加上一些风景。这能够经过一些 screen.blit() 的调用来实现。

在#3的结尾处,在添加玩家图片的后面,加上如下的代码:

这段代码加载图片并将它们放在变量里。如今它们须要被画在屏幕上。可是当你检查了草的图片后,发现它不会覆盖整个屏幕,它的分辨率是640 x 480。

添加到 game.py 里#6的代码:

你能够看到,这段代码首先是依次经过x进行循环。又是一个依次经过y的循环而且根据循环里x和y的值来画上草的效果。接下来的几行就是在屏幕上画出城堡。

若是你如今运行你的代码,效果应该以下图:

好多了——如今开始看起来不错了!

 

第三步:让兔子可以移动

接下来你须要加上一些真正的游戏的元素了,好比让兔子可以随着按键移动。

为了作到这一点,首先,你须要实现一个方法,用来记录在某一时刻那个键被按下。能够经过新建一个按键状态的队列来存放每一个你想在游戏里用到的按键。

把如下代码加入到 game.py 里#2后面:

这段代码是不言自明的,key这个队列用来记录几个按键的状况:WASD。队列中的每一项对应一个按键——第一个对应W,第二个对应A等等。

playerpos这个变量表示程序画出玩家的位置。由于这个游戏会让玩家向不一样的方向移动,用一个变量来表示玩家的位置而且可以依据这个变量将玩家画出来的方案是很是适合的。

如今你须要修改如今画出玩家的代码,须要用上playerpos变量。把#6部分的代码进行修改:

改为:

接下来,根据按下的键来更新按键记录数组。PyGame里用给按键添加事件的方法来检测按键。

在#8八月份的结尾,就在event.py == pygame.QUIT后面,添加一下的代码(与pygame.QUIT保持同级别缩进):

Wow!又加了这么多代码。可是若是你仔细看看这些表达式,并无那么复杂。

首先,你检查是否有一个键被按下或放开。而后,检查是哪个键被按下或放开了,若是被按下或放开的键是你使用的,你就更新记录按键的变量。

最终,你须要更新playerpos变量做为按键后的反应。这其实是很是简单的。

把一下的代码加到game.py的结尾:(让它与for 循环保持同级别缩进)

这段代码简单的检查了哪一个键被按下,而后增长或减小玩家的x和y坐标。

运行这个游戏,那么你应该会看到一下的画面。试着按WASD,耶!好使了!

第四步:让兔子转向

好的,如今你的兔子在你按键的时候能够移动了,可是若是你能用鼠标让兔子朝向你选择的方向不是更酷吗?这样它就不会老是朝向一个方向了。用三角定理实现它会很是简单。

看一下下面的插图:

在上图中,若是(5,2)是兔子的位置,(2,4)是如今鼠标的位置,你能够经过三角定理来得出须要旋转的角度。而后,你知道了旋转的角度后,以就能够来旋转你的兔子了。

若是你对这部分感到有点疑惑,不要担忧——这没有关系。但这是你为何须要在数学课上集中精力的缘由。在游戏编程中会用获得它的。

如今,你须要接受你的游戏里的概念。为了实现它,你可使用PyGame Surface.rotate(degrees) 函数。

atatn2函数是来自Python 的math库。因此把一下代码加到#1部分:

而后,把#6部分的最后一行用一下代码替换:

咱们来浏览一下以上代码的基本结构。首先获取鼠标和玩家的位置。而后将它们使用atan2函数。而后,获取经过atan2函数得出的角度和弧度。

当兔子被旋转的时候,它的位置将会改变。因此你须要计算兔子新的位置,而后将其在屏幕上显示出来。

再次运行游戏,若是你只是按WASD这几个键,那么这个游戏跟之前仍是同样的。可是若是你移动鼠标,兔子也开始旋转了,至关酷!

第五步:射吧!兔子

如今你的兔子能够四处移动了,是时候来添加更多的功能了。让兔子用箭头射向它们的敌人怎么样?

这一步会有一点复杂,由于你须要跟踪全部的箭头,更新它们,旋转它们,在它们跑出屏幕的时候删除它们。

首先,在#2声明的部分加上必要的变量的声明。

第一个变量会跟踪玩家的精度,第二个变量会跟踪箭头。这个精度的变量本质上是一个数字组成的列表,记录了射出的箭头数和被击中的獾的数量。以后咱们会用到这些信息用来计算射击精确度。

接下来,在#3部分结尾加载箭头的图片。

如今,当玩家点击鼠标,就须要射出一支箭头。在#8部分加上如下代码:

这段代码会检查是否鼠标被点击了,若是点击了,它就会获得鼠标的位置而且根据玩家和光标的位置计算出箭头旋转角度。旋转角度的值存放在arrows这个数组里。

接下来,你须要真的在屏幕上画出箭头来。在#6部分加上如下代码:

vely和velx的值是根据三角定理算出来的。10是箭头的速度。if表达式是检查箭头是否超出了屏幕范围,若是超出,就删除这个箭头。第二个for表达式是循环来把箭头根据相应的旋转画出来。

试着运行游戏。当你点击鼠标时,你的兔子就能够射出剪头了:D

第六部:獾,拿上武器!

好吧,如今有了城堡,而且你有一个英雄能够移动和射出箭头。还差什么呢?攻击城堡的敌人能够被英雄用箭头射了!

在这一步,你将会随机建立出一些獾冲向城堡。在游戏的进程中会有愈来愈多的獾冒出来。因此,咱们来列个接下来要作的事情的清单。

  1. 添加一个坏蛋的列表
  2. 更新坏蛋的信息,而且检查它们是否超出屏幕范围
  3. 展现这些坏蛋

第一步,在#2部分加上一下代码:

以上的代码里定义了一个定时器,使得游戏里能够通过一段时间后就新建一只獾。

在#3部分结尾处添加如下代码:

第一行跟前面加载图片的代码很类似。第二行声明了一个图片的复制。

接下来,你须要更新而且显示这些坏蛋了。在#6.2部分加上如下代码:

上面的代码看起来有很多。第一行是来检查badtime是否为0,若是为0,建立一个獾而后从新设置badtime。第一个循环更新獾的x坐标,检查獾是否超出屏幕范围,若是超出范围,将獾删掉。第二个循环是来画出全部的獾。

为了在以上代码里用到随机的功能,你须要导入random库。因此在#1部分加上导入的代码:

最后,把一行代码添加到#4部分的while表达式后面:

试着运行这段代码。如今它应该像个真正的游戏了——你能够移动、射箭、转向,而后有獾冲向你。

可是先慢着!为何獾没有炸掉城堡?咱们快速的把这功能加进来。

把如下代码加到#6.3部分index+=1以前的第一个循环里:

这段代码至关简单。若是獾的x坐标离右边小于64,就删除坏蛋而且减小游戏里的健康值,减小的大小为5至20里的一个随机数。

再次运行这个游戏,你就会有一些獾冲过来而且在碰到城堡的时候会消失。尽管你看不到,獾实际上会下降你的健康值。

第七部:獾与箭头的碰撞

獾们冲向你的城堡,可是你的箭头对它们彻底没有做用!这让兔子怎么放手它的家园呢?

是时候来让箭头可以杀死獾让你能保护你的城堡而且赢得这场游戏。基本上,你须要循环全部的坏蛋,你须要循环全部的箭头来检查是否有碰撞。若是碰撞上,删除獾,删除箭头,而且添加精确度的变量里面加1。

在#6.3.1部分后面加这些:

这段代码里面只有一个地方须要提一下,这个if表达式使用了PyGame内建功能来检查两个矩形是否交叉。接下来的一些代码跟上面说的同样。

再运行下代码,如今你就能够用箭头来杀死獾了。

 

第八步:添加健康值和时间的显示

如今游戏运行起来至关不错了。如今有攻击者,有防守者。如今,你须要的就是经过一个方法来显示兔子的得分。

最简单的方法就是添加一个HUD来显示当前城堡的生命值。你也能够加一个计时来记录城堡存活下来的时间。

首先,添加一个计时。在#7部分加上下面的代码:

上面的代码使用了PyGame默认的大小为24的字体。这个字体用来显示时间信息。

接下来添加代码到#6.4部分后面:

这段代码首先画了一个全红色的生命值条。而后根据城堡的生命值往生命条里面添加绿色。

运行下代码,如今就会有计时和生命值条了。

第九步:赢或输

如今怎么样?若是你玩的时间够长,即便你的生命值已经变成0了,游戏仍然是继续的!不只如此,你仍然能够用箭头射向这些獾。这确定不太对。你须要加上一些赢或者输的状况来让你的游戏值得玩。

那么咱们来加上胜利或者失败的条件。你能够经过终止主循环,进入胜利/失败的循环来实现它。你须要指出玩家是否胜利,并将其显示在屏幕上。

下面是一些胜利/失败的一些基本条件:

若是时间到了(90秒)那么:

  • 中止运行游戏
  • l设置游戏的输出

若是城堡被毁,那么:

  • 中止运行游戏
  • l设置游戏的输出

精确度是一直都须要计算的。

在game.py 结尾添加这些代码:

这是最长的一段代码!不过它并不复杂。

第一个ifb表达式是检查是否时间到了。第二个是检查城堡是否被摧毁了。第三个计算你的精准度。以后,一个if表达式是检查你是赢了仍是输了,而后显示出相应的图片。

固然,若是你想在赢或输的时候显示图片,这些图片首先须要加载。因此在#3部分加上这些代码:

还有须要改的地方,把#4部分从:

改为:

这个running变量会跟踪游戏是否结束,exitcode变量会跟踪玩家是否胜利。

再次运行游戏,你就发现你能够胜利或者失败了!酷

第十步:免费的音乐和声音效果

这个游戏如今至关不错了,可是没有声音。有点太安静了。加上一点声音效果,能让你更好地感觉这个游戏。

PyGame可以让加载和播放声音很是简单。首先,你在#2部分结尾加上这些代码:

而后在#3部分加载声音而后设置声音:

上面大部分代码就是加载声音文件而且配置音量。可是注意 pygame.mixer.music.load这行代码——这一行加载游戏的背景音乐而后下一行让背景音乐一直不停的播放。

如今注意声音的配置。如今你全部须要作的就是在须要的时候播放不一样的音乐。

再次运行游戏,你会发现如今有背景音乐了,而且在射出箭头和碰撞的时候会有音效。这游戏就更加逼真啦!

 

那接下来呢?

你应该为本身感到自豪:你刚刚完成了一个游戏;里面包含了音乐,音效,一个杀手兔子,自杀冲锋的獾等等。我跟你说了这确实是能够完成的!

你能够从这里下载最终的游戏代码。

在这基础上,你能够根据你本身的创意来扩展游戏!你能够试着重置里面的各类图片,加上不一样的枪或者是不一样的怪物!

若是你对这篇教程有什么问题和建议。请留言。

程序员专属极客T恤,你喜欢哪款? ->  第2件八折,从这里抢购
 赞  5 收藏  24 评论
 

关于做者:贱圣OMG

非专业码农(新浪微博:@贱圣OMG) 我的主页 ·  个人文章 ·  16
 

   

直接登陆 
最新评论
  • CSU985  2013/08/24

     

    牛逼的孩子啊

     

  • WYS  2013/08/24

     

    骚年很强,忍不住实现了一下,
    发现绘制箭头的代码有点小问题,
    一、箭头的删除有问题,index值只能为0或1;二、箭头重复绘制

     

    • WYS  2013/08/24

       

      修改成:
      # 6.2 - 绘制箭头 Draw arrows
      index=0#当前箭头下标
      for bullet in arrows:#计算箭头位置
      velx=math.cos(bullet[0])*10#X方向分速度
      vely=math.sin(bullet[0])*10#Y方向分速度
      bullet[1]+=velx*0.1
      bullet[2]+=vely*0.1
      if bullet[1]640*0.8 or bullet[2]480*0.8:#超出屏幕范围
      arrows.pop(index)#删除当前箭头,后面的箭头代替当前箭头,index下标不变
      else:
      index+=1#若没删除,则下标加1,计算下一个箭头
      for projectile in arrows:
      arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29)#转动后的箭头图片
      screen.blit(arrow1, (projectile[1], projectile[2]))#绘制箭头

       

      •  

        关于问题实在没有看懂,代码也反复看了,不得要领,能否劳烦详细说说?

         

  •  

    好东西呀,下个星期双休无聊来看看能不能按照LZ的方式实现一下;
    多谢分享,分享万岁
    ;

     

  • 阿宅  2013/08/26

     

    我作到第三步,可是按键之后没有反应

     

  • gaint111  2013/08/27

     

    试下

     

  • 图腾  2013/08/27

     

    试一下

     

  • caven16  2013/09/13

     

    2.7.3应该下哪一个版本的PyGame ?

     

  • Kevin  2013/10/02

     

    太还玩了!

     

  • 李呈  2013/10/17

     

    请问素材在哪里下载呢?没有找到。若是能够,能发给我一份吗?

     

  •  

    有谁完成了,游戏结束后选择继续或者退出的部分么,我卡了三天了…………求助

     

  • RichieWang  2014/10/19

     

    關於您給的兔子圖片? 好像不能點

     

  • Sean Zhao  2014/12/07

     

    很好
    做为入门的实例

     

  • fansfantasy  2015/04/09

     

    E:\python>game.py
    Traceback (most recent call last):
    File "E:\python\game.py", line 10, in
    screen=pygame.display.set_mode((width, height))
    pygame.error: No available video device

    这是什么问题啊

     

  • 董欣宇  2015/05/20

     

    我发现若是用mac的话 游戏图像只会显示在左上角 而且只有正常大小的四分之一 为何啊@。@

     

  • 第四个火枪手 高级软件工程师2015/09/12

     

    个人python是3.4.2因此运行不起来。

     

  • 小英的守护 程序员2015/09/14

     

    楼主太厉害了,根据你的提示,python3.4修改一些地方也是能够行得通的。

     

  • Melody_empty  2015/11/24

     

    mark,厉害啊

     

  •  

    箭头打在獾身上只能删除最前面的獾 有没有办法打哪一个死哪一个 (为何箭头不会消失)

     

 

关于伯乐在线博客

在这个信息爆炸的时代,人们已然被大量、快速而且简短的信息所包围。然而,咱们相信:过多“快餐”式的阅读只会使人“虚胖”,缺少实质的内涵。伯乐在线内容团队正试图以咱们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“养分”元素。

快速连接
问题反馈与求助 » 
加入伯乐翻译小组 » 
加入专栏做者 »

关注咱们

新浪微博:@伯乐在线官方微博
RSS:订阅地址
推荐微信号 

合做联系
Email:bd@Jobbole.com
QQ: 2302462408 (加好友请注明来意)

更多频道

小组 – 好的话题、有启发的回复、值得信赖的圈子
头条 – 分享和发现有价值的内容与观点
相亲 – 为IT单身男女服务的征婚传播平台
资源 – 优秀的工具资源导航
翻译 – 翻译传播优秀的外文文章
文章 – 国内外的精选文章
设计 – UI,网页,交互和用户体验
iOS – 专一iOS技术分享
安卓 – 专一Android技术分享
前端 – JavaScript, HTML5, CSS
Java – 专一Java技术分享
Python – 专一Python技术分享

 

© 2016 伯乐在线 首页   博客   资源   小组   相亲    反馈

 
跳到底部
返回顶部
相关文章
相关标签/搜索