IOS 约瑟夫环游戏的实现
2017-04-09 20:34
281 查看
IOS 约瑟夫环游戏的实现
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。具体推导及原理解析,请参考百度百科详见:约瑟夫环_百度百科
本文主要介绍,通过使用 Obj-C 和 Swift 实现这个算法过程,参考代码如下:
Objective-c 实现代码:
/** * 约瑟夫游戏 * 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列 * @parameter n 游戏人数 * @parameter k 开始报数 * @parameter m 结束报数 */ -(void)playGame:(NSInteger)n andStart:(NSInteger)k withEnd:(NSInteger)m{ if(n <= 0 || n <= k){ NSLog(@"请输入正确的参数"); return; } //生成一个 1到n 的数组,即玩游戏的人员编号数组 NSMutableArray *muarr = [NSMutableArray array]; for (NSInteger p = 1; p <= n; p++) { [muarr addObject:[NSString stringWithFormat:@"%ld",(long)p]]; } NSInteger j = 1; //报数器 NSString *strOut = nil; //出局编号 NSInteger index = [muarr indexOfObject:[NSString stringWithFormat:@"%ld",(long)k]]; //索引 //一直报数直到全部出局,即数组长度为0 while (muarr.count >= 1) { //循环报号 for (NSInteger i = 1;i <= m; i++,j++,index++) { //从头开始报数 if (index > muarr.count - 1) index = 0; strOut = [NSString stringWithFormat:@"%@",[muarr objectAtIndex:index]]; if (j == m) { NSLog(@"出局编号:%@",strOut); //移除出局编号 [muarr removeObject:strOut]; //最后一个人不用循环报数了,就是他自己 if (muarr.count <= 1) { NSLog(@"出局编号:%@",[muarr lastObject]); return; } //下一个人开始报数 index--; i = 0; //重新开始循环 j = 0; //计数器清零(从1开始报数,上面会累加1) } } }
Swift代码参考:
/** * 约瑟夫游戏 * 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列 * @parameter n 游戏人数 * @parameter k 开始报数 * @parameter m 结束报数 */ func playGame(n:Int, andStart k:Int, withEnd m:Int){ if n <= 0 || n <= k { print("请输入正确的参数") return; } //生成一个 1到n 的数组,即玩游戏的人员编号数组 var arrPeole = [Int]() for p:Int in 1...n { arrPeole.append(p) } var j = 1 //报数器 var outPeople:Int? //出局人 var index = arrPeole.index(where: {return $0 == k}) //索引 //一直报数直到全部出局,即数组长度为0 while arrPeole.count > 0 { //循环报号 for var i:Int in 1...m { //从头开始报数 if index! > arrPeole.count - 1 { index = 0 } outPeople = arrPeole[index!] if j == m { print("出局编号:\(outPeople!)") //移除出局编号 arrPeole.remove(at: index!) //最后一个人不用循环报数了,就是他自己 if arrPeole.count <= 1 { print("出局编号:\(arrPeole.last!)"); return; } //下一个人开始报数 index = index! - 1; i = 0; //重新开始循环 j = 0; //计数器清零(从1开始报数,上面会累加1) } i = i + 1 j = j + 1 index = index! + 1 } } } }
相关文章推荐
- 用java实现 数三退出游戏(2)约瑟夫环
- (NO.00005)iOS实现炸弹人游戏(六):游戏数据的初始化(三)
- (NO.00005)iOS实现炸弹人游戏(七):游戏数据的序列化表示
- (NO.00004)iOS实现打砖块游戏(十六):导弹发射道具的实现(下)
- (NO.00004)iOS实现打砖块游戏(四):砖块类的实现
- (NO.00004)iOS实现打砖块游戏(六):反弹棒类
- (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
- (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
- (NO.00004)iOS实现打砖块游戏(十三):伸缩自如,我是如意金箍棒(下)!
- (NO.00005)iOS实现炸弹人游戏(八):游戏主角(一)
- 【iOS-Cocos2d游戏开发之十五】详解CCProgressTimer 进度条并修改cocos2d源码实现“理想”游戏进度条!
- 【iOS开发必备指南合集】申请企业级IDP、真机调试、游戏接入GameCenter 指南(实现仿官方的成就提示)、游戏接入OpenFeint指南;
- 【iOS-Cocos2d游戏开发之二十二 】CCSpeed实现CCAnimate动画进行时设置慢动作以及设置游戏加减速进行(塔防游戏必备)!
- 游戏制作之路:一个对我来说可实现的High-end的Mac/iOS游戏制作大概计划
- (NO.00005)iOS实现炸弹人游戏(六):游戏数据的初始化(三)
- (NO.00005)iOS实现炸弹人游戏(七):游戏数据的序列化表示
- iOS 游戏 Oh my fish! 切割痕迹实现
- (NO.00004)iOS实现打砖块游戏(十六):导弹发射道具的实现(下)
- IOS游戏辅助--QQ欢乐斗地主记牌器的实现
- (NO.00004)iOS实现打砖块游戏(四):砖块类的实现