game.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package games
  2. import (
  3. "battlecamp-go-server/board"
  4. "battlecamp-go-server/player"
  5. "math/rand"
  6. "sync"
  7. "time"
  8. )
  9. type Game struct {
  10. Id int64 `json:"id"`
  11. StartTime int64 `json:"startTime"`
  12. EndTime int64 `json:"endTime"`
  13. Board *board.Board `json:"board"`
  14. Players []*player.Player `json:"-"`
  15. mutex sync.Mutex
  16. Winner *player.Player `json:"winner,omitempty"`
  17. }
  18. func NewGame(cols, rows int) *Game {
  19. createTime := time.Now().Unix()
  20. game := &Game{
  21. StartTime: createTime,
  22. Board: board.New(cols, rows),
  23. Players: make([]*player.Player, 0),
  24. }
  25. return game
  26. }
  27. func (g *Game) Join(p *player.Player) {
  28. g.mutex.Lock()
  29. g.placePlayer(p)
  30. g.Players = append(g.Players, p)
  31. g.mutex.Unlock()
  32. }
  33. func (g *Game) placePlayer(p *player.Player) {
  34. xRange := g.Board.Cols / 5
  35. yRange := g.Board.Rows
  36. for {
  37. x := rand.Intn(xRange)
  38. y := rand.Intn(yRange)
  39. if g.isValidPlayerPos(x, y) {
  40. p.Pos.X = x
  41. p.Pos.Y = y
  42. return
  43. }
  44. }
  45. }
  46. func (g *Game) isValidPlayerPos(x, y int) bool {
  47. t := g.Board.Get(x, y)
  48. if t == board.Rock {
  49. return false;
  50. }
  51. return g.getPlayerAt(x, y) == nil
  52. }
  53. func (g *Game) getPlayerAt(x, y int) *player.Player {
  54. for _, p := range g.Players {
  55. if (p.Pos.X == x && p.Pos.Y == y) {
  56. return p
  57. }
  58. }
  59. return nil
  60. }
  61. func (g *Game) GetPlayer(playerId string) *player.Player {
  62. for _, p := range g.Players {
  63. if p.Id == playerId{
  64. return p
  65. }
  66. }
  67. return nil
  68. }