IOS培训
美国上市IOS培训机构

400-111-8989

热门课程

iOS研究社:iOS斗地主发牌顺序

  • 发布: _清墨
  • 来源:IOS资讯
  • 时间:2018-04-11 16:48

你玩过斗地主吗?你的战况如何呢?我们来斗一把?我可能有点菜,但是今天我不是要跟你斗地主,我是想根据斗地主这个游戏做些技术分享,即iOS斗地主发牌顺序,有兴趣吗?一起来看看:

目的:随机发牌,发的牌按牌大小排序(花色与数字)

介绍下规则:

ios斗地主发牌规则

解释一下,就是个位十位组成的2位数代表牌的数字,百位的1、2、3(还有个或许是0,或许是4)代表花色,想将其按斗地主牌排列的方式来排列这些数据。需要得到这样的排列:

ios斗地主最终需要得到的排列

OK,在群里我告诉了他2种方案来做,一种是先排列数字,然后再排列花色。虽说思路就是这样的,但我们不知道他们产品规定的牌对应的数字,这个就不讲了,我们来讲下第二种方案:

创建一个数组allArr,allArr数组里存下所有牌的排序,从大小王到黑红梅方3,然后根据后台返的数组getArr,判断给的这个getArr数组是否包含allArr数组中的元素,不包含的从allArr中删除,最后得到的allArr就是getArr按allArr排序方式排列的数组

可能没看懂,那么接下来我们来抽象它:

上面也说了规则,一副牌 54 张,一人 17 张,留 3 张做底牌,在确定地主之前玩家不能看底牌,地主确定后,底牌亮出,底牌分给地主。

我们先来构造所有排序过的54张牌:

    NSArray *colorArr = @[@"黑",@"红",@"梅",@"方"];

    NSArray *numArr   = @[@"2",@"A",@"K",@"Q",@"J",@"10",@"9",@"8",@"7",@"6",@"5",@"4",@"3"];

     

    //组合54张牌,先是大小王

    NSMutableArray *allPokerArr = [NSMutableArray arrayWithArray:@[@"大王",@"小王"]];

    for (NSString *numStr in numArr) {//组合不同花色不同数字的牌

        for (NSString *colorStr in colorArr) {

            NSString *newStr = [colorStr stringByAppendingString:numStr];

            [allPokerArr addObject:newStr];

        }

    }

一副牌包含大小王,然后是黑红梅方的从2到3的牌,以上代码就构造出了这从大到小排列的54张牌:

ios斗地主

好的,排序的54张牌就绪,我们下一步来抽象随机发给一个人的17张牌,为了抽象这随机的17张牌,我们先给排序过的54张牌随机打乱,然后随便找一个范围取出17张牌,这样就能得到随机不会重复的17张牌:

//随机打乱这54张牌

NSArray *mixArr = [allPokerArr sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {

        int seed = arc4random_uniform(2);

        if (seed) {

            return [obj1 compare:obj2];

        } else {

            return [obj2 compare:obj1];

        }

    }];

arc4random_uniform()的原型是arc4random_uniform(uint32_t __upper_bound),效果是随机取出 0-填入值之间的无符号整数,如填入2,则结果为0或1。经过以上代码,我们得出来混合打乱的54张牌:(每次运行都不一样,随机的)

ios斗地主

ios斗地主

接下来我们随便构造一个范围,取出混合后的54张牌中的这个范围内的17张牌:

  NSRange range = NSMakeRange(10, 17);

    NSArray *newArr = [mixArr subarrayWithRange:range];

得到随机的17张牌如下:

ios斗地主

接下来嘛,就是把这17张牌排列好,再来一遍思想:

创建一个数组allArr,allArr数组里存下所有牌的排序,从大小王到黑红梅方3,然后根据后台返的数组getArr,判断给的这个getArr数组是否包含allArr数组中的元素,不包含的从allArr中删除,最后得到的allArr就是getArr按allArr排序方式排列的数组

思想中的allArr就是我们代码中的allPokerArr,getArr对应newArr,得到结果的代码如下:

//排序这17张牌

    NSMutableArray *resultArr = [NSMutableArray arrayWithArray:allPokerArr];

    for (NSString *str in allPokerArr) {

        if (![newArr containsObject:str]) {//不包含则删除

            [resultArr removeObject:str];

        }

    }

NSMutableArray *resultArr = [NSMutableArray arrayWithArray:allPokerArr];这句代码构造最终排序后的牌,也因为遍历过程中不能操作(改变)遍历的数组而写。

我们最终得到的结果resultArr为:

ios斗地主

再运行一次,得到结果如下:

ios斗地主

这不,就完成了这个需求。整个过程代码贴下来:

NSArray *colorArr = @[@"黑",@"红",@"梅",@"方"];

    NSArray *numArr   = @[@"2",@"A",@"K",@"Q",@"J",@"10",@"9",@"8",@"7",@"6",@"5",@"4",@"3"];

     

    //组合54张牌,先是大小王

    NSMutableArray *allPokerArr = [NSMutableArray arrayWithArray:@[@"大王",@"小王"]];

    for (NSString *numStr in numArr) {//组合不同花色不同数字的牌

        for (NSString *colorStr in colorArr) {

            NSString *newStr = [colorStr stringByAppendingString:numStr];

            [allPokerArr addObject:newStr];

        }

    }

     

    //随机打乱这54张牌

    NSArray *mixArr = [allPokerArr sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {

        int seed = arc4random_uniform(2);

        if (seed) {

            return [obj1 compare:obj2];

        } else {

            return [obj2 compare:obj1];

        }

    }];

     

    //随便构造一个范围,取出混合后的54张牌中的这个范围内的17张牌

    NSRange range = NSMakeRange(10, 17);

    NSArray *newArr = [mixArr subarrayWithRange:range];

     

    //排序这17张牌

    NSMutableArray *resultArr = [NSMutableArray arrayWithArray:allPokerArr];

    for (NSString *str in allPokerArr) {

        if (![newArr containsObject:str]) {

            [resultArr removeObject:str];

        }

    }

怎么样?知道ios技术层面上斗地主是怎么玩的了吗?想知道更多ios好玩有趣的东西,来达内ios培训结构我们一起创造那些实用、好玩、有价值的东西吧!

免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

预约申请免费试听课

上一篇:iOS 12 概念设计欣赏 这些变化值得期待
下一篇:看iOS 9 的源码被泄露谈风控的重要性

达内学员余华:iOS几何变换总结

iOS12降级到11.4.1正式版教程

iOS系统上安装迅雷app教程

越狱教程来了,iOS11.3.1越狱教程

选择城市和中心
贵州省

广西省

海南省