OC(奥特曼打小怪兽游戏)

FJMonster.h//怪兽类

#import <Foundation/Foundation.h>

@class FJUltraman;

/**定义一个怪兽类有名字和生命值*/

@interface FJMonster : NSObject{

    NSString *_name;

    NSUInteger _hp;

}


+ (instancetype) monsterWithName:(NSString *)name hp:(NSUInteger)hp;


- (instancetype) initWithName:(NSString *) name hp:(NSUInteger)hp;


//怪兽攻击奥特曼

- (void) attack:(FJUltraman *) ultraman;



- (NSUInteger) hp;


- (void) setHp:(NSUInteger) hp;


- (NSString *) name;


@end


FJMonster.m

#import "FJMonster.h"

#import "FJUltraman.h"

@implementation FJMonster


+ (instancetype) monsterWithName:(NSString *)name hp:(NSUInteger)hp{

    

    return [[self alloc] initWithName:(NSString *)name hp:(NSUInteger)hp];


}


- (instancetype) initWithName:(NSString *)name hp:(NSUInteger)hp{

    if (self = [super init]) {

        _name = name;

        _hp = hp;

    }

    return self;

}


- (void)attack:(FJUltraman *)ultraman{

   //游戏设定:小怪兽对奥特曼造成5-15的伤害

    

   

    NSUInteger injury = arc4random() % 11 + 5;

    NSInteger newHp = ultraman.hp - injury;

    [ultraman setHp:newHp < 0? 0 : newHp];

    

    

}


- (NSString *)name{

    return  _name;

}


- (NSUInteger)hp{

    return _hp;

}

- (void)setHp:(NSUInteger)hp{

    

    _hp = hp;

}


- (NSString *)description{

    return [NSString stringWithFormat:@"%@小怪兽的生命值:%ld",_name,_hp];

}



@end


FJUltraman.h

#import <Foundation/Foundation.h>

@class FJMonster;

@interface FJUltraman : NSObject{

    NSUInteger _hp;

    NSUInteger _mp;

    NSString *_name;

}

+ (instancetype) ultramanWithName :(NSString *)name

                                hp:(NSUInteger)hp

                                mp:(NSUInteger)mp;


- (instancetype) initWithName:(NSString *)name

                      hp:(NSUInteger)hp

                      mp:(NSUInteger)mp;


- (void) attack:(FJMonster *) monster;


- (void) hugeAttack:(FJMonster *) monster;


- (void) magicAttack:(NSArray *) monsters;


- (NSString *) name;


- (NSUInteger) mp;


- (NSUInteger) hp;


- (void) setHp:(NSUInteger) hp;



@end


FJUltraman.m

#import "FJUltraman.h"

#import "FJMonster.h"

@implementation FJUltraman


+ (instancetype)ultramanWithName:(NSString *)name hp:(NSUInteger)hp mp:(NSUInteger)mp{

    

    return [[self alloc]initWithName:(NSString *) name hp:(NSUInteger) hp mp:(NSUInteger) mp];

}



- (instancetype) initWithName:(NSString *) name hp:(NSUInteger) hp mp:(NSUInteger) mp {

    if (self = [super init]) {

        _name = name;

        _hp = hp;

        _mp = mp;

    }

    return self;

}



//这个方法是奥特曼用指定的伤害值攻击怪兽

//通常重复的代码都可以封装成一个方法

- (void) beatMonster:(FJMonster *) monster withInjury:(NSUInteger) injury{

    

    NSUInteger newHp = monster.hp - injury;

    monster.hp = newHp < 0 ? 0 : newHp;

    //点语法用在赋值运算的右边相当于调用了getter方法,左边相当于调用了setter方法

}


//奥特曼的普通攻击对小怪兽造成20-30的伤害

- (void) attack:(FJMonster *)monster{

    

    NSUInteger injury = arc4random() % 11 +20;

    [self beatMonster:monster withInjury:injury];

    _mp += 5;//每次奥特曼普通攻击魔法值加5

}


//奥特曼的大招对小怪兽产生一个50或者3/4的伤害

- (void)hugeAttack:(FJMonster *)monster{

    NSUInteger injury = monster.hp * 0.75 <= 50 ? 50 : (monster.hp * 0.75);

    [self beatMonster:monster withInjury:injury];

    _mp -=60;//每次奥特曼放大招魔法值减去60

    

}


//奥特曼魔法攻击一群小怪兽,小怪兽的生命值减去10

- (void)magicAttack:(NSArray *)monsters{

    

    for (FJMonster *monster in monsters) {

        

        if (monster.hp > 0) {

            [self beatMonster:monster withInjury:10];

        }

        

    }

    _mp -= 40;//每次奥特曼魔法攻击mp减少40

}


- (NSString *)name{

    return  _name;

}


- (NSUInteger)mp{

    

    return  _mp;

}


- (NSUInteger)hp{

    return _hp;

}


- (void)setHp:(NSUInteger)hp{

    

    _hp = hp;

}



- (NSString *)debugDescription{

    

    return  [NSString stringWithFormat:@"%@奥特曼的生命值是:%ld\n",_name,_hp];

}


@end



main.m


#import <Foundation/Foundation.h>

#import "FJUltraman.h"

#import "FJMonster.h"


BOOL all_dead(NSArray *monsters){

    for (FJMonster * monster in monsters) {

        if (monster.hp > 0) {

            return NO;

        }

    }

    return YES;

}


FJMonster *selectOne(NSArray *monsters){

    

    return monsters[arc4random() % monsters.count];

}



int main(int argc, const char * argv[]) {

    @autoreleasepool {

       

        FJUltraman *u = [FJUltraman ultramanWithName:@"鹿晗" hp:423 mp:377];

        NSMutableArray *monsters = [NSMutableArray arrayWithObjects:

                                    [FJMonster monsterWithName:@"cat1" hp:100],

                                    [FJMonster monsterWithName:@"cat2" hp:180],

                                    [FJMonster monsterWithName:@"cat3" hp:89],nil];

        

        int round=1;

        do{

            NSLog(@"*************%02d回合*************",round);

            //产生一个随机数0-6普通攻击 7-8魔法攻击 9放大招

            int rate = arc4random() % 10;

            if (rate < 7) {

                FJMonster *m = selectOne(monsters);//从一组小怪兽中选一个活的

                [u attack:m];//奥特曼普通攻击怪兽

                if (m.hp > 0) {//如果怪兽还活着就得还击

                    [m attack:u];

                }else{//如果怪兽死了,从怪兽数组中移除该怪兽

                    [monsters removeObject:m];

                }

            }

            else if (rate < 9){

                if (u.mp >= 40) {

                    

                    NSLog(@"奥特曼使用了魔法攻击!");

                    [u magicAttack:monsters];//奥特曼使用魔法攻击一群怪兽

                    for (int i=0; i<monsters.count; i++) {

                        FJMonster *m = monsters[i];//在这个怪兽数组中若还有怪兽活着就得还击

                        if (m.hp > 0) {

                            [m attack:u];

                        }else{

                            [monsters removeObject:m];

                        }

                    }

                    

                }

                

            }else

            {

                

                if (u.mp >= 60) {

                    NSLog(@"奥特曼使用了大招!!");

                    FJMonster *m = selectOne(monsters);

                    [u hugeAttack:m];

                    if (m.hp>0) {

                        [m attack:u];

                    }else{

                        [monsters removeObject:m];

                    }

                }

                

            }

            

            NSLog(@"%@",u);//打印出奥特曼的生命值

            for (FJMonster *m in monsters) {

                NSLog(@"%@",m);

            }

            NSLog(@"\n");

            

           round +=1;

            

            

        }while(u.hp > 0 && !all_dead(monsters) );

        if (u.hp > 0) {

            NSLog(@"%@胜利",u.name);

        }else{

            NSLog(@"怪兽胜利");

        }

        

        

    }

    return 0;

}


运行结果截图:


121243_60Df_2683146.png

转载于:https://my.oschina.net/luhoney/blog/643979

现在有一个奥特曼怪兽的角色扮演游戏。请你根据下面的描述,定义两个类:奥特曼类和怪兽类。 在奥特曼的世界,打怪兽就是全部。现在人人都有机会成为奥特曼,加入到与怪兽无止境的战斗中。可惜,并非人人生来就是英雄,革命尚未成功,同志仍需努力啊。每一个奥特曼都要从零开始,辛勤劳动,打怪升级,最终才能成为举世瞩目的大英雄。 奥特曼的等级(rank)从第一级开始,随着它打怪兽经验(exp)的增加,等级将不断攀升。随着等级的升高,奥特曼的生命值(hp)上限和攻击力(damage)也将大大增强。在与怪兽的战斗中,奥特曼收获的不仅仅是经验。有时,运气好的话,还能从怪兽身上弄到点小钱(money)。不要小看这些钱,关键时刻,它能给奥特曼买药补血呀。奥特曼没有金刚不坏之身,在与怪兽的战斗中,奥特曼会受到伤害。一旦奥特曼的生命值降到0,它英雄的一生就结束了。 好了,了解了奥特曼的基本情况,现在可以开始战斗了。首先,我们需要一位全新的奥特曼,我们给它赋予一定的初始实力(initial)。让它投入战斗吧! 在与怪兽的战斗中要讲究策略。所谓知己知彼,百战不殆,一旦碰到怪兽,我们首先要查看自己和对方的实力(display),包括双方的等级、生命值、攻击力、经验和所拥有的钱财。所谓打得赢就打,打不赢就跑。如果对手太强大,逃跑吧(escape)!偶尔逃跑无伤颜面,但会耗费一点生命值。如果总是逃跑,生命被虚耗,那英雄就当不成了。所以该出手时就出手,勇敢地战斗(attack)吧!每一回合的战斗中,怪兽会受到攻击(attacked),怪兽也会反击(fightback),让奥特曼受到攻击(attacked)。每一回合结束,只要奥特曼还活着(isalive),而且怪兽也还活着,战斗就要继续。如果奥特曼的生命值太低,也许抵挡不了下一轮的进攻,那么别财迷了,掏钱出来给它补血(restore)吧。当然,如果形势确实不妙,奥特曼也可以中途逃跑。但如果获得了最终的胜利(win),不仅能赢得战斗经验,夺取怪兽身上的钱财,足够多的经验也许能让奥特曼升级(upgrade)。 以及其实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值