什么房间那些先暂时不管吧. 最简单的方法就是先快速加入桌子, 也不要准备了. 加入就算自动准备, 断线重连什么的也都不管, 现在的目标就是先跑通流程
一个斗地主房间 (高级场 中级场 初级场, 通常是倍率不同) 里面有很多桌子
package main
import "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 main
import (
"log"
"sync"
)
var nTableAutoInc = 0 // 自增的桌子ID
var mpTableList sync.Map // 桌子列表 TTable
// TTable 桌子类
type TTable struct {
nIndex int // 桌子索引
bFull bool // 是否满了
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 main
import connection "github.com/266game/goserver/Connection"
// TPlayer 玩家类
type TPlayer struct {
NickName string // 昵称
Conn *connection.TConnection // 连接
}
// NewPlayer 创建一个新玩家
func NewPlayer() *TPlayer {
p := &TPlayer{}
return p
}