diff --git a/.gitignore b/.gitignore index 3b735ec..21bda7b 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,6 @@ # Go workspace file go.work + +*.env +temp diff --git a/build/.keep b/build/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/build/app.Dockerfile b/build/app.Dockerfile new file mode 100644 index 0000000..0183121 --- /dev/null +++ b/build/app.Dockerfile @@ -0,0 +1,14 @@ +FROM golang:1.22.0-alpine3.19 as build +WORKDIR /src +COPY go.mod go.sum /src/ +RUN go mod download && go mod verify +COPY cmd /src/cmd +COPY internal /src/internal +COPY website /src/website +RUN go build -o /app/app /src/cmd/thunderlight/thunderlight.go + +FROM alpine:3.19 +WORKDIR /app +COPY --from=build /app/app /app/app +EXPOSE 80 +CMD ["/app/app"] diff --git a/deployment/.keep b/deployment/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/deployment/docker-compose.yaml b/deployment/docker-compose.yaml new file mode 100644 index 0000000..cbdcad7 --- /dev/null +++ b/deployment/docker-compose.yaml @@ -0,0 +1,46 @@ +version: '3' + +services: + # App container + app: + build: + context: ../ + dockerfile: build/app.Dockerfile + image: thunderlight-app:latest + container_name: app + environment: + - MYSQL_LINK=${MYSQL_USER}:${MYSQL_PASSWORD}@tcp(database:3306)/${MYSQL_DATABASE}?charset=utf8&parseTime=True&loc=Local + networks: + - app-network + ports: + - 80:80 + depends_on: + database: + condition: service_healthy + + # MySQL container + database: + image: mysql:8.3.0 + container_name: database + environment: + - MYSQL_DATABASE=${MYSQL_DATABASE} + - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} + - MYSQL_PASSWORD=${MYSQL_PASSWORD} + - MYSQL_USER=${MYSQL_USER} + volumes: + - db-data:/var/lib/mysql:rw + networks: + - app-network + ports: + - 3306:3306 + healthcheck: + test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"] + timeout: 20s + retries: 10 + + +networks: + app-network: + driver: bridge +volumes: + db-data: diff --git a/go.mod b/go.mod index 41d3617..2662b8f 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,11 @@ module github.com/thunderlight-shogi/engine go 1.22.0 + +require ( + github.com/go-sql-driver/mysql v1.7.1 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + gorm.io/driver/mysql v1.5.4 + gorm.io/gorm v1.25.7 +) diff --git a/go.sum b/go.sum index e69de29..6c41eab 100644 --- a/go.sum +++ b/go.sum @@ -0,0 +1,12 @@ +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +gorm.io/driver/mysql v1.5.4 h1:igQmHfKcbaTVyAIHNhhB888vvxh8EdQ2uSUT0LPcBso= +gorm.io/driver/mysql v1.5.4/go.mod h1:9rYxJph/u9SWkWc9yY4XJ1F/+xO0S/ChOmbk3+Z5Tvs= +gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/gorm v1.25.7 h1:VsD6acwRjz2zFxGO50gPO6AkNs7KKnvfzUjHQhZDz/A= +gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= diff --git a/internal/database/.keep b/internal/database/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/internal/model/model.go b/internal/model/model.go new file mode 100644 index 0000000..b1a2903 --- /dev/null +++ b/internal/model/model.go @@ -0,0 +1,70 @@ +package model + +import ( + "os" + + "gorm.io/driver/mysql" + "gorm.io/gorm" +) + +type Player uint + +const ( + Sente Player = iota + Gote +) + +type FigureType struct { + Id uint `gorm:"primarykey"` + Name string + Moves []Move `gorm:"foreignKey:FigureTypeId"` + TurnFigureId *uint + TurnFigure *FigureType +} + +type StartingPosition struct { + Id uint `gorm:"primarykey"` + Name string + Figures []StartingPositionFigure `gorm:"foreignKey:StartingPositionId"` +} + +type Move struct { + Id uint `gorm:"primarykey"` + FigureTypeId uint + HorizontalShift int + VerticalShift int +} + +type StartingPositionFigure struct { + Id uint `gorm:"primarykey"` + StartingPositionId uint + FigureTypeId uint + FigureType FigureType + HorizontalOffset uint + VerticalOffset uint + Player Player +} + +var db *gorm.DB + +func init() { + link, ok := os.LookupEnv("MYSQL_LINK") + if !ok { + panic("MYSQL_LINK environment variable is undefined") + } + var err error + db, err = gorm.Open(mysql.Open(link), &gorm.Config{}) + if err != nil { + panic("failed to connect database") + } + db.AutoMigrate(&StartingPosition{}, &StartingPositionFigure{}, &FigureType{}, &Move{}) + + result := db.Find(&FigureType{}) + if result.RowsAffected == 0 { + seed() + } +} + +func GetDB() *gorm.DB { + return db +} diff --git a/internal/model/seeder.go b/internal/model/seeder.go new file mode 100644 index 0000000..3956e36 --- /dev/null +++ b/internal/model/seeder.go @@ -0,0 +1,1129 @@ +package model + +func seed() { + // Silver+ + SilverPlus := FigureType{ + Name: "Silver+", + Moves: []Move{ + { + HorizontalShift: 1, + VerticalShift: -1, + }, + { + HorizontalShift: 0, + VerticalShift: -1, + }, + { + HorizontalShift: 1, + VerticalShift: -1, + }, + { + HorizontalShift: 1, + VerticalShift: 0, + }, + { + HorizontalShift: -1, + VerticalShift: 0, + }, + { + HorizontalShift: 0, + VerticalShift: 1, + }, + }, + } + + // Knight+ + KnightPlus := FigureType{ + Name: "Knight+", + Moves: []Move{ + { + HorizontalShift: 1, + VerticalShift: -1, + }, + { + HorizontalShift: 0, + VerticalShift: -1, + }, + { + HorizontalShift: 1, + VerticalShift: -1, + }, + { + HorizontalShift: 1, + VerticalShift: 0, + }, + { + HorizontalShift: -1, + VerticalShift: 0, + }, + { + HorizontalShift: 0, + VerticalShift: 1, + }, + }, + } + + // Lance+ + LancePlus := FigureType{ + Name: "Lance+", + Moves: []Move{ + { + HorizontalShift: 1, + VerticalShift: -1, + }, + { + HorizontalShift: 0, + VerticalShift: -1, + }, + { + HorizontalShift: 1, + VerticalShift: -1, + }, + { + HorizontalShift: 1, + VerticalShift: 0, + }, + { + HorizontalShift: -1, + VerticalShift: 0, + }, + { + HorizontalShift: 0, + VerticalShift: 1, + }, + }, + } + + // Pawn+ + PawnPlus := FigureType{ + Name: "Pawn+", + Moves: []Move{ + { + HorizontalShift: 1, + VerticalShift: -1, + }, + { + HorizontalShift: 0, + VerticalShift: -1, + }, + { + HorizontalShift: 1, + VerticalShift: -1, + }, + { + HorizontalShift: 1, + VerticalShift: 0, + }, + { + HorizontalShift: -1, + VerticalShift: 0, + }, + { + HorizontalShift: 0, + VerticalShift: 1, + }, + }, + } + // Rook+ + RookPlus := FigureType{ + Name: "Rook+", + Moves: []Move{ + { + HorizontalShift: 0, + VerticalShift: -1, + }, + { + HorizontalShift: 0, + VerticalShift: -2, + }, + { + HorizontalShift: 0, + VerticalShift: -3, + }, + { + HorizontalShift: 0, + VerticalShift: -4, + }, + { + HorizontalShift: 0, + VerticalShift: -5, + }, + { + HorizontalShift: 0, + VerticalShift: -6, + }, + { + HorizontalShift: 0, + VerticalShift: -7, + }, + { + HorizontalShift: 0, + VerticalShift: -8, + }, + + { + HorizontalShift: 0, + VerticalShift: 1, + }, + { + HorizontalShift: 0, + VerticalShift: 2, + }, + { + HorizontalShift: 0, + VerticalShift: 3, + }, + { + HorizontalShift: 0, + VerticalShift: 4, + }, + { + HorizontalShift: 0, + VerticalShift: 5, + }, + { + HorizontalShift: 0, + VerticalShift: 6, + }, + { + HorizontalShift: 0, + VerticalShift: 7, + }, + { + HorizontalShift: 0, + VerticalShift: 8, + }, + + { + HorizontalShift: -1, + VerticalShift: 0, + }, + { + HorizontalShift: -2, + VerticalShift: 0, + }, + { + HorizontalShift: -3, + VerticalShift: 0, + }, + { + HorizontalShift: -4, + VerticalShift: 0, + }, + { + HorizontalShift: -5, + VerticalShift: 0, + }, + { + HorizontalShift: -6, + VerticalShift: 0, + }, + { + HorizontalShift: -7, + VerticalShift: 0, + }, + { + HorizontalShift: -8, + VerticalShift: 0, + }, + + { + HorizontalShift: 1, + VerticalShift: 0, + }, + { + HorizontalShift: 2, + VerticalShift: 0, + }, + { + HorizontalShift: 3, + VerticalShift: 0, + }, + { + HorizontalShift: 4, + VerticalShift: 0, + }, + { + HorizontalShift: 5, + VerticalShift: 0, + }, + { + HorizontalShift: 6, + VerticalShift: 0, + }, + { + HorizontalShift: 7, + VerticalShift: 0, + }, + { + HorizontalShift: 8, + VerticalShift: 0, + }, + + { + HorizontalShift: 1, + VerticalShift: 1, + }, + { + HorizontalShift: -1, + VerticalShift: 1, + }, + { + HorizontalShift: 1, + VerticalShift: -1, + }, + { + HorizontalShift: -1, + VerticalShift: -1, + }, + }, + } + + // Bishop+ + BishopPlus := FigureType{ + Name: "Bishop+", + Moves: []Move{ + { + HorizontalShift: 1, + VerticalShift: 1, + }, + { + HorizontalShift: 2, + VerticalShift: 2, + }, + { + HorizontalShift: 3, + VerticalShift: 3, + }, + { + HorizontalShift: 4, + VerticalShift: 4, + }, + { + HorizontalShift: 5, + VerticalShift: 5, + }, + { + HorizontalShift: 6, + VerticalShift: 6, + }, + { + HorizontalShift: 7, + VerticalShift: 7, + }, + { + HorizontalShift: 8, + VerticalShift: 8, + }, + { + HorizontalShift: -1, + VerticalShift: 1, + }, + { + HorizontalShift: -2, + VerticalShift: 2, + }, + { + HorizontalShift: -3, + VerticalShift: 3, + }, + { + HorizontalShift: -4, + VerticalShift: 4, + }, + { + HorizontalShift: -5, + VerticalShift: 5, + }, + { + HorizontalShift: -6, + VerticalShift: 6, + }, + { + HorizontalShift: -7, + VerticalShift: 7, + }, + { + HorizontalShift: -8, + VerticalShift: 8, + }, + { + HorizontalShift: 1, + VerticalShift: -1, + }, + { + HorizontalShift: 2, + VerticalShift: -2, + }, + { + HorizontalShift: 3, + VerticalShift: -3, + }, + { + HorizontalShift: 4, + VerticalShift: -4, + }, + { + HorizontalShift: 5, + VerticalShift: -5, + }, + { + HorizontalShift: 6, + VerticalShift: -6, + }, + { + HorizontalShift: 7, + VerticalShift: -7, + }, + { + HorizontalShift: 8, + VerticalShift: -8, + }, + { + HorizontalShift: -1, + VerticalShift: -1, + }, + { + HorizontalShift: -2, + VerticalShift: -2, + }, + { + HorizontalShift: -3, + VerticalShift: -3, + }, + { + HorizontalShift: -4, + VerticalShift: -4, + }, + { + HorizontalShift: -5, + VerticalShift: -5, + }, + { + HorizontalShift: -6, + VerticalShift: -6, + }, + { + HorizontalShift: -7, + VerticalShift: -7, + }, + { + HorizontalShift: -8, + VerticalShift: -8, + }, + + { + HorizontalShift: 0, + VerticalShift: -1, + }, + { + HorizontalShift: 0, + VerticalShift: 1, + }, + { + HorizontalShift: -1, + VerticalShift: 0, + }, + { + HorizontalShift: 1, + VerticalShift: 0, + }, + }, + } + + // King + King := FigureType{ + Name: "King", + Moves: []Move{ + { + HorizontalShift: -1, + VerticalShift: -1, + }, + { + HorizontalShift: -1, + VerticalShift: 0, + }, + { + HorizontalShift: -1, + VerticalShift: 1, + }, + { + HorizontalShift: 0, + VerticalShift: -1, + }, + { + HorizontalShift: 0, + VerticalShift: 1, + }, + { + HorizontalShift: 1, + VerticalShift: -1, + }, + { + HorizontalShift: 1, + VerticalShift: 0, + }, + { + HorizontalShift: 1, + VerticalShift: 1, + }, + }, + } + + // Gold + Gold := FigureType{ + Name: "Gold", + Moves: []Move{ + { + HorizontalShift: 1, + VerticalShift: -1, + }, + { + HorizontalShift: 0, + VerticalShift: -1, + }, + { + HorizontalShift: 1, + VerticalShift: -1, + }, + { + HorizontalShift: 1, + VerticalShift: 0, + }, + { + HorizontalShift: -1, + VerticalShift: 0, + }, + { + HorizontalShift: 0, + VerticalShift: 1, + }, + }, + } + + // Silver + Silver := FigureType{ + Name: "Silver", + Moves: []Move{ + { + HorizontalShift: 1, + VerticalShift: -1, + }, + { + HorizontalShift: 0, + VerticalShift: -1, + }, + { + HorizontalShift: 1, + VerticalShift: -1, + }, + { + HorizontalShift: 1, + VerticalShift: 1, + }, + { + HorizontalShift: -1, + VerticalShift: 1, + }, + }, + TurnFigure: &SilverPlus, + } + + // Knight + Knight := FigureType{ + Name: "Knight", + Moves: []Move{ + { + HorizontalShift: 1, + VerticalShift: -2, + }, + { + HorizontalShift: -1, + VerticalShift: -2, + }, + }, + TurnFigure: &KnightPlus, + } + + // Lance + Lance := FigureType{ + Name: "Lance", + Moves: []Move{ + { + HorizontalShift: 0, + VerticalShift: -1, + }, + { + HorizontalShift: 0, + VerticalShift: -2, + }, + { + HorizontalShift: 0, + VerticalShift: -3, + }, + { + HorizontalShift: 0, + VerticalShift: -4, + }, + { + HorizontalShift: 0, + VerticalShift: -5, + }, + { + HorizontalShift: 0, + VerticalShift: -6, + }, + { + HorizontalShift: 0, + VerticalShift: -7, + }, + { + HorizontalShift: 0, + VerticalShift: -8, + }, + }, + TurnFigure: &LancePlus, + } + + // Rook + Rook := FigureType{ + Name: "Rook", + Moves: []Move{ + { + HorizontalShift: 0, + VerticalShift: -1, + }, + { + HorizontalShift: 0, + VerticalShift: -2, + }, + { + HorizontalShift: 0, + VerticalShift: -3, + }, + { + HorizontalShift: 0, + VerticalShift: -4, + }, + { + HorizontalShift: 0, + VerticalShift: -5, + }, + { + HorizontalShift: 0, + VerticalShift: -6, + }, + { + HorizontalShift: 0, + VerticalShift: -7, + }, + { + HorizontalShift: 0, + VerticalShift: -8, + }, + + { + HorizontalShift: 0, + VerticalShift: 1, + }, + { + HorizontalShift: 0, + VerticalShift: 2, + }, + { + HorizontalShift: 0, + VerticalShift: 3, + }, + { + HorizontalShift: 0, + VerticalShift: 4, + }, + { + HorizontalShift: 0, + VerticalShift: 5, + }, + { + HorizontalShift: 0, + VerticalShift: 6, + }, + { + HorizontalShift: 0, + VerticalShift: 7, + }, + { + HorizontalShift: 0, + VerticalShift: 8, + }, + + { + HorizontalShift: -1, + VerticalShift: 0, + }, + { + HorizontalShift: -2, + VerticalShift: 0, + }, + { + HorizontalShift: -3, + VerticalShift: 0, + }, + { + HorizontalShift: -4, + VerticalShift: 0, + }, + { + HorizontalShift: -5, + VerticalShift: 0, + }, + { + HorizontalShift: -6, + VerticalShift: 0, + }, + { + HorizontalShift: -7, + VerticalShift: 0, + }, + { + HorizontalShift: -8, + VerticalShift: 0, + }, + + { + HorizontalShift: 1, + VerticalShift: 0, + }, + { + HorizontalShift: 2, + VerticalShift: 0, + }, + { + HorizontalShift: 3, + VerticalShift: 0, + }, + { + HorizontalShift: 4, + VerticalShift: 0, + }, + { + HorizontalShift: 5, + VerticalShift: 0, + }, + { + HorizontalShift: 6, + VerticalShift: 0, + }, + { + HorizontalShift: 7, + VerticalShift: 0, + }, + { + HorizontalShift: 8, + VerticalShift: 0, + }, + }, + TurnFigure: &RookPlus, + } + + // Bishop + Bishop := FigureType{ + Name: "Bishop", + Moves: []Move{ + { + HorizontalShift: 1, + VerticalShift: 1, + }, + { + HorizontalShift: 2, + VerticalShift: 2, + }, + { + HorizontalShift: 3, + VerticalShift: 3, + }, + { + HorizontalShift: 4, + VerticalShift: 4, + }, + { + HorizontalShift: 5, + VerticalShift: 5, + }, + { + HorizontalShift: 6, + VerticalShift: 6, + }, + { + HorizontalShift: 7, + VerticalShift: 7, + }, + { + HorizontalShift: 8, + VerticalShift: 8, + }, + { + HorizontalShift: -1, + VerticalShift: 1, + }, + { + HorizontalShift: -2, + VerticalShift: 2, + }, + { + HorizontalShift: -3, + VerticalShift: 3, + }, + { + HorizontalShift: -4, + VerticalShift: 4, + }, + { + HorizontalShift: -5, + VerticalShift: 5, + }, + { + HorizontalShift: -6, + VerticalShift: 6, + }, + { + HorizontalShift: -7, + VerticalShift: 7, + }, + { + HorizontalShift: -8, + VerticalShift: 8, + }, + { + HorizontalShift: 1, + VerticalShift: -1, + }, + { + HorizontalShift: 2, + VerticalShift: -2, + }, + { + HorizontalShift: 3, + VerticalShift: -3, + }, + { + HorizontalShift: 4, + VerticalShift: -4, + }, + { + HorizontalShift: 5, + VerticalShift: -5, + }, + { + HorizontalShift: 6, + VerticalShift: -6, + }, + { + HorizontalShift: 7, + VerticalShift: -7, + }, + { + HorizontalShift: 8, + VerticalShift: -8, + }, + { + HorizontalShift: -1, + VerticalShift: -1, + }, + { + HorizontalShift: -2, + VerticalShift: -2, + }, + { + HorizontalShift: -3, + VerticalShift: -3, + }, + { + HorizontalShift: -4, + VerticalShift: -4, + }, + { + HorizontalShift: -5, + VerticalShift: -5, + }, + { + HorizontalShift: -6, + VerticalShift: -6, + }, + { + HorizontalShift: -7, + VerticalShift: -7, + }, + { + HorizontalShift: -8, + VerticalShift: -8, + }, + }, + TurnFigure: &BishopPlus, + } + + // Pawn + Pawn := FigureType{ + Name: "Pawn", + Moves: []Move{ + { + HorizontalShift: 0, + VerticalShift: -1, + }, + }, + TurnFigure: &PawnPlus, + } + + db.Create([]*FigureType{&King, &Gold, &Silver, &Knight, &Lance, &Rook, &Bishop, &Pawn}) + + DefaultPosition := StartingPosition{ + Name: "Default", + Figures: []StartingPositionFigure{ + { + FigureType: Pawn, + HorizontalOffset: 1, + VerticalOffset: 3, + Player: Gote, + }, + { + FigureType: Pawn, + HorizontalOffset: 2, + VerticalOffset: 3, + Player: Gote, + }, + { + FigureType: Pawn, + HorizontalOffset: 3, + VerticalOffset: 3, + Player: Gote, + }, + { + FigureType: Pawn, + HorizontalOffset: 4, + VerticalOffset: 3, + Player: Gote, + }, + { + FigureType: Pawn, + HorizontalOffset: 5, + VerticalOffset: 3, + Player: Gote, + }, + { + FigureType: Pawn, + HorizontalOffset: 6, + VerticalOffset: 3, + Player: Gote, + }, + { + FigureType: Pawn, + HorizontalOffset: 7, + VerticalOffset: 3, + Player: Gote, + }, + { + FigureType: Pawn, + HorizontalOffset: 8, + VerticalOffset: 3, + Player: Gote, + }, + { + FigureType: Pawn, + HorizontalOffset: 9, + VerticalOffset: 3, + Player: Gote, + }, + + { + FigureType: Pawn, + HorizontalOffset: 1, + VerticalOffset: 7, + Player: Sente, + }, + { + FigureType: Pawn, + HorizontalOffset: 2, + VerticalOffset: 7, + Player: Sente, + }, + { + FigureType: Pawn, + HorizontalOffset: 3, + VerticalOffset: 7, + Player: Sente, + }, + { + FigureType: Pawn, + HorizontalOffset: 4, + VerticalOffset: 7, + Player: Sente, + }, + { + FigureType: Pawn, + HorizontalOffset: 5, + VerticalOffset: 7, + Player: Sente, + }, + { + FigureType: Pawn, + HorizontalOffset: 6, + VerticalOffset: 7, + Player: Sente, + }, + { + FigureType: Pawn, + HorizontalOffset: 7, + VerticalOffset: 7, + Player: Sente, + }, + { + FigureType: Pawn, + HorizontalOffset: 8, + VerticalOffset: 7, + Player: Sente, + }, + { + FigureType: Pawn, + HorizontalOffset: 9, + VerticalOffset: 7, + Player: Sente, + }, + + { + FigureType: Rook, + HorizontalOffset: 8, + VerticalOffset: 2, + Player: Gote, + }, + { + FigureType: Rook, + HorizontalOffset: 2, + VerticalOffset: 8, + Player: Sente, + }, + + { + FigureType: Bishop, + HorizontalOffset: 2, + VerticalOffset: 2, + Player: Gote, + }, + { + FigureType: Bishop, + HorizontalOffset: 8, + VerticalOffset: 8, + Player: Sente, + }, + + { + FigureType: Lance, + HorizontalOffset: 1, + VerticalOffset: 1, + Player: Gote, + }, + { + FigureType: Knight, + HorizontalOffset: 2, + VerticalOffset: 1, + Player: Gote, + }, + { + FigureType: Silver, + HorizontalOffset: 3, + VerticalOffset: 1, + Player: Gote, + }, + { + FigureType: Gold, + HorizontalOffset: 4, + VerticalOffset: 1, + Player: Gote, + }, + { + FigureType: King, + HorizontalOffset: 5, + VerticalOffset: 1, + Player: Gote, + }, + { + FigureType: Gold, + HorizontalOffset: 6, + VerticalOffset: 1, + Player: Gote, + }, + { + FigureType: Silver, + HorizontalOffset: 7, + VerticalOffset: 1, + Player: Gote, + }, + { + FigureType: Knight, + HorizontalOffset: 8, + VerticalOffset: 1, + Player: Gote, + }, + { + FigureType: Lance, + HorizontalOffset: 9, + VerticalOffset: 1, + Player: Gote, + }, + + { + FigureType: Lance, + HorizontalOffset: 1, + VerticalOffset: 9, + Player: Sente, + }, + { + FigureType: Knight, + HorizontalOffset: 2, + VerticalOffset: 9, + Player: Sente, + }, + { + FigureType: Silver, + HorizontalOffset: 3, + VerticalOffset: 9, + Player: Sente, + }, + { + FigureType: Gold, + HorizontalOffset: 4, + VerticalOffset: 9, + Player: Sente, + }, + { + FigureType: King, + HorizontalOffset: 5, + VerticalOffset: 9, + Player: Sente, + }, + { + FigureType: Gold, + HorizontalOffset: 6, + VerticalOffset: 9, + Player: Sente, + }, + { + FigureType: Silver, + HorizontalOffset: 7, + VerticalOffset: 9, + Player: Sente, + }, + { + FigureType: Knight, + HorizontalOffset: 8, + VerticalOffset: 9, + Player: Sente, + }, + { + FigureType: Lance, + HorizontalOffset: 9, + VerticalOffset: 9, + Player: Sente, + }, + }, + } + + db.Create(&DefaultPosition) +}