Marco
6cbd7d37aa
1. Make lobby a struct containing the players and a mutex used to lock itself 2. Wait for websocket connections to be established by both players before starting the game. 3. Add methods to write to and read from players
110 lines
2.3 KiB
Go
110 lines
2.3 KiB
Go
package server
|
|
|
|
import (
|
|
"log"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type Game struct {
|
|
id uuid.UUID
|
|
players [2]Player
|
|
currentTurnPlayer Player
|
|
}
|
|
|
|
const (
|
|
PlayerToMove = 0
|
|
CheckPlayerChange = 1
|
|
)
|
|
|
|
func NewGame() *Game {
|
|
var game Game = Game{
|
|
id: uuid.New(),
|
|
}
|
|
|
|
return &game
|
|
}
|
|
|
|
func (game Game) getPlayer1() *Player {
|
|
return &game.players[0]
|
|
}
|
|
|
|
func (game Game) getPlayer2() *Player {
|
|
return &game.players[1]
|
|
}
|
|
|
|
func (game *Game) handle() {
|
|
defer log.Println("Game ", game.id, ": handle() ended")
|
|
|
|
<-game.getPlayer1().wsConnEstablished
|
|
log.Println("WS connection for player 1 established")
|
|
<-game.getPlayer2().wsConnEstablished
|
|
log.Println("WS connection for player 2 established")
|
|
|
|
gameState := PlayerToMove
|
|
game.currentTurnPlayer = *game.getPlayer1()
|
|
var move *Move
|
|
var receivedMessage []byte
|
|
|
|
for {
|
|
|
|
switch gameState {
|
|
case PlayerToMove:
|
|
var err error
|
|
_, receivedMessage, err = game.currentTurnPlayer.ReadMessageFromPlayer()
|
|
if err != nil {
|
|
log.Println("Error while reading message:", err)
|
|
// At the moment, we return when there is an error while reading a message.
|
|
// This means, the game just ends uncontrolled
|
|
return
|
|
}
|
|
move, err = parseMove(string(receivedMessage))
|
|
log.Println("Player ", game.currentTurnPlayer, " moved: ", move)
|
|
|
|
if err != nil {
|
|
log.Println("Game: ", game.id, err)
|
|
continue
|
|
}
|
|
gameState = CheckPlayerChange
|
|
|
|
case CheckPlayerChange:
|
|
|
|
if game.currentTurnPlayer.Uuid == game.players[0].Uuid {
|
|
game.currentTurnPlayer = game.players[1]
|
|
} else {
|
|
game.currentTurnPlayer = game.players[0]
|
|
}
|
|
|
|
err := game.getPlayer1().WriteMessageToPlayer(receivedMessage)
|
|
if err != nil {
|
|
log.Println("Error during message writing:", err)
|
|
continue
|
|
}
|
|
err = game.getPlayer2().WriteMessageToPlayer(receivedMessage)
|
|
if err != nil {
|
|
log.Println("Error during message writing:", err)
|
|
continue
|
|
}
|
|
gameState = PlayerToMove
|
|
|
|
}
|
|
|
|
log.Println("GameState = ", gameState)
|
|
if gameState == PlayerToMove {
|
|
log.Println("with player ", game.currentTurnPlayer, " to move")
|
|
}
|
|
}
|
|
}
|
|
|
|
func (game *Game) addPlayersToGame(players [2]Player) {
|
|
log.Printf("Adding players %s and %s to new game", players[0].Uuid.String(), players[1].Uuid.String())
|
|
|
|
for i := range players {
|
|
players[i].InGame = true
|
|
}
|
|
|
|
game.players = players
|
|
|
|
go game.handle()
|
|
}
|