Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.76 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. public class Maquina extends Jugador{
  4. private FitxaMap map;
  5. private boolean color;
  6. private int lastTorn;
  7.  
  8. //Conte un hashMap que guarda entrades amb: el moviment que es podria fer aquell torn + FitxaMap
  9. private class PositionMap {
  10. int numVictoriesPossibles;
  11. private HashMap<String,FitxaMap> map;
  12.  
  13. public PositionMap(){
  14. this.map=new HashMap<>();
  15. this.numVictoriesPossibles=0;
  16. }
  17.  
  18. public int getNumVictoriesPossibles() {
  19. return this.numVictoriesPossibles;
  20. }
  21.  
  22. public void setNumVictoriesPossibles(int numVictoriesPossibles) {
  23. this.numVictoriesPossibles = numVictoriesPossibles;
  24. }
  25.  
  26. public HashMap<String,FitxaMap> getMap() {
  27. return this.map;
  28. }
  29. public void addHashMap(HashMap<String,FitxaMap> input){
  30. this.map = input;
  31. }
  32.  
  33. public void addToHashMap(String s,FitxaMap input) {
  34. this.map.put(s,input);
  35. if(input!=null)this.numVictoriesPossibles+=input.getNumVictoriesPossibles();
  36. }
  37.  
  38. public boolean mapIsEmpty() {
  39. return(this.map.size() == 0);
  40. }
  41. }
  42.  
  43. //Conte un hashmap que guarda la fitxa que es podria moure aquell torn + PositionMap
  44. private class FitxaMap {
  45. private HashMap<String,PositionMap> map;
  46. private int numVictoriesPossibles;
  47. public FitxaMap() {
  48. this.map=new HashMap<>();
  49. this.numVictoriesPossibles=0;
  50. }
  51.  
  52. public FitxaMap(int numVictoriesPossibles) {
  53. this.map = new HashMap<>();
  54. this.numVictoriesPossibles=numVictoriesPossibles;
  55. }
  56.  
  57. public int getNumVictoriesPossibles() {
  58. return this.numVictoriesPossibles;
  59. }
  60.  
  61. public HashMap<String,PositionMap> getMap() {
  62. return this.map;
  63. }
  64.  
  65. public boolean mapIsEmpty() {
  66. return(this.map.size() == 0);
  67. }
  68.  
  69. public void addToHashMap(String s,PositionMap input) {
  70. this.map.put(s,input);
  71. this.numVictoriesPossibles+=input.getNumVictoriesPossibles();
  72. }
  73. }
  74.  
  75.  
  76. public Maquina(String nom) {
  77. super(nom);
  78. this.map = new FitxaMap();
  79. this.lastTorn=0;
  80. }
  81.  
  82. public String[] juga(Taulell taulell,boolean color){
  83. //Necessita que es passi com a parametre el torn de la partida i el numero maxim de torns per a la profunditat
  84. int torn=0;
  85. //si es fa servir per una nova partida(N partides en Maquina vs. Maquina) aixo vol dir que el torn no sera l'esperat
  86. if(this.lastTorn+2!=torn) {
  87. this.color = color;
  88. this.lastTorn=torn;
  89. int maxDepth = 2;
  90. ArrayList<Fitxa> fitxes = taulell.fitxesJugador(color);
  91. for (int i = 0; i < fitxes.size(); ++i) {
  92. Fitxa fitxa = fitxes.get(i);
  93. PositionMap ret = new PositionMap();
  94. if (possibleMovimentFitxa(fitxa, new Taulell(taulell), ret, this.lastTorn, maxDepth))
  95. this.map.addToHashMap(fitxa.getPosicio(), ret);
  96. }
  97. }
  98. String[] moviment = highestChance();
  99. if(moviment.length == 2) return moviment;
  100. else return movimentRandom(taulell);
  101. }
  102.  
  103. /**
  104. * Retorna el moviment amb mes possibilitats de guanyar si n'hi ha. Si no retorna null
  105. * @return Array que conte origen i desti de la fitxa que s'hauria de moure en aquell torn.
  106. */
  107. private String[] highestChance() {
  108. Iterator itFitxaMap = this.map.getMap().entrySet().iterator();
  109. Map.Entry maxFitxa=null;
  110. Map.Entry maxPos=null;
  111. int highestVictories = 0;
  112. //Fitxa a moure amb mes victories posibles
  113. while(itFitxaMap.hasNext()){
  114. Map.Entry pair = (Map.Entry)itFitxaMap.next();
  115. PositionMap auxPM = (PositionMap)pair.getValue();
  116. Iterator itPositionMap = auxPM.getMap().entrySet().iterator();
  117. while(itPositionMap.hasNext()) {
  118. Map.Entry pairIntern = (Map.Entry)itPositionMap.next();
  119. FitxaMap auxFM = (FitxaMap)pairIntern.getValue();
  120. if(highestVictories<auxFM.getNumVictoriesPossibles()) {
  121. highestVictories = auxFM.getNumVictoriesPossibles();
  122. maxFitxa = pair;
  123. maxPos = pairIntern;
  124. }
  125. }
  126. }
  127. if(highestVictories!=0){
  128. String[] moviment = new String[2];
  129. moviment[0] = (String)maxFitxa.getKey();
  130. moviment[0] = (String)maxPos.getKey();
  131. this.map= (FitxaMap)maxPos.getValue();
  132. return moviment;
  133. }
  134. return new String[0];
  135. }
  136.  
  137.  
  138. /**
  139. * Retorna els moviments possibles que te la fitxa que la portin a la victoria de Maquina
  140. * @param f Fitxa que es consulta
  141. * @param taulell Taulell on esta la fitxa
  142. * @param map Objecte que conte un hashMap on s'han d'afegir els moviments que portin a la victoria
  143. * @param torn Profunditat de la cerca
  144. * @param maxDepth Maxima profunditat
  145. * @return Retorna true si s'ha trobat cap moviment que porti ala victoria
  146. */
  147. public boolean possibleMovimentFitxa(Fitxa f,Taulell taulell,PositionMap map,int torn, int maxDepth) {
  148. if(torn==maxDepth) {
  149. return false;
  150. }
  151. ArrayList<String> movimentsPossibles = taulell.movimentsPossibles(f.getPosicio());
  152. //hasmap has an entry for every possible movement
  153. for(int i=0; i<movimentsPossibles.size();++i) {
  154. Taulell aux = new Taulell(taulell);
  155. //if(torn==0)System.out.println(" to " + movimentsPossibles.get(i));
  156. aux.moviment(f.getPosicio(),movimentsPossibles.get(i));
  157. boolean endGame = estatJoc(aux,f.getColor());
  158. if(endGame) {
  159. if(this.color==f.getColor()) {
  160. //System.out.println("A PATH! Depth: "+torn+" Fitxa: "+f.getClass()+" "+f.getPosicio()+" Movement: "+movimentsPossibles.get(i));
  161. FitxaMap res = new FitxaMap(1);
  162. map.addToHashMap(movimentsPossibles.get(i),res);
  163. map.setNumVictoriesPossibles(1);
  164. return true;
  165. }
  166. else return false;
  167. }
  168. //hasmap has an entry for every possible movement of the contesting player
  169. FitxaMap novesFitxes= new FitxaMap();
  170. ArrayList<Fitxa> fitxesContrincant = aux.fitxesJugador(!color);
  171. boolean pathFound=false;
  172. for(int j = 0;j < fitxesContrincant.size();++j) {
  173. Fitxa fitxaContrincant=fitxesContrincant.get(j);
  174. //for(int x=0;x<torn+1;++x) System.out.print("->");
  175. //System.out.print(fitxaContrincant.getClass() + ":"+fitxaContrincant.getPosicio());
  176. PositionMap ret=new PositionMap();
  177. if(possibleMovimentFitxa(fitxaContrincant,aux,ret,torn + 1,maxDepth)) {
  178. pathFound=true;
  179. //System.out.println(movimentsPossibles.get(i));
  180. novesFitxes.addToHashMap(fitxaContrincant.getPosicio(),ret);
  181. }
  182. }
  183. if(pathFound) {
  184. map.addToHashMap(movimentsPossibles.get(i),novesFitxes);
  185. }
  186. }
  187. if(map.mapIsEmpty()) return false;
  188. else return true;
  189.  
  190. }
  191.  
  192. /**
  193. * Consulta si la partida s'hauria acabat en l'escenari del taulell passat com a parametre
  194. * @param taulell Taulell de l'escenari que s'esta explorant
  195. * @param colorTorn Color del jugador que tira en aquell torn
  196. * @return True si l'altre jugador no te un Rei o si el Rei esta en escac i mat
  197. */
  198. private boolean estatJoc(Taulell taulell,boolean colorTorn) {
  199. //taulell.printTaulell();
  200. ArrayList<Fitxa> Fitxes_jugador= taulell.fitxesJugador(!colorTorn);
  201. //System.out.println(Fitxes_jugador.size());
  202. for(int i=0; i<Fitxes_jugador.size() ;++i) {
  203. Fitxa f = Fitxes_jugador.get(i);
  204. //System.out.println("INSTANCE OF:" +f.getClass() +" "+f.getPosicio() + " " + taulell.getFitxa(f.getPosicio()));
  205. if(f instanceof Rei) {
  206. return taulell.escacMat(f.getPosicio());
  207. }
  208. }
  209. return true;
  210. }
  211.  
  212. /**
  213. * Retorna el primer moviment possible que pugui fer maquina amb una de les seves fitxes
  214. * @param taulell Taulell del torn actual
  215. * @return Retorna un array amb un moviment aleatori.
  216. */
  217. private String[] movimentRandom(Taulell taulell) {
  218. ArrayList<Fitxa> fitxes = taulell.fitxesJugador(this.color);
  219. for (int i=0;i<fitxes.size();++i) {
  220. if(taulell.movimentsPossibles(fitxes.get(i).getPosicio()).size()!=0) return new String[]{fitxes.get(i).getPosicio(),taulell.movimentsPossibles(fitxes.get(i).getPosicio()).get(0)};
  221. }
  222. return null;
  223. }
  224. /*
  225. public void printMap(){
  226. System.out.println();
  227. if(this.map != null) {
  228. HashMap<String,PositionMap> aux = this.map;
  229. boolean end = aux.isEmpty();
  230. int i =0;
  231. while (!end) {
  232. Iterator it = aux.entrySet().iterator();
  233. Map.Entry pair = (Map.Entry)it.next();
  234. if(i%2==1) System.out.println(" to "+pair.getKey());
  235. else System.out.print(pair.getKey());
  236. PositionMap positionMap = (PositionMap)pair.getValue();
  237. if(positionMap==null){
  238. end=true;
  239. }
  240. else aux = positionMap.getMap();
  241. ++i;
  242. }
  243. }
  244. }
  245. */
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement