public void DoubleSelfTackleAddsTwoBeers() { var pos = getStartPositions(); pos[0] = Position.Green5; pos[1] = Position.Green5; pos[4] = Position.RedStart; var sit = new Situation(pos); var moves = sit.GetMoves(Piece.Green, 2); sit.ApplyMove(moves[0]); Assert.AreEqual(2, sit.beers[(int)Piece.Green]); }
public void DoubleUnfoldsToStartPosition() { var pos = getStartPositions(); pos[4] = pos[5] = Position.RedGoal1; var sit = new Situation(pos); var moves = sit.GetMoves(Piece.Red, 3); Assert.AreEqual(1, moves.Length); sit.ApplyMove(moves[0]); Assert.AreEqual(Piece.Red, sit.board[(int)Position.RedGoal1]); Assert.AreEqual(Piece.None, sit.board[(int)Position.RedGoal2]); Assert.AreEqual(Piece.None, sit.board[(int)Position.RedGoal3]); Assert.AreEqual(Piece.Red, sit.board[(int)Position.RedGoal4]); }
public void DoubleUnfoldsWhenPiecesBeforeItAreFilled() { var pos = getStartPositions(); pos[0] = Position.GreenGoal4; pos[1] = pos[2] = Position.GreenGoal2; pos[3] = Position.GreenGoal1; var sit = new Situation(pos); var moves = sit.GetMoves(Piece.Green, 2); sit.ApplyMove(moves[0]); Assert.AreEqual(Piece.Green, sit.board[(int)Position.GreenGoal1]); Assert.AreEqual(Piece.Green, sit.board[(int)Position.GreenGoal2]); Assert.AreEqual(Piece.Green, sit.board[(int)Position.GreenGoal3]); Assert.AreEqual(Piece.Green, sit.board[(int)Position.GreenGoal4]); Assert.AreEqual(Piece.Green, sit.GetWinner()); }
public void TestTripleGetEaten() { var pos = getStartPositions(); pos[0] = Position.GreenGoal1; pos[1] = pos[2] = pos[3] = Position.Yellow6; pos[4] = Position.Yellow3; var sit = new Situation(pos); var moves = sit.GetMoves(Piece.Red, 3); sit.ApplyMove(moves[0]); Assert.AreEqual(1, moves.Length); Assert.AreEqual(Position.Yellow6, moves[0].EndPosition); Assert.AreEqual(Piece.None, sit.board[(int)Position.GreenHome1]); Assert.AreEqual(Piece.Green, sit.board[(int)Position.GreenHome2]); Assert.AreEqual(Piece.Green, sit.board[(int)Position.GreenHome3]); Assert.AreEqual(Piece.Green, sit.board[(int)Position.GreenHome4]); Assert.AreEqual(Position.GreenGoal1, sit.pieces[0]); Assert.AreEqual(Position.GreenHome2, sit.pieces[1]); Assert.AreEqual(Position.GreenHome3, sit.pieces[2]); Assert.AreEqual(Position.GreenHome4, sit.pieces[3]); }
public void TestRedCanQuadruple() { Position[] pos = getStartPositions(); pos[4] = Position.RedStart; pos[5] = Position.RedStart; pos[6] = Position.RedStart; Situation sit = new Situation(pos); for (int i = 4; i < 7; i++) { Assert.AreEqual(Position.RedStart, sit.pieces[i]); } Move[] moves = sit.GetMoves(Piece.Red, 6); Assert.AreEqual(2, moves.Length); Assert.AreEqual(Position.RedStart, moves[0].StartPosition); Assert.AreEqual(Position.Red6, moves[0].EndPosition); Assert.AreEqual(Position.RedHome4, moves[1].StartPosition); Assert.AreEqual(Position.RedStart, moves[1].EndPosition); Assert.AreEqual(MoveType.DoubleUp, moves[1].Type); sit.ApplyMove(moves[1]); for (int i = 4; i < 8; i++) { Assert.AreEqual(Position.RedStart, sit.pieces[i]); } moves = sit.GetMoves(Piece.Red, 3); Assert.AreEqual(1, moves.Length); sit.ApplyMove(moves[0]); for (int i = 4; i < 8; i++) { Assert.AreEqual(Position.Red3, sit.pieces[i]); } Assert.AreEqual(Piece.None, sit.board[(int)Position.RedStart]); Assert.AreEqual(Piece.Red, sit.board[(int)Position.Red3]); }
public void TestGreenGoesToGoal() { var pos = getStartPositions(); pos[0] = Position.GreenGoal3; pos[1] = Position.Yellow6; var sit = new Situation(pos); var moves = sit.GetMoves(Piece.Green, 1); Assert.AreEqual(2, moves.Length); sit.ApplyMove(moves[1]); Assert.AreEqual(Position.GreenGoal1, sit.pieces[1]); moves = sit.GetMoves(Piece.Green, 2); Assert.AreEqual(0, moves.Length); }
public void TestEatingWithMultiplePiecesOnBoard() { Position[] pos = getStartPositions(); pos[0] = Position.Red1; pos[4] = Position.GreenStart; pos[5] = Position.Yellow3; pos[6] = Position.Red2; Situation start = new Situation(pos); Move[] moves = start.GetMoves(Piece.Green, 1); Assert.AreEqual(1, moves.Length); Assert.AreEqual(Position.Red1, moves[0].StartPosition); Assert.AreEqual(Position.Red2, moves[0].EndPosition); start.ApplyMove(moves[0]); Assert.AreEqual(Piece.None, start.board[(int)Position.Red1]); Assert.AreEqual(Piece.Green, start.board[(int)Position.Red2]); Assert.AreEqual(Piece.None, start.board[(int)Position.RedHome1]); Assert.AreEqual(Piece.None, start.board[(int)Position.RedHome2]); Assert.AreEqual(Piece.Red, start.board[(int)Position.RedHome4]); Assert.AreEqual(Piece.Red, start.board[(int)Position.RedHome3]); Assert.AreEqual(Position.RedHome3, start.pieces[6]); }
public void Test2DoublePieces() { var pos = getStartPositions(); pos[0] = pos[1] = Position.Yellow2; pos[2] = pos[3] = Position.Red2; var sit = new Situation(pos); var moves = sit.GetMoves(Piece.Green, 4); sit.ApplyMove(moves[1]); Assert.AreEqual(2, moves.Length); Assert.AreEqual(0, moves[0].Piece); Assert.AreEqual(Position.Yellow2, moves[0].StartPosition); Assert.AreEqual(Position.Yellow6, moves[0].EndPosition); Assert.AreEqual(2, moves[1].Piece); Assert.AreEqual(Position.Red2, moves[1].StartPosition); Assert.AreEqual(Position.Red6, moves[1].EndPosition); Assert.AreEqual(Position.Red6, sit.pieces[2]); Assert.AreEqual(Position.Red6, sit.pieces[3]); Assert.AreEqual(Piece.None, sit.board[(int)Position.Red2]); Assert.AreEqual(Piece.Green, sit.board[(int)Position.Red6]); }
public void TestDoublePieceMovesTogether() { Position[] pos = getStartPositions(); pos[0] = Position.GreenStart; pos[1] = Position.GreenStart; Situation sit = new Situation(pos); Move[] moves = sit.GetMoves(Piece.Green, 3); Assert.AreEqual(1, moves.Length); sit.ApplyMove(moves[0]); Assert.AreEqual(Piece.None, sit.board[(int)Position.GreenStart]); Assert.AreEqual(Piece.Green, sit.board[(int)Position.Green3]); Assert.AreEqual(Position.Green3, sit.pieces[0]); Assert.AreEqual(Position.Green3, sit.pieces[1]); }
public void TestDoubleGetsEatenAndGetsOut() { var pos = getStartPositions(); pos[0] = pos[1] = Position.RedStart; var sit = new Situation(pos); var moves = sit.GetMoves(Piece.Red, 6); sit.ApplyMove(moves[0]); moves = sit.GetMoves(Piece.Green, 6); sit.ApplyMove(moves[0]); Assert.AreEqual(Piece.Green, sit.board[(int)Position.GreenStart]); Assert.AreEqual(Piece.None, sit.board[(int)Position.GreenHome1]); Assert.AreEqual(Piece.Green, sit.board[(int)Position.GreenHome2]); Assert.AreEqual(Piece.Green, sit.board[(int)Position.GreenHome3]); Assert.AreEqual(Piece.Green, sit.board[(int)Position.GreenHome4]); Assert.IsTrue(sit.Validate()); }
public void TestDoubleArrivesToGoalWithPieceAlreadyInGoal() { var pos = getStartPositions(); pos[0] = Position.GreenGoal1; pos[1] = pos[2] = Position.Yellow6; var sit = new Situation(pos); var moves = sit.GetMoves(Piece.Green, 4); sit.ApplyMove(moves[0]); Assert.AreEqual(1, moves.Length); Assert.AreEqual(Position.GreenGoal4, moves[0].EndPosition); Assert.AreEqual(Piece.Green, sit.board[(int)Position.GreenGoal2]); Assert.AreEqual(Piece.None, sit.board[(int)Position.GreenGoal3]); Assert.AreEqual(Piece.Green, sit.board[(int)Position.GreenGoal4]); }
public void TestDoubleArrivesToGoal3() { var pos = getStartPositions(); pos[0] = pos[1] = Position.Yellow6; var sit = new Situation(pos); var moves = sit.GetMoves(Piece.Green, 3); sit.ApplyMove(moves[0]); Assert.AreEqual(1, moves.Length); Assert.AreEqual(Position.GreenGoal3, moves[0].EndPosition); Assert.AreEqual(Piece.Green, sit.board[(int)Position.GreenGoal1]); Assert.AreEqual(Piece.None, sit.board[(int)Position.GreenGoal2]); Assert.AreEqual(Piece.Green, sit.board[(int)Position.GreenGoal3]); Assert.AreEqual(Piece.None, sit.board[(int)Position.GreenGoal4]); Assert.IsTrue(sit.Validate()); }
public void TestCloning() { Situation s = Situation.GameStart(); s.ApplyMove(new Move(0, s.pieces[0], Position.Green4, MoveType.Move)); Situation clone = new Situation(s); Assert.AreEqual(Piece.Green, clone.board[(int)Position.Green4], "Move should be ok on the clone"); s.ApplyMove(new Move(0, s.pieces[0], Position.Green6, MoveType.Move)); Assert.AreEqual(Piece.None, s.board[(int)Position.Green4], "Move should be have happened on the original"); Assert.AreEqual(Piece.Green, s.board[(int)Position.Green6], "Move should be have happened on the original"); Assert.AreEqual(Piece.Green, clone.board[(int)Position.Green4], "Clone should not be affected"); Assert.AreEqual(Piece.None, clone.board[(int)Position.Green6], "Clone should not be affected"); clone.ApplyMove(new Move(1, clone.pieces[1], Position.GreenGoal2, MoveType.Move)); Assert.AreEqual(Position.GreenGoal2, clone.pieces[1], "Move should be have happened on the clone"); Assert.AreEqual(Position.GreenHome2, s.pieces[1], "Move should be have happened on the clone"); }
public void TestAfterEatingHomePiecesShouldBeLastInPieceList() { Position[] pos = getStartPositions(); pos[0] = Position.Yellow1; pos[4] = Position.GreenStart; pos[5] = Position.Yellow3; pos[6] = Position.Red2; Situation start = new Situation(pos); Move[] moves = start.GetMoves(Piece.Green, 2); start.ApplyMove(moves[0]); Assert.AreEqual(Position.GreenStart, start.pieces[4]); Assert.AreEqual(Position.Red2, start.pieces[5]); Assert.AreEqual(Position.RedHome3, start.pieces[6]); Assert.AreEqual(Position.RedHome4, start.pieces[7]); }
public void TripleFinishesOverOwnPiece() { var pos = getStartPositions(); pos[0] = Position.GreenGoal2; pos[1] = pos[2] = pos[3] = Position.GreenGoal1; var sit = new Situation(pos); var moves = sit.GetMoves(Piece.Green, 3); sit.ApplyMove(moves[0]); Assert.AreEqual(Piece.Green, sit.board[(int)Position.GreenGoal1]); Assert.AreEqual(Piece.Green, sit.board[(int)Position.GreenGoal2]); Assert.AreEqual(Piece.Green, sit.board[(int)Position.GreenGoal3]); Assert.AreEqual(Piece.Green, sit.board[(int)Position.GreenGoal4]); Assert.AreEqual(Piece.Green, sit.GetWinner()); }
public void TestEating() { Position[] pos = getStartPositions(); pos[0] = Position.Red1; pos[4] = Position.Red4; Situation start = new Situation(pos); Move[] moves = start.GetMoves(Piece.Green, 3); Assert.AreEqual(1, moves.Length); Assert.AreEqual(Position.Red1, moves[0].StartPosition); Assert.AreEqual(Position.Red4, moves[0].EndPosition); start.ApplyMove(moves[0]); Assert.AreEqual(Piece.None, start.board[(int)Position.Red1]); Assert.AreEqual(Piece.Green, start.board[(int)Position.Red4]); Assert.AreEqual(Piece.Red, start.board[(int)Position.RedHome1]); Assert.AreEqual(Piece.Red, start.board[(int)Position.RedHome2]); Assert.AreEqual(Piece.Red, start.board[(int)Position.RedHome4]); Assert.AreEqual(Piece.Red, start.board[(int)Position.RedHome3]); Assert.AreEqual(Position.RedHome1, start.pieces[4]); }
static void Main(string[] args) { List<Position> positionList = new List<Position>(); positionList.AddRange(new Position[] { Position.GreenGoal4, Position.GreenGoal3, Position.GreenGoal2, Position.GreenGoal1}); for (int p = (int)Position.Yellow6; p >= (int)Position.GreenStart; p--) { positionList.Add((Position)p); } positionList.AddRange(new Position[] { Position.GreenHome4, Position.GreenHome3, Position.GreenHome2, Position.GreenHome1 }); Position[] positionOrder = positionList.ToArray(); int len = positionOrder.Length; int homeStart = len-4; bool first = true; for (int i = 0; i < len; i++) { for (int j = Math.Max(i, 1); j < len; j++) { if (i == j && i >= homeStart) continue; for (int k = Math.Max(j, 2); k < len; k++) { if (j == k && j >= homeStart) continue; for (int l = Math.Max(k,3); l < len; l++) { if (k == l && k >= homeStart) continue; var pos = getStartPositions(); pos[0] = positionOrder[i]; pos[1] = positionOrder[j]; pos[2] = positionOrder[k]; pos[3] = positionOrder[l]; Situation sit = new Situation(pos); Situation s2 = new Situation(sit); if (s2.UnfoldMultiples(Piece.Green)) { continue; } int nomoves = 0; decimal ev = 0; if (first) { SaveValue(sit, 0); first = false; continue; } for (int roll = 1; roll <= 6; roll++) { Move[] moves = sit.GetMoves(Piece.Green, roll); if (moves.Length == 0) { nomoves++; } else { decimal value = Decimal.MaxValue; foreach(Move move in moves) { Situation s = new Situation(sit); s.ApplyMove(move); value = Math.Min(value, GetValue(s)); } ev += value; } } if (sit.GetNumberOfTries(Piece.Green) == 3) { ev = (5 * nomoves * nomoves + (36 + 6 * nomoves + nomoves * nomoves) * ev) / (216 - nomoves * nomoves * nomoves); } else { ev = (5 + ev) / (6 - nomoves); } SaveValue(sit, ev); Console.WriteLine(positionOrder[i] + " " + positionOrder[j] + " " + positionOrder[k] + " " + positionOrder[l] + ": " + ev); } } } } Byte[] bytes = new Byte[6 * dict.Count]; int offset = 0; foreach (KeyValuePair<int, decimal> kvp in dict) { Array.Copy(System.BitConverter.GetBytes(kvp.Key), 0, bytes, offset, 4); offset += 4; Array.Copy(System.BitConverter.GetBytes((Int16)(kvp.Value * 256)), 0, bytes, offset, 2); offset += 2; } File.WriteAllBytes("singleplayer.data", bytes); Console.ReadLine(); }
public void RedShouldGetTwoBeersWhenAPieceIsEatenByADouble() { var pos = getStartPositions(); pos[0] = Position.Blue1; pos[1] = Position.Blue1; pos[5] = Position.Blue3; var sit = new Situation(pos); var moves = sit.GetMoves(Piece.Green, 2); sit.ApplyMove(moves[0]); Assert.AreEqual(2, sit.beers[(int)Piece.Red]); }