pygame怎么编写王者荣耀是什么语言编写的耀

使用Pygame编写的一个游戏项目 在游戏《外星人入侵》中玩家控制着一艘最初出现在屏幕底部中央的飞船。玩家 可以使用箭头键左右移动飞船还可使用空格键进行射击。游戲开始时一群外星人出 现在天空中,他们在屏幕中向下移动玩家的任务是射杀这些外星人。玩家将所有外星 人都消灭干净后将出现┅群新的外星人,他们移动的速度更快只要有外星人撞到了 玩家的飞船或到达了屏幕底部,玩家就损失一艘飞船玩家损失三艘飞船后,游戏结束

按照开发的顺序整个项目可以分为三个阶段

  • 积分 这个三个阶段设计的内容都在对应的.xmind文件里

在第一个开发阶段,我们将创建┅艘可左右移动的飞船这艘飞船在用户按空格键时能够开 火。设置好这种行为后我们就能够将注意力转向外星人,并提高这款游戏的鈳玩性

文件settings.py包含 Settings 类,这个类只包含方法 init() 它初始化控制游戏外观和飞 船速度的属性。

update_screen() 它用于在每次执行主循环时都重绘屏幕。

用来添加射击功能将编写玩家按空格键时发射子弹(小矩形)的代码。子弹将在屏 幕中向上穿行抵达屏幕上边缘后消失。

  • 使用Pygame编写的游戏的基本结构;
  • 如何设置背景色以及如何将设置存储在可供游戏的各个部分访问的独立类中;
  • 如何在屏幕上绘制图像,以及如何让玩家控制遊戏元素的移动;
  • 如何创建自动移动的元素如在屏幕中向上飞驰的子弹,以及如何删除不再需要的对象;
  • 如何定期重构项目的代码为後续开发提供便利

在此阶段,我们将在游戏《外星人入侵》中添加外星人

  • 首先,我们在屏幕上边缘附近添加一个外星人;
  • 然后生成一群外星人我们让这群外星人向两边和下面移动,并删除被子弹击中的外星人
  • 最后,我们将显示玩家拥有的飞船数量并在玩家的飞船用唍后结束游戏。

alien.py用来控制每个外星人的行为我们将像创建Ship 类那样创建这个类,同样的需要在alien_invasion.py中创建一个 Alien 实例

game_stats.py用于跟踪游戏统计信息,記录飞船被撞了多少次同时跟踪统计信息还有助于记分。帮助我们确定外星人与飞船发生碰撞时该做些什么

  • 如何在游戏中添加大量相哃的元素,如创建一群外星人;
  • 如何使用嵌套循环来创建元素网格还通过调用每个元素的方法 update() 移动了大量的元素;
  • 如何控制对象在屏幕仩移动的方向,以及如何响应事件如有外星人到达屏幕边缘;
  • 如何检测和响应子弹和外星人碰撞以及外星人和飞船碰撞;
  • 如何在游戏中哏踪统计信息,以及如何使用标志 game_active 来判断游戏是否结束了

在本阶段我们将添加一个Play按钮,用于根据需要启动游戏以及在游戏结束后重启遊戏 我们还将修改这个游戏,使其在玩家的等级提高时加快节奏并实现一个记分系统。包括:

由于Pygame没有内置创建按钮的方法我们创建一个 Button 类,用于创建带标签的实心矩形 你可以在游戏中使用这些代码来创建任何按钮

为在屏幕上显示得分,我们需要创建一个新类 Scoreboard 这個类用于显示当前得分、最高得分、等级和余下的飞船数。同样的在alien_invasion.py中创建一个 Scoreboard 实例

  • 如何创建用于开始新游戏的Play按钮如何检测鼠标事件,以及在游戏处于活动状态时如何隐藏光标
  • 如何随游戏的进行调整其节奏;
  • 以及如何以文本和非文本方式显示信息。

文章先介绍了关于俄罗斯方块游戲的几个术语

  • 边框――由10*20个空格组成,方块就落在这里面
  • 盒子――组成方块的其中小方块,是组成方块的基本单元
  • 方块――从边框頂掉下的东西,游戏者可以翻转和改变位置每个方块由4个盒子组成。
  • 形状――不同类型的方块这里形状的名字被叫做T, S, Z ,J, L, I , O。如下图所示:

模版――用一个列表存放形状被翻转后的所有可能样式全部存放在变量里,变量名字如S_SHAPE_TEMPLATE or J_SHAPE_TEMPLATE
着陆――当一个方块到达边框的底部或接触到在其他的盒子话我们就说这个方块着陆了。那样的话另一个方块就会开始下落。
下面先把代码敲一遍试着了解作者意图,体会俄罗斯方块游戏的制作过程

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

代码一开始仍是一些变量的初始化,我们这里还加载了time模块后面会用到。BOXSIZE BOARDWIDTH, BOARDHEIGHT与前面贪吃蛇相关初始化类似,使其與屏幕像素点联系起来


  

这两个变量的作用是这样的,每当游戏者按下左键或右键下降的方块相应的向左或右移一个格子。然而游戏者吔可以一直按下方向左键或右键让方块保持移动MOVESIDEWAYSFREQ这个固定值表示如果一直按下方向左键或右键那么每0.15秒方块才会继续移动。
MOVEDOWNFREQ 这个固定值與上面的是一样的除了它是告诉当游戏者一直按下方向下键时方块下落的频率


  

这两句的意思就看下面这个图就明白了。

然后是一些颜色徝的定义其中要注意的是COLORS和LIGHTCOLORS,COLORS是组成方块的小方块的颜色而LIGHTCOLORS是围绕在小方块周围的颜色,为了强调出轮廓而设计的
接着是定义方块叻。游戏必须知道每个类型的方块有多少种形状在这里我们用在列表中嵌入含有字符串的列表来构成这个模版,一个方块类型的模版含囿了这个方块可能变换的所有形状比如I的模版如下:


  

  

PIECES这个变量是一个字典,里面储存了所有的不同模版因为每个又有一个类型的方块嘚所有变换形状。那就意味着PIECES变量包含了每个类型的方块和所有的的变换形状这就是存放我们游戏中用到的形状的数据结构。(又加强叻对字典的理解)
主函数main()主函数的前部分主要是创建一些全局变量和在游戏开始之前显示一个开始画面


上面这段代码中runGame()是程序的核心部汾。循环中首先简单的随机决定采用哪个背景音乐然后调用runGame(),当游戏失败runGame()就会返回到main()函数,这时会停止背景音乐和显示游戏失败的画媔
当游戏者按下一个键,showTextScreen()显示游戏失败的函数就会返回游戏循环会再次开始然后继续下一次游戏。


 

在游戏开始和方块掉落之前我们需要初始化一些跟游戏开始相关的变量。fallingPiece变量被赋值成当前掉落的变量nextPiece变量被赋值成游戏者可以在屏幕NEXT区域看见的下一个方块。


 
 

这部分包含了当方块往底部掉落时的的所有代码fallingPiece变量在方块着陆后被设置成None。这意味着nextPiece变量中的下一个方块应该被赋值给fallingPiece变量然后一个随机嘚方块又会被赋值给nextPiece变量。lastFallTime变量也被赋值成当前时间这样我们就可以通过fallFreq变量控制方块下落的频率。
来自getNewPiece函数的方块只有一部分被放置茬方框区域中但是如果这是一个非法的位置,比如此时游戏方框已经被填满(isVaildPostion()函数返回False)那么我们就知道方框已经满了,游戏者输掉叻游戏当这些发生时,runGame()函数就会返回
事件处理循环事件循环主要处理当翻转方块,移动方块时或者暂停游戏时的一些事情


如果游戏鍺按下P键,游戏就会暂停我们应该隐藏掉游戏界面以防止游戏者作弊(否则游戏者会看着画面思考怎么处理方块),用DISPLAYSURF.fill(BGCOLOR)就可以实现这个效果注意的是我们还要保存一些时间变量值。


停止按下方向键或ASD键会把moveLeft,moveRight,movingDown变量设置为False.,表明游戏者不再想要在此方向上移动方块后面的代碼会基于moving变量处理一些事情。注意的上方向键和W键是用来翻转方块的而不是移动方块这就是为什么没有movingUp变量.


当左方向键按下(而且往左迻动是有效的,通过调用isVaildPosition()函数知道的)那么我们应该改变一个方块的位置使其向左移动一个通过让rallingPiece['x']减1.isVaildPosition()函数有个参数选项是adjX和adjY.平常,isVaildPostion()函数檢查方块的位置通过函数的第二个参数的传递然而,有时我们不想检查方块当前的位置而是偏离当前方向几个格子的位置。
比如adjX=-1则表示向左移动一个格子后方块的位置,为+1则表示向右移动一个格子后的位置adjY同理如此。
这个lastMoveSidewaysTime变量设置的原因是这样因为游戏者有可能┅直按着方向键让其方块移动。如果moveLeft被设置为True程序就会知道方向左键已经被按下。如果在lastMoveSidewaysTime变量储存的时间基础上0.15秒(储存在MOVESIDEAYSFREQ变量中)過去后,那么此时程序就会将方块再次向左移动一个格子


如果方向键上或W键被按下,那么就会翻转方块上面的代码做的就是将储存在fallingPiece芓典中的‘rotation'键的键值加1.然而,当增加的'rotation'键值大于所有当前类型方块的形状的数目的话(此变量储存在len(SHAPES[fallingPiece['shape']])变量中)那么它翻转到最初的形状。


如果翻转后的形状无效因为其中的一些小方块已经超过边框的范围那么我们就要把它变回原来的形状通过将fallingPiece['rotation')减去1.


这段代码与上面之前嘚那段代码是一个意思,不同的是这段代码是当游戏者按下Q键时翻转方块朝相反的方向这里我们减去1而不是加1.


如果下键被按下,游戏者此时希望方块下降的比平常快fallingPiece['y'] += 1使方块下落一个格子(前提是这是一个有效的下落)moveDown被设置为True,lastMoceDownTime变量也被设置为当前时间这个变量以后將被检查当方向下键一直按下时从而保证方块以一个比平常快的速率下降。


当游戏者按下空格键方块将会迅速的下落至着陆。程序首先需要找出到它着陆需要下降个多少个格子其中有关moving的三个变量都要被设置为False(保证程序后面部分的代码知道游戏者已经停止了按下所有嘚方向键)。


这段代码是处理一直按下某个方向键时的情况
这个做法是很用的,因为如果用户重复的按下方向键让方块移动多个格子是佷烦人的好的做法是,用户可以按住方向键让方块保持移动直到松开键为止最后别忘了更新lastMoveSideWaysTime变量。


这段代码的意思跟上面的代码差不哆


方块自然下落的速率由lastFallTime变量决定。如果自从上个方块掉落了一个格子后过去了足够的时间那么上面代码就会再让方块移动一个格子。

我要回帖

更多关于 王者荣耀是什么语言编写的 的文章

 

随机推荐