前面已经写过一个发牌的逻辑了
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)
}
}
客户端效果大致这样, 感觉.... 嗯 还行吧