golang制作一个斗地主游戏服务器[6]:打牌和跟牌

终于到了最重要(其实也是最不重要)的打牌环节了.

打牌的逻辑其实很简单

选完地主以后 由地主开牌

判断手牌是否消耗完毕 ->

-> 开牌 ->  有人跟牌 

              -> 无人跟牌 -> 循环一圈会到自己 -> 本轮结束

-> 游戏结束


// 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
}

写到这里. 斗地主的游戏基本上暂时告一段落.  没有客户端已经很难再继续写下去了,   还是需要简单的构建一下服务器才行. 下一节可能需要先讲一部分逻辑上的搭建工作

猜你喜欢

转载自blog.csdn.net/warrially/article/details/88645411