Many many changes

This commit is contained in:
Marco 2023-06-25 16:11:29 +02:00
parent 7f206b15fe
commit 9793c37582
20 changed files with 252 additions and 102 deletions

View File

@ -2,7 +2,7 @@ package api
import ( import (
"encoding/json" "encoding/json"
"local/m/mchess_server/types" "mchess_server/types"
) )
type WebsocketMessage struct { type WebsocketMessage struct {

View File

@ -1,18 +1,15 @@
package chess package chess
import "local/m/mchess_server/types" import "mchess_server/types"
type Bishop struct { type Bishop struct {
Color types.ChessColor Color types.ChessColor
} }
func (Bishop) AfterMoveAction() {
}
func (b Bishop) GetColor() types.ChessColor { func (b Bishop) GetColor() types.ChessColor {
return b.Color return b.Color
} }
func (b Bishop) GetAllLegalAndIllegalMoves(board Board, fromSquare types.Coordinate) []types.Coordinate { func (b Bishop) GetAllMovesButBlocked(board Board, fromSquare types.Coordinate) []types.Coordinate {
return []types.Coordinate{} return []types.Coordinate{}
} }

View File

@ -1,7 +1,7 @@
package chess package chess
import ( import (
"local/m/mchess_server/types" "mchess_server/types"
"github.com/samber/lo" "github.com/samber/lo"
) )
@ -14,11 +14,11 @@ func (b Board) Init() {
for i := 1; i <= 8; i++ { for i := 1; i <= 8; i++ {
coord.Row = 2 coord.Row = 2
coord.Col = i coord.Col = i
b[coord] = Pawn{Color: types.White, HasMoved: false} b[coord] = Pawn{Color: types.White}
coord.Row = 7 coord.Row = 7
coord.Col = i coord.Col = i
b[coord] = Pawn{Color: types.Black, HasMoved: false} b[coord] = Pawn{Color: types.Black}
} }
b[types.Coordinate{Row: 1, Col: 1}] = Rook{Color: types.White} b[types.Coordinate{Row: 1, Col: 1}] = Rook{Color: types.White}
@ -41,39 +41,58 @@ func (b Board) Init() {
} }
func (b Board) CheckMove(move types.Move) (bool, string) { func (b Board) CheckMove(move types.Move) (bool, string) {
// We make a copy of the original board to play moves on it,
// We can play the move on it and then check if it is invalid
tempBoard := b.getCopyOfBoard()
//Check start square of move
pieceAtStartSquare := b.getPieceAt(move.StartSquare) pieceAtStartSquare := b.getPieceAt(move.StartSquare)
if pieceAtStartSquare == nil { if pieceAtStartSquare == nil {
return false, "no piece at start square" return false, "no piece at start square"
} }
movingColor := pieceAtStartSquare.GetColor() movingColor := pieceAtStartSquare.GetColor()
//Check end square of move
pieceAtEndSquare := b.getPieceAt(move.EndSquare) pieceAtEndSquare := b.getPieceAt(move.EndSquare)
if pieceAtEndSquare != nil { if pieceAtEndSquare != nil {
if pieceAtEndSquare.GetColor() == pieceAtStartSquare.GetColor() { if pieceAtEndSquare.GetColor() == pieceAtStartSquare.GetColor() {
return false, "same-coloured piece at end square" return false, "same-coloured piece at end square"
} }
} }
// At the moment, we do not need to check if the correct color is moving, var wasPromotionMove bool
//since we are only reading moves from the player whose turn it is. // var piece types.PieceShortName
switch pieceAtStartSquare.(type) {
case Pawn:
wasPromotionMove, _ = tempBoard.handlePossiblePromotion(move, movingColor)
}
legal := lo.Contains(pieceAtStartSquare.GetAllLegalAndIllegalMoves(b, move.StartSquare), move.EndSquare) if !wasPromotionMove {
if !legal { // At the moment, we do not need to check if the correct color is moving,
return false, "not a legal square" //since we are only reading moves from the player whose turn it is.
allMovesExceptBlocked := pieceAtStartSquare.GetAllMovesButBlocked(tempBoard, move.StartSquare)
legal := lo.Contains(allMovesExceptBlocked, move.EndSquare)
if !legal {
return false, "not a legal square"
}
//We play the move on the temporary board
delete(tempBoard, move.StartSquare)
tempBoard[move.EndSquare] = pieceAtStartSquare
} }
//Check if king of moving color is in check -> move not allowed //Check if king of moving color is in check -> move not allowed
//Do that by checking if the king is in a square attacked by the other color. //Do that by checking if the king is in a square attacked by the other color.
ownKingCoordinate := b.getSquareOfPiece(King{Color: movingColor}) ownKingCoordinate := tempBoard.getSquareOfPiece(King{Color: movingColor})
if ownKingCoordinate == nil { if ownKingCoordinate == nil {
return false, string(movingColor) + " king not found" return false, string(movingColor) + " king not found"
} }
kingIsAttacked := b.isSquareAttacked(*ownKingCoordinate, movingColor.Opposite()) kingIsAttacked := tempBoard.isSquareAttacked(*ownKingCoordinate, movingColor.Opposite())
if kingIsAttacked { if kingIsAttacked {
return false, "king is attacked after move" return false, "king is attacked after move"
} }
//Check for checkmate //Check for checkmat&e
//Is every square that the king can move to attacked? And can no other //Is every square that the king can move to attacked? And can no other
//piece block? -> checkmate //piece block? -> checkmate
@ -86,11 +105,9 @@ func (b Board) CheckMove(move types.Move) (bool, string) {
// in this scenaria the path are all the squares between queen and king. // in this scenaria the path are all the squares between queen and king.
// If a piece can be moved into the path, it is no checkmate // If a piece can be moved into the path, it is no checkmate
//We play the move //We play the move on the real board
delete(b, move.StartSquare) b = tempBoard
b[move.EndSquare] = pieceAtStartSquare
pieceAtStartSquare.AfterMoveAction()
return true, "" return true, ""
} }
@ -107,7 +124,7 @@ func (b Board) isSquareAttacked(square types.Coordinate, byColor types.ChessColo
var attackedSquares []types.Coordinate var attackedSquares []types.Coordinate
for square, piece := range b { for square, piece := range b {
attackedSquares = append(attackedSquares, piece.GetAllLegalAndIllegalMoves(b, square)...) attackedSquares = append(attackedSquares, piece.GetAllMovesButBlocked(b, square)...)
} }
return lo.Contains(attackedSquares, square) return lo.Contains(attackedSquares, square)
@ -115,10 +132,51 @@ func (b Board) isSquareAttacked(square types.Coordinate, byColor types.ChessColo
func (b Board) getPieceAt(coord types.Coordinate) Piece { func (b Board) getPieceAt(coord types.Coordinate) Piece {
piece, found := b[coord] piece, found := b[coord]
if !found { if !found {
return nil return nil
} }
return piece return piece
} }
func (b Board) handlePossiblePromotion(move types.Move, color types.ChessColor) (bool, types.PieceShortName) {
var isPromotionMove bool
var promotionToPiece types.PieceShortName
messageContainsPromotion := move.IsPromotionMove()
if messageContainsPromotion {
promotionToPiece = *move.PromotionToPiece
}
switch color {
case types.White:
if move.StartSquare.Row == types.RangeLastValid-1 &&
move.EndSquare.Row == types.RangeLastValid {
isPromotionMove = true
}
case types.Black:
if move.StartSquare.Row == types.RangeFirstValid+1 &&
move.EndSquare.Row == types.RangeFirstValid {
isPromotionMove = true
}
}
if isPromotionMove {
delete(b, move.StartSquare)
b[move.EndSquare] = GetPieceForShortName(promotionToPiece)
}
return isPromotionMove, promotionToPiece
}
func (b Board) getCopyOfBoard() Board {
board := make(map[types.Coordinate]Piece)
for coord, piece := range b {
board[coord] = piece
}
return board
}

71
chess/board_test.go Normal file
View File

@ -0,0 +1,71 @@
package chess
import (
"mchess_server/types"
"testing"
"github.com/stretchr/testify/assert"
)
func Test_CheckMove_validPawnMove(t *testing.T) {
var board = make(Board)
board[types.Coordinate{Col: 1, Row: 1}] = Pawn{Color: types.White}
board[types.Coordinate{Col: 1, Row: 5}] = King{Color: types.White}
board[types.Coordinate{Col: 8, Row: 5}] = King{Color: types.Black}
move := types.Move{
StartSquare: types.Coordinate{Col: 1, Row: 1},
EndSquare: types.Coordinate{Col: 1, Row: 2},
}
good, _ := board.CheckMove(move)
assert.True(t, good)
}
func Test_CheckMove_invalidPawnMoves(t *testing.T) {
var board = make(Board)
board[types.Coordinate{Col: 2, Row: 5}] = Pawn{Color: types.White}
board[types.Coordinate{Col: 1, Row: 5}] = King{Color: types.White}
board[types.Coordinate{Col: 7, Row: 5}] = Queen{Color: types.Black}
board[types.Coordinate{Col: 8, Row: 5}] = King{Color: types.Black}
move := types.Move{
StartSquare: types.Coordinate{Col: 2, Row: 5},
EndSquare: types.Coordinate{Col: 2, Row: 6},
}
t.Run("pawn is blocked", func(t *testing.T) {
testBoard := board.getCopyOfBoard()
testBoard[types.Coordinate{Col: 2, Row: 6}] = Pawn{Color: types.Black}
legalMove, _ := testBoard.CheckMove(move)
assert.False(t, legalMove)
})
t.Run("king of moving color is in check after move", func(t *testing.T) {
good, _ := board.CheckMove(move)
assert.False(t, good)
})
}
func Test_CheckMove_validPromotion(t *testing.T) {
var board Board = make(Board)
board[types.Coordinate{Col: 1, Row: 7}] = Pawn{Color: types.White}
board[types.Coordinate{Col: 1, Row: 1}] = King{Color: types.White}
board[types.Coordinate{Col: 8, Row: 7}] = King{Color: types.Black}
shortName := types.Queen
move := types.Move{
StartSquare: types.Coordinate{Col: 1, Row: 7},
EndSquare: types.Coordinate{Col: 1, Row: 8},
PromotionToPiece: &shortName,
}
good, reason := board.CheckMove(move)
assert.Empty(t, reason)
assert.True(t, good)
}

View File

@ -1,8 +1,8 @@
package chess package chess
import ( import (
"local/m/mchess_server/api" "mchess_server/api"
"local/m/mchess_server/types" "mchess_server/types"
"log" "log"
"time" "time"

View File

@ -1,22 +1,15 @@
package chess package chess
import "local/m/mchess_server/types" import "mchess_server/types"
type King struct { type King struct {
Color types.ChessColor Color types.ChessColor
HasMoved bool
} }
// AfterMoveAction implements Piece.
func (k King) AfterMoveAction() {
k.HasMoved = true
}
// GetColor implements Piece.
func (k King) GetColor() types.ChessColor { func (k King) GetColor() types.ChessColor {
return k.Color return k.Color
} }
func (k King) GetAllLegalAndIllegalMoves(board Board, fromSquare types.Coordinate) []types.Coordinate { func (k King) GetAllMovesButBlocked(board Board, fromSquare types.Coordinate) []types.Coordinate {
return []types.Coordinate{} return []types.Coordinate{}
} }

View File

@ -1,19 +1,19 @@
package chess package chess
import "local/m/mchess_server/types" import "mchess_server/types"
type Knight struct { type Knight struct {
Color types.ChessColor Color types.ChessColor
} }
// AfterMoveAction implements Piece. // AfterMoveAction implements Piece.
func (Knight) AfterMoveAction() { func (k Knight) AfterMoveAction() {
} }
func (k Knight) GetColor() types.ChessColor { func (k Knight) GetColor() types.ChessColor {
return k.Color return k.Color
} }
func (k Knight) GetAllLegalAndIllegalMoves(board Board, fromSquare types.Coordinate) []types.Coordinate { func (k Knight) GetAllMovesButBlocked(board Board, fromSquare types.Coordinate) []types.Coordinate {
return []types.Coordinate{} return []types.Coordinate{}
} }

View File

@ -1,21 +1,16 @@
package chess package chess
import ( import (
"local/m/mchess_server/types" "mchess_server/types"
"github.com/samber/lo" "github.com/samber/lo"
) )
type Pawn struct { type Pawn struct {
Color types.ChessColor Color types.ChessColor
HasMoved bool
} }
func (p Pawn) AfterMoveAction() { func (p Pawn) GetAllMovesButBlocked(board Board, fromSquare types.Coordinate) []types.Coordinate {
p.HasMoved = true
}
func (p Pawn) GetAllLegalAndIllegalMoves(board Board, fromSquare types.Coordinate) []types.Coordinate {
theoreticalSquares := p.getAllMoves(fromSquare) theoreticalSquares := p.getAllMoves(fromSquare)
legalSquares := p.filterBlockedSquares(board, fromSquare, theoreticalSquares) legalSquares := p.filterBlockedSquares(board, fromSquare, theoreticalSquares)
@ -31,34 +26,38 @@ func (p Pawn) getAllMoves(fromSquare types.Coordinate) []types.Coordinate {
switch p.Color { switch p.Color {
case types.Black: case types.Black:
if fromSquare.Down(1) != nil { firstMove := fromSquare.Row == types.RangeLastValid-1
if fromSquare.Down(1) != nil {
theoreticalMoves = append(theoreticalMoves, *fromSquare.Down(1)) theoreticalMoves = append(theoreticalMoves, *fromSquare.Down(1))
} }
if !p.HasMoved && fromSquare.Down(2) != nil { if firstMove && fromSquare.Down(2) != nil {
theoreticalMoves = append(theoreticalMoves, *fromSquare.Down(2)) theoreticalMoves = append(theoreticalMoves, *fromSquare.Down(2))
} }
if lowerRight := fromSquare.Down(1).Right(1); lowerRight != nil { if lowerRight := fromSquare.Down(1).Right(1); lowerRight != nil {
theoreticalMoves = append(theoreticalMoves, *lowerRight) theoreticalMoves = append(theoreticalMoves, *lowerRight)
} }
if lowerLeft := fromSquare.Down(1).Left(1); lowerLeft != nil { if lowerLeft := fromSquare.Down(1).Left(1); lowerLeft != nil {
theoreticalMoves = append(theoreticalMoves, *lowerLeft) theoreticalMoves = append(theoreticalMoves, *lowerLeft)
} }
case types.White: case types.White:
firstMove := fromSquare.Row == types.RangeFirstValid+1
if fromSquare.Up(1) != nil { if fromSquare.Up(1) != nil {
theoreticalMoves = append(theoreticalMoves, *fromSquare.Up(1)) theoreticalMoves = append(theoreticalMoves, *fromSquare.Up(1))
} }
if !p.HasMoved && fromSquare.Up(2) != nil { if firstMove && fromSquare.Up(2) != nil {
theoreticalMoves = append(theoreticalMoves, *fromSquare.Up(2)) theoreticalMoves = append(theoreticalMoves, *fromSquare.Up(2))
} }
if upperRight := fromSquare.Up(1).Right(1); upperRight != nil { if upperRight := fromSquare.Up(1).Right(1); upperRight != nil {
theoreticalMoves = append(theoreticalMoves, *upperRight) theoreticalMoves = append(theoreticalMoves, *upperRight)
} }
if upperLeft := fromSquare.Up(1).Left(1); upperLeft != nil { if upperLeft := fromSquare.Up(1).Left(1); upperLeft != nil {
theoreticalMoves = append(theoreticalMoves, *upperLeft) theoreticalMoves = append(theoreticalMoves, *upperLeft)
} }
} }
return theoreticalMoves return theoreticalMoves

View File

@ -1,11 +1,30 @@
package chess package chess
import ( import (
"local/m/mchess_server/types" "mchess_server/types"
) )
type Piece interface { type Piece interface {
GetAllLegalAndIllegalMoves(board Board, fromSquare types.Coordinate) []types.Coordinate GetAllMovesButBlocked(board Board, fromSquare types.Coordinate) []types.Coordinate
GetColor() types.ChessColor GetColor() types.ChessColor
AfterMoveAction() }
func GetPieceForShortName(name types.PieceShortName) Piece {
var piece Piece
switch name {
case 'p':
piece = Pawn{}
case 'q':
piece = Queen{}
case 'k':
piece = King{}
case 'b':
piece = Bishop{}
case 'r':
piece = Rook{}
case 'n':
piece = Knight{}
}
return piece
} }

View File

@ -4,8 +4,8 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"errors" "errors"
"local/m/mchess_server/api" "mchess_server/api"
"local/m/mchess_server/types" "mchess_server/types"
"log" "log"
"time" "time"

View File

@ -1,18 +1,15 @@
package chess package chess
import "local/m/mchess_server/types" import "mchess_server/types"
type Queen struct { type Queen struct {
Color types.ChessColor Color types.ChessColor
} }
func (Queen) AfterMoveAction() {
}
func (q Queen) GetColor() types.ChessColor { func (q Queen) GetColor() types.ChessColor {
return q.Color return q.Color
} }
func (q Queen) GetAllLegalAndIllegalMoves(board Board, fromSquare types.Coordinate) []types.Coordinate { func (q Queen) GetAllMovesButBlocked(board Board, fromSquare types.Coordinate) []types.Coordinate {
return []types.Coordinate{} return []types.Coordinate{}
} }

View File

@ -1,13 +1,12 @@
package chess package chess
import "local/m/mchess_server/types" import "mchess_server/types"
type Rook struct { type Rook struct {
Color types.ChessColor Color types.ChessColor
HasMoved bool
} }
func (Rook) AfterMoveAction() { func (r Rook) AfterMoveAction() {
} }
// GetColor implements Piece. // GetColor implements Piece.
@ -15,6 +14,6 @@ func (r Rook) GetColor() types.ChessColor {
return r.Color return r.Color
} }
func (r Rook) GetAllLegalAndIllegalMoves(board Board, fromSquare types.Coordinate) []types.Coordinate { func (r Rook) GetAllMovesButBlocked(board Board, fromSquare types.Coordinate) []types.Coordinate {
return []types.Coordinate{} return []types.Coordinate{}
} }

6
go.mod
View File

@ -1,4 +1,4 @@
module local/m/mchess_server module mchess_server
go 1.20 go 1.20
@ -12,6 +12,7 @@ require (
require ( require (
github.com/bytedance/sonic v1.8.0 // indirect github.com/bytedance/sonic v1.8.0 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect
@ -25,7 +26,10 @@ require (
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/pelletier/go-toml/v2 v2.0.6 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/samber/lo v1.38.1 // indirect github.com/samber/lo v1.38.1 // indirect
github.com/stretchr/objx v0.5.0 // indirect
github.com/stretchr/testify v1.8.4 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.9 // indirect github.com/ugorji/go/codec v1.2.9 // indirect
golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect

3
go.sum
View File

@ -74,6 +74,7 @@ github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM=
github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
@ -83,6 +84,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=

View File

@ -1,7 +1,7 @@
package lobby_registry package lobby_registry
import ( import (
"local/m/mchess_server/chess" "mchess_server/chess"
"github.com/google/uuid" "github.com/google/uuid"
) )
@ -22,10 +22,10 @@ func NewEmptyLobbyWithUUID(uuid uuid.UUID) *Lobby {
} }
} }
func (w *Lobby) AddPlayerAndStartGameIfFull(player *chess.Player) { func (l *Lobby) AddPlayerAndStartGameIfFull(player *chess.Player) {
w.Game.AddPlayersToGame(player) l.Game.AddPlayersToGame(player)
if w.IsFull() { if l.IsFull() {
go w.Game.Handle() go l.Game.Handle()
} }
} }

View File

@ -4,10 +4,10 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"local/m/mchess_server/api" "mchess_server/api"
"local/m/mchess_server/chess" "mchess_server/chess"
lobbies "local/m/mchess_server/lobby_registry" lobbies "mchess_server/lobby_registry"
"local/m/mchess_server/usher" "mchess_server/usher"
"log" "log"
"net/http" "net/http"
"os" "os"

View File

@ -45,22 +45,6 @@ func (c Coordinate) Left(number int) *Coordinate {
return nil return nil
} }
type Move struct {
StartSquare Coordinate `json:"startSquare"`
EndSquare Coordinate `json:"endSquare"`
}
type PieceClass string
const (
Pawn PieceClass = "pawn"
Rook PieceClass = "rook"
Knight PieceClass = "knight"
Bishop PieceClass = "bishop"
Queen PieceClass = "queen"
King PieceClass = "king"
)
type ChessColor string type ChessColor string
const ( const (

14
types/move.go Normal file
View File

@ -0,0 +1,14 @@
package types
type Move struct {
StartSquare Coordinate `json:"startSquare"`
EndSquare Coordinate `json:"endSquare"`
PromotionToPiece *PieceShortName `json:"promotionToPiece,omitempty"`
}
func (m Move) IsPromotionMove() bool {
if m.PromotionToPiece != nil {
return true
}
return false
}

12
types/shortname.go Normal file
View File

@ -0,0 +1,12 @@
package types
type PieceShortName rune
const (
Pawn PieceShortName = 'p'
Rook PieceShortName = 'r'
Knight PieceShortName = 'n'
Bishop PieceShortName = 'b'
Queen PieceShortName = 'q'
King PieceShortName = 'k'
)

View File

@ -1,8 +1,8 @@
package usher package usher
import ( import (
"local/m/mchess_server/chess" "mchess_server/chess"
lobbies "local/m/mchess_server/lobby_registry" lobbies "mchess_server/lobby_registry"
) )
type Usher struct { type Usher struct {