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;
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;
}
运行结果截图: