golang制作一个斗地主游戏服务器[10]:房间、桌子、玩家

什么房间那些先暂时不管吧.  最简单的方法就是先快速加入桌子,  也不要准备了.  加入就算自动准备,   断线重连什么的也都不管,   现在的目标就是先跑通流程

一个斗地主房间 (高级场 中级场 初级场, 通常是倍率不同) 里面有很多桌子

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
}

猜你喜欢

转载自blog.csdn.net/warrially/article/details/88802264