close
文章出處

  學習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

 

  上面就是小怪獸的基本邏輯,利用面向對象來描述小怪獸的好處是好擴充,比如逃跑會有什么其他后果,可以在不改動原來代碼的基礎上增加相應的方法或者類。通過小怪獸的邏輯希望大家會更好的理解面向對象的思想。 

 


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 AutoPoster 的頭像
    AutoPoster

    互聯網 - 大數據

    AutoPoster 發表在 痞客邦 留言(0) 人氣()