Advertisement
Guest User

Untitled

a guest
Mar 18th, 2019
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.05 KB | None | 0 0
  1. import tensorflow as tf
  2. from tensorflow import keras
  3. import numpy as np
  4.  
  5. np.random.seed(0)
  6.  
  7. def gen_party(players_count):
  8. deck = [i for i in range(36)]
  9. np.random.shuffle(deck)
  10.  
  11. known_cards = [0] * 36
  12. players_turns = [0] * players_count
  13. for i in range(players_count) : players_turns[i] = []
  14.  
  15. table, beaten, offside, out = [], [], [], []
  16.  
  17.  
  18. players = [0] * players_count
  19. for i in range(players_count):
  20. players[i] = [0] * 6
  21. for c in range(6):
  22. players[i][c] = deck.pop()
  23.  
  24. trump = deck.pop();
  25. deck.insert(0, trump)
  26. trump //= 9
  27.  
  28. def is_higher(card1, card2):
  29. if card1 // 9 != card2 // 9 : return card1 // 9 == trump and (card2 // 9 != trump or card1 > card2)
  30. return card1 > card2
  31.  
  32.  
  33. def can_be_beaten(player_hand, player_table, result) :
  34. for idx, card in enumerate(player_hand):
  35. if is_higher(card, table[-1]):
  36. result.append(idx)
  37. if len(player_table) == 1 : return result
  38. hand_copy, table_copy = player_hand.copy(), player_table.copy()
  39. hand_copy.pop(idx)
  40. table_copy.pop()
  41. new_result = can_be_beaten(hand_copy, table_copy, result)
  42. if len(new_result) != 0 : return result
  43. result.pop()
  44. return []
  45.  
  46.  
  47.  
  48.  
  49. #0 - unknown, 1 - at hand, 2 - attacking, 3 - destroyed, 4 - other player, 5 - offside
  50. def fill_turn(player, result, attack):
  51. turn_info = [0] * 38
  52. for idx, k in enumerate(known_cards):
  53. if k != 0:
  54. turn_info[idx] = 4 #other palyer
  55.  
  56. for i in offside: turn_info[i] = 5 #offside
  57.  
  58. for i in players[player] : turn_info[i] = 1 #at hand
  59.  
  60. for i in beaten : turn_info[i] = 3 #destroyed
  61.  
  62. for i in table : turn_info[i] = 2 #attacking
  63.  
  64. turn_info[36] = trump
  65.  
  66. if (attack) : turn_info[37] = 1
  67.  
  68. if result < 36 : out[result] = 0.9
  69.  
  70. players_turns[player].append(turn_info + out)
  71.  
  72. turn_pl = 0
  73. min = 36
  74. for idx, hand in enumerate(players):
  75. for card in hand:
  76. if card // 9 == trump and card < min:
  77. min = card
  78. turn_pl = idx
  79.  
  80. def_pl = (turn_pl + 1) % players_count
  81.  
  82. while True:
  83. np.random.shuffle(players[def_pl])
  84. np.random.shuffle(players[turn_pl])
  85. card = players[turn_pl].pop()
  86. out = [0.1] * 36;
  87. for c in players[turn_pl] : out[c] = 0.5
  88. fill_turn(turn_pl, card, True)
  89. table.append(card)
  90. while True:
  91. all = table + beaten
  92. for i in range(players_count):
  93. if i == def_pl : continue
  94. out = [0.1] * 36
  95. for c in players[i] : out[c] = 0.3
  96. if len(players[def_pl]) == len(table) : break;
  97. for table_card in all:
  98. for idx, player_card in enumerate(players[i]):
  99. if player_card % 9 == table_card % 9:
  100. out[player_card] = 0.5
  101. if np.random.randint(0, 4) == 0:
  102. fill_turn(i, player_card, True)
  103. table.append(player_card)
  104. players[i].pop(idx)
  105. else:
  106. fill_turn(i, 36, True)
  107.  
  108. if len(table) == 0 : break;
  109. table[::-1].sort()
  110. if table[0] == 28:
  111. c = 1
  112. variant = can_be_beaten(players[def_pl], table, [])
  113. out = [0.1] * 36
  114. for c in players[def_pl] : out[c] = 0.3
  115. for v in variant : out[v] = 0.5
  116. if len(variant) == 0 or np.random.randint(0, 6) == 0:
  117. fill_turn(def_pl, 36, False)
  118. all = table + beaten
  119. players[def_pl] += all
  120. for i in all : known_cards[i] = 1
  121. table, beaten = [], []
  122. break
  123.  
  124. for idx in variant:
  125. fill_turn(def_pl, players[def_pl][idx], False)
  126. beaten.append(players[def_pl].pop(idx))
  127. beaten.append(table.pop())
  128. if len(players[def_pl]) == 0 : break
  129.  
  130. for i in range(players_count):
  131. if len(deck) == 0 : break
  132. cpl = (i + turn_pl) % players_count
  133. if cpl == def_pl : continue
  134. for i in range(len(players[cpl]), 6) :
  135. if len(deck) == 0 : break
  136. if (len(deck) == 1) : known_cards[deck[0]] = 1
  137. players[cpl].append(deck.pop())
  138.  
  139. for i in range(len(players[def_pl]), 6):
  140. if len(deck) == 0 : break
  141. if (len(deck) == 1) : known_cards[deck[0]] = 1
  142. players[def_pl].append(deck.pop())
  143.  
  144. if len(deck) == 0:
  145. for i in range(players_count):
  146. if len(players[i]) == 0 : return players_turns[i]
  147.  
  148. if len(beaten) == 0 : turn_pl = (def_pl + 1) % players_count
  149. else:
  150. turn_pl = def_pl;
  151. offside += beaten
  152. beaten = []
  153.  
  154. def_pl = (turn_pl + 1) % players_count
  155.  
  156. def expand_turn(turn):
  157. result = [0] * 2
  158. result[0] = [0.1] * 221
  159. result[1] = turn[38:]
  160. for i in range(36):
  161. result[0][i * 6 + turn[i]] = 0.9
  162. result[0][216 + turn[36]] = 0.9
  163. if turn[37] != 0 : result[0][220] = 0.9
  164. return result
  165.  
  166. model = keras.Sequential([
  167. keras.layers.Dense(300, input_shape=(221,)),
  168. keras.layers.Dense(150, activation=tf.nn.sigmoid),
  169. keras.layers.Dense(36, activation=tf.nn.sigmoid)
  170. ])
  171.  
  172. model.compile(optimizer=tf.train.AdamOptimizer(), loss='categorical_crossentropy', metrics=['accuracy'])
  173.  
  174. inputs = np.empty((1,221))
  175. outputs = np.empty((1, 36))
  176. for i in range(100):
  177. party = gen_party(3)
  178. for turn in party :
  179. res = expand_turn(turn)
  180. inputs = np.vstack((inputs, res[0]))
  181. outputs = np.vstack((outputs, res[1]))
  182.  
  183. model.fit(inputs, outputs, epochs=1000)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement