Advertisement
Guest User

Untitled

a guest
Apr 1st, 2020
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.21 KB | None | 0 0
  1.  
  2. @Override
  3. public synchronized boolean takeTurn() {
  4. while (!active & game.getBoard().getTokens().size() != 0){
  5. System.out.println(name + ": I am waiting for my turn.");
  6. try {
  7. wait();
  8. } catch (InterruptedException e) {
  9. e.printStackTrace();
  10. }
  11. }
  12. int n = game.getBoard().getTokens().size();
  13. System.out.println(name + ": I have received permission to take my turn. " +
  14. "There are " + n + " tokens left.");
  15. try {
  16. sleep(100);
  17. } catch (InterruptedException e) {
  18. e.printStackTrace();
  19. }
  20. if(n == 0) { return false; }
  21.  
  22. //var t = getTokenFromBoard((int)(Math.random()*game.getBoard().getTokens().size()));
  23.  
  24. /*
  25. List<Token> shuffled = new ArrayList<>(game.getBoard().getTokens());
  26. List<Token> have = new ArrayList<>(tokens);
  27.  
  28. Token t = getBestToken(have, shuffled, 0, 4);
  29.  
  30. if (t == null){
  31. t = getTokenFromBoard((int)(Math.random()*game.getBoard().getTokens().size()));
  32. }
  33. else{
  34. int index = 0;
  35. for (Token token : game.getBoard().getTokens()){
  36. if (token.getValue() == t.getValue()){
  37. t = getTokenFromBoard(index);
  38. break;
  39. }
  40. index++;
  41. }
  42. }
  43. */
  44.  
  45. Token t;
  46. int tokenVal = getBestTokenVal(tokens, 4);
  47. if (tokenVal != -1) {
  48.  
  49. int index = 0;
  50. for (Token token : game.getBoard().getTokens()) {
  51. if (token.getValue() == tokenVal) {
  52. break;
  53. }
  54. index++;
  55. }
  56.  
  57. t = getTokenFromBoard(index);
  58. }
  59. else{
  60. t = getTokenFromBoard((int)(Math.random()*game.getBoard().getTokens().size()));
  61. }
  62.  
  63. System.out.println("Player " + name + " has taken the token " + t
  64. + ", " + game.getBoard().getTokens().size() + " tokens left.");
  65. setInActive();
  66. System.out.println("Urmeaza player-ul " + next.getName());
  67. next.setActive();
  68. return true;
  69. }
  70.  
  71. public Token getBestToken(List<Token> chosenTokens, List<Token> remainedTokens, int depth, int stopDepth) {
  72. if (depth >= stopDepth) {
  73. return null;
  74. }
  75.  
  76. int score = calculateScore(chosenTokens);
  77.  
  78. for (Token token : remainedTokens){
  79. chosenTokens.add(token);
  80.  
  81. int possibleScore = calculateScore(chosenTokens);
  82. if (possibleScore > score){
  83. chosenTokens.remove(token);
  84. return token;
  85. }
  86.  
  87. chosenTokens.remove(token);
  88. }
  89.  
  90. List<Token> remainedTokensClone = new ArrayList<>(remainedTokens);
  91.  
  92. for (Token token : remainedTokensClone){
  93. chosenTokens.add(token);
  94. remainedTokens.remove(token);
  95. Token futureOption = getBestToken(chosenTokens, remainedTokens, depth+1, stopDepth);
  96.  
  97. if (futureOption != null){
  98. chosenTokens.remove(token);
  99. remainedTokens.add(token);
  100. return futureOption;
  101. }
  102.  
  103. remainedTokens.add(token);
  104. chosenTokens.remove(token);
  105. }
  106.  
  107. return null;
  108. }
  109.  
  110. public int getBestTokenVal(List<Token> givenTokens, int consideredMoves){
  111. int maxPossibleScore = calculateScore(givenTokens);
  112.  
  113. int []frequence = new int[totalTokens];
  114.  
  115. for (Token token : givenTokens){
  116. frequence[token.getValue()] ++;
  117. }
  118.  
  119. int []isAvailable = new int[totalTokens];
  120.  
  121. for (Token token : game.getBoard().getTokens()){
  122. isAvailable[token.getValue()] ++;
  123. }
  124.  
  125. List <Integer> bestOptions = new ArrayList<>();
  126.  
  127. for (int ratio = 1; ratio < totalTokens; ratio++){
  128. for (int start = 0; start < totalTokens; start++){
  129. int ratioScore = 0;
  130. int illegalMoves = 0;
  131. List <Integer> currentOptions = new ArrayList<>();
  132.  
  133. for (int tokenVal = start; tokenVal < totalTokens; tokenVal += ratio){
  134. if (frequence[tokenVal] == 0){
  135. if (isAvailable[tokenVal] == 1){
  136. illegalMoves ++;
  137. if (illegalMoves > consideredMoves)
  138. break;
  139. }
  140. else{
  141. break;
  142. }
  143.  
  144. currentOptions.add(tokenVal);
  145. }
  146. ratioScore++;
  147. }
  148.  
  149. if (maxPossibleScore < ratioScore){
  150. maxPossibleScore = ratioScore;
  151. bestOptions = currentOptions;
  152. }
  153. }
  154. }
  155.  
  156. int randomTokenIndex = (int) (Math.random() * bestOptions.size());
  157. int tokenVal = -1;
  158. if (bestOptions.size() != 0) {
  159. tokenVal = bestOptions.get(randomTokenIndex);
  160. }
  161. return tokenVal;
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement