Advertisement
Guest User

Untitled

a guest
Nov 14th, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.61 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace SimpleCheckers
  5. {
  6. public enum PlayerType { None, Computer, Human };
  7.  
  8. /// <summary>
  9. /// Reprezinta o piesa de joc
  10. /// </summary>
  11. public class Piece
  12. {
  13. public int Id { get; set; } // identificatorul piesei
  14. public int X { get; set; } // pozitia X pe tabla de joc
  15. public int Y { get; set; } // pozitia Y pe tabla de joc
  16. public PlayerType Player { get; set; } // carui tip de jucator apartine piesa (om sau calculator)
  17.  
  18. public Piece(int x, int y, int id, PlayerType player)
  19. {
  20. X = x;
  21. Y = y;
  22. Id = id;
  23. Player = player;
  24. }
  25.  
  26. /// <summary>
  27. /// Returneaza lista tuturor mutarilor permise pentru piesa curenta (this)
  28. /// in configuratia (tabla de joc) primita ca parametru
  29. /// </summary>
  30. public List<Move> ValidMoves(Board currentBoard)
  31. {
  32. // throw new Exception("Aceasta metoda trebuie implementata");
  33. List<Move> validMovesList = new List<Move>();
  34.  
  35. // consideram toate mutarile posibile din jurul pozitiei curente
  36. for (int x = X - 1; x <= X + 1; ++x)
  37. {
  38. for (int y = Y - 1; y <= Y + 1; ++y)
  39. {
  40. Move mutare = new Move(Id, x, y);
  41.  
  42. // si verificam care mutari sunt valide
  43. if (IsValidMove(currentBoard, mutare))
  44. {
  45. validMovesList.Add(mutare);
  46. }
  47. }
  48. }
  49.  
  50. return validMovesList;
  51. }
  52.  
  53. /// <summary>
  54. /// Testeaza daca o mutare este valida intr-o anumita configuratie
  55. /// </summary>
  56. public bool IsValidMove(Board currentBoard, Move move)
  57. {
  58. // throw new Exception("Aceasta metoda trebuie implementata");
  59. // verificam ca mutarea sa fie la doar un patrat distanta
  60. if (Math.Abs(move.NewX - X) > 1 || Math.Abs(move.NewY - Y) > 1)
  61. {
  62. return false;
  63. }
  64.  
  65. // verificam ca noile coordonate sa nu fie in afara tablei de joc
  66. if (move.NewX < 0 || move.NewX >= currentBoard.Size
  67. || move.NewY < 0 || move.NewY >= currentBoard.Size)
  68. {
  69. return false;
  70. }
  71.  
  72. // verificam daca pe pozitia noua se afla vreo alta piesa
  73. foreach (Piece piesa in currentBoard.Pieces)
  74. {
  75. if (piesa.X == move.NewX && piesa.Y == move.NewY)
  76. {
  77. return false;
  78. }
  79. }
  80.  
  81. // daca totul e in regula, mutarea este valida
  82. return true;
  83. }
  84. }
  85. }
  86.  
  87.  
  88. __________________________________MINMAX.cs_____________________________
  89.  
  90.  
  91.  
  92.  
  93. using System;
  94. using System.Collections.Generic;
  95.  
  96. namespace SimpleCheckers
  97. {
  98. /// <summary>
  99. /// Implementeaza algoritmul de cautare a mutarii optime
  100. /// </summary>
  101. public class Minimax
  102. {
  103. private static Random _rand = new Random();
  104.  
  105. /// <summary>
  106. /// Primeste o configuratie ca parametru, cauta mutarea optima si returneaza configuratia
  107. /// care rezulta prin aplicarea acestei mutari optime
  108. /// </summary>
  109. public static Board FindNextBoard(Board currentBoard)
  110. {
  111. // throw new Exception("Aceasta metoda trebuie implementata");
  112. // = algoritmul Minimax
  113. List<Board> listaConfiguratii = new List<Board>();
  114. List<Move> listaMutariValide;
  115.  
  116. // parcurgem fiecare piesa de pe tabla
  117. foreach (Piece piesa in currentBoard.Pieces)
  118. {
  119. // doar in cazul pieselor computer-ului (nivelul maximizant)
  120. if (piesa.Player == PlayerType.Computer)
  121. {
  122. // preluam lista de mutari valide ale piesei curente
  123. listaMutariValide = piesa.ValidMoves(currentBoard);
  124.  
  125. // transformam aceasta lista de mutari intr-o lista de configuratii posibile
  126. foreach (Move m in listaMutariValide)
  127. {
  128. listaConfiguratii.Add(currentBoard.MakeMove(m));
  129. }
  130. }
  131. }
  132.  
  133. // cautam mutarea pentru care functia de evaluare statica este maxima
  134. // consideram, initial, ca functia de evaluare este maxima in prima configuratie posibila
  135. double f_eval_max = listaConfiguratii[0].EvaluationFunction();
  136. double f_eval_curent;
  137. for (int i = 1; i < listaConfiguratii.Count; ++i)
  138. {
  139. f_eval_curent = listaConfiguratii[i].EvaluationFunction();
  140. if (f_eval_curent > f_eval_max)
  141. {
  142. f_eval_max = f_eval_curent;
  143. }
  144. }
  145.  
  146. // verificam daca exista mai multe maxime
  147. List<Board> listaConfiguratiiCuFEvalMaxim = new List<Board>();
  148. foreach (Board b in listaConfiguratii)
  149. {
  150. if (b.EvaluationFunction() == f_eval_max) // punem fiecare "cea mai buna configuratie" in lista
  151. {
  152. listaConfiguratiiCuFEvalMaxim.Add(b);
  153. }
  154. }
  155.  
  156. // daca exista mai multe configuratii cu aceeasi functie de evaluare maxima, returnam una aleatorie
  157. return listaConfiguratiiCuFEvalMaxim[_rand.Next(listaConfiguratiiCuFEvalMaxim.Count)];
  158. }
  159. }
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement