Python中的塔防墙建筑|Wireframe#70

电子说

1.2w人已加入

描述

 

以Atari先锋Rampart的风格保护您的城堡。Mark在最新版本的Wireframe杂志中向您展示了如何操作。

上世纪80年代,一种新的战略流派应运而生。塔防游戏包括在你的城堡周围建造围墙或障碍物,以防止敌人摧毁它。Atari发行的《Rampart》是该类游戏中一个著名的早期作品。比赛分为两个阶段。在建造阶段,玩家在堡垒周围的墙壁上填洞,并放置大炮。在第二阶段,玩家的堡垒将被舰队从海上攻击,玩家可以用大炮还击。这个循环会一直持续下去,直到玩家无法再填补墙壁的空隙,或者他们摧毁了所有攻击船只。      

python

大炮准备好了,准备战斗!这是最初的Rampart,由Atari于1990年开发。

在我们的PygameZero示例中,我们将研究两种塔防机制:筑墙系统,然后检查要塞是否被墙包围。要开始编码,我们需要一个背景——在本例中,是一个海岸线部分。然后,我们需要定义一个不可见的网格,该网格将保存墙所在位置的详细信息。如果我们假设每个墙段是40×40像素,那么在800×600像素的窗口上,我们可以定义一个二维列表中20×15的网格。在这个列表中,我们将从所有设置为0的正方形开始,然后如果我们添加墙截面,将该正方形切换为1。为了定义我们可以构建和不能构建的地方,我们可以加载一个小黑白图像,并从中读取像素,将不可构建的正方形设置为3。

我们的堡垒将占据四个正方形,因此我们将堡垒位置的左上角正方形设为2,其他三个正方形设为3。这将阻止玩家在堡垒上筑墙。我们使用on_mouse_move()函数跟踪鼠标的移动,当我们获得鼠标x和y坐标时,我们在锁定到不可见网格的鼠标指针下绘制一段墙。当我们得到一个on_mouse_down()事件时,我们检查所经过的正方形是否为0,如果为0,我们将其转换为1。

python

我们向塔防流派致敬。建造一系列的墙来安全地包围你的堡垒。

在draw()函数中,如果我们在网格中有1的地方绘制一个墙截面,我们将看到墙所在的平面正方形。然而,我们想要的是所有的墙都与外面的城垛连接起来。为此,我们需要检查每个墙件周围的正方形,并根据其与其他墙件的连接方式来更改我们使用的图像。我们查看上方、右侧、下方和左侧的正方形,如果没有墙,则创建一个带零的字符串,如果有墙,则生成一个带1的字符串。这意味着如果没有墙连接,我们将获得字符串“0000”,如果上方有墙,将获得字符串1000,如果当前墙的左侧和右侧有墙,示例:“wall0101”。

在示例的第二部分,我们将检测堡垒是否被墙包围。有多种方法可以做到这一点,但我们将使用“flood fill”例程来测试这一点。首先,我们制作一份网格列表的副本以进行测试。然后,从网格上的堡垒位置开始,我们递归地测试所有相邻的正方形。如果我们碰到了一堵墙,那么我们就关闭了回路的分支。这就产生了一系列向外延伸的测试,直到到达地图的一侧,或者因为所有的代码分支都碰到了墙,所以我们没有正方形来测试。如果到达地图的边缘,墙上就会有洞;否则,堡垒将被封闭。

这些是我们的筑墙和测试程序。为了完成塔防风格的游戏,你需要添加一些大炮和舰船来战斗,但我们会把这部分留给你来实现。

python

这是Mark的塔防游戏开始代码。要在系统上运行它,首先需要安装PygameZero。完整说明可在此处(http://wfmag.cc/pgzero)找到。有关完整代码,请访问我们的github(http://wfmag.cc/wfmag70)。

获取Wireframe#70

您可以在Wireframe第70期中阅读更多类似的功能(https://www.raspberrypi.com/news/tag/wireframe/),可直接从Raspberry Pi Press(http://wfmag.cc/issues)获得,我们在全球范围内提供。

   

python

大结局:Wireframe#70,现已上市。

如果你喜欢数字形式的杂志,你也可以下载Wireframe第70期的免费PDF!(http://wfmag.cc/70)


审核编辑 :李倩


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分