还剩17页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
如果你想在WindowsPC上尝试这篇教程里讲到的东西,你需要安装Python确保你安装的是
2.
7.3版本,而不是
3.
3.0版本!在安装程序运行完之后,在开始按钮的“所有程序”里就会有IDLE了首先启动IDLE如果你是用的Mac,上面已经是把Python装好了!打开终端,输入python,然后按回车就行了注意如果你是安装的从python.org下载的安装包,那么你在Mac上也可以启动IDLE了,它应该是在/Application/Python
2.7这个文件夹里如果你按以上的步骤执行了,那么你可以看到一下的东西注意如果你想迅速终止Python,你可以输入exit然后按回车,或者是按Control+D现在很迅速的把Python环境配置好了,为了测试下Python是否正常工作,输入print1+1然后按回车,应该会打印出2你刚才就写了一个简单的Python程序!那么,现在你知道Python已经能正常工作了,为了能用Python来写一个游戏,你需要安装PyGamePyGame是一个Python的库,能够让你更容易的写出一个游戏它提供的功能包括图片处理和声音重放的功能,并且它们能很容易的整合进你的游戏里点击这里下载适合你的PyGame安装包确保你下载的是针对
2.7版本的库注意从以上链接下载的PyGame安装包是无法与Mac上安装的Python一起正常工作的你需要从python.org上下载一个Python安装包才能使用PyGame或者,你可以用MacPorts来让你的Python和PyGame正常工作为了确定PyGame是否安装好了,打开IELD或者是在终端里运行Python,然后输入importpygame并且回车如果没有打出任何输出,说明没有问题但是,如果打出了如下图的输出,那么PyGame就没有被安装上如果你发现了这样的错误,把出错的情况发到论坛上,我会帮助你把它运行起来 运行文件里的Python代码现在你已经能在Python快捷终端里写一点代码了,如果你想要写一个更大一点的程序(比如游戏),那么你就需要把代码保存到文件里了有好几种运行文件里的Python代码的方法其中一种方法是使用一个简单的文本编辑器,比如Windows系统上的nodepad,或者Mac上的TextEdit打开一个新的文本文件,输入Python代码(比如print1+1)然后将其保存为XXX.py(XXX表示文件名)在Windows上,双击这个py文件来运行它在Mac上,打开终端然后输入python,然后把代码文件拖到终端上最后再按回车另一种运行代码的方法是使用IDLE编辑器,这是在这篇教程里主要使用的方法要运行IDLE,需要在终端里输入idle,然后在菜单里选择新建文件,然后就可以利用这个文本编辑器来写Python代码了你可以通过File/Save来保存文件,通过点击Run/Run(F5)来运行代码要注意运行的菜单在编辑器里打开了文件之后才可用 添加游戏资源你现在已经基本上准备好来创建一个游戏了但是哪个游戏没有很棒的图像和音效呢?我把游戏里需要的图像和音像保存在了zip档案里,点击这里下载在下载好文件后,为游戏创建一个文件夹然后把压缩文件解压到这个文件夹的子文件夹里,将其命名为resources,具体如下图我们现在可以开始做兔子和獾这个游戏啦! 第一步你好,兔子运行IDLE,打开一个新的文本编辑窗口输入以下的代码把文件保存到你的游戏文件夹里,把它命名为game.py我们现在看看这段代码做了什么导入pygame库,这一步能让你使用库里提供的功能初始化pygame,设置展示窗口加载作为兔子的图片不停地循环执行接下来的部分在给屏幕画任何东西之前用黑色进行填充在屏幕的(100,100)坐标出添加你加载的兔子图片更新屏幕检查一些新的事件,如果有退出命令,则终止程序的执行在运行这段代码后,你会看到一下的画面可以看到一个兔子在这里,准备好要战斗了!但是暂时兔子看起来还是很孤独的,背景上只有它一个现在是时候让它更进一步了 第二步添加背景我们现在开始给游戏的背景加上一些风景这可以通过一些screen.blit的调用来实现在#3的结尾处,在添加玩家图片的后面,加上以下的代码这段代码加载图片并将它们放在变量里现在它们需要被画在屏幕上但是当你检查了草的图片后,发现它不会覆盖整个屏幕,它的分辨率是640x480添加到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)是现在鼠标的位置,你可以通过三角定理来得出需要旋转的角度然后,你知道了旋转的角度后,以就可以来旋转你的兔子了如果你对这部分感到有点疑惑,不要担心——这没有关系但这是你为什么需要在数学课上集中精力的原因在游戏编程中会用得到它的现在,你需要接受你的游戏里的概念为了实现它,你可以使用PyGameSurface.rotatedegrees函数atatn2函数是来自Python的math库所以把一下代码加到#1部分然后,把#6部分的最后一行用一下代码替换我们来浏览一下以上代码的基本结构首先获取鼠标和玩家的位置然后将它们使用atan2函数然后,获取通过atan2函数得出的角度和弧度当兔子被旋转的时候,它的位置将会改变所以你需要计算兔子新的位置,然后将其在屏幕上显示出来再次运行游戏,如果你只是按WASD这几个键,那么这个游戏跟以前还是一样的但是如果你移动鼠标,兔子也开始旋转了,相当酷!第五步射吧!兔子现在你的兔子可以四处移动了,是时候来添加更多的功能了让兔子用箭头射向它们的敌人怎么样这一步会有一点复杂,因为你需要跟踪所有的箭头,更新它们,旋转它们,在它们跑出屏幕的时候删除它们首先,在#2声明的部分加上必要的变量的声明第一个变量会跟踪玩家的精度,第二个变量会跟踪箭头这个精度的变量本质上是一个数字组成的列表,记录了射出的箭头数和被击中的獾的数量之后我们会用到这些信息用来计算射击精确度接下来,在#3部分结尾加载箭头的图片现在,当玩家点击鼠标,就需要射出一支箭头在#8部分加上以下代码这段代码会检查是否鼠标被点击了,如果点击了,它就会得到鼠标的位置并且根据玩家和光标的位置计算出箭头旋转角度旋转角度的值存放在arrows这个数组里接下来,你需要真的在屏幕上画出箭头来在#6部分加上以下代码vely和velx的值是根据三角定理算出来的10是箭头的速度if表达式是检查箭头是否超出了屏幕范围,如果超出,就删除这个箭头第二个for表达式是循环来把箭头根据相应的旋转画出来试着运行游戏当你点击鼠标时,你的兔子就可以射出剪头了:D第六部獾,拿上武器!好吧,现在有了城堡,并且你有一个英雄可以移动和射出箭头还差什么呢?攻击城堡的敌人可以被英雄用箭头射了!在这一步,你将会随机创建出一些獾冲向城堡在游戏的进程中会有越来越多的獾冒出来所以,我们来列个接下来要做的事情的清单添加一个坏蛋的列表更新坏蛋的信息,并且检查它们是否超出屏幕范围展示这些坏蛋第一步,在#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这行代码——这一行加载游戏的背景音乐然后下一行让背景音乐一直不停的播放现在注意声音的配置现在你所有需要做的就是在需要的时候播放不同的音乐再次运行游戏,你会发现现在有背景音乐了,并且在射出箭头和碰撞的时候会有音效这游戏就更加逼真啦!1234Python
2.
7.3v
2.
7.3:70274d53c1ddApr 9201220:52:43[GCC
4.
2.1AppleInc.build5666dot3]ondarwinTypehelpcopyrightcreditsorlicenseformoreinformation.12345678Python
2.
7.2defaultJun20201216:23:33[GCC
4.
2.1CompatibleAppleClang
4.0tags/Apple/clang-
418.
0.60]ondarwinTypehelpcopyrightcreditsorlicenseformoreinformation.importpygameTracebackmostrecentcalllast: Filestdinline1inmoduleImportError:Nomodulenamedpygame123456789101112131415161718192021222324252627#1-Importlibraryimportpygamefrompygame.localsimport* #2-Initializethegamepygame.initwidthheight=640480screen=pygame.display.set_modewidthheight #3-Loadimagesplayer=pygame.image.loadresources/images/dude.png #4-keeploopingthroughwhile1: #5-clearthescreenbeforedrawingitagain screen.fill0 #6-drawthescreenelements screen.blitplayer100100 #7-updatethescreen pygame.display.flip #8-loopthroughtheevents foreventinpygame.event.get: #checkiftheeventistheXbutton ifevent.type==pygame.QUIT: #ifitisquitthegame pygame.quit exit012grass=pygame.image.loadresources/images/grass.pngcastle=pygame.image.loadresources/images/castle.png1234567forxinrangewidth/grass.get_width+1: foryinrangeheight/grass.get_height+1: screen.blitgrassx*100y*100screen.blitcastle030screen.blitcastle0135screen.blitcastle0240screen.blitcastle034512keys=[FalseFalseFalseFalse]playerpos=
[100100]1screen.blitplayer1001001screen.blitplayerplayerpos123456789101112131415161718ifevent.type==pygame.KEYDOWN: ifevent.key==K_w: keys
[0]=True elifevent.key==K_a: keys
[1]=True elifevent.key==K_s: keys
[2]=True elifevent.key==K_d: keys
[3]=Trueifevent.type==pygame.KEYUP: ifevent.key==pygame.K_w: keys
[0]=False elifevent.key==pygame.K_a: keys
[1]=False elifevent.key==pygame.K_s: keys
[2]=False elifevent.key==pygame.K_d: keys
[3]=False123456789#9-Moveplayerifkeys
[0]: playerpos
[1]-=5elifkeys
[2]: playerpos
[1]+=5ifkeys
[1]: playerpos
[0]-=5elifkeys
[3]: playerpos
[0]+=51importmath123456#
6.1-Setplayerpositionandrotationposition=pygame.mouse.get_posangle=math.atan2position
[1]-playerpos
[1]+32position
[0]-playerpos
[0]+26playerrot=pygame.transform.rotateplayer360-angle*
57.29playerpos1=playerpos
[0]-playerrot.get_rect.width/2playerpos
[1]-playerrot.get_rect.height/2screen.blitplayerrotplayerpos112acc=
[00]arrows=[]1arrow=pygame.image.loadresources/images/bullet.png1234ifevent.type==pygame.MOUSEBUTTONDOWN: position=pygame.mouse.get_pos acc
[1]+=1 arrows.append[math.atan2position
[1]-playerpos1
[1]+32position
[0]-playerpos1
[0]+26playerpos1
[0]+32playerpos1
[1]+32]12345678910111213#
6.2-Drawarrowsforbulletinarrows: index=0 velx=math.cosbullet
[0]*10 vely=math.sinbullet
[0]*10 bullet
[1]+=velx bullet
[2]+=vely ifbullet
[1]-64orbullet
[1]640orbullet
[2]-64orbullet
[2]480: arrows.popindex index+=1 forprojectileinarrows: arrow1=pygame.transform.rotatearrow360-projectile
[0]*
57.29 screen.blitarrow1projectile
[1]projectile
[2]1234badtimer=100badtimer1=0badguys=[
[640100]]healthvalue=19412badguyimg1=pygame.image.loadresources/images/badguy.pngbadguyimg=badguyimg112345678910111213141516#
6.3-Drawbadgersifbadtimer==0: badguys.append[640random.randint50430] badtimer=100-badtimer1*2 ifbadtimer1=35: badtimer1=35 else: badtimer1+=5index=0forbadguyinbadguys: ifbadguy
[0]-64: badguys.popindex badguy
[0]-=7 index+=1forbadguyinbadguys: screen.blitbadguyimgbadguy1importrandom1badtimer-=112345678#
6.
3.1-Attackcastlebadrect=pygame.Rectbadguyimg.get_rectbadrect.top=badguy
[1]badrect.left=badguy
[0]ifbadrect.left64: healthvalue-=random.randint520 badguys.popindex#
6.
3.3-Nextbadguy1234567891011#
6.
3.2-Checkforcollisionsindex1=0forbulletinarrows: bullrect=pygame.Rectarrow.get_rect bullrect.left=bullet
[1] bullrect.top=bullet
[2] ifbadrect.colliderectbullrect: acc
[0]+=1 badguys.popindex arrows.popindex1 index1+=1123456#
6.4-Drawclockfont=pygame.font.FontNone24survivedtext=font.renderstr90000-pygame.time.get_ticks/60000+:+str90000-pygame.time.get_ticks/1000%
60.zfill2True000textRect=survivedtext.get_recttextRect.topright=
[6355]screen.blitsurvivedtexttextRect12healthbar=pygame.image.loadresources/images/healthbar.pnghealth=pygame.image.loadresources/images/health.png1234#
6.5-Drawhealthbarscreen.blithealthbar55forhealth1inrangehealthvalue: screen.blithealthhealth1+88123456789101112131415161718192021222324252627282930313233343536 #10-Win/Losecheck ifpygame.time.get_ticks=90000: running=0 exitcode=1 ifhealthvalue=0: running=0 exitcode=0 ifacc
[1]!=0: accuracy=acc
[0]*
1.0/acc
[1]*100 else: accuracy=0#11-Win/losedisplay ifexitcode==0: pygame.font.init font=pygame.font.FontNone24 text=font.renderAccuracy:+straccuracy+%True25500 textRect=text.get_rect textRect.centerx=screen.get_rect.centerx textRect.centery=screen.get_rect.centery+24 screen.blitgameover00 screen.blittexttextRectelse: pygame.font.init font=pygame.font.FontNone24 text=font.renderAccuracy:+straccuracy+%True02550 textRect=text.get_rect textRect.centerx=screen.get_rect.centerx textRect.centery=screen.get_rect.centery+24 screen.blityouwin00 screen.blittexttextRectwhile1: foreventinpygame.event.get: ifevent.type==pygame.QUIT: pygame.quit exit0 pygame.display.flip12gameover=pygame.image.loadresources/images/gameover.pngyouwin=pygame.image.loadresources/images/youwin.png123#4-keeploopingthroughwhile1: badtimer-=112345#4-keeploopingthroughrunning=1exitcode=0whilerunning: badtimer-=11pygame.mixer.init12345678910#
3.1-Loadaudiohit=pygame.mixer.Soundresources/audio/explode.wavenemy=pygame.mixer.Soundresources/audio/enemy.wavshoot=pygame.mixer.Soundresources/audio/shoot.wavhit.set_volume
0.05enemy.set_volume
0.05shoot.set_volume
0.05pygame.mixer.music.loadresources/audio/moonlight.wavpygame.mixer.music.play-
10.0pygame.mixer.music.set_volume
0.25123456#section
6.
3.1afterifbadrect.left64:hit.play#section
6.
3.2afterifbadrect.colliderectbullrect:enemy.play#section8afterifevent.type==pygame.MOUSEBUTTONDOWN:shoot.play。