Golangは地主のためのゲームサーバーを作ります[12]:カードをもう一度書きます

私はすでに取引の論理を書いています。

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

クライアントの効果はおおまかにこんな感じです…

おすすめ

転載: blog.csdn.net/warrially/article/details/88841454