什么房间那些先暂时不管吧.最简单的方法就是先快速加入桌子,也不要准备了.加入就算自动准备,断线重连什么的也都不管,现在的目标就是先跑通流程
一个斗地主房间 (高级场 中级场 初级场, 通常是倍率不同) 里面有很多桌子
package mainimport "log"// TRoom 房间类
type TRoom struct {
}// NewRoom 新建房间
func NewRoom() *TRoom {
p := &TRoom{} return p
}// QuickJoin 快速加入一张桌子
// pPlayer *TPlayer 玩家指针
func (self *TRoom) QuickJoin(pPlayer *TPlayer) bool {
// 1 快速找到一个新桌子
pTable := FindEmptyTable()
if pTable == nil {
log.Println("没有空桌子了. 需要新建一个空桌子")
pTable = NewTable()
} // 桌子里加入个新玩家
pTable.playerJoin(pPlayer)
// 如果桌子坐满了. 那么就开局
if pTable.isFull() {
pTable.playing()
} return true
}
每个桌子可以“坐” 3个人,再来的人就是“站着”观战, 目前不考虑观战
// table.go
//
package mainimport (
"log"
"sync"
)var nTableAutoInc = 0// 自增的桌子ID
var mpTableList sync.Map // 桌子列表 TTable// TTable 桌子类
type TTable struct {
nIndexint// 桌子索引
bFullbool// 是否满了
pPlayerList[3]*TPlayer // 里面的玩家
nPlayerCount int
ddz*TDDZ // 斗地主
}// NewTable 新建一个桌子
func NewTable() *TTable {
nTableAutoInc++
nIndex := nTableAutoInc
p := &TTable{}
p.init()
mpTableList.Store(nIndex, p) // 插入到队列中
return p
}// FindEmptyTable 找一个空的桌子
func FindEmptyTable() *TTable {
var pTable *TTable
mpTableList.Range(func(k, v interface{}) bool {
// 在这里判断每一个map里的桌子是否为空
if v.(*TTable).isEmpty() {
pTable = v.(*TTable)
return false
}
return true
})
return pTable
}// 桌子开始玩耍
func (self *TTable) playing() {
go func() {
log.Println("游戏正式开始")self.ddz = NewDDZ()
log.Println("游戏正式结束")
}()
}// 假构造函数
func (self *TTable) init() {
self.nPlayerCount = 0
}// 桌子是否满了
func (self *TTable) isFull() bool {
return self.nPlayerCount >= 3
}// 桌子是否空的
func (self *TTable) isEmpty() bool {
return self.nPlayerCount < 3
}// 桌子上加入一个新玩家
func (self *TTable) playerJoin(pPlayer *TPlayer) {
self.nPlayerCount++ // 循环找空位插入
for i := 0;
i < 3;
i++ {
if self.pPlayerList[i] == nil {
self.pPlayerList[i] = pPlayer
return
}
}
}
玩家 目前就记录一个昵称就行。 剩下的就是玩家的客户端连接, 其他暂时都不要
package mainimport connection "github.com/266game/goserver/Connection"// TPlayer 玩家类
type TPlayer struct {
NickName string// 昵称
Conn*connection.TConnection // 连接
}// NewPlayer 创建一个新玩家
func NewPlayer() *TPlayer {
p := &TPlayer{}
return p
}
【golang制作一个斗地主游戏服务器[10]:房间、桌子、玩家】
推荐阅读
- Go|Docker后端部署详解(Go+Nginx)
- GO|GO,GO,GO!
- Go成长之路|go中判断空字符串、nil和len(t)的用法
- go编译tools
- go grpc安装与使用
- goroutine 调度原理
- Go|Go进阶之路——复杂类型
- Go进阶之路——变量
- Go进阶之路——流程控制语句