04-14-2023, 01:01 PM
Here's the code, I don't know if it's the fastest way to do it but does the job
Code:
(game "HowToPlaceNeutralPiece"
(players 2)
(equipment
{
(board (square 8))
(regions "Central4x4" Neutral
(difference (difference (difference (difference (sites Inner) (sites Column 1)) (sites Column 6)) (sites Row 1)) (sites Row 6))
)
(regions "TopLeftCorner" Neutral (sites {48 56 57}))
(regions "TopRightCorner" Neutral (sites {62 63 55}))
(regions "BottomRightCorner" Neutral (sites {15 7 6}))
(regions "BottomLeftCorner" Neutral (sites {1 0 8}))
(regions "Corners" Neutral (union {(sites "TopLeftCorner") (sites "TopRightCorner") (sites "BottomRightCorner") (sites "BottomLeftCorner")}))
(regions "PerimeterMinusCorners" Neutral (difference (sites Perimeter) (sites "Corners")))
(piece "Dot" Neutral)
(piece "Rook" Each)
(piece "Pawn" Each)
}
)
(rules
phases:
{
(phase "FirstTwoNeutralPieces"
(play
(move Add
(piece "Dot0")
(to
(forEach (sites "Central4x4")
if:
(and
{
// can't be placed on an already occupied site
(is Empty (site))
// cannot be collinear
(= 0
(count Pieces All in:(sites LineOfSight at:(site) Orthogonal))
)
// cannot be connect diagonally
(= 0
(count Pieces All in:(sites Around (site) Diagonal))
)
}
)
)
)
)
)
(nextPhase (= (count Moves) 2) "LastFourNeutralPieces")
)
(phase "LastFourNeutralPieces"
(play
(move Add
(piece "Dot0")
(to
(forEach (sites "PerimeterMinusCorners")
if:
(and
{
// can't be placed on an already occupied site
(is Empty (site))
// cannot be collinear
(= 0
(count Pieces All in:(sites LineOfSight at:(site) Orthogonal))
)
}
)
)
)
)
)
(nextPhase (= (count Moves) 6) "RookPhase")
)
(phase "RookPhase"
(play
(if
(= 1 (mover))
(move Add (piece "Rook1") (to (sites "Corners")))
(move Add
(piece "Rook2")
(to
// series of if that checks which corner is occupied by the first rook, and returns the opposite corner
(if
(= 1 (count Pieces P1 in:(sites "TopLeftCorner")))
(sites "BottomRightCorner")
(if
(= 1 (count Pieces P1 in:(sites "TopRightCorner")))
(sites "BottomLeftCorner")
(if
(= 1 (count Pieces P1 in:(sites "BottomRightCorner")))
(sites "TopLeftCorner")
(sites "TopRightCorner")
)
)
)
)
)
)
)
(nextPhase (= (count Moves) 8) "PawnPhase")
)
(phase "PawnPhase"
(play
(if
(= 1 (mover))
(move Add (piece "Pawn1") (to (sites Empty)))
(move Add (piece "Pawn2") (to (sites Empty)))
)
)
(end (if (no Moves Next) (result All Draw)))
)
}
)
)