私はすでに取引の論理を書いています。
GolangはDoudishuゲームサーバーを作成します[3]:Doudishuは他の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
}
クライアントがデータを受け取った後、ハンドカードのデータを表示し、操作可能である必要があります。それを考えた後でも、チェックボックスに置き換える方が適切だと思います。
// 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)
}
}
クライアントの効果はおおまかにこんな感じです…