| using Unity.MLAgents.Integrations.Match3; |
|
|
| namespace Unity.MLAgentsExamples |
| { |
| public class Match3ExampleActuator : Match3Actuator |
| { |
| private Match3Board m_Board; |
| Match3Board Board => m_Board; |
|
|
| public Match3ExampleActuator(Match3Board board, |
| bool forceHeuristic, |
| string name, |
| int seed |
| ) |
| : base(board, forceHeuristic, seed, name) |
| { |
| m_Board = board; |
| } |
|
|
|
|
| protected override int EvalMovePoints(Move move) |
| { |
| var pointsByType = new[] { Board.BasicCellPoints, Board.SpecialCell1Points, Board.SpecialCell2Points }; |
| |
| var moveVal = Board.GetCellType(move.Row, move.Column); |
| var moveSpecial = Board.GetSpecialType(move.Row, move.Column); |
| var (otherRow, otherCol) = move.OtherCell(); |
| var oppositeVal = Board.GetCellType(otherRow, otherCol); |
| var oppositeSpecial = Board.GetSpecialType(otherRow, otherCol); |
|
|
|
|
| int movePoints = EvalHalfMove( |
| otherRow, otherCol, moveVal, moveSpecial, move.Direction, pointsByType |
| ); |
| int otherPoints = EvalHalfMove( |
| move.Row, move.Column, oppositeVal, oppositeSpecial, move.OtherDirection(), pointsByType |
| ); |
| return movePoints + otherPoints; |
| } |
|
|
| int EvalHalfMove(int newRow, int newCol, int newValue, int newSpecial, Direction incomingDirection, int[] pointsByType) |
| { |
| |
| var currentBoardSize = Board.GetCurrentBoardSize(); |
| int matchedLeft = 0, matchedRight = 0, matchedUp = 0, matchedDown = 0; |
| int scoreLeft = 0, scoreRight = 0, scoreUp = 0, scoreDown = 0; |
|
|
| if (incomingDirection != Direction.Right) |
| { |
| for (var c = newCol - 1; c >= 0; c--) |
| { |
| if (Board.GetCellType(newRow, c) == newValue) |
| { |
| matchedLeft++; |
| scoreLeft += pointsByType[Board.GetSpecialType(newRow, c)]; |
| } |
| else |
| break; |
| } |
| } |
|
|
| if (incomingDirection != Direction.Left) |
| { |
| for (var c = newCol + 1; c < currentBoardSize.Columns; c++) |
| { |
| if (Board.GetCellType(newRow, c) == newValue) |
| { |
| matchedRight++; |
| scoreRight += pointsByType[Board.GetSpecialType(newRow, c)]; |
| } |
| else |
| break; |
| } |
| } |
|
|
| if (incomingDirection != Direction.Down) |
| { |
| for (var r = newRow + 1; r < currentBoardSize.Rows; r++) |
| { |
| if (Board.GetCellType(r, newCol) == newValue) |
| { |
| matchedUp++; |
| scoreUp += pointsByType[Board.GetSpecialType(r, newCol)]; |
| } |
| else |
| break; |
| } |
| } |
|
|
| if (incomingDirection != Direction.Up) |
| { |
| for (var r = newRow - 1; r >= 0; r--) |
| { |
| if (Board.GetCellType(r, newCol) == newValue) |
| { |
| matchedDown++; |
| scoreDown += pointsByType[Board.GetSpecialType(r, newCol)]; |
| } |
| else |
| break; |
| } |
| } |
|
|
| if ((matchedUp + matchedDown >= 2) || (matchedLeft + matchedRight >= 2)) |
| { |
| |
| var totalScore = pointsByType[newSpecial]; |
| if (matchedUp + matchedDown >= 2) |
| { |
| totalScore += scoreUp + scoreDown; |
| } |
|
|
| if (matchedLeft + matchedRight >= 2) |
| { |
| totalScore += scoreLeft + scoreRight; |
| } |
| return totalScore; |
| } |
|
|
| return 0; |
| } |
| } |
|
|
| } |
|
|