| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- package games
- import (
- "battlecamp-go-server/board"
- "battlecamp-go-server/player"
- "math/rand"
- "sync"
- "time"
- )
- type Game struct {
- Id int64 `json:"id"`
- StartTime int64 `json:"startTime"`
- EndTime int64 `json:"endTime"`
- Board *board.Board `json:"board"`
- Players []*player.Player `json:"-"`
- mutex sync.Mutex
- Winner *player.Player `json:"winner,omitempty"`
- }
- func NewGame(cols, rows int) *Game {
- createTime := time.Now().Unix()
- game := &Game{
- StartTime: createTime,
- Board: board.New(cols, rows),
- Players: make([]*player.Player, 0),
- }
- return game
- }
- func (g *Game) Join(p *player.Player) {
- g.mutex.Lock()
- g.placePlayer(p)
- g.Players = append(g.Players, p)
- g.mutex.Unlock()
- }
- func (g *Game) placePlayer(p *player.Player) {
- xRange := g.Board.Cols / 5
- yRange := g.Board.Rows
- for {
- x := rand.Intn(xRange)
- y := rand.Intn(yRange)
- if g.isValidPlayerPos(x, y) {
- p.Pos.X = x
- p.Pos.Y = y
- return
- }
- }
- }
- func (g *Game) isValidPlayerPos(x, y int) bool {
- t := g.Board.Get(x, y)
- if t == board.Rock {
- return false;
- }
- return g.getPlayerAt(x, y) == nil
- }
- func (g *Game) getPlayerAt(x, y int) *player.Player {
- for _, p := range g.Players {
- if (p.Pos.X == x && p.Pos.Y == y) {
- return p
- }
- }
- return nil
- }
- func (g *Game) GetPlayer(playerId string) *player.Player {
- for _, p := range g.Players {
- if p.Id == playerId{
- return p
- }
- }
- return nil
- }
|