终于到了最重要(其实也是最不重要)的打牌环节了.
打牌的逻辑其实很简单
选完地主以后 由地主开牌
判断手牌是否消耗完毕 ->
-> 开牌 -> 有人跟牌
-> 无人跟牌 -> 循环一圈会到自己 -> 本轮结束
-> 游戏结束
// playcard 出牌阶段
func (self *TDDZ) playcard() {
// 检查是否还有手牌
if len(self.pHandCardList[self.nTurnPosition-1]) == 0 {
log.Println("手牌打完, 游戏结束")
return
}
if self.nCardType == 0 {
// 1. 如果当前轮没有类型, 表示才刚开始出牌, 可以随机选一张牌型来出, 其他人只能跟着这个牌型继续打, 除非使用炸弹
self.roundStart()
} else if self.nLargePosition == self.nTurnPosition {
// 2. 如果最大的牌的位置. 和当前要出牌的人的位置一样. 表示他出的牌过了一轮没有人要的起, 那么下一轮开始
self.roundEnd()
} else {
// 3. 跟牌
self.roundFollow()
}
// 继续打牌
self.playcard()
}
流程大致是上面的流程, 因为没做客户端,所以逻辑都是超时自动出一张单 和 超时自动过牌
逻辑还算是比较简单. 因为涉及到客户端操作. 所以暂时都不写任何东西
弄上临时的逻辑对付一下
// 回合开始
func (self *TDDZ) roundStart() {
log.Println("回合开始, 准备打牌")
//1. 新人打牌, 打第一张
ch := make(chan int, 1)
self.chPlayDZ = ch
select {
case <-ch:
log.Println("模拟打牌")
case <-time.After(time.Second * 1): // 假设5秒超时
log.Println("roundStart 超时")
}
// 默认当做单牌
// 要找到一个能匹配上的牌组
log.Println("打出前")
self.pHandCardList[self.nTurnPosition-1].print()
pOutCard, pLeftCard := self.pHandCardList[self.nTurnPosition-1].ai(cardTypeSINGLE, cardPointNIL)
log.Println("位置", self.nTurnPosition, "打出牌:")
pOutCard.print()
// 选完以后重新弄上手牌
self.pHandCardList[self.nTurnPosition-1] = make(TCards, len(pLeftCard))
copy(self.pHandCardList[self.nTurnPosition-1], pLeftCard)
pLeftCard.print()
self.pHandCardList[self.nTurnPosition-1].print()
//
self.nLargePosition = self.nTurnPosition
self.nTurnPosition++ // 当前轮到的人的
if self.nTurnPosition > 3 {
self.nTurnPosition -= 3
}
self.nHand++ // 手次
self.nCardType = cardTypeSINGLE // 当前出牌牌型
self.nCardPoint = pOutCard[0].nPoint // 当前出牌点数
}
// 下家跟拍
func (self *TDDZ) roundFollow() {
ch := make(chan int, 1)
self.chPlayDZ = ch
select {
case <-ch:
log.Println("模拟打牌")
case <-time.After(time.Second * 1): // 假设5秒超时
log.Println("roundFollow 超时")
}
// 这里超时是不出的
self.nTurnPosition++ // 当前轮到的人的
if self.nTurnPosition > 3 {
self.nTurnPosition -= 3
}
self.nHand++ // 手次
log.Println("当前位置变成了他", self.nTurnPosition)
// 这两个保持不变
}
// 下一轮
func (self *TDDZ) roundEnd() {
self.nHand = 0
self.nCardType = cardTypeNIL
self.nCardPoint = cardPointNIL
}
写到这里. 斗地主的游戏基本上暂时告一段落. 没有客户端已经很难再继续写下去了, 还是需要简单的构建一下服务器才行. 下一节可能需要先讲一部分逻辑上的搭建工作