zoukankan      html  css  js  c++  java
  • Objective-C中小怪兽的逻辑

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

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

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

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

      代码说明:

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

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

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

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

    复制代码
     1 //
     2 //  Location.m
     3 //  HelloOC
     4 //
     5 //  Created by ludashi on 14-7-27.
     6 //  Copyright (c) 2014年 ludashi. All rights reserved.
     7 //
     8 
     9 #import "Location.h"
    10 
    11 @implementation Location
    12 //实现便利初始化函数
    13 - (id) initWithX : (int)vX
    14            AndY : (int)vY
    15 {
    16     if (self = [super init]) {
    17         self->x = vX;
    18         self->y = vY;
    19     }
    20     return self;
    21 }
    22 
    23 //实现便利构造函数
    24 + (id) locationWithX:(int)vX
    25                 AndY:(int)vY
    26 {
    27     //实例化位置对象,并赋值
    28     Location *location = [[Location alloc] initWithX:vX AndY:vY];
    29     return location;
    30 }
    31 
    32 //set方法
    33 -(void) setX:(int)vX
    34 {
    35     x = vX;
    36 }
    37 
    38 -(void) setY:(int)vY
    39 {
    40     y = vY;
    41 }
    42 
    43 //x和y的获取方法
    44 - (int) getLocationX
    45 {
    46     return x;
    47 }
    48 
    49 - (int) getLocationY
    50 {
    51     return y;
    52 }
    53 
    54 - (void) display
    55 {
    56     NSLog(@"该点的坐标为:(%d, %d)", self->x, self->y);
    57 }
    58 
    59 @end
    复制代码

      

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

    复制代码
     1     @private
     2     //当前生命值
     3     int currentLifeValue;
     4     
     5     //原始生命值
     6     int originalLifeValue;
     7     
     8     //当前位置
     9     Location *currentLocation;
    10     
    11     //原始位置
    12     Location *originalLocation;
    13     
    14     //攻击力
    15     int attack;
    16     
    17     //防御力
    18     int defense;
    复制代码

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

      

    复制代码
    1 //设置当前位置
    2 - (void) setCurrentLocation:(Location *)vCurrentLocation
    3 {
    4     //位置更新
    5     originalLocation = currentLocation;
    6     currentLocation = vCurrentLocation;
    7 }
    复制代码

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

    复制代码
     1 //便利初始化方法,初始化原始生命力和原始位置以及攻击力和防御力
     2 - (id) initWithOriginalLifeValue:(int)vOriginalLifeValue
     3              AndOriginalLocation:(Location *)vOriginalLocation
     4                        AndAttack:(int)vAttack
     5                       AndDefence:(int)vDefence
     6 {
     7     if (self = [super init]) {
     8         self->originalLifeValue = vOriginalLifeValue;
     9         self->originalLocation = vOriginalLocation;
    10         self->attack = vAttack;
    11         self->defence = vDefence;
    12     }
    13     return self;
    14 }
    15 
    16 //便利构造器
    17 + (id) monsterWithOriginalLifeValue:(int)vOriginalLifeValue
    18                 AndOriginalLocation:(Location *)vOriginalLocation
    19                           AndAttack:(int)vAttack
    20                          AndDefence:(int)vDefenceon
    21 {
    22     //实例化对象
    23     Monster *monster = [[Monster alloc] initWithOriginalLifeValue:vOriginalLifeValue
    24                                                AndOriginalLocation:vOriginalLocation
    25                                                          AndAttack:vAttack
    26                                                         AndDefence:vDefenceon];
    27     return monster;
    28     
    29 }
    复制代码

      

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

    复制代码
     1 //移动行为
     2 -(void) move : (Location *)vCurrentLocation
     3 {
     4     //传入当前值,调用坐标更新方法
     5     [self setCurrentLocation:vCurrentLocation];
     6     
     7     
     8     //获取原有位置的坐标
     9     int oX = [originalLocation getLocationX];
    10     int oY = [originalLocation getLocationY];
    11     
    12     //获取现在的位置
    13     int cX = [currentLocation getLocationX];
    14     int cY = [currentLocation getLocationY];
    15     
    16     //获取现在位置的坐标
    17     NSLog(@"从位置(%d, %d), 移动到了(%d, %d)", oX, oY, cX, cY);
    18 }
    复制代码

      

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

    复制代码
    1 //攻击英雄行为
    2 - (void) attackHero
    3 {
    4     //攻击一次英雄的攻击力会变化,防御力也会变化,这里用加一模拟
    5     attack++;
    6     defence++;
    7     NSLog(@"攻击英雄,攻击力增为%d, 防御力增加为%d",attack, defence);
    8 }
    复制代码

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

    复制代码
    1 //逃跑行为
    2 - (void) escape
    3 {
    4     //逃跑则会减少
    5     attack--;
    6     defence--;
    7     NSLog(@"打不过就跑吧,攻击力减为%d, 防御力减为:%d", attack, defence);
    8 }
    复制代码

    测试运行结果如下:

    复制代码
    2014-07-27 18:55:19.240 HelloOC[1617:303] 从位置(0, 0), 移动到了(10, 20)
    2014-07-27 18:55:19.242 HelloOC[1617:303] 从位置(10, 20), 移动到了(100, 200)
    2014-07-27 18:55:19.242 HelloOC[1617:303] 从位置(100, 200), 移动到了(200, 300)
    2014-07-27 18:55:19.242 HelloOC[1617:303] 攻击英雄,攻击力增为11, 防御力增加为11
    2014-07-27 18:55:19.243 HelloOC[1617:303] 攻击英雄,攻击力增为12, 防御力增加为12
    2014-07-27 18:55:19.243 HelloOC[1617:303] 攻击英雄,攻击力增为13, 防御力增加为13
    2014-07-27 18:55:19.243 HelloOC[1617:303] 打不过就跑吧,攻击力减为12, 防御力减为:12
    复制代码

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

  • 相关阅读:
    [LeetCode] 222. Count Complete Tree Nodes Java
    [LeetCode] 199. Binary Tree Right Side View Java
    自动加载的两种办法
    Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted
    Java 面试
    Java 获取最近时间
    Java 倒序输出
    java 排序算法
    图片预览
    SSH三大框架的工作原理
  • 原文地址:https://www.cnblogs.com/zhangkeyu/p/6659338.html
Copyright © 2011-2022 走看看