编写了一个在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