Advertisement
Guest User

Untitled

a guest
Feb 25th, 2020
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.33 KB | None | 0 0
  1. import json
  2.  
  3.  
  4. def main():
  5. wonStates = set()
  6. lostStates = set()
  7.  
  8. with open('wonStates.json', 'r') as inFile:
  9. wonStates = {(tuple(x[0]), tuple(x[1])) for x in json.loads(inFile.read())}
  10. with open('lostStates.json', 'r') as inFile:
  11. lostStates = {(tuple(x[0]), tuple(x[1])) for x in json.loads(inFile.read())}
  12.  
  13. tiles = (0, 0, 0, 0, 5, 0, 0, 0, 0)
  14. tiles, previousMove = makeMove(tiles, (4, 1, 3))
  15. check = tiles, previousMove
  16. for i in range(10000):
  17. print(i)
  18. buildGames(tiles, previousMove, wonStates, lostStates)
  19. if check in wonStates:
  20. print('won')
  21. break
  22. elif check in lostStates:
  23. print('lost')
  24. break
  25.  
  26. print(len(wonStates))
  27. print(len(lostStates))
  28.  
  29. with open('wonStates.json', 'w') as outFile:
  30. outFile.write(json.dumps([[list(x[0]), list(x[1])] for x in wonStates], separators=(',', ':')))
  31. with open('lostStates.json', 'w') as outFile:
  32. outFile.write(json.dumps([[list(x[0]), list(x[1])] for x in lostStates], separators=(',', ':')))
  33.  
  34.  
  35. def buildGames(tiles, previousMove, wonStates, lostStates):
  36. seenStates = set()
  37. unseenStates = set()
  38. while 1:
  39. currentState = tiles, previousMove
  40. seenStates.add(currentState)
  41. unseenStates.discard(currentState)
  42.  
  43. if tiles[0] >= 3:
  44. wonStates.add(currentState)
  45. return
  46. elif tiles[8] >= 3:
  47. lostStates.add(currentState)
  48. return
  49.  
  50. illegalMove = (previousMove[1], previousMove[0], previousMove[2])
  51. spaces = previousMove[2]
  52. moveList = []
  53. for tile, coins in enumerate(tiles):
  54. if tile == 0 or tile == 8 or coins == 0:
  55. continue
  56. if 0 <= tile - spaces <= 8:
  57. for i in range(min(coins, 3)):
  58. moveList.append((tile, tile - spaces, i+1))
  59. if 0 <= tile + spaces <= 8:
  60. for i in range(min(coins, 3)):
  61. moveList.append((tile, tile + spaces, i+1))
  62. moveStates = {move: makeMove(tiles, move) for move in moveList if move != illegalMove}
  63. if len(moveStates) == 0:
  64. print('Game is locked up??')
  65. print(currentState)
  66. return
  67.  
  68. candidateMoves = []
  69. for move, newState in moveStates.items():
  70. if newState in lostStates:
  71. wonStates.add(currentState)
  72. return
  73. elif newState not in wonStates:
  74. candidateMoves.append(move)
  75. if newState not in seenStates:
  76. unseenStates.add(newState)
  77. if len(candidateMoves) == 0:
  78. lostStates.add(currentState)
  79. return
  80. for move in candidateMoves:
  81. if moveStates[move] not in seenStates:
  82. tiles, previousMove = moveStates[move]
  83. break
  84. else:
  85. tiles, previousMove = next(iter(unseenStates)) # think this throws an error if unseenStates is empty, ie a true cycle?
  86.  
  87.  
  88. def makeMove(tiles, move):
  89. newTiles = list(tiles[::-1])
  90. newMove = (8-move[0], 8-move[1], move[2])
  91. newTiles[newMove[0]] -= newMove[2]
  92. newTiles[newMove[1]] += newMove[2]
  93. return tuple(newTiles), newMove
  94.  
  95.  
  96. if __name__ == '__main__':
  97. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement