OC小游戏之英雄打怪兽

编写了一个在Xcode控制台上运行的简单小游戏,本来打算写到100关(⊙o⊙)…后来发现没有好的idea,就先写了2关,目的在于练练手,理清类与类之间的关系。有好的想法和有空的话会慢慢写到100关。游戏并不复杂,但有很多细节需要处理好。
本游戏包括主函数、Game类、Hero类、Monster类和Pass类 全都附带注释
下面直接上代码

主函数
main.h
#import 
#import "Monster.h"
#import "Pass.h"
#import "Hero.h"
#import "Game.h"


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

    @autoreleasepool {

        Game *g1 = [Game new];  //分别创建游戏 英雄 关卡 怪兽对象
        Hero *h1 = [Hero new];
        Pass *p1 = [Pass new];
        Monster *m1 = [Monster new];


        [g1 showGame];      //游戏介绍
        [NSThread sleepForTimeInterval:2];  //延时2秒
        NSLog(@"请选择您喜欢的英雄:1.德玛西亚 2.赵信 3.亚索 4.奥巴马");
        int a;
        scanf("%d",&a);

        h1.nowHP = 100; //设置英雄当前HP值
        h1.heroLV = 1;     //设置英雄初始等级
        h1.upexp = 100;  //设置英雄升级所需的经验
        h1.ATK = 50;   //英雄攻击力
        h1.DEF = 10;   //英雄防御力
        m1.nowHP=100;  //怪兽当前的HP值
        m1.ATK = 30;   //怪兽攻击力
        m1.DEF =10;    //怪兽防御力
        [h1 showHeroName:a];   //显示选中的英雄名字
        NSString *str1 = [h1 showJN:a];  //显示该英雄拥有的技能
        NSLog(@"%@",str1);
        NSLog(@"Ready~");
                for(int b = 3 ; b>0 ; b--)
                {
                    NSLog(@"%d",b);
                    [NSThread sleepForTimeInterval:1];
                }
        NSLog(@"游戏开始");
        printf("\n");
        p1.passNum = 1;  //设置当前关卡数为1


        [p1 showPassWithPassName:@"《幽暗密林》" andMonsterName:@"哥布林" andPassLV:@"★☆☆☆☆" andThePassStory:"1000年前,一场突如其来的异变,让原本平静和谐的阿拉德大陆卷入血雨腥风之中,动物植物在一夕之间纷纷魔化成邪恶的怪物,它们凶残嗜血,肆意吞噬人类的生命,死亡和恐惧迅速在阿拉德大陆蔓延" andTheMonster:m1];  //显示关卡名字、关卡怪兽、关卡难度、及关卡背景故事

        printf("\n");
        printf("\n");


        [m1 shout];   //怪兽叫吼 表示怪兽登场
        [NSThread sleepForTimeInterval:1];
        [h1 shout];   //英雄回应
        [NSThread sleepForTimeInterval:1];
        [h1 fightMonster:m1];  //英雄开始打怪兽
        [NSThread sleepForTimeInterval:2];
        printf("\n");

 // -----------------------第二关------------------------
        [NSThread sleepForTimeInterval:3];
        NSLog(@"按任意数字继续,按0退出");  //继续游戏的请求
        int s;
        scanf("%d",&s);
        if(s!=0)   //输入非0的数字 继续游戏
        {

                Monster *m2 = [Monster new];  //创建第二关的怪兽

                [p1 showPassWithPassName:@"《丛林丧尸》" andMonsterName:@"僵尸" andPassLV:@"★★☆☆☆" andThePassStory:"在遥远的北方丛林,有一个叫做诺斯玛尔的村庄。在毫无征兆的情况下突然爆发黑死病,村里的人全部死亡,无一幸免。帝国派遣特使前往调查,却找不到死者的尸体..." andTheMonster:m2];
                    //显示关卡名字、关卡怪兽、关卡难度、及关卡背景故事

                printf("\n");
                int k  = [m2 fistGame];  //与怪兽进行猜拳游戏 如果玩家此关卡游戏失败,则返回0
                if( k == 0)  //返回0代表游戏失败
                {
                    exit(0);  //直接结束程序 游戏不再执行下去
                }
                else  //否则代表游戏胜利
                {
                   [h1 fightWinRewardAndThePassLV:@"★★☆☆☆"]; //调用战斗胜利的奖励方法 获得相应奖励
                }

        }

        else //输入0 则退出游戏
        {
            NSLog(@"下次再玩~");
            exit(0);  //结束程序
        }




    }
    return 0;
}

Game类

game.h
#import 
#import "Hero.h"

@interface Game : NSObject


    @property  (nonatomic,strong)NSString *gameName;  //游戏名称
    @property   (nonatomic,strong)NSString *gameSay;         //游戏描述
    @property   (nonatomic,assign)NSInteger gamePass;         //游戏关卡
    @property   (nonatomic,strong)NSString *nowHero;            //当前英雄


-(void)showGame; //游戏介绍

@end
Game.m
#import "Game.h"

@implementation Game


-(void)showGame
{
    _gameName=@"英雄联盟";
    _gameSay = @"英雄打怪兽";
    _gamePass = 100 ;

    NSLog(@"欢迎来到%@,这是一个%@的游戏,本游戏共有%ld关",_gameName,_gameSay,_gamePass);
}



@end

Hero类

Hero.h
#import 
#import "Monster.h"




@interface Hero : NSObject


    @property (nonatomic,strong)NSString *heroName;        //角色名称
    @property (nonatomic,assign)NSInteger heroLV;          //等级
    @property (nonatomic,assign)NSInteger exp;              //经验
    @property (nonatomic,assign)NSInteger  upexp;          //升级所需经验
    @property (nonatomic,assign)NSInteger nowHP;           //当前生命值
    @property (nonatomic,assign)NSInteger originalHp;      //原始生命值
    @property (nonatomic,assign)CGPoint nowPlace;          //当前位置
    @property (nonatomic,assign)CGPoint originalPlace;     // 原始位置
    @property (nonatomic,assign)NSInteger ATK;              //攻击力
    @property (nonatomic,assign)NSInteger DEF;              //防御力



-(void)move; //移动(未实现)

-(void)fightMonster:(Monster *)m1;  //打怪兽

-(NSString *)showJN:(int)num; //显示技能

-(void)showHeroName:(int)num; //显示英雄名字

-(void)shout;// 叫喊

-(void)fightWinRewardAndThePassLV:(NSString *)LV; //战斗胜利奖励 传入难度系数(1-5) 难度越大获得经验越多

@end
Hero.m
#import "Hero.h"

@implementation Hero

-(void)move  //该功能暂未实现 先用NSLog代替
{
    NSLog(@"正在移动...");
}



-(NSString *)showJN:(int)num //通过输入的数字 返回对应的字符串
{
    switch (num) {
        case 1:
            return @"该角色的技能有:旋转小陀螺,正义制裁";
        case 2:
            return @"该角色的技能有:爆菊抢 菊花捅";
        case 3:
            return @"该角色的技能有:风墙 破风斩";
        default:
            return @"该角色的技能有:圣光弹 移动射击";
    }
}




-(void)showHeroName:(int)num  //通过输入的数字 显示对应的英雄名字 并把字符串赋给hero的heroName的属性
{
    if(num==1)
    {
        NSLog(@"您选择的是德玛西亚");
        _heroName= @"德玛西亚";
    }
    else if (num==2)
    {
        NSLog(@"您选择的是赵信");
        _heroName= @"赵信";
    }
    else if (num==3)
    {
        NSLog(@"您选择的是亚索");
        _heroName= @"亚索";
    }
    else
    {
        NSLog(@"您选择了奥巴马");
        _heroName= @"奥巴马";
    }

}



-(void)shout
{
    NSLog(@"[%@]:来啊,来互相伤害啊",_heroName);
}



-(void)fightWinRewardAndThePassLV:(NSString *)LV  //战斗胜利奖励方法 传入难度等级
    {
            int a;
            if( [LV isEqualToString:@"★☆☆☆☆"])   //把字符串类型的难度转化为数字类型的难度系数 以便使用
            {
                 a = 1;
            }
            else if([LV isEqualToString:@"★★☆☆☆"])
            {
                 a =2;
            }
            else if([LV isEqualToString:@"★★★☆☆"])
            {
                 a = 3;
            }
            else if([LV isEqualToString:@"★★★★☆"])
            {
                 a = 4;
            }
            else
            {
                a = 5;
            }

            _exp = _exp+10*a;   //增加经验值 a为1-5的难度系数 难度系数越高获得的经验越多
            NSLog(@"获得经验%d 当前经验值%ld",10*a,_exp);

            if(_exp >=_upexp)   //如果当前经验值大于或等于升级所需经验
            {
                _heroLV++;     //则等级加1
                _upexp +=100;    //升级所需经验+100
                _exp = _exp - _upexp;    //修改当前经验值
                NSLog(@"升级啦~ 当前等级%ld",_heroLV);
            }

            int k = arc4random_uniform(100);  //生成一个0-99的随机数k
            if(k<10)          // 生成的这个随机数k 小于10的几率是10% 即出现的几率是10% 我们可以把这个思想转化为 10%的几率爆出史诗装备
            {
                NSLog(@"恭喜您获得史诗装备一件!");
                NSLog(@"攻击力增加%d,防御力增加%d,生命值增加%d",30,10,50);
                _ATK+=30;           //获得装备 增加英雄的攻击力、防御力、及血量
                _DEF+=10;
                _nowHP +=50;
            }
            if(k>=10&&k<40)  // 同理 30%的几率爆出稀有装备
            {
                NSLog(@"恭喜获得稀有装备一件!");
                NSLog(@"攻击力增加%d,防御力增加%d,生命值增加%d",10,5,20);
                _ATK+=10;
                _DEF+=5;
                _nowHP +=20;
            }
    }




-(void)fightMonster:(Monster *)m1   //英雄开始打怪兽
{

    NSLog(@"-------------------战斗开始![%@]VS[%@] ------------------- ",_heroName,m1.monsterName);
    [NSThread sleepForTimeInterval:2];
    while(_nowHP >0 && m1.nowHP>0)   //如果英雄与怪兽的HP值均大于0 说明没有决出胜负 继续进行战斗 如果有一方的HP值小于0,则跳出循环 结束战斗
    {
            NSInteger gwsddsh = _ATK-(m1.DEF);   // 怪物受到的伤害 : 英雄攻击力-怪物防御力
            NSInteger gwsyHP = m1.nowHP -gwsddsh;   // 怪物剩余血量 : 当前血量 - 怪物受到的伤害
            if(gwsyHP <0)                             //判断怪兽剩余血量是否小于0(血量不能是负数)
               {
                   gwsyHP = 0;              //如果小于0 则置为0 (如果不置0 经过战斗后下面可能会显示怪兽的血量为负数,这不科学)
               }

            NSLog(@"[%@]对[%@]打了一巴掌,对其造成%ld点伤害,[%@]剩余血量%ld",_heroName,m1.monsterName,gwsddsh,m1.monsterName,gwsyHP);  //显示战斗信息
            m1.nowHP = gwsyHP;  //设置怪兽新的血量
            if(m1.nowHP<=0)       // 如果怪物死亡,则跳出循环,不再战斗,因为死亡的怪物不会攻击英雄
            {
                    break;
            }
            NSInteger yxsddsh = (m1.ATK)-_DEF ;   // 英雄受到的伤害 : 怪物攻击力-英雄防御力
            NSInteger yxsyHP = _nowHP- yxsddsh ;     // 英雄剩余血量 : 当前血量 - 英雄受到的伤害
            if(_nowHP <=0)    //同上
            {
                _nowHP = 0;
            }
            NSLog(@"[%@]对[%@]捅了一刀,造成%ld点伤害,[%@]剩余血量%ld",m1.monsterName,_heroName,yxsddsh,_heroName,yxsyHP);
            _nowHP = yxsyHP;

            [NSThread sleepForTimeInterval:2];   //延时
            printf("\n");
    }

    if(_nowHP<=0)  // 如果英雄血量为0 则说明战斗失败
    {
        NSLog(@"战斗失利!英雄已死亡!");
    }
    else       //否则为战斗胜利
    {
        NSLog(@"战斗胜利!");
        [self fightWinRewardAndThePassLV:@"★☆☆☆☆"];   //战斗胜利 就调用战斗胜利的奖励方法 获得相应奖励
    }
}
@end

Monster类

Monster.h
#import 




@interface Monster : NSObject

    @property (nonatomic,assign)NSInteger  nowHP;         //当前生命值
    @property (nonatomic,assign)NSInteger  originalHp;    // 原始生命值
    @property (nonatomic,assign)CGPoint  nowPlace;       //当前位置
    @property  (nonatomic,assign)CGPoint  originalPlace;    // 原始位置
    @property (nonatomic,assign)NSInteger  ATK;      //攻击力
    @property (nonatomic,assign)NSInteger  DEF;     //防御力
    @property (nonatomic,strong)NSString  *monsterName;   //怪物名


-(void)move;  //移动方法(未实现)

-(void)fightHero;  //攻击英雄

-(void)runAway;  //逃跑 (未实现)

-(void)shout;  //叫喊

-(int)fistGame;  //猜拳游戏



@end
Monster.m
#import "Monster.h"


@implementation Monster

-(void)move
{
    NSLog(@"移动中...");
}

-(void)fightHero
{
    NSLog(@"叼他...");
}

-(void)runAway    //以上3个方法未具体实现 暂且用一句话代替...
{
    NSLog(@"撤退");
}

-(void)shout
{
    NSLog(@"[%@]:受死吧凡人~",_monsterName);
}





-(int)fistGame   //猜拳游戏
{
    NSLog(@"---------[%@]不想和你说话并强行与你进行猜拳游戏---------",_monsterName);
    printf("\n");
    NSLog(@"请选择:1.剪刀 2.石头 3.布");
    int b ;
    scanf("%d",&b);    //通过输入的数字 显示出所选择拳头类型
    switch (b) {
        case 1:
            NSLog(@"您选择了:剪刀");
            break;
        case 2:
            NSLog(@"您选择了:石头");
            break;
        case 3:
            NSLog(@"您选择了:布");
            break;
    }
    [NSThread sleepForTimeInterval:1];

    int a = arc4random_uniform(3)+1;  //生成一个1-3的随机数a 来代表怪兽出的拳头类型
    switch (a) {
        case 1:
            NSLog(@"[%@]选择了:剪刀",_monsterName);
            break;
        case 2:
            NSLog(@"[%@]选择了:石头",_monsterName);
            break;
        case 3:
            NSLog(@"[%@]选择了:布",_monsterName);
            break;
    }
    [NSThread sleepForTimeInterval:2];

    if( (b == 1 && a == 3) ||        //英雄获胜的3种可能
        (b == 2 && a == 1) ||
        (b == 3 && a == 2)  )
    {
        NSLog(@"恭喜您获胜~");
        return 1;
    }
    else if( a == b )                     //如果出的拳头相同 代表平局
    {
        NSLog(@"平局,再战!");
        [self fistGame];
        return 1;
    }
    else                                       // 剩下的情况就是输
    {

        NSLog(@"很遗憾,[%@]获胜~",_monsterName);
        NSLog(@"[%@]:哈哈,你个辣鸡~",_monsterName);
        NSLog(@"----------------游戏结束 /(ㄒoㄒ)/~~ ----------------");
        return 0;                          // 返回1
    }

}





@end

Pass类

pass.h
#import 
#import "Monster.h"

@interface Pass : NSObject

    @property (nonatomic,strong)NSString  *passName;      //关卡名称
    @property (nonatomic,assign)NSInteger  passNum;        //关卡编号
    @property (nonatomic,assign)NSInteger  passTime;        //关卡时间
    @property (nonatomic,strong)NSString  *monsterName;    //关卡怪物
    @property (nonatomic,strong)NSString  *passLV;         //关卡难度


-(void)showPassWithPassName:(NSString *)passName andMonsterName:(NSString *)monsterName andPassLV:(NSString *)passLV andThePassStory:(char *)passStory andTheMonster:(Monster *)m;   //显示关卡信息


@end
Pass.m
#import "Pass.h"

@implementation Pass

-(void)showPassWithPassName:(NSString *)passName andMonsterName:(NSString *)monsterName andPassLV:(NSString *)passLV andThePassStory:(char *)passStory andTheMonster:(Monster *)m
{
    m.monsterName = monsterName;   //把传入的参数赋给相应的属性
    _monsterName = monsterName;
    _passName = passName;
    _passLV = passLV;


    NSLog(@"-------------------------------------------------");
    NSLog(@"-------- 第%ld关 %@ 登场怪物:%@ --------",_passNum,_passName,_monsterName);
    NSLog(@"---------------------难度%@--------------------",_passLV);
    NSLog(@"-------------------------------------------------");
    [NSThread sleepForTimeInterval:1];

    char *str = passStory;
    int b = 0;
    printf("\n");
    while(str[b] != '\0')   //从字符串的第0位开始 如果该值不为空值 则把字符输出 并延时0.02秒 直到把整个字符串输出完 这会产生一种类似打字效果
    {
        printf("%c",str[b]);
        [NSThread sleepForTimeInterval:0.02f];
        b++;
    }

    _passNum++;   //关卡数加1 每调用一次此方法 关卡数将会自动加1 不需自己手动设置第几关

}



@end

你可能感兴趣的:(OC小项目)