@@ -104,30 +104,29 @@ abstract class Variant private[variant] (
104
104
val activePlayerPieces = situation.board.piecesOf(situation.player)
105
105
val opponentPieces = situation.board.piecesOf(! situation.player)
106
106
107
- def createMove (category : String , orig : Pos , dest : Pos ) = Move (Piece (situation.player, Role .defaultRole), orig, dest, situation, boardAfter(situation, orig, dest), true , if (category == " pushout " ) Some (dest) else None )
107
+ def createMove (orig : Pos , dest : Pos , capture : Boolean = false ) = Move (Piece (situation.player, Role .defaultRole), orig, dest, situation, boardAfter(situation, orig, dest), true , if (capture ) Some (dest) else None )
108
108
109
109
def generateSideMoves (lineOfMarbles : List [Pos ], direction : Direction ): List [Move ] = {
110
110
def canMoveTowards (pos : Pos , direction : Direction ): Boolean = situation.board.isEmptySquare(direction(pos))
111
111
112
- def possibleSideMoves : List [(Pos , Pos , Direction )] = Pos .sideMovesDirsFromDir(direction).flatMap(
112
+ def possibleSideMoves : List [(Pos , Pos )] = Pos .sideMovesDirsFromDir(direction).flatMap(
113
113
dir =>
114
114
if (lineOfMarbles.map(
115
115
(pos) => canMoveTowards(pos, dir)
116
116
).contains(false )) None
117
117
else (
118
118
lineOfMarbles.headOption,
119
- lineOfMarbles.reverse.headOption.flatMap(dir(_)),
120
- dir
119
+ lineOfMarbles.reverse.headOption.flatMap(dir(_))
121
120
) match {
122
- case ( (Some (head), Some (tail), dir ) ) => Some ( (head, tail, dir ) )
121
+ case ( (Some (head), Some (tail)) ) => Some ( (head, tail) )
123
122
case _ => None
124
123
}
125
124
)
126
125
127
126
List (
128
127
if (lineOfMarbles.size == 3 ) generateSideMoves(lineOfMarbles.dropRight(1 ), direction) else List (),
129
128
possibleSideMoves.flatMap {
130
- case ( (orig, dest, _ ) ) => Some (createMove(" side " , orig, dest))
129
+ case ( (orig, dest) ) => Some (createMove(orig, dest))
131
130
case _ => None
132
131
}
133
132
).flatten
@@ -139,30 +138,30 @@ abstract class Variant private[variant] (
139
138
direction(neighbour).toList.flatMap {
140
139
case (thirdSquareInLine) => {
141
140
if (situation.board.isEmptySquare(Some (thirdSquareInLine))) // xx.
142
- Some (createMove(" line " , pos, thirdSquareInLine))
141
+ Some (createMove(pos, thirdSquareInLine))
143
142
else if (opponentPieces.contains(thirdSquareInLine)) // xxo
144
143
direction(thirdSquareInLine) match { // xxo?
145
- case None => Some (createMove(" pushout " , pos, thirdSquareInLine)) // xxo\
144
+ case None => Some (createMove(pos, thirdSquareInLine, true )) // xxo\
146
145
case Some (emptySquare) if situation.board.isEmptySquare(Some (emptySquare)) => {
147
- Some (createMove(" push " , pos, thirdSquareInLine)) // xxo.
146
+ Some (createMove(pos, thirdSquareInLine)) // xxo.
148
147
}
149
148
case _ => None
150
149
}
151
150
else if (activePlayerPieces.contains(thirdSquareInLine)) // xxx
152
151
direction(thirdSquareInLine).flatMap {
153
152
case (fourthSquareInLine) => // xxx_
154
153
if (situation.board.isEmptySquare(Some (fourthSquareInLine))) // xxx.
155
- Some (createMove(" line " , pos, fourthSquareInLine))
154
+ Some (createMove(pos, fourthSquareInLine))
156
155
else if (opponentPieces.contains(fourthSquareInLine)) // xxxo
157
156
direction(fourthSquareInLine) match { // xxxo?
158
- case None => Some (createMove(" pushout " , pos, fourthSquareInLine)) // xxxo\
159
- case Some (emptyPos) if (situation.board.isEmptySquare(Some (emptyPos))) => Some (createMove(" push " , pos, fourthSquareInLine)) // xxxo.
157
+ case None => Some (createMove(pos, fourthSquareInLine, true )) // xxxo\
158
+ case Some (emptyPos) if (situation.board.isEmptySquare(Some (emptyPos))) => Some (createMove(pos, fourthSquareInLine)) // xxxo.
160
159
case _ => direction(fourthSquareInLine).flatMap { // xxxo?
161
160
case (fifthSquareInLine) =>
162
161
if (opponentPieces.contains(fifthSquareInLine)) // xxxoo
163
162
direction(fifthSquareInLine) match {
164
- case None => Some (createMove(" pushout " , pos, fourthSquareInLine)) // xxxoo\
165
- case Some (emptySquare) if situation.board.isEmptySquare(Some (emptySquare)) => Some (createMove(" push " , pos, emptySquare)) // xxxoo.
163
+ case None => Some (createMove(pos, fourthSquareInLine, true )) // xxxoo\
164
+ case Some (emptySquare) if situation.board.isEmptySquare(Some (emptySquare)) => Some (createMove(pos, emptySquare)) // xxxoo.
166
165
case _ => None
167
166
}
168
167
else None
@@ -197,20 +196,13 @@ abstract class Variant private[variant] (
197
196
situation.board.copy(pieces = piecesAfterAction(situation.board.pieces, orig, dest))
198
197
}
199
198
200
- def isSideMove (orig : Pos , dest : Pos ): Boolean = orig.dir(dest) match {
201
- case dirString if (dirString == " upRight" || dirString == " downLeft" ) =>
202
- if (orig.|<>| ((square) => square.index == dest.index, Pos .dirFromString(orig.dir(dest))) == Nil ) true
203
- else false
204
- case _ => orig.rank.index != dest.rank.index && orig.file.index != dest.file.index
205
- }
206
-
207
199
/*
208
200
How to move pieces based on orig, dest :
209
- A. Find direction between orig and dest
201
+ A. Find direction between orig and dest (in case of a sideMove this will always be "upY" or "downX")
210
202
B. Determine the kind of move (side move or not)
211
203
C. play the move
212
204
- side move :
213
- Based on the 2 directions computed in A, applied to origin to land on a square,
205
+ Based on the 2 directions computed in A (vertical + horizontal) , applied to origin to land on a square,
214
206
find out which square :
215
207
- is the empty square (it's the sideMoveSideDir)
216
208
- contains the marble used to do a side move (it's the sideMoveLineDir)
@@ -233,15 +225,15 @@ abstract class Variant private[variant] (
233
225
case _ => None
234
226
}
235
227
}.headOption
236
- val sideMoveSideDir : Option [Direction ] = Pos .possibleLineDirsFromSideMoveDir(origToDestDir).flatMap {
228
+ val sideDir : Option [Direction ] = Pos .possibleLineDirsFromSideMoveDir(origToDestDir).flatMap {
237
229
direction => direction(orig) match {
238
230
case (Some (squareInLine)) if (! pieces.contains(squareInLine)) => Some (direction)
239
231
case _ => None
240
232
}
241
233
}.headOption
242
234
val lineDirSecondPos : Option [Pos ] = lineDir.flatMap(direction => direction(orig))
243
235
val lineDirThirdPos : Option [Pos ] = lineDirSecondPos.flatMap(direction => lineDir.flatMap(_(direction)))
244
- val sideMovePosFromOrig : Option [Pos ] = sideMoveSideDir .flatMap(direction => direction(orig))
236
+ val sideMovePosFromOrig : Option [Pos ] = sideDir .flatMap(direction => direction(orig))
245
237
val diagonalPosFromOrig : Option [Pos ] = (lineDir, sideMovePosFromOrig) match {
246
238
case ( Some (someLineDir), Some (origSideMove) ) => someLineDir(origSideMove)
247
239
case _ => None
@@ -327,6 +319,13 @@ abstract class Variant private[variant] (
327
319
328
320
override def hashCode : Int = id
329
321
322
+ private def isSideMove (orig : Pos , dest : Pos ): Boolean = orig.dir(dest) match {
323
+ case dirString if (dirString == " upRight" || dirString == " downLeft" ) =>
324
+ if (orig.|<>| ((square) => square.index == dest.index, Pos .dirFromString(orig.dir(dest))) == Nil ) true // if we can't reach dest from orig using only the same direction.
325
+ else false
326
+ case _ => orig.rank.index != dest.rank.index && orig.file.index != dest.file.index
327
+ }
328
+
330
329
private def turnPieces (situation : Situation ): PieceMap = situation.board.piecesOf(situation.player)
331
330
332
331
val kingPiece : Option [Role ] = None
0 commit comments