123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- package room
- import (
- "server/msg"
- "sort"
- "github.com/name5566/leaf/gate"
- "github.com/name5566/leaf/log"
- )
- // 定一个类为每局游戏
- type GameRound struct {
- // 押注总数
- TotalBet int32
- //回合列表
- Rounds []msg.ReqRound
- }
- // RoomStatus 房间状态
- const (
- RoomStatusWaiting = 0 // 等待开局
- RoomStatusDealing = 1 // 发牌中
- RoomStatusPlaying = 2 // 游戏进行中
- RoomStatusEnd = 3 // 游戏结束
- )
- type Room struct {
- Id string
- Players []*Player
- Status int
- // 当前轮次
- Round int
- // 当前回合的座位
- RoundSitPos int
- // 每局游戏
- GameRound *GameRound
- // 牌堆
- CardDeck *[]msg.ReqCard
- }
- type Player struct {
- Id string
- Agent gate.Agent
- IsRobot bool
- UserData interface{}
- //手牌
- HandCards *[]msg.ReqCard
- // 座位
- SitPos int32
- // 等待发牌
- WaitCard bool
- // 是否已看牌
- IsSeen bool
- // 是否已弃牌
- IsPacked bool
- // 是否已开牌
- IsShow bool
- // 是否已结算
- IsSettle bool
- // 是否已准备
- IsReady bool
- // 是否是庄家
- IsDealer bool
- // 是否获胜
- IsWin bool
- // 上一次操作
- LastOpt *msg.PlayerOpt
- // 是否可以亮牌
- CanShow bool
- }
- // 获取玩家ID
- func (p *Player) GetUserId() string {
- return p.Id
- }
- // 获取玩家的昵称
- func (p *Player) GetNickname() string {
- if userData, ok := p.UserData.(struct{ Nickname string }); ok {
- return userData.Nickname
- }
- return ""
- }
- // 获取玩家的头像
- func (p *Player) GetAvatar() string {
- if userData, ok := p.UserData.(struct{ Head_Image string }); ok {
- return userData.Head_Image
- }
- return ""
- }
- func (r *Room) AddPlayer(p *Player) {
- r.Players = append(r.Players, p)
- }
- func (r *Room) RemovePlayer(p *Player) {
- for i, player := range r.Players {
- if player.Id == p.Id {
- r.Players = append(r.Players[:i], r.Players[i+1:]...)
- break
- }
- }
- }
- func (r *Room) RemoveAllRobot() {
- newPlayers := make([]*Player, 0)
- for _, player := range r.Players {
- if !player.IsRobot {
- newPlayers = append(newPlayers, player)
- }
- }
- r.Players = newPlayers
- }
- func (r *Room) GetPlayer(id string) *Player {
- for _, player := range r.Players {
- if player.Id == id {
- return player
- }
- }
- return nil
- }
- // 获取庄家的玩家
- func (r *Room) GetDealerPlayer() *Player {
- for _, player := range r.Players {
- if player.IsDealer {
- return player
- }
- }
- return nil
- }
- // 设置指定玩家为庄家,并设置其他玩家为非庄家
- func (r *Room) SetDealerPlayer(p *Player) {
- for _, player := range r.Players {
- player.IsDealer = false
- }
- p.IsDealer = true
- }
- // 获取WaitCard是false的所有玩家
- func (r *Room) GetWaitCardPlayers() []*Player {
- players := make([]*Player, 0)
- for _, player := range r.Players {
- if !player.WaitCard {
- players = append(players, player)
- }
- }
- return players
- }
- // sitPos 是当前玩家的座位号,GetWaitCardPlayers 从sitPos开始 顺时针方向把所有玩家返回
- // 从指定座位号开始顺时针获取所有玩家
- func (room *Room) GetPlayersBySitPos(startSitPos int32) []*Player {
- players := make([]*Player, 0)
- maxSitPos := int32(5) //
- log.Debug("startSitPos:%v", room.Players)
- // 先添加大于等于 startSitPos 的座位
- for sitPos := startSitPos; sitPos <= maxSitPos; sitPos++ {
- for _, player := range room.Players {
- if player.SitPos == sitPos {
- players = append(players, player)
- break
- }
- }
- }
- // 再添加小于 startSitPos 的座位
- for sitPos := int32(0); sitPos < startSitPos; sitPos++ {
- for _, player := range room.Players {
- if player.SitPos == sitPos {
- players = append(players, player)
- break
- }
- }
- }
- return players
- }
- // 根据座位号获取玩家
- func (r *Room) GetPlayerBySitPos(sitPos int32) *Player {
- for _, player := range r.Players {
- if player.SitPos == sitPos {
- return player
- }
- }
- return nil
- }
- // 增加玩家操作到当前回合
- func (r *Room) AddPlayerOpt(round *msg.ReqRound) {
- r.Round++
- r.GameRound.Rounds = append(r.GameRound.Rounds, *round)
- }
- // 设置当前回合为下个没有弃牌的玩家(逆时针)
- func (r *Room) SetNextRound() {
- curSitPos := int32(r.RoundSitPos)
- player := r.GetPlayerBySitPos(curSitPos)
- player.CanShow = true
- // 按照座位号从小到大排序
- sort.Slice(r.Players, func(i, j int) bool {
- return r.Players[i].SitPos < r.Players[j].SitPos
- })
- // 获取当前座位号的索引
- curSitPosIndex := -1
- for i, player := range r.Players {
- if player.SitPos == curSitPos {
- curSitPosIndex = i
- break
- }
- }
- // 逆时针:当前索引减1
- // 如果减1后小于0,则回到最后一个位置
- nextIndex := curSitPosIndex
- for i := 0; i < len(r.Players); i++ {
- nextIndex = (curSitPosIndex - 1 - i + len(r.Players)) % len(r.Players)
- if !r.Players[nextIndex].IsPacked {
- break
- }
- }
- r.RoundSitPos = int(r.Players[nextIndex].SitPos)
- log.Debug("SetNextRound:下一个操作的玩家座位:%d", r.RoundSitPos)
- }
- // 获取没有弃牌的玩家是否只有一个,并返回没有弃牌的座位号
- func (r *Room) IsOnlyOneNotPacked() (bool, int32) {
- count := 0
- sitPos := int32(0)
- for _, player := range r.Players {
- if !player.IsPacked {
- count++
- sitPos = player.SitPos
- }
- }
- return count == 1, sitPos
- }
- // 当前座位号玩家获胜
- func (r *Room) PlayerWin(sitPos int32) {
- player := r.GetPlayerBySitPos(sitPos)
- player.IsWin = true
- r.Status = RoomStatusEnd
- }
- // 增加押注
- func (r *Room) AddBet(bet int32) {
- r.GameRound.TotalBet += bet
- }
|