swift版欢乐斗牛

欢乐斗牛

参与斗牛的玩家每回合会得到五张扑克牌,每张牌可能是 A、2,3、4、5、6、7、8、9、10 、J、 Q、 K中的任意一张,这些牌分别代表一个数,就是其本身,我们规定A代表1,J、Q、K和10是等价的。玩家拿到五张牌后,可以任意取三张牌,如果三张牌的点数相加为10或者10的倍数(比如20或者30),即说明该玩家有牛。在有牛的前提下,剩下的两张牌相加 即为玩家的最终点数,点数总共有牛1、牛2…牛10这样十种情况,点数越大越好(即牛1最小,牛10最大),两张牌的点数相加若超过10,则只取个位数,比如 3和8, 则该玩家点数为牛1。如果构成10或者10的倍数,即都视为牛10,比如 5和5、10和10、10和J,这三种情况均为牛10。如果类型相同则比较最大的牌的数字,如果数字相同则比较花色依此类推。

计分规则:
1.无牛(无分):5张牌中的任意3张加起来不能成为10的倍数(如5,6,8,10,J)。
2.有牛:5张牌中的任意3张加起来为10的倍数,但另外2张不为10的倍数(如5,6,7,9,J)。
3.牛牛:5张牌中的任意3张加起来为10的倍数,且另外2张也为10的倍数(如5,6,9,10,J)。
4.四花:5张牌中一张为10,另外4张为花(如10,J,J,Q,K)。
5.五花:5张牌全为花(如Q,J,J,Q,K)。
6.五小:5张牌都小于5,并且全部加起来小于等于10。
7.炸弹:5张牌有4张牌一样。

牌型:炸弹> 五小 > 五花 > 四花 > 牛牛 > 有分 > 没分。
花色: 黑桃 > 红桃 > 草花 > 方块。
单张:K > Q > J > 10 > 9 > 8 > 7 > 6 > 5 > 4 > 3 > 2 > A。

同牌型间的比较:
无牛:比单张大小。
有牛:比分数大小,牛九 > 牛八 > 牛七 > 牛六 > 牛五 > 牛四 > 牛三 > 牛二 > 牛一。
牛牛:比单张+花色大小。
四花:比单张+花色大小。
五花:比单张+花色大小。
五小:比点数+单张+花色大小。(有些地区不支持。)
炸弹:大牌吃小牌,K最大,A最小。

牌型翻倍情况:以赢的一方倍数为准。
无分和牛1,牛2,牛3,牛4,牛5,牛6: 1倍。
牛7,牛8,牛9: 2倍。
牛牛: 3倍。
四花: 4倍。
五花: 5倍。
五小: 6倍
炸弹: 6倍
玩法规则:
1.每局确定N个玩家(一共2-6人),其中第一局通过系统随机确定庄家,如果庄家有牛则继续做庄,如果没牛就下庄,轮到下一家。
2.每人初始分为1000分,每局基准分100分。
3.每人随机洗牌并发牌5张。
4.按斗牛规则综合进行对比,并确定哪些是赢家,若玩家没有牛,则显示“无牛”,若玩家有牛,输出一个正整数代表“牛几”。

设计思路:
创建Cards类,Play类,game类,Test主程序类。
其中game类中的Compare(Caed x,Card y)方法用来比较两张牌的大小
运行结果如下:
在这里插入图片描述

import Foundation

//为了预留大小王的要求,故设计成枚举类型

/// 返回花色,//黑桃,红桃,梅花,方块:4种,另大小王还有2种,分别计为:大,小 // 数字 从大到小
///
/// - DaWang: <#DaWang description#>
/// - XiaoWang: <#XiaoWang description#>
/// - HeiTao: <#HeiTao description#>
/// - HongTao: <#HongTao description#>
/// - MeiHua: <#MeiHua description#>
/// - FangKuai: <#FangKuai description#>
enum CardColor :Int{
    case DaWang=6
    case XiaoWang=5
    case HeiTao = 4
    case HongTao = 3
    case MeiHua = 2
    case FangKuai = 1
    case error = -1
    
    /// 返回花色的数字大小
    ///
    /// - Returns: <#return value description#>
    func getInt() -> Int {
        return self.rawValue
    }
    
    ///返回花色
    ///
    /// - Returns: <#return value description#>
    func toSting() -> String {
        switch self {
        case .DaWang:
            return "大"   //大王
        case .XiaoWang:
            return "小"   //小王
        case .HeiTao:
            return "黑桃"
        case .HongTao:
            return "红桃"
        case .MeiHua:
            return "梅花"
        case .FangKuai:
            return "方块"
        default:
            return "默认"
        }
        
    }
}

/// 定义扑克牌数字的大小
///
/// - Wang: <#Wang description#>
/// - K: <#K description#>
/// - Q: <#Q description#>
/// - J: <#J description#>
/// - X_10: <#X_10 description#>
/// - X_9: <#X_9 description#>
/// - X_8: <#X_8 description#>
/// - X_7: <#X_7 description#>
/// - X_6: <#X_6 description#>
/// - X_5: <#X_5 description#>
/// - X_4: <#X_4 description#>
/// - X_3: <#X_3 description#>
/// - X_2: <#X_2 description#>
/// - A: <#A description#>
enum CardNumber :Int{
    case Wang = 14
    case K=13
    case Q=12
    case J=11
    case X_10 = 10
    case X_9=9
    case X_8=8
    case X_7=7
    case X_6 = 6
    case X_5 = 5
    case X_4 = 4
    case X_3 = 3
    case X_2 = 2
    case A = 1
    case error = -1
    
    
    /// 返回牌面对应的数字,用于比较大小
    ///
    /// - Returns: <#return value description#>
    func getNumber() -> Int {
        return self.rawValue
    }
    
    func toString() -> String{
        switch self {
        case .Wang:
            return "王"
        case .K:
            return "K"
        case .Q:
            return "Q"
        case .J:
            return "J"
        case .X_10:
            return String(10)
        case .X_9:
            return String(9)
        case .X_8:
            return String(8)
        case .X_7:
            return String(7)
        case .X_6:
            return String(6)
        case .X_5:
            return String(5)
        case .X_4:
            return String(4)
        case .X_3:
            return String(3)
        case .X_2:
            return String(2)
        case .A:
            return "A"
        default:
            return "默认"
        }
    }
    
    
    /// 返回牌面大小,用于计算几张牌的和
    ///
    /// - Returns: <#return value description#>
    func getDaXiao() -> Int {
        switch self {
        case .Wang:
            return 10
        case .K:
            return 10
        case .Q:
            return 10
        case .J:
            return 10
        case .X_10:
            return 10
        case .X_9:
            return 9
        case .X_8:
            return 8
        case .X_7:
            return 7
        case .X_6:
            return 6
        case .X_5:
            return 5
        case .X_4:
            return 4
        case .X_3:
            return 3
        case .X_2:
            return 2
        case .A:
            return 1
        default:
            return 0
        }
    }
}



/// 扑克牌类
class Card{
    private var color :CardColor
    private var number:CardNumber    //A,2,3,4,5,6,7,8,9,10,J,Q,K ,王,如果是大小王,和花色组合起来就是大王,小王
    
    init(color:CardColor,number:CardNumber) {
        self.color=color
        self.number=number
    }
    ///返回牌的花色+大小
    func toString() -> String{
        return "\(color.toSting())\(number.toString())"
    }
    ///返回某张牌的数字大小
    func getNumber() ->Int{
        return self.number.rawValue
    }
    
    
    /// 返回牌面大小值,用于计算几张牌之和
    ///
    /// - Returns: <#return value description#>
    func getDaXiao() -> Int{
        return self.number.getDaXiao()
    }
    
    /// 返回某张牌的花色对应的数字大小
    ///
    /// - Retu
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值