IOS 实现植物大战僵尸

使用Cocos2D-x引擎在Mac下开发运行在iOS设备上的《植物大战僵尸》第一篇 今天,让我们一起来看一下关于使用Cocos2D-x引擎开发运行在iOS设备上的《植物大战僵尸》简易版本,我所做的就设计了两关,开始动画、菜单界面、游戏界面、游戏成功失败界面,菜单界面上有开始游戏按钮、退出游戏按钮、关于按钮、帮助按钮、游戏界面上有暂停和返回按钮。所用到的技术等做完之后再进行总结,现在就从开始一点一点讲述我所做的过程。 首先,环境搭建这方面我就不多说了,不懂的可以网上找一些资料,这 阅读详情



一。实现界面上的图像;

1.这是界面的布局成为这个熊样。

2.将4个相同类型的植物槽中的植物关联到同一个事件中。

@property (strong, nonatomic) IBOutletCollection(UIImageView) NSArray *plantIVs;

3.将下面的45个草坪中的坑 添加uiview,然后关联到一个相同功能的数组中。

@property (strong, nonatomic) IBOutletCollection(UIView) NSArray *boxes;

4.背景出现什么就拖出什么 ,拖出阳光的图片  阳光图片的下面托出一个lable用于显示数据。

 

二。拖拽植物槽里点植物:

1。以下代码是用来实现 植物槽里点植物多,从一张图片中截取出你要的图片显示在植物槽里;

-(void)initUI{

   

    UIImage *plantsImage = [UIImageimageNamed:@"seedpackets.png"];

    float w = plantsImage.size.width/18;

    float h = plantsImage.size.height;

    for (int i=0; i<4; i++) {

        UIImageView *plantIV =self.plantIVs[i];

        float x = 0;

        switch (i) {

            case1://豌豆射手

                x= 2*w;

                break;

               

            case2://寒冰射手

                x= 3*w;

                break;

            case3://坚果

                x= 5*w;

                break;

       }

       

        CGImageRef subImage = CGImageCreateWithImageInRect(plantsImage.CGImage, CGRectMake(x, 0, w, h));

       

        plantIV.image = [UIImageimageWithCGImage:subImage];

        CGImageRelease(subImage);

 

 

三。 创建一个植物类,用来显示植物了, 植物类应该继承uiimageview;

 

1.因为所有以后要用到多植物都是属于要有动态效果的, 所以在创建好  植物父类的时候就要对其进行一个timer方法: 然后在调用这个方法的时候要创建一个改变图片的方法

- (id)initWithFrame:(CGRect)frame

{

    self = [superinitWithFrame:frame];

    if (self) {

        

        [NSTimerscheduledTimerWithTimeInterval:.1target:selfselector:@selector(changeImage) userInfo:nilrepeats:YES];

        

    }

    returnself;

}

然后在初始化此方法后要对这个方法进行实现。   , 此段代码就是实现图片的所有植物类图片的动态效果。  此方法需要在 viewdidload里面实现。

而且注意对是: 这里面用到了一个count的变量,  所以需要在.h里面进行声明

@property (nonatomic)int count;

@property (nonatomic, strong)UIImage *plantImage;

.h里面的声明代码。  而plantImage 是表示植物槽里点植物 声明的全局属性,其它子类可以继承。

 

-(void)changeImage{

    

 

    float w = self.plantImage.size.width/8;

//    x  0w   1w  2w  3w

    CGImageRef subImage = CGImageCreateWithImageInRect(self.plantImage.CGImage, CGRectMake(self.count++%8*w, 0, w, self.plantImage.size.height));

    

    self.image = [UIImageimageWithCGImage:subImage];

    

    CGImageRelease(subImage);

    

}做完这些后,也无法实现显示动态植物的原因是, 没有在viewcontroller中进行初始化的声明及使用。

 

 

 

四。接下来  需要创建其它的子类用来继承plant植物类,  因为现在声明了一个全局变量叫plantImage

1.声明一个子类叫做sunflower就是向日葵:  继承父类plant,然后在其自己的类当中实现自己要显示的图片。

- (id)initWithFrame:(CGRect)frame

{

    self = [superinitWithFrame:frame];

    if (self) {

        self.plantImage = [UIImageimageNamed:@"plant_0.png"];   此段代码是这个阶段要用的!  此时需要在页面中创建一个花 需要代码进行初始化,

就是self.dragPlant =[[SunFloweralloc]initWithFrame:plantIV.frame];类似于这样的

        //打开用户交互不然自身及内部子控件的事件响应不了

        self.userInteractionEnabled= YES;

        //让超出自身范围的子控件不显示

        self.clipsToBounds = YES;

    }

    returnself;

}

 

接下来此阶段的工作酒时重复以上的工作,创建一个豌豆射手,寒冰射手,坚果类  然后继承父类 的方法:然后在其具体的方法中进行自身图片的显示。

 

五。第五步,接下来这部分应该实现的是具体的每个草坪的坑中, 需要托45个view   然后45个view需要将其设置成透明,alpha里面设置,用控件全选。

此阶段就需要实现鼠标的点击事件了。

-(void)touchesBegan:(NSSet *)toucheswithEvent:(UIEvent *)event{

UITouch *t = [touches anyObject];

    

    CGPoint p = [t locationInView:self.view];

    

    for (UIImageView *plantIV inself.plantIVs) {

        if (CGRectContainsPoint(plantIV.frame, p)) {    //植物槽上的植物和p点(鼠标的点)点位置相同的话,用一个switch来创建点击不同植物槽,在当前的植物槽上创建植物。

            switch (plantIV.tag) {

                case0:

                {

                   self.dragPlant = [[SunFloweralloc]initWithFrame:plantIV.frame];

                 

                }

                   break;

                case1:

                {

                   self.dragPlant = [[Peaalloc]initWithFrame:plantIV.frame];

           

                }

                   break;

                case2:

                {

                   self.dragPlant = [[IcePeaalloc]initWithFrame:plantIV.frame];

                

                }

                   break;

                case3:

                {

                   self.dragPlant = [[Nutalloc]initWithFrame:plantIV.frame];

                }

                   break;

            }

            self.dragPlant.delegate = self;

            [self.viewaddSubview:self.dragPlant];

        }

    }

    

}     此段代码的意思就是  当你点击植物槽里点植物时  在当前点击的植物上复制一个新的植物   每个植物槽的tag不同。

 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{  鼠标移动的事件情况

    UITouch *t = [touches anyObject];

    CGPoint p = [t locationInView:self.view];

    

    self.dragPlant.center = p;

 

-(void)touchesEnded:(NSSet *)toucheswithEvent:(UIEvent *)event{

    //判断是否拖拽着植物

    if (self.dragPlant) {如果拖动的是植物的话:下面的判断是遍历每个草坪上的槽;

        

        for (UIView *box inself.boxes) {

           if (CGRectContainsPoint(box.frame, self.dragPlant.center)&&box.subviews.count==0) {如果草坪上的frame和拖动植物的中心点中心点重叠多话:将植物显示到当前你拖动到的草坪槽的中心点上,    而后面加的box的count的判断是为了避免:   一个草坪槽里出现多个植物。

         

               [box addSubview:self.dragPlant];

                self.dragPlant.center = CGPointMake(box.frame.size.width/2, box.frame.size.height/2);

               //开火儿

                [self.dragPlantbeginFire];

            }

        }

        //判断如果没有扔到任何一个坑里面的话就把植物删除

        if ([self.dragPlant.superviewisEqual:self.view]) {

            [self.dragPlantremoveFromSuperview];

        }

        

        

        self.dragPlant = nil;   //如果没有次方法:会出现  如果拖动一个植物后拖动到草坪槽里,  但是点击松手后,但是你鼠标移动的话也会出现植物跟着移动;

    }

    

}

此时实现以上的方法后    会有一个小bug 因为如果遇到了意外中断的情况  是可以讲图片添加等任意位置的:  所以此时就需要实现一个意外中断的方法:

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{

    

    if (self.dragPlant) {

        [self.dragPlantremoveFromSuperview];

    }

 

第五步完成了以后, 现在所有植物槽的植物能拖动了,,植物也能正确懂种植在草坪上,  但是现在当情况是,没有阳光,  每一个植物所对应的:如产阳光,发射子弹,等功能没有实现。所以,下一步的功能就是  实现�产出阳光。

 

 

第六步:

解决方案与需求: 因为�产出阳光 是其自身的状态属性, 但是这个 状态属性,基本上大部分的植物都存在,  所以需要声明一个父类的方法, 然后在父类的.h中声明.m中实现, 但是父类的实现的代码里不做任何代码的操作,  而是要通过子类继承重写的方式进行各自的  子类的植物的具体功能的实现,  所以需要重写。

 

在子类的重写方法中  因为是要动态的有规律的添加太阳, 需要调用计时器的方法:      然后selector中加入一个 添加阳光的方法:

 

需要注意的一点是。当你这个�扔到坑里的时候就需要调用开火这个方法,  所以还需要在view didload里面实现:

 

注意:  一般控件都有一个属性是用户交互, 因为当你拖动到草坪上时交互不开的花可能点不了:  原因是因为图片imageview的交互是默认关闭的,而他如果关闭了,所有在他内部的所有子控件也就变成了关闭的:  所以在这里需要写入一个方法;  这个方法是在向日葵自己的.m方法里面写的;自定义的时候。

//打开用户交互 不然自身及内部子控件的事件响应不了

        self.userInteractionEnabled= YES;

        //让超出自身范围的子控件不显示

        self.clipsToBounds = YES;

 

 

-(void)beginFire{

    [NSTimerscheduledTimerWithTimeInterval:8target:selfselector:@selector(addSun) userInfo:nilrepeats:YES];

    

}

-(void)addSun{

    

    UIButton *sunBtn = [[UIButtonalloc]initWithFrame:CGRectMake(10, 25, 25, 25)];//因为阳光是按钮,需要收集,所以是按钮,

    [sunBtn setImage:[UIImageimageNamed:@"sun.png"] forState:UIControlStateNormal];

    [sunBtn addTarget:selfaction:@selector(clicked:) forControlEvents:UIControlEventTouchUpInside];

    

    [selfaddSubview:sunBtn];

    

    //阳光自己消失

    [NSTimerscheduledTimerWithTimeInterval:3target:selfselector:@selector(removeSunAction:) userInfo:sunBtn repeats:NO];

    

    

}

-(void)removeSunAction:(NSTimer *)timer{

    UIButton *sunBtn = timer.userInfo;

    

    [sunBtn removeFromSuperview];

}

-(void)clicked:(UIButton *)sunBtn{阳光按钮自己的点击事件。

    [sunBtn removeFromSuperview];

    

    [self.delegateaddSunCount:25];

 

现在剩余一个小功能就是:没有阳光的计数。  所以要涉及到反向调用

 

 

第七步: 反向调用 给阳光的label添加修改功能。

反向传值流程:1.在B类的.h中声明一个A类型的weak属性delegate

2.在A类中创建完B类的时候给B类型对象的delegate属性赋值 

3.在A类的.h中声明方法供B类调用 如果需要传递回来参数那该方法声明时需要带参数

 

  viewcontroller是A类  ,太阳花是B类

 

1.现在是在sunflower中声明的, 因为方向调用要改Label的值得话 不仅仅是在这个子类当中,其他地方也要用,  所以需要声明在父类当中

2.在A类中 创建完B类的时候 也就是创建太阳花初始化方法的时候   给B类型的对象的delegate赋值。 self.dragPlant.delegate = self;

3.在A类的.h中声明方法供B调用,-(void)addSunCount:(int)count;

  然后再.m里面实现以下

-(void)addSunCount:(int)count{

    int oldCount = self.sunCountLabel.text.intValue;

    self.sunCountLabel.text = [NSStringstringWithFormat:@"%d",oldCount+count];

 

剩下的工作就是只需要在点击按钮事件的时候  调用此方法就可以了  ;就是太阳花自己的点击消失的时候要计数;

-(void)clicked:(UIButton *)sunBtn{

    [sunBtn removeFromSuperview];

    

    [self.delegateaddSunCount:25];

 

 

 

做完这些 ,植物的大部分工作都已经做完了,剩下的工作就是添加子弹。

 

第八步.添加子弹 

 

 

发射子弹是每隔一段事件发射, 所以在开火的方法中应该开一个timer pea的.m方法里


植物大战僵尸融合版V3.8:安装指南、二创内容体验与常见问题解决 游戏模组(MOD)是通过修改游戏资源文件与逻辑代码,为原有游戏注入新内容与玩法的技术实践。其原理在于对游戏本体的资源包(如.pak文件)进行替换或扩展,并注入自定义代码以实现新功能。这项技术的核心价值在于极大地延长了经典游戏的生命力,并催生了活跃的玩家创作生态。在诸如《植物大战僵尸》等经典游戏中,社区通过整合海量“二创植物”和“修改器”功能,创造出内容庞杂的“融合版”整合包,为玩家提供了近乎无限的探索空间。然而,这类非官方整合包的安装与运行常面临兼容性挑战,尤其是在Windows、Android和iOS等不 阅读详情

相关推荐

植物大战僵尸源码

自己写了一个简单的小程序,其中有不足之处,望谅解,本程序只供对cocos2d-x游戏开发者学习使用;开发环境xcode4.5 coco2d-x

自己动手写植物大战僵尸(iOS)

如题,本博文介绍如何用iOS UI创建一个植物大战僵尸的游戏,如有可能能后续可能会用cocos2d重构。 简述一下类的结构设计: Model: 僵尸(抽象类)->各种僵尸 植物(抽象类)->各种植物 子弹,阳光 僵尸池,子弹池(享元模式,在内存中重用僵尸和子弹,而不是来回重复的释放和创建,能极大的提高程序的运行效率) 僵尸工厂,植物工厂(工厂模式,负责僵尸对象和植物对象的创建)

Ron的专栏 1938

ios植物大战僵尸的游戏

这是一个ios编写的植物大战僵尸的手机游戏。有兴趣的同学可以下载看一下

手机也能种向日葵:PvZ-Portable在Android和iOS上安装的超详细图文教程

PvZ-Portable 是一款由社区开发的跨平台《植物大战僵尸:GOTY 版》重制引擎,支持在 Android 7.0+ 与 iOS 16.4+ 上安装运行。本教程手把手教你完成手机端的安装与资源配置,让你随时随地掏出手机种向日葵 🌻 [![PvZ-Portable 跨平台植物大战僵尸重制引擎](https://raw.gitcode.com/gh_mirrors/pv/PvZ-Portab

gitblog_00287的博客 34

IOS植物大战僵尸

植物大战僵尸 ,IOS项目基本的一个游戏开发!

植物大战僵尸(iphone版cocos2d源码)

cocos2d开发,植物大战僵尸(iphone版demo源码),仅做学习交流!!

IOS开发基础02(序列帧动画)

以植物大战僵尸为例: //  ViewController.swift //  植物大战僵尸 import UIKit class ViewController: UIViewController {          //IOS显示图片基本都采用UIImageView     override func viewDidLoad() {

ZGAaron的博客 999

AS7341光谱传感器实战:如何用STM32F103精准测量环境色温(附完整代码)

本文详细介绍了如何使用STM32F103驱动AS7341光谱传感器实现环境色温的精准测量。从硬件连接到驱动开发,再到色温计算算法的实现,提供了完整的代码示例和优化建议,帮助开发者在智能照明、农业监测等领域快速应用AS7341进行高精度色温检测。

weixin_30352645的博客 478

三步掌握C++游戏开发:植物大战僵尸重制版深度实践指南

植物大战僵尸C++重制版是基于Cocos2d-x 3.16引擎的完整开源项目,为C++开发者和游戏编程学习者提供了绝佳的实战平台。通过这个104个关卡的经典游戏重制,你将深入理解现代游戏引擎架构、面向对象设计模式以及跨平台开发的核心技术。本文将从架构设计到代码实现,带你全方位解析这个技术含量丰富的游戏项目。 ## 🎯 为什么这个项目值得深入探索? 对于C++初学者而言,这个项目避免了复杂的语

gitblog_00664的博客 353

AI Agent在智能投研中的实战:多智能体信息整合与策略生成

那么,什么是AI Agent?简单来说,AI Agent是一种能够感知环境、做出决策并采取行动的自主系统。自主性:能够在没有人类直接干预的情况下运行,对自己的行为和内部状态有一定的控制权。反应性:能够感知环境的变化,并及时做出反应。主动性:不仅能够对环境变化做出反应,还能够主动地设定目标并采取行动实现这些目标。社会性:能够与其他Agent(包括人类和人工智能)进行交互、协作和竞争。它们可以全天候不间断地监控和处理海量信息,大大提升信息处理能力;

AI大模型应用之禅 191

别再只看读写速度了!聊聊手机闪存eMMC、UFS3.1和SSD背后的功耗与体积玄学

本文深入探讨手机闪存技术eMMC、UFS3.1和SSD在功耗与体积设计上的关键差异。通过对比接口技术、封装工艺和温度管理,揭示移动存储如何在有限空间内平衡性能与能效,为消费者提供选购参考。重点关注UFS3.1的差分信号设计和全双工架构带来的显著优势。

weixin_27061475的博客 448

终极植物大战僵尸C++重制版:从零开始的游戏开发实战指南

植物大战僵尸C++重制版是基于Cocos2d-x 3.16引擎开发的经典游戏复刻项目,通过本指南你将掌握如何从零开始搭建完整的游戏开发环境,了解游戏架构设计与核心功能实现,是学习C++游戏开发的绝佳实践案例。 ## 🚀 项目概述:经典游戏的现代技术重构 这款植物大战僵尸重制版采用C++语言结合Cocos2d-x 3.16引擎开发,完整复现了原作的核心玩法与视觉风格。项目代码结构清晰,包含了植

gitblog_00093的博客 361

MATLAB实战:5步搞定GNSS单点定位解算(附完整代码)

本文提供了一份基于MATLAB的GNSS单点定位实战指南。通过5个核心步骤,详细讲解了如何从卫星坐标和伪距观测值出发,利用最小二乘迭代算法,构建并实现一个完整的单点定位解算器。文章附有完整代码,并涵盖精度评估与结果分析,适合GNSS初学者和MATLAB用户快速上手实践。

a2b3c4d5e的博客 250

终极植物大战僵尸C++重制版:5步快速上手的开源游戏开发实战指南

植物大战僵尸C++重制版是一款基于Cocos2d-x 3.16引擎开发的开源游戏项目,完整复刻了经典塔防游戏的核心玩法。这个C++游戏开发项目不仅适合游戏开发新手学习,也为有经验的开发者提供了优秀的参考代码。通过本指南,你将掌握如何快速上手这个开源游戏项目,了解其架构设计和核心功能实现。 ## 🎮 游戏项目概览与特色 这款植物大战僵尸重制版采用纯C++语言开发,使用Cocos2d-x 3.1

gitblog_00544的博客 422

【推荐100个unity插件之8】实现多人在线联机游戏——Mirror插件的使用介绍(附项目源码)

基于Mirror的Unity多人游戏开发指南 本文介绍了使用Mirror插件开发Unity多人游戏的基本流程。Mirror是Unity的高级网络API,替代了已废弃的UNet系统。文章详细讲解了如何导入Mirror插件,创建NetworkManager网络管理器,处理常见错误,以及创建玩家角色和出生点。 主要内容包括: 创建场景NetworkManager并配置必要组件 为玩家添加NetworkIdentity和NetworkTransform组件 设置玩家初始生成位置和生成方式 常见错误及解决方法 通过M

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

论文阅读: 2024 ICLR AutoDAN: Generating Stealthy Jailbreak Prompts on Aligned Large Language Models

AutoDAN: Generating Stealthy Jailbreak Prompts on Aligned Large Language Models这篇论文名为“AUTODAN: GENERATING STEALTHY JAILBREAK PROMPTS ON ALIGNED LARGE LANGUAGE MODELS”,主要研究大语言模型(LLMs)的越狱攻击问题,提出了一种名为AutoDAN的新方法,能自动生成隐蔽的越狱提示,具体内容如下:

CSPhD-winston的博客 1178

本周你不可错过的iOS游戏(111216)

相对于前两周《无尽之剑2》、《Michael Jackson The Experience HD》等大作的好戏连台,本周的游戏质量略有下降,好在在数量上弥补了不足。首先进入我们视野的是重大更新的经典游戏《植物大战僵尸》,以及一款历经十年仍长久不衰的《侠盗飞车3》和另一款家用机时代的经典弹幕游戏《虫姬》,微软的《Kinectimals》凭借家用机与移动平台的联动也颇为引人关注。一起来看看除此之外

雷锋网 1049

【补充篇】三万字了解AUTOSAR软件架构(一)

主要讲解了AUTOSAR软件架构的分层及各个栈的作用

weixin_47571898的博客 1120

一些资源分享

一些资源分享 最近在优快云上上传了一些小的小小项目,有植物大战僵尸(Javase 语言实现),企业网站(ASP.NET ,C#,HTML). 同时也上传了一些Javase做的一些窗体Demo。也有分享了一些ios的学习视频,大家可以进入我的下载页面可以下载。视频的获取通过百度云可以获取到。 希望我的分享能够对象有一些帮助。我的下载页面地址是: http://

Coder_PWH 884

如何给K8S配置一个具有永久有效的kubeconfig

在 Amazon EKS 环境中,Kubernetes 的认证机制与 AWS IAM 深度集成,通过aws-iam-authenticator动态生成临时凭证。这种设计虽然增强了安全性,但给需要持久化凭证的工具链(如 CI/CD 系统中的 KubeVela)带来了挑战。具体表现为:临时凭证失效​​:默认 Token 有效期为 15 分钟至 1 小时;​​IAM 角色限制​​:直接使用aws eks get-token生成的凭证无法持久化

小杨同学的博客 660

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

深度解析:基于Cocos2d-x的植物大战僵尸C++重制版架构揭秘与实战指南

植物大战僵尸C++重制版是一款基于Cocos2d-x 3.16引擎开发的开源游戏项目,完整复现了经典塔防游戏的核心玩法。该项目采用纯C++语言开发,具备104个可玩关卡、14种僵尸类型和13种植物类型,支持Windows、Linux、Android、iOS等多平台部署,为游戏开发者提供了优秀的学习范本和技术参考。 ## 🚀 项目亮点:现代游戏开发的最佳实践 ### 技术选型优势 项目选用Co

gitblog_01046的博客 324

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

iOS开发-------MVC架构思想-植物大战僵尸

十月长假也就这么过去了,利用假期想磨练一下自己的MVC架构的思想,于是找了一个相对比较麻烦的Demo来锻炼下,在之前很喜欢植物大战僵尸这个游戏,也算为游戏致敬了,但是这个植物大战僵尸肯定不是之前玩过的那个游戏,只是致敬,类似打地鼠,但是代码感觉非常多,所以也算楼主的目前博客里面最有料的了,不得不说,想逻辑的时候直接的虐心啊,先看一下效果吧 然后看一下如果家中的僵尸

RITL_Y 1999

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

植物大战僵尸融合版全平台安装指南:安全下载与玩法解析

生成的演示页面,可以直观看到不同植物融合效果,还能直接测试各平台安装包的兼容性报告。实际体验发现,用网页版模拟器测试安卓APK的安装流程非常方便,无需真机就能预判可能出现的解析错误。对于想快速了解游戏核心玩法的朋友,这种无需下载的云端体验方式既安全又高效,特别适合在分享给好友时使用。

DiamondWolf89的博客 508

HTML视频帧级控制:用requestVideoFrameCallback实现hyperframes

HTML视频帧级控制是现代Web动效开发的关键能力,其核心原理在于浏览器渲染管线与JavaScript的协同调度。通过requestVideoFrameCallback获取高精度媒体时间戳,结合createImageBitmap实现无损帧提取,并利用CSS animation-delay与关键帧动态绑定,可达成毫秒级、帧级的视觉同步。该技术显著提升教学标注、交互式视频、营销动效等场景的精准度与性能,无需新框架,而是深度挖掘video标签与原生API的组合潜力。本文聚焦hyperframes这一工程实践代号,

weixin_32349561的博客 210

iOS 上运行 Windows 程序:Wine 兼容层与 FEX-Emu 指令翻译实战

跨平台兼容层通过动态二进制翻译和 API 转换,让不同架构的程序在异构系统上运行。其核心原理是将源指令集翻译为目标指令集,并将系统调用映射到宿主环境。在移动端,这种技术能突破生态壁垒,让 iPad 等设备直接运行桌面级应用,尤其适合老游戏、行业软件等场景。然而,iOS 的沙盒限制、无 JIT 权限和 Metal 图形接口带来了独特挑战。本文围绕 Madeira 项目,拆解 FEX-Emu 指令翻译、Wine API 转换和 DXMT 图形翻译三层架构,分享配置调优与避坑经验,助你在 iOS 上搭建可用的 W

weixin_29895109的博客 289
上一篇: IOS tableView下拉刷新,上拉刷新(LOW)
下一篇: IOS 实现美图秀秀
NameUseNsstring
博客等级 码龄11年 1粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值