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

主函数
main.h
#import <Foundation/Foundation.h>
#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];  //与怪兽进行猜拳游戏 如果玩家此关卡游戏失败,则返回0if( k == 0)  //返回0代表游戏失败{exit(0);  //直接结束程序 游戏不再执行下去}else  //否则代表游戏胜利{[h1 fightWinRewardAndThePassLV:@"★★☆☆☆"]; //调用战斗胜利的奖励方法 获得相应奖励}}else //输入0 则退出游戏{NSLog(@"下次再玩~");exit(0);  //结束程序}}return 0;
}

Game类

game.h
#import <Foundation/Foundation.h>
#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 <Foundation/Foundation.h>
#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的随机数kif(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 <Foundation/Foundation.h>@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 <Foundation/Foundation.h>
#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小游戏之英雄打怪兽相关推荐

  1. 小程序 文字游戏 英雄打怪兽

    前言:这是运用这几天学到的小知识自己写的一个小游戏 这里面想引用random 来做到每次生成的boss血量随机 没想到强制类型转换卡主我了好在是解决了 先上截图 由于我只放了一张截图 看不出来boss ...

  2. python笔试题奥特曼打怪兽_python文字小游戏——奥特曼大战小怪兽

    历时三天,辛辛苦苦,废寝忘食,呕心沥血之作!!! 这是一个我根据自己的想法做出来的一个模拟以前文字游戏的小游戏 里面的主要实现是:玩家通过控制台输入键盘指令来进行操作,存取档,输游戏名,地图移动并随机 ...

  3. c语言英雄打怪兽掉箭题目,荒野乱斗:“打怪兽”有诀窍,英雄选择尤其重要...

    原标题:荒野乱斗:"打怪兽"有诀窍,英雄选择尤其重要 荒野乱斗更新版本之后,有一个新的模式引起了三哥的注意.因为有"首领之战"的经验,三哥第一时间就尝试了这个新 ...

  4. c语言英雄打怪兽掉箭题目,面向对象练习,写的一个简单的文字游戏,英雄打怪兽...

    游戏的要求:如图 image.png (358.8 KB, 下载次数: 1) 游戏要求 2020-5-14 13:02 上传 源代码:importrandomasr #英雄(大类),包含精灵和人类两类 ...

  5. c++ 小游戏 NO 7 打怪游戏(无聊)

    最后一章有惊喜: int dadaj() {string c[10],dr[10],zb[20],daojv[11];cout<<"你好,欢迎"<<endl ...

  6. c语言英雄打怪兽掉箭题目,高中English单句翻译练习精选840句

    高中英语单句翻译练习精选840句 Translation (1) 1.她很有教书的才干.真遗憾她放弃了她的教师职 位.(ability, abandon) 2.每次我看到他的时候,他总是专心于他的功课 ...

  7. Python打怪小游戏

    Python打怪小游戏 1.怪兽池中有若干种怪兽: monsters_pool = ['火柴鼠', '瞌睡熊', '板牙狸', '博学企鹅', '绅士企鹅', '漂浮龟', '皮皮', '贪玩虎', ...

  8. js打怪兽(封装函数)

    运行结果: 下面是详细代码(复制粘贴即可): // 案例:英雄打怪兽 // 创建一个构造函数 (英雄和怪兽),攻击力(100).防御力(50).暴击率(随机一个数5的倍数 攻击力*2) // 伤害值 ...

  9. 基于JAVA的类与对象做出的英雄打怪兽程序

    一.英雄打怪兽 基于Java类与对象的调用而做出的程序. 二.实例代码 1.主函数 代码如下: menu(); 2.menu函数 代码如下: Scanner scanner = new Scanner ...

最新文章

  1. R语言ggplot2可视化:使用ggrepel包在线图(line plot)的尾端那个数据点添加文本标签(text label)
  2. 在“DNS管理器”中手工增加DNS主机(A)或者别名(CNAME)记录时,出现被拒绝的错误...
  3. lnmp下安装PECL HTTP 扩展
  4. php的__FILE__常量和dirname()
  5. 在VM上安装centOS后的网络配置
  6. SDUT-3362 数据结构实验之图论六:村村通公路
  7. lambda函数if_lambda表达式速度如何呢?看完这篇文章你就明白了
  8. kafka技术内幕(二)
  9. stepinto stepout stepover的区别
  10. Git分支命令学习使用
  11. 搭建jenkins+gitlab+tomcat+maven步骤
  12. 论文翻译 SLAM综述
  13. PHP100视频教程解压密码[连载结束]
  14. 计算机信息统计试题,计算机概率统计复习试题.doc
  15. Rtmp协议看一篇就够了
  16. Windows10 64位安装MySQL(免安装版本)
  17. 五百万微商都在用微信智能获客小程序,你还不加入?
  18. c# mvc ajax txt auto,ASP.Net MVC和复制div中的自我AJAX更新局部视图/控制器
  19. html地图周边搜索,高德地图API实现定位、地点搜索和周边搜索(H5/Vue/微信小程序)...
  20. Excel如何完成多权重计算

热门文章

  1. 【UE4 C++】 UE4 C++ 入门(无参考项目)——技术宅阿棍儿 学习笔记
  2. 普联发送系统日志 服务器地址,tp路由器日志服务器安装
  3. 8除以2表示什么意思_8除以2等于4表示什么
  4. 微信网页版二维码扫码过程发生了什么
  5. 仿某鸟云前台 智简魔方IDC财务管理系统
  6. android电视识别多区u盘,【当贝市场】电视无法识别U盘APK文件终极方法
  7. mac 远程桌面连接工具 Microsoft Remote Desktop for Mac 的安装与使用
  8. python框架pika的基本使用
  9. Webrtc 多人视频会议系统 服务器 Licode 介绍
  10. 基于微信小程序的电影院买票选座系统