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
- }
- 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
- }
- 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
- }
- func (r *Room) GetWaitCardPlayers() []*Player {
- players := make([]*Player, 0)
- for _, player := range r.Players {
- if !player.WaitCard {
- players = append(players, player)
- }
- }
- return players
- }
- func (room *Room) GetPlayersBySitPos(startSitPos int32) []*Player {
- players := make([]*Player, 0)
- maxSitPos := int32(5)
- log.Debug("startSitPos:%v", room.Players)
-
- for sitPos := startSitPos; sitPos <= maxSitPos; sitPos++ {
- for _, player := range room.Players {
- if player.SitPos == sitPos {
- players = append(players, player)
- break
- }
- }
- }
-
- 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
- }
- }
-
-
- 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
- }
|