欢乐斗牛
参与斗牛的玩家每回合会得到五张扑克牌,每张牌可能是 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