• 基于C语言设计的植物大战僵尸小游戏


    资源下载地址:https://download.csdn.net/download/sheziqiong/86763979
    资源下载地址:https://download.csdn.net/download/sheziqiong/86763979

    植物大战僵尸

    主要内容
    游戏环境

    Linux 任何终端都可以; 需要开到最大的屏幕;

    如果要编译源码(可能运行./PVZ会 permission denied 我也不知道为什么),需要安装 cmake;然后:

    cmake .
    make
    ./PVZ
    
    • 1
    • 2
    • 3

    即可;

    游戏玩法:
    • w,a,s,d 上下左右移动;

      b 在商店购买商品

      n 在空格种植植物

      j 铲掉这个格子的植物

      h 收获这个格子的太阳花的阳光

      Esc 可以直接重新开始

    • 僵尸越过底线就判定为吃掉了脑子

    • TIP:(如果不出现僵尸可以按Esc刷新一下,我在WSL和我的centos 服务器里面出现过这种情况,但是在ubuntu里面没有)

    植物图鉴:
    • 向日葵:

    在这里插入图片描述

    阳光:50

    生命值:50

    植物功能:生产阳光 用H收货

    • 豌豆射手:

    在这里插入图片描述

    阳光:100

    生命值:100

    植物功能:发射豌豆

    • 寒冰射手:

    在这里插入图片描述

    阳光:175

    生命值:100

    植物功能:发射冰豌豆 可以让僵尸减速

    • 樱桃炸弹:

    在这里插入图片描述

    阳光:150

    植物功能:对周围的僵尸造成200点伤害

    • 坚果墙:

    在这里插入图片描述

    阳光:50

    生命值:300

    植物功能:肉

    僵尸图鉴
    • 普通僵尸:

    在这里插入图片描述

    生命值:100

    • 路障僵尸:

    在这里插入图片描述

    生命值:200

    特点:在生命值<100的时候帽子会变成普通僵尸的样子

    • 铁桶僵尸:

    在这里插入图片描述

    生命值:300

    特点:在生命值<100的时候帽子会变成普通僵尸的样子

    • 读报僵尸:

    在这里插入图片描述

    生命值:200

    特点:在生命值<100的时候,手臂会变成普通僵尸的样子并且速度变快

    课程主要目标:
    • 完成包含上述植物,僵尸的植物大战僵尸游戏,并且提供商店,铲子和积分功能
    • 我额外做了开始和Restart界面,可以无限的玩游戏
    课程设计主要思路:
    • (目前的思路):
    Game
    Controller
    Plant Group
    Zombie Group
    Bullet Group
    Plants
    Zombies
    Bullets
    我的主要想法是: 
    
    • 1
    • 在Game里面控制游戏界面的切换:

      init
      play
      exit
      failure
    • 在Game的play里面调用controller进行游戏逻辑游戏渲染,并且根据键盘的响应调用controller进行一些其他(比如:铲子,收货阳光)操作:

      play
      键盘控制
      controller
      controller时间流逝
      僵尸生成
      僵尸/豌豆移动
      逻辑处理
      胜负判断
      移动控制
      商店购买
      收货阳光
      铲除植物
      重新开始
    • 对于渲染以及碰撞的处理,我的做法是对于bullet(豌豆),用 X,Y 存大格子的位置, 然后在根据植物本身的图案在生成的时候计算出 bx,by 这是具体的像素的位置,用来提供碰撞检测的数据;

    • 对于每一个 bullet(豌豆) plant(植物) zombie(僵尸) plant(植物) 我的想法是在每一个对象里面都存好自身的位置(X,Y,bx,by),然后自己有一个根据位置的draw函数进行渲染,work函数进行每一个时间片自身的处理以及和其他对象的交互;具体的细节在下面的类介绍之中;

    • PS:我之前失败的想法是用一个二维的map来存储数据,每一个时间片更新map的状态,然后对这个map进行统一的渲染,但是因为过于繁琐,不够解耦,遂放弃。

    主要类的设计
    • 具体如下:

    在这里插入图片描述

    • 我自顶向下介绍各个类的设计;

    • Game.h 中的game类:

      • int init()用来初始化屏幕,对w,s两个按键进行处理进行state的变换,根据state决定是play还是exit;
      • int play() 包含一个大的while循环来进行游戏,并且建立了一个controller对象c1,通过对按键事件的处理调用c1中的函数来进行游戏;
      • int failure() 显示最后得分以及并且通过对w,s的按键处理来完成state的变换,通过state决定是restart 还是 exit;
      • void test() 对上述三个函数进行了整合;
    • logic.h下面的类:

      controller类:

      • private里面的一些常量:包括 sun 用来记录目前的阳光, t用来记录游戏进行的总时间片数,plant_catch用来存放在商店购买的植物种类,ID用来记录僵尸,植物,豌豆的ID, natual_sun_speed用来控制自然产生阳光的速度;

      • public中的变量:

      • 三个vector zombie_group,plant_group,bullet_group分别是三类对象的vector,对于后面的遍历,然后来进行对象的交互等操作;

        我觉得这里是一种聚集的思想

      • controller();生成函数 初始化一些内容

      • static void map_init(): 初始化地图 包括草地 商店等

      • void time_passing(): 使controller的t+1,并且调用三个vector里面所有对象的timepassing()函数;

      • void information_draw(); 用于基本信息 包括得分,阳光的绘图

      • void buy_plant(int x,int y) 根据上层提供的x,y修改plant_catch里面的内容来确定买了什么植物,如果阳光不够还会调用cannot_buy()函数在信息区告诉玩家阳光不够;

      • void plant_flowers(int x,int y) 根据上层提供的坐标以及plant_catch里面的type创建plant对象并且压入plant_group这个vector里面

      • void zombie_productor(int x,int y,int type)//在逻辑位x,y上面生产所需要的型号的僵尸

      • void plant_group_work(),void zomie_group_work(),void bullet_group_work();通过遍历上述的三个vector然后调用所有对象的work函数,有需要的还对其他的group进行的遍历,从而达成对象的交互(攻击);并且会把死亡的对象从vector里面删除,并且调用里面的death()函数进行渲染,达成对于草地的恢复;

        void both_work()调用了上面三个group_work();

      • void both_draw() ,void both_move()遍历所有对象 调用里面的draw()和 move()函数;

      • void sun_catch(int x,int y)根据给定的坐标 如果该坐标是向日葵 就收货里面的阳光

      • void delete_plant(int x,int y) 根据给定的坐标,让里面的植物死亡

      • void zombie_fram() 根据时间片改变烈度,根据烈度随机的调用zombie_productor(int x,int y,int type)来进行僵尸的产生;

      • int return score()返回分数

    资源下载地址:https://download.csdn.net/download/sheziqiong/86763979
    资源下载地址:https://download.csdn.net/download/sheziqiong/86763979

  • 相关阅读:
    mysql 创建函数
    北京海淀区统计数据集(2016年3月-2019年3月)
    类欧笔记存档
    人工神经网络算法的应用,人工神经网络是算法吗
    C. Nice Garland
    多模态&多目标学习-vsn+transformer
    【艾特淘】8月22日之后,抖音精选联盟准入标准变了
    LintCode 1359: Convert Sorted Array to Binary Search Tree
    金仓数据库KingbaseES服务器应用参考手册--2. initdb
    面试算法20:回文子字符串的个数
  • 原文地址:https://blog.csdn.net/newlw/article/details/126829365