您当前的位置: 首页 >  Python

CSDN 程序人生

暂无认证

  • 1浏览

    0关注

    1993博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

涨知识!用 Python 实现植物大战僵尸代码

CSDN 程序人生 发布时间:2019-12-08 10:22:12 ,浏览量:1

 

作者 | marble_xu

责编 | 毛中政

出品 | CSDN博客

功能介绍

最近一直在给这个植物大战僵尸游戏添加新的植物和僵尸, 因为网上的图片资源有限,能加的植物和僵尸比较少, 目前进展如下。

功能实现如下:

  • 支持的植物类型:太阳花,豌豆射手,寒冰射手,坚果,樱桃炸弹。新增加植物:双重豌豆射手,三重豌豆射手,食人花 ,小喷菇,土豆地雷,倭瓜。

  • 支持的僵尸类型:普通僵尸,棋子僵尸,路障僵尸,铁桶僵尸。新增加读报僵尸。

  • 使用json文件保存关卡信息,设置僵尸出现的时间和位置。

  • 增加每关开始时选择上场植物。

  • 增加除草机。

下面是游戏的截图:

图1:新增的植物和僵尸

图2:每关开始选择上场植物卡片

图3:选择植物在哪里种植

植物卡片选择和种植

如图3所示,游戏中可以种植物的方格一共有45个(有5行,每行9列)。

这篇文章要介绍的是:

  • 上方植物卡片栏的实现。

  • 点击植物卡片,鼠标切换为植物图片。

  • 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。

完整代码

游戏实现代码的github链接:

https://github.com/marblexu/PythonPlantsVsZombies

这边是csdn的下载链接:

https://download.csdn.net/download/marble_xu/11982275

代码实现

所有的植物卡片的名称和属性都保存在单独的list中,每个list index都对应一种植物。

比如list index 0 就是太阳花:

  • card_name_list[0] 是太阳花卡片的名字,用来获取太阳花卡片的图片。

  • plant_name_list[0] 是太阳花的名字,用来获取太阳花卡片的图片。

  • plant_sun_list[0] 是种植太阳花需要花费的太阳点数。

  • plant_frozen_time_list[0] 是太阳花的冷却时间。

代码在source\component\menubar.py中:

card_name_list = [c.CARD_SUNFLOWER, c.CARD_PEASHOOTER, c.CARD_SNOWPEASHOOTER, c.CARD_WALLNUT,
                  c.CARD_CHERRYBOMB, c.CARD_THREEPEASHOOTER, c.CARD_REPEATERPEA, c.CARD_CHOMPER,
                  c.CARD_PUFFMUSHROOM, c.CARD_POTATOMINE, c.CARD_SQUASH]
plant_name_list = [c.SUNFLOWER, c.PEASHOOTER, c.SNOWPEASHOOTER, c.WALLNUT,
                   c.CHERRYBOMB, c.THREEPEASHOOTER, c.REPEATERPEA, c.CHOMPER,
                   c.PUFFMUSHROOM, c.POTATOMINE, c.SQUASH]
plant_sun_list = [50, 100, 175, 50, 150, 325, 200, 150, 0, 25, 50]
plant_frozen_time_list = [0, 5000, 5000, 10000, 5000, 5000, 5000, 5000, 8000, 8000, 8000]
all_card_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

植物卡片类

代码在source\component\menubar.py中,每个植物卡片是一个单独的Card类,用来显示这个植物。

  • checkMouseClick函数:判断鼠标是否点击到这个卡片;

  • canClick:判断这个卡片是否能种植(有没有足够的点数,是否还在冷却时间内);

  • update 函数:通过设置图片的透明度来表示这个卡片是否能选择。

class Card():
    def __init__(self, x, y, name_index, scale=0.78):
        self.loadFrame(card_name_list[name_index], scale)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y

        self.name_index = name_index
        self.sun_cost = plant_sun_list[name_index]
        self.frozen_time = plant_frozen_time_list[name_index]
        self.frozen_timer = -self.frozen_time
        self.select = True


    def loadFrame(self, name, scale):
        frame = tool.GFX[name]
        rect = frame.get_rect()
        width, height = rect.w, rect.h


        self.image = tool.get_image(frame, 0, 0, width, height, c.BLACK, scale)

    def checkMouseClick(self, mouse_pos):
        x, y = mouse_pos
        if(x >= self.rect.x and x = self.rect.y and y  sun_value or
            (current_time - self.frozen_timer) = self.rect.x and x = self.rect.y and y             
关注
打赏
1614322772
查看更多评论
0.0501s