public Tuple <VirtualPiece, Vector2Int> DoEverythingBecauseNothingWorks() { int maxUtils = 1500; VirtualPiece bestMovePiece = null; Vector2Int bestMovePosition = new Vector2Int(0, 0); foreach (VirtualPiece piece in playerPiecesDict[playerTurn]) { List <Vector2Int> possileCells = piece.CheckPathing(); Vector2Int currentPosition = piece.cCurrentPosition; bool isDead = piece.cIsDead; foreach (Vector2Int movement in possileCells) { VirtualBoard newVirtualBoard = CloneVirtualBoard(); VirtualPiece newPiece = newVirtualBoard.FindPiece(piece.cCurrentPosition, piece.cPieceName, isDead, piece.cPlayerInt); newPiece.MovePiece(movement.x, movement.y); newVirtualBoard.player1Utils = newVirtualBoard.EvaluateVirtualBoard(); if (newVirtualBoard.aiPlayerWinning) { maxUtils = newVirtualBoard.player1Utils; bestMovePiece = piece; bestMovePosition = movement; return(new Tuple <VirtualPiece, Vector2Int>(bestMovePiece, bestMovePosition)); } int maxUtils2 = -1500; VirtualPiece bestMovePiece2 = null; Vector2Int bestMovePosition2 = new Vector2Int(0, 0); foreach (VirtualPiece piece2 in newVirtualBoard.playerPiecesDict[newVirtualBoard.playerTurn]) { List <Vector2Int> possileCells2 = piece2.CheckPathing(); Vector2Int currentPosition2 = piece2.cCurrentPosition; bool isDead2 = piece2.cIsDead; foreach (Vector2Int movement2 in possileCells2) { VirtualBoard newVirtualBoard2 = newVirtualBoard.CloneVirtualBoard(); VirtualPiece newPiece2 = newVirtualBoard2.FindPiece(piece2.cCurrentPosition, piece2.cPieceName, isDead2, piece2.cPlayerInt); newPiece2.MovePiece(movement2.x, movement2.y); newVirtualBoard2.player1Utils = newVirtualBoard2.EvaluateVirtualBoard(); if (newVirtualBoard2.player1Utils > maxUtils2) { maxUtils2 = newVirtualBoard2.player1Utils; newVirtualBoard.player1Utils = newVirtualBoard2.player1Utils; bestMovePiece2 = newPiece2; bestMovePosition2 = movement2; } } } if (newVirtualBoard.player1Utils < maxUtils) { maxUtils = newVirtualBoard.player1Utils; bestMovePiece = piece; bestMovePosition = movement; } } } return(new Tuple <VirtualPiece, Vector2Int>(bestMovePiece, bestMovePosition)); }
public VirtualBoard CloneVirtualBoard() { VirtualBoard newVirtualBoard = new VirtualBoard(); for (int x = 0; x < mAllCells.GetLength(0); x++) { for (int y = 0; y < mAllCells.GetLength(1); y++) { if (mAllCells[x, y] != null) { VirtualPiece newPiece = mAllCells[x, y].ClonePiece(newVirtualBoard); newVirtualBoard.mAllCells[x, y] = newPiece; newVirtualBoard.playerPiecesDict[newPiece.cPlayerInt].Add(newPiece); } } } foreach (KeyValuePair <int, List <VirtualPiece> > kvp in sideBoardDict) { for (int x = 0; x < kvp.Value.Count; x++) { VirtualPiece newPiece = kvp.Value[x].ClonePiece(newVirtualBoard); newVirtualBoard.sideBoardDict[kvp.Key].Add(newPiece); } } newVirtualBoard.playerTurn = SwitchPlayerTurn(); return(newVirtualBoard); }
public void SetVirtualBoard(Board board) { for (int x = 0; x < board.mAllCells.GetLength(0); x++) { for (int y = 0; y < board.mAllCells.GetLength(1); y++) { if (board.mAllCells[x, y].mCurrentPiece != null) { Piece piece = board.mAllCells[x, y].mCurrentPiece; VirtualPiece newPiece = new VirtualPiece(); newPiece.SetVirtualPiece(piece.pieceName, piece.playerOwnerInt, piece.mPossibleMovement, piece.isDead, new Vector2Int(x, y), this); mAllCells[x, y] = newPiece; playerPiecesDict[piece.playerOwnerInt].Add(newPiece); } } } foreach (KeyValuePair <int, Cell[, ]> kvp in board.sideBoardDict) { for (int x = 0; x < kvp.Value.GetLength(0); x++) { for (int y = 0; y < kvp.Value.GetLength(1); y++) { if (kvp.Value[x, y].mCurrentPiece != null) { Piece piece = kvp.Value[x, y].mCurrentPiece; VirtualPiece newPiece = new VirtualPiece(); newPiece.SetVirtualPiece(piece.pieceName, piece.playerOwnerInt, piece.mPossibleMovement, piece.isDead, new Vector2Int(x, y), this); sideBoardDict[kvp.Key].Add(newPiece); playerPiecesDict[piece.playerOwnerInt].Add(newPiece); } } } } player1Utils = EvaluateVirtualBoard(); }
public VirtualPiece ClonePiece(VirtualBoard newVirtualBoard) { VirtualPiece newPiece = new VirtualPiece(); newPiece.SetVirtualPiece(cPieceName, cPlayerInt, cPossibleMovement, cIsDead, cCurrentPosition, newVirtualBoard); return(newPiece); }
/// <summary> /// Generates a RKN-container using the official dimensions /// </summary> /// <param name="id">The ID of the container</param> /// <returns>The newly generated container</returns> public static Container GenerateContainerRKN(int id) { // Create it Container container = new Container() { ID = id, Mesh = new MeshCube() { Length = 15.3, Width = 20.1, Height = 16.3 } }; // Add slants Slant slant = new Slant() { Container = container, Position = new MeshPoint() { X = 0.0, Y = 15.6, Z = 0.0 }, NormalVector = new MeshPoint() { X = 0.0, Y = 1.0, Z = -1.0 } }; slant.Seal(); container.AddSlant(slant); // Add virtual piece VirtualPiece virtualPiece = new VirtualPiece() { Container = container, FixedOrientation = 0, FixedPosition = new MeshPoint() { X = 1, Y = 17.1, Z = 11.0 } }; virtualPiece.AddComponent(0, 0, 0, 13.3, 3.0, 5.0); virtualPiece.Seal(); container.AddVirtualPiece(virtualPiece); // Seal the container container.Seal(); // Return it return(container); }
public void ResetPiecesPlayer(VirtualPiece piece) { foreach (KeyValuePair <int, List <VirtualPiece> > kvp in playerPiecesDict) { if (kvp.Value.Contains(piece) && kvp.Key != piece.cPlayerInt) { kvp.Value.Remove(piece); } else if (!kvp.Value.Contains(piece) && kvp.Key == piece.cPlayerInt) { kvp.Value.Add(piece); } } }
private void Capture(int x, int y) { VirtualPiece capturedPiece = cVirtualBoard.mAllCells[x, y]; string previousName = capturedPiece.cPieceName; capturedPiece.cPlayerInt = cPlayerInt; capturedPiece.cIsDead = true; cVirtualBoard.AddPieceToPlayerSideBoard(capturedPiece, cPlayerInt); if (previousName == "Hu") { capturedPiece.SwitchHuAndJa(); } cVirtualBoard.ResetPiecesPlayer(capturedPiece); }
public void CreateRecursiveBoardDict() { foreach (VirtualPiece piece in playerPiecesDict[playerTurn]) { List <Vector2Int> possileCells = piece.CheckPathing(); Vector2Int currentPosition = piece.cCurrentPosition; bool isDead = piece.cIsDead; foreach (Vector2Int movement in possileCells) { VirtualBoard newVirtualBoard = CloneVirtualBoard(); VirtualPiece newPiece = newVirtualBoard.FindPiece(piece.cCurrentPosition, piece.cPieceName, isDead, piece.cPlayerInt); newPiece.MovePiece(movement.x, movement.y); newVirtualBoard.player1Utils = newVirtualBoard.EvaluateVirtualBoard(); recursiveBoardDict.Add(new Tuple <VirtualPiece, Vector2Int>(piece, movement), newVirtualBoard); } } // foreach (VirtualPiece piece in playerPiecesDict[playerTurn]) //{ // if (piece.cPlayerInt == playerTurn) // { // List<Vector2Int> possileCells = piece.CheckPathing(); // Vector2Int currentPosition = piece.cCurrentPosition; // bool isDead = piece.cIsDead; // foreach (Vector2Int movement in possileCells) // { // VirtualBoard newVirtualBoard = CloneVirtualBoard(); // VirtualPiece newPiece = newVirtualBoard.FindPiece(piece.cCurrentPosition, piece.cPieceName, isDead, piece.cPlayerInt); // newPiece.MovePiece(movement.x, movement.y); // newVirtualBoard.player1Utils = newVirtualBoard.EvaluateVirtualBoard(); // recursiveBoardDict.Add(new Tuple<VirtualPiece, Vector2Int>(piece, movement), newVirtualBoard); // } // } //} }
public void GetBestMove() { int maxUtils = 1500; if (playerTurn == 1) { maxUtils = -1500; } VirtualPiece bestMovePiece = null; Vector2Int bestMovePosition = new Vector2Int(0, 0); foreach (KeyValuePair <Tuple <VirtualPiece, Vector2Int>, VirtualBoard> kvp in recursiveBoardDict) { if (playerTurn == 2) { if (kvp.Value.aiPlayerWinning) { maxUtils = kvp.Value.player1Utils; bestMovePiece = kvp.Key.Item1; bestMovePosition = kvp.Key.Item2; aiPlayerWinning = true; bestMove = kvp.Key; return; } } if ((playerTurn == 1 && kvp.Value.player1Utils > maxUtils) || (playerTurn == 2 && kvp.Value.player1Utils < maxUtils)) { maxUtils = kvp.Value.player1Utils; player1Utils = kvp.Value.player1Utils; bestMovePiece = kvp.Key.Item1; bestMovePosition = kvp.Key.Item2; } } bestMove = new Tuple <VirtualPiece, Vector2Int>(bestMovePiece, bestMovePosition); }
/// <summary> /// Generates a AMJ-container using the official dimensions /// </summary> /// <param name="id">The ID of the container</param> /// <returns>The newly generated container</returns> public static Container GenerateContainerAMJ(int id) { // Create it Container container = new Container() { ID = id, Mesh = new MeshCube() { Length = 30.6, Width = 23.0, Height = 24.0 } }; // Add slants Slant slant1 = new Slant() { Container = container, Position = new MeshPoint() { X = 0.0, Y = 15, Z = 24.0 }, NormalVector = new MeshPoint() { X = 0.0, Y = 1.0, Z = 1.0 } }; slant1.Seal(); container.AddSlant(slant1); //Slant slant2 = new Slant() //{ // Container = container, // Position = new MeshPoint() { X = 0.0, Y = 15, Z = 24.0 }, // NormalVector = new MeshPoint() { X = 0.0, Y = 1.0, Z = 0.5 } //}; //slant2.Seal(); //container.AddSlant(slant2); //Slant slant3 = new Slant() //{ // Container = container, // Position = new MeshPoint() { X = 0.0, Y = 15, Z = 24.0 }, // NormalVector = new MeshPoint() { X = 0.0, Y = 1.0, Z = 2.0 } //}; //slant3.Seal(); //container.AddSlant(slant3); // Add virtual pieces VirtualPiece virtualPiece1 = new VirtualPiece() { Container = container, FixedOrientation = 0, FixedPosition = new MeshPoint() { X = 9.7, Y = 1.0, Z = 0.0 } }; virtualPiece1.AddComponent(0, 0, 0, 1.0, 7.0, 24.0); virtualPiece1.Seal(); container.AddVirtualPiece(virtualPiece1); VirtualPiece virtualPiece2 = new VirtualPiece() { Container = container, FixedOrientation = 0, FixedPosition = new MeshPoint() { X = 19.9, Y = 1.0, Z = 0.0 } }; virtualPiece2.AddComponent(0, 0, 0, 1.0, 7.0, 24.0); virtualPiece2.Seal(); container.AddVirtualPiece(virtualPiece2); // Seal the container container.Seal(); // Return it return(container); }
public void AddPieceToPlayerSideBoard(VirtualPiece piece, int newplayerOwnerInt) { sideBoardDict[newplayerOwnerInt].Add(piece); }