iOS 斗地主发牌排序
点击上方“iOS开发”,选择“置顶公众号”
关键时刻,第一时间送达!
很多人都玩过斗地主,也有很多人没玩过,或者像我一样是个菜B,不太懂怎么玩,好,没关系,这篇文章不是教你斗地主,是要根据斗地主这个游戏做些技术分享:
目的:随机发牌,发的牌按牌大小排序(花色与数字)
介绍下规则:
文章的灵感来源是群友在iOS群所问的问题
解释一下,就是个位十位组成的2位数代表牌的数字,百位的1、2、3(还有个或许是0,或许是4)代表花色,想将其按斗地主牌排列的方式来排列这些数据。需要得到这样的排列:
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张牌:
好的,排序的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张牌:(每次运行都不一样,随机的)
接下来我们随便构造一个范围,取出混合后的54张牌中的这个范围内的17张牌:
NSRange range = NSMakeRange(10, 17);
NSArray *newArr = [mixArr subarrayWithRange:range];
得到随机的17张牌如下:
接下来嘛,就是把这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为:
再运行一次,得到结果如下:
这不,就完成了这个需求。整个过程代码贴下来:
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];
}
}
作者: _清墨
链接:https://www.jianshu.com/p/4c1c2ded4bf2
iOS开发整理发布,转载请联系作者授权
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
随时掌握互联网精彩
- 1 习近平G20里约峰会展现大国担当 7959290
- 2 多国驻乌克兰大使馆因袭击风险关闭 7955104
- 3 78岁老太将减持2.5亿股股票 7867029
- 4 二十国集团里约峰会将会卓有成效 7723873
- 5 俄导弹击中乌水电站大坝 7631854
- 6 孙颖莎王艺迪不敌日本削球组合 7569703
- 7 高三女生酒后被强奸致死?检方回应 7464426
- 8 第一视角记录虎鲨吞下手机全程 7361528
- 9 雷军喊话欢迎大家投递简历 7230600
- 10 智慧乌镇点亮数字经济新未来 7173284