golang制作一个斗地主游戏服务器[12]:再写发牌

前面已经写过一个发牌的逻辑了

 golang制作一个斗地主游戏服务器[3]:斗地主给其他三家玩家发牌

这时要在上面稍微添加一些逻辑.主要是

1.  把实际玩家关联进去

2.  给玩家发送手牌数据


// dealcard 发牌阶段
func (self *TDDZ) dealcard() {
	// 需要洗一副牌, 并且发送给三个玩家
	pCardHeap := NewCards(54)
	pCardHeap.print()

	// 需要给三家每一家发17张牌
	self.pHandCardList[0] = make(TCards, 17)
	self.pHandCardList[1] = make(TCards, 17)
	self.pHandCardList[2] = make(TCards, 17)
	self.pUnderCardList = make(TCards, 3)

	copy(self.pHandCardList[0], pCardHeap[0:17])
	copy(self.pHandCardList[1], pCardHeap[17:34])
	copy(self.pHandCardList[2], pCardHeap[34:51])
	copy(self.pUnderCardList, pCardHeap[51:54])

	// 发牌完毕给大家手上排个序好看些
	self.pHandCardList[0].sort()
	self.pHandCardList[1].sort()
	self.pHandCardList[2].sort()
	self.pUnderCardList.sort()

	self.pHandCardList[0].print()
	self.pHandCardList[1].print()
	self.pHandCardList[2].print()
	self.pUnderCardList.print()

	// 这里准备发牌
	for i := 0; i < 3; i++ {
		pPlayer := self.pTable.pPlayerList[i]
		pack := &ddzpb.TDDZ{}
		pack.DealCardBc = &ddzpb.TDealCardBc{}
		pack.DealCardBc.Position = proto.Int(i + 1)
		pack.DealCardBc.YourCards = pbTCards(&self.pHandCardList[i]) // 手牌发给3家
		pack.Command = proto.Int(21)
		buff, _ := proto.Marshal(pack)
		pPlayer.Conn.WritePack(buff)
	}

	// 跳到叫地主环节
	self.defineDZ()
}

手牌类需要扩展一下. 把转化成PB的方法做一下

// 把 TCards 转成 pb形式
func pbTCards(pCards *c.TCards) *ddzpb.TCards {
	pb := &ddzpb.TCards{}

	pb.CardCount = proto.Int(pCards.Len())
	for i := 0; i < pCards.Len(); i++ {
		pb.CardValue = append(pb.CardValue, int32((*pCards)[i].GetValue()))
	}
	return pb
}

客户端在收到数据以后. 要把手牌的数据展示出来, 并且要可以操作.  想了下还是觉得用 checkbox 代替会比较合适

// TMainForm 主窗体
type TMainForm struct {
	*vcl.TForm
	pClient       *tcpclient.TTCPClient
	Btn1          *vcl.TButton
	Btn2          *vcl.TButton
	Edit1         *vcl.TEdit
	Label1        *vcl.TLabel
	Label2        *vcl.TLabel
	Label3        *vcl.TLabel
	CheckBoxGroup [20]*vcl.TCheckBox
}
	for i := 0; i < 20; i++ {
		pCheckbox := vcl.NewCheckBox(self)
		self.CheckBoxGroup[i] = pCheckbox

		pCheckbox.SetParent(self)
		pCheckbox.SetCaption("--")

		pCheckbox.SetBounds(int32(10+i*50), 200, 50, 28)
	}

然后把它显示出来, 先备着. 后面到出牌的时候在用

case 21: // 发牌
			bc := pack.GetDealCardBc()
			yourcards := bc.GetYourCards() // 得到手牌

			// 先清空手牌
			for i := 0; i < 20; i++ {
				self.CheckBoxGroup[i].SetVisible(false)
			}
			// 再给checkbox 重新命名
			for i, v := range yourcards.GetCardValue() {
				if i >= 20 {
					log.Panicln("超了")
				}
				pCard := c.NewCard(int(v))
				self.CheckBoxGroup[i].SetCaption(pCard.ToStr())
				self.CheckBoxGroup[i].SetTag(int(v)) // 这里的tag 后续要用
				self.CheckBoxGroup[i].SetVisible(true)
			}
		}

客户端效果大致这样, 感觉.... 嗯 还行吧

猜你喜欢

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