学习Objective-C的面向对象也有一段时间了,为了犒劳自己的学习成果,写个小怪兽来犒劳一下自己把。在LOL中有怪兽和英雄的角色吧,接下来就先写一个小怪兽的类吧。从小怪兽的角度来讲,怪兽都有那些行为和属性呢?最重要的两点是小怪兽要打英雄对吧,“攻击英雄”的行为是少不了的,另一个是小怪兽打不过怎么办呢?打不过就跑呗,顺理成章,得有“逃跑”行为吧。要想跑得会动,所以得有“移动”的行为吧。

  小怪兽除了上面的基本行为外,还有那些属性呢?小怪兽在攻击英雄的同时生命力是由变化的,会由一个值变到另一个值,所以得有“当前的生命力”和“原来的生命力”,同时“攻击力”和“防御力”对于小怪兽来说也是必不可少的,移动时得有“当前位置”和“原来位置”。下面的代码运行的环境是XCode5.0.2版本。

  面向对象不就是用代码模拟现实中的对象,将现实中对象的某些行为能力,特征用代码表现出来,然后用这些代码来模拟现实中的问题。下面就是用计算机来模拟一下小怪兽的逻辑,本博文的文文字和代码均属原创,转载请注明出处。

  一.在计算机中位置一般是由坐标来实现的,所以坐标类是要有的。以下是定义坐标的interface, 存放在Location.h文件中

  代码说明:

    1.下面有两个属性表示坐标x和y,分别给x和y编写setter和getter方法

    2.为了初始化为该类定义类便利构造函数

    3.为了方便查看坐标,为该类定义类display方法,便于显示坐标

    编写implementation,对于的文件为Location.m

 //
// Location.m
// HelloOC
//
// Created by ludashi on 14-7-27.
// Copyright (c) 2014年 ludashi. All rights reserved.
// #import "Location.h" @implementation Location
//实现便利初始化函数
- (id) initWithX : (int)vX
AndY : (int)vY
{
if (self = [super init]) {
self->x = vX;
self->y = vY;
}
return self;
} //实现便利构造函数
+ (id) locationWithX:(int)vX
AndY:(int)vY
{
//实例化位置对象,并赋值
Location *location = [[Location alloc] initWithX:vX AndY:vY];
return location;
} //set方法
-(void) setX:(int)vX
{
x = vX;
} -(void) setY:(int)vY
{
y = vY;
} //x和y的获取方法
- (int) getLocationX
{
return x;
} - (int) getLocationY
{
return y;
} - (void) display
{
NSLog(@"该点的坐标为:(%d, %d)", self->x, self->y);
} @end

  

  二.为了节省篇幅小怪兽类的interface就省略不写了,下面是小怪兽的属性

     @private
//当前生命值
int currentLifeValue; //原始生命值
int originalLifeValue; //当前位置
Location *currentLocation; //原始位置
Location *originalLocation; //攻击力
int attack; //防御力
int defense;

  1.为了小怪兽的移动打基础,必须有个方法能够更新位置,也就是实现如果小怪兽要移动,那么必须有新的坐标产生,这个新的坐标就是小怪兽要移动的位置,移动时把原有的坐标更新成现在小怪兽在的地方,而currentLocation跟新成要移动的位置。代码如下:

  

 //设置当前位置
- (void) setCurrentLocation:(Location *)vCurrentLocation
{
//位置更新
originalLocation = currentLocation;
currentLocation = vCurrentLocation;
}

  2.小怪兽类要想快速的复制更多的小怪兽,必须得有便利初始化方法和便利构造函数,代码如下

 //便利初始化方法,初始化原始生命力和原始位置以及攻击力和防御力
- (id) initWithOriginalLifeValue:(int)vOriginalLifeValue
AndOriginalLocation:(Location *)vOriginalLocation
AndAttack:(int)vAttack
AndDefence:(int)vDefence
{
if (self = [super init]) {
self->originalLifeValue = vOriginalLifeValue;
self->originalLocation = vOriginalLocation;
self->attack = vAttack;
self->defence = vDefence;
}
return self;
} //便利构造器
+ (id) monsterWithOriginalLifeValue:(int)vOriginalLifeValue
AndOriginalLocation:(Location *)vOriginalLocation
AndAttack:(int)vAttack
AndDefence:(int)vDefenceon
{
//实例化对象
Monster *monster = [[Monster alloc] initWithOriginalLifeValue:vOriginalLifeValue
AndOriginalLocation:vOriginalLocation
AndAttack:vAttack
AndDefence:vDefenceon];
return monster; }

  

  3.小怪兽用攻击英雄得会动吧,移动时要给小怪兽下达个指令让它去哪,得有个坐标能传入到move函数中,代码如下

 //移动行为
-(void) move : (Location *)vCurrentLocation
{
//传入当前值,调用坐标更新方法
[self setCurrentLocation:vCurrentLocation]; //获取原有位置的坐标
int oX = [originalLocation getLocationX];
int oY = [originalLocation getLocationY]; //获取现在的位置
int cX = [currentLocation getLocationX];
int cY = [currentLocation getLocationY]; //获取现在位置的坐标
NSLog(@"从位置(%d, %d), 移动到了(%d, %d)", oX, oY, cX, cY);
}

  

  4.小怪兽的使命是什么呢,当然是攻击英雄啦,但是攻击英雄是有好处的,会提高防御力,和攻击力哦,所以攻击英雄的同时需要更新攻击力和防御力

 //攻击英雄行为
- (void) attackHero
{
//攻击一次英雄的攻击力会变化,防御力也会变化,这里用加一模拟
attack++;
defence++;
NSLog(@"攻击英雄,攻击力增为%d, 防御力增加为%d",attack, defence);
}

  5.小怪兽不是什么正人君子,所以打不过他就跑,下面是逃跑的方法

 //逃跑行为
- (void) escape
{
//逃跑则会减少
attack--;
defence--;
NSLog(@"打不过就跑吧,攻击力减为%d, 防御力减为:%d", attack, defence);
}

测试运行结果如下:

-- ::19.240 HelloOC[:] 从位置(, ), 移动到了(, )
-- ::19.242 HelloOC[:] 从位置(, ), 移动到了(, )
-- ::19.242 HelloOC[:] 从位置(, ), 移动到了(, )
-- ::19.242 HelloOC[:] 攻击英雄,攻击力增为11, 防御力增加为11
-- ::19.243 HelloOC[:] 攻击英雄,攻击力增为12, 防御力增加为12
-- ::19.243 HelloOC[:] 攻击英雄,攻击力增为13, 防御力增加为13
-- ::19.243 HelloOC[:] 打不过就跑吧,攻击力减为12, 防御力减为:

  上面就是小怪兽的基本逻辑,利用面向对象来描述小怪兽的好处是好扩充,比如逃跑会有什么其他后果,可以在不改动原来代码的基础上增加相应的方法或者类。通过小怪兽的逻辑希望大家会更好的理解面向对象的思想。

Objective-C中小怪兽的逻辑的更多相关文章

  1. “奥特曼攻打小怪兽”java学习打怪升级第一步

    ---恢复内容开始--- 练习:回合制对战游戏:奥特曼和小怪兽进行PK,直到一方的血量为0时结束战斗,输出谁胜利了! 不难看出场景中有两个对象:”奥特曼“这一对象抽象为”Ao"类:     ...

  2. 理解Objective C 中id

    什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...

  3. 浅谈Objective—C中的面向对象特性

    Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...

  4. 研究分析JS中的三种逻辑语句

    JS中的三种逻辑语句:顺序.分支和循环语句. 一.顺序语句 代码规范如下:1. <script type="text/javascript"> var a = 10;  ...

  5. 用适配器模式处理复杂的UITableView中cell的业务逻辑

    用适配器模式处理复杂的UITableView中cell的业务逻辑 适配器是用来隔离数据源对cell布局影响而使用的,cell只接受适配器的数据,而不会与外部数据源进行交互. 源码: ModelCell ...

  6. objective C中的字符串NSStirng常用操作

    objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的 ...

  7. quick-cocos2d-x项目《狂点小怪兽》总结

    最近找了个公司实习,领导让我把公司的<狂点小怪兽>C++游戏用Lua重写.大概用了一个星期完成. 第一次使用quick-cocos2d-x,磕磕碰碰的也算是走了一遍流程. 1. quick ...

  8. Objective C中的ARC的修饰符的使用---- 学习笔记九

    #import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...

  9. Objective - C中属性和点语法的使用

    一.属性        属性是Objective—C 2.0定义的语法,为实例变量提供了setter.getter方法的默认实现能在一定程度上简化程序代码,并且增强实例变量的访问安全性         ...

随机推荐

  1. Swing学习笔记1-----Swing组件类的层次

    1.  从结构上划分 Swing 组件类分为两种,一种是JComponent类,一种是Windows类.其中windows类包含的是一些可以独立显示的组件,而JComponent类包含的是不可以独立显 ...

  2. 关于iOS后台问题( 一 )(ios后台刷新,后台定位,后台下载,真后台)

    关于iOS的后台,以下引用一些文段进行一下脑补,请同学们大致看一下,有个基础,原文出处 -------------------------------------------------------- ...

  3. [转]Android ListView 与 RecyclerView 对比浅析—缓存机制

    从源码角度剖析ListView 与 RecyclerView 缓存机制的不同 https://zhuanlan.zhihu.com/p/23339185 原文地址:http://dev.qq.com/ ...

  4. 编译链接 C++

    预处理之后的源文件被称为一个编译单位,也即编译器的工作对象.为了使编译能够进行,程序员必须提供各种程序其他部分的声明来孤立分析一个编译单位.所有名字空间,类,函数都应该在他们所在的编译单位中有声明,所 ...

  5. <2048>调查报告心得与体会

    老师这次给我们布置了一个任务,就是让我们写一份属于自己的调查报告,针对这个任务,我们小组的六个人通过积极的讨论,提出了一些关于我们产品的问题,当然这些问题并不是很全面,因为我们是从自己的角度出发,无法 ...

  6. Event,delegate,handler之间的关系

    在C#或者说.Net的事件处理机制中,有三个关键的概念 - 事件(Event),委托(Delegate)和处理器(Handler),另外在面向对象的背景中,还有另外两个概念 - 发送者(Sender) ...

  7. 框架设计之ADO.NET Command的ExecuteScalar误用情景及底层解说

    最近下载了点资料,学了学Android,发现Android入门还算简单,从.NET过渡到Android,也就三七十一天的事. 大伙有空也可以学学... 好了,言归正文,那日,有网友发了一个他们公司的数 ...

  8. spring事务管理器设计思想(一)

    在最近做的一个项目里面,涉及到多数据源的操作,比较特殊的是,这多个数据库的表结构完全相同,由于我们使用的ibatis框架作为持久化层,为了防止每一个数据源都配置一套规则,所以重新实现了数据源,根据线程 ...

  9. 【原】Python用例:将指定文件或目录打包成zip文件

    #This Demo is used to compress files to .zip file #Base on Windows import os import time #The files ...

  10. 每天一个linux命令(46):vmstat命令

    vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控.他是对系统的整体情况进行统计,不足之处是无法对某个进程进行深 ...