gamescene.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. package gamelogic
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "bet24.com/log"
  6. )
  7. type GameScene struct {
  8. Banker int // 庄家
  9. Phase int // 场景阶段
  10. ActionPhase int // 动作阶段
  11. PhaseIndex int // 场景阶段索引
  12. WhoseTurn int // 当前轮到谁操作
  13. FirstActionPlayer int // 游戏开始第一个操作的人
  14. LastTurn int // 上个操作的玩家
  15. Players []PlayerInfo // 玩家信息
  16. GameIndex int // 游戏局数
  17. Index int // 场景索引
  18. LeftSec int // 剩余时间
  19. JackPotAmount int // 奖池数据
  20. CurrentTradeAmount int // 当前交易金额
  21. RoundWinner []int // 回合赢家
  22. CurrentMinRobScore int // 当前最小抢庄
  23. CurrentActionPlayer int // 当前动作闲家
  24. userActions []userAction // 玩家动作用作回放数据
  25. tableId int // 桌子ID
  26. isNeedCalc bool
  27. }
  28. func newGameScene(tableId int) *GameScene {
  29. gs := new(GameScene)
  30. gs.ctor()
  31. gs.initData(tableId)
  32. return gs
  33. }
  34. func (gs *GameScene) ctor() {
  35. gs.Players = make([]PlayerInfo, CHAIR_COUNT)
  36. for i := 0; i < CHAIR_COUNT; i++ {
  37. gs.Players[i].isEndToStart = false
  38. }
  39. }
  40. func (gs *GameScene) initData(tableId int) {
  41. gs.tableId = tableId
  42. gs.userActions = []userAction{}
  43. gs.Index = 0
  44. gs.GameIndex = 0
  45. gs.JackPotAmount = 0
  46. for i := 0; i < CHAIR_COUNT; i++ {
  47. gs.Players[i].initData(0, 0)
  48. }
  49. gs.gameInit(-1)
  50. }
  51. func (gs *GameScene) gameInit(whoseTurn int) {
  52. gs.Banker = -1
  53. gs.Phase = Phase_Free
  54. gs.ActionPhase = ActionPhase_Banker_GiveMoney
  55. gs.PhaseIndex = 0
  56. gs.RoundWinner = []int{}
  57. gs.WhoseTurn = whoseTurn
  58. gs.FirstActionPlayer = whoseTurn
  59. gs.LastTurn = -1
  60. gs.LeftSec = 0
  61. gs.CurrentActionPlayer = -1
  62. gs.CurrentTradeAmount = 0
  63. gs.CurrentMinRobScore = 0
  64. gs.isNeedCalc = true
  65. for i := 0; i < CHAIR_COUNT; i++ {
  66. gs.Players[i].gameInit()
  67. }
  68. }
  69. func (gs *GameScene) addUserAction(chairId, action, param int) {
  70. gs.userActions = append(gs.userActions, userAction{
  71. action: action,
  72. data: fmt.Sprintf("ChairId:%d, Param:%d", chairId, param)})
  73. }
  74. func (gs *GameScene) nextChair() {
  75. gs.LastTurn = gs.WhoseTurn
  76. for {
  77. gs.WhoseTurn = getPreviousChair(gs.LastTurn)
  78. if gs.Players[gs.WhoseTurn].Score > 0 {
  79. break
  80. }
  81. }
  82. }
  83. func (gs *GameScene) nextActionChair() {
  84. gs.LastTurn = gs.WhoseTurn
  85. for {
  86. if gs.CurrentActionPlayer == -1 {
  87. gs.CurrentActionPlayer = getPreviousChair(gs.Banker)
  88. } else {
  89. gs.CurrentActionPlayer = getPreviousChair(gs.CurrentActionPlayer)
  90. }
  91. if gs.Players[gs.CurrentActionPlayer].RobScore > 0 || gs.Banker == gs.CurrentActionPlayer {
  92. break
  93. }
  94. }
  95. gs.WhoseTurn = gs.CurrentActionPlayer
  96. }
  97. func (gs *GameScene) compareCard() {
  98. winner := 0
  99. for i := 0; i < CHAIR_COUNT; i++ {
  100. if gs.Players[i].RobScore > 0 {
  101. winner = i
  102. break
  103. }
  104. }
  105. if winner == (CHAIR_COUNT - 1) {
  106. gs.RoundWinner = append(gs.RoundWinner, winner)
  107. return
  108. }
  109. start := winner
  110. for i := start + 1; i < CHAIR_COUNT; i++ {
  111. if gs.Players[i].RobScore <= 0 {
  112. continue
  113. }
  114. if isBigger(gs.Players[i].HandCards, gs.Players[winner].HandCards) {
  115. winner = i
  116. }
  117. }
  118. gs.RoundWinner = append(gs.RoundWinner, winner)
  119. for i := start + 1; i < CHAIR_COUNT; i++ {
  120. if gs.Players[i].RobScore <= 0 {
  121. continue
  122. }
  123. if i == winner {
  124. continue
  125. }
  126. if isEqual(gs.Players[i].HandCards, gs.Players[winner].HandCards) {
  127. gs.RoundWinner = append(gs.RoundWinner, i)
  128. }
  129. }
  130. }
  131. func (gs *GameScene) roundEnd() {
  132. if len(gs.RoundWinner) == 0 && gs.Banker != -1 {
  133. gs.RoundWinner = append(gs.RoundWinner, gs.Banker)
  134. }
  135. winnAmount := 0
  136. for i := 0; i < CHAIR_COUNT; i++ {
  137. if gs.Players[i].RobScore > 0 {
  138. winnAmount += gs.Players[i].RobScore
  139. gs.Players[i].ChangeScore -= gs.Players[i].RobScore
  140. gs.Players[i].RobScore = 0
  141. }
  142. }
  143. if len(gs.RoundWinner) == 0 {
  144. return
  145. }
  146. win := winnAmount / len(gs.RoundWinner)
  147. for i := 0; i < len(gs.RoundWinner); i++ {
  148. gs.Players[gs.RoundWinner[i]].Score += win
  149. gs.Players[gs.RoundWinner[i]].ChangeScore = win
  150. }
  151. }
  152. func (gs *GameScene) isNoNeedCompare() bool {
  153. for i := 0; i < CHAIR_COUNT; i++ {
  154. if i == gs.Banker {
  155. continue
  156. }
  157. if gs.Players[i].RobScore > 0 {
  158. return false
  159. }
  160. }
  161. gs.Players[gs.Banker].RobScore *= 2
  162. return true
  163. }
  164. func (gs *GameScene) isAllDoRobBanker() bool {
  165. for i := 0; i < CHAIR_COUNT; i++ {
  166. if gs.Players[i].Status == Player_Status_Play && gs.Players[i].RobScore == 0 {
  167. return false
  168. }
  169. }
  170. return true
  171. }
  172. func (gs *GameScene) isActionOver() bool {
  173. if gs.CurrentActionPlayer == gs.Banker {
  174. return true
  175. }
  176. nextChair := gs.CurrentActionPlayer
  177. for {
  178. if nextChair == -1 {
  179. nextChair = getPreviousChair(gs.Banker)
  180. } else {
  181. nextChair = getPreviousChair(nextChair)
  182. }
  183. if gs.Players[nextChair].RobScore > 0 || gs.Banker == nextChair {
  184. break
  185. }
  186. }
  187. return nextChair == gs.Banker
  188. }
  189. func (gs *GameScene) isBelowOneRobBanker() bool {
  190. if gs.WhoseTurn != -1 {
  191. return false
  192. }
  193. robCount := 0
  194. robChair := -1
  195. for i := 0; i < CHAIR_COUNT; i++ {
  196. if gs.Players[i].Status == Player_Status_Play || gs.Players[i].Status == Player_Status_AllIn {
  197. robCount++
  198. robChair = i
  199. }
  200. }
  201. if robCount == 1 {
  202. gs.Players[robChair].RobScore *= 2
  203. gs.RoundWinner = append(gs.RoundWinner, robChair)
  204. }
  205. return robCount <= 1
  206. }
  207. func (gs *GameScene) confirmBanker() {
  208. bigScore := 0
  209. charId := -1
  210. for i := 0; i < CHAIR_COUNT; i++ {
  211. chair := (gs.FirstActionPlayer + CHAIR_COUNT - i) % CHAIR_COUNT
  212. if gs.Players[chair].RobScore > bigScore {
  213. charId = chair
  214. bigScore = gs.Players[chair].RobScore
  215. }
  216. }
  217. gs.Banker = charId
  218. gs.WhoseTurn = gs.Banker
  219. }
  220. func (gs *GameScene) nextGame(winScore int) bool {
  221. gs.GameIndex++
  222. end := true
  223. for i := 0; i < CHAIR_COUNT; i++ {
  224. if !gs.Players[i].IsValid || gs.Players[i].Score == 0 {
  225. continue
  226. }
  227. if gs.Players[i].Score >= winScore {
  228. end = false
  229. }
  230. }
  231. return end
  232. }
  233. func (gs *GameScene) getWinner() int {
  234. winner := -1
  235. winScore := 0
  236. for i := 0; i < CHAIR_COUNT; i++ {
  237. if !gs.Players[i].IsValid || gs.Players[i].Score <= 0 {
  238. continue
  239. }
  240. if gs.Players[i].Score >= winScore {
  241. winner = i
  242. winScore = gs.Players[i].Score
  243. }
  244. }
  245. return winner
  246. }
  247. func (gs *GameScene) getCopy() GameScene {
  248. var ret GameScene
  249. d, _ := json.Marshal(gs)
  250. json.Unmarshal(d, &ret)
  251. return ret
  252. }
  253. func (gs *GameScene) getScene(chairId int, isPlayer bool, isOwnerWatCh bool) string {
  254. tmp := gs.getCopy()
  255. if isOwnerWatCh {
  256. d, _ := json.Marshal(tmp)
  257. return string(d)
  258. }
  259. for i := 0; i < CHAIR_COUNT; i++ {
  260. if gs.Phase == Phase_End || gs.Phase == Phase_RoundEnd || gs.Phase == Phase_CompareCard {
  261. continue
  262. }
  263. if chairId == i {
  264. continue
  265. }
  266. tmp.Players[i].hideSecretData()
  267. }
  268. d, _ := json.Marshal(tmp)
  269. return string(d)
  270. }
  271. func (gs *GameScene) dump() {
  272. log.Release("====GameScene Table[%d] Index[%d] GameIndex[%d]====", gs.tableId, gs.Index, gs.GameIndex)
  273. log.Release(" Phase[%d],PhaseIndex[%d], WhoseTurn[%d],LastTurn[%d],Banker[%d],FirstActionPlayer[%d], ActionPhase[%d]",
  274. gs.Phase, gs.PhaseIndex, gs.WhoseTurn, gs.LastTurn, gs.Banker, gs.FirstActionPlayer, gs.ActionPhase)
  275. log.Release(" JackPotAmount[%d],CurrentTradeAmount[%d],RoundWinner[%v],CurrentActionPlayer[%d]",
  276. gs.JackPotAmount, gs.CurrentTradeAmount, gs.RoundWinner, gs.CurrentActionPlayer)
  277. log.Release(" CurrentMinRobScore[%d]", gs.CurrentMinRobScore)
  278. for i := 0; i < CHAIR_COUNT; i++ {
  279. gs.Players[i].dump(i)
  280. }
  281. if len(gs.userActions) > 0 {
  282. log.Release(" Actions:%d", len(gs.userActions))
  283. for _, v := range gs.userActions {
  284. v.dump()
  285. }
  286. }
  287. log.Debug("---------------------------")
  288. }