Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import json
- def main():
- wonStates = set()
- lostStates = set()
- with open('wonStates.json', 'r') as inFile:
- wonStates = {(tuple(x[0]), tuple(x[1])) for x in json.loads(inFile.read())}
- with open('lostStates.json', 'r') as inFile:
- lostStates = {(tuple(x[0]), tuple(x[1])) for x in json.loads(inFile.read())}
- tiles = (0, 0, 0, 0, 5, 0, 0, 0, 0)
- tiles, previousMove = makeMove(tiles, (4, 1, 3))
- check = tiles, previousMove
- for i in range(10000):
- print(i)
- buildGames(tiles, previousMove, wonStates, lostStates)
- if check in wonStates:
- print('won')
- break
- elif check in lostStates:
- print('lost')
- break
- print(len(wonStates))
- print(len(lostStates))
- with open('wonStates.json', 'w') as outFile:
- outFile.write(json.dumps([[list(x[0]), list(x[1])] for x in wonStates], separators=(',', ':')))
- with open('lostStates.json', 'w') as outFile:
- outFile.write(json.dumps([[list(x[0]), list(x[1])] for x in lostStates], separators=(',', ':')))
- def buildGames(tiles, previousMove, wonStates, lostStates):
- seenStates = set()
- unseenStates = set()
- while 1:
- currentState = tiles, previousMove
- seenStates.add(currentState)
- unseenStates.discard(currentState)
- if tiles[0] >= 3:
- wonStates.add(currentState)
- return
- elif tiles[8] >= 3:
- lostStates.add(currentState)
- return
- illegalMove = (previousMove[1], previousMove[0], previousMove[2])
- spaces = previousMove[2]
- moveList = []
- for tile, coins in enumerate(tiles):
- if tile == 0 or tile == 8 or coins == 0:
- continue
- if 0 <= tile - spaces <= 8:
- for i in range(min(coins, 3)):
- moveList.append((tile, tile - spaces, i+1))
- if 0 <= tile + spaces <= 8:
- for i in range(min(coins, 3)):
- moveList.append((tile, tile + spaces, i+1))
- moveStates = {move: makeMove(tiles, move) for move in moveList if move != illegalMove}
- if len(moveStates) == 0:
- print('Game is locked up??')
- print(currentState)
- return
- candidateMoves = []
- for move, newState in moveStates.items():
- if newState in lostStates:
- wonStates.add(currentState)
- return
- elif newState not in wonStates:
- candidateMoves.append(move)
- if newState not in seenStates:
- unseenStates.add(newState)
- if len(candidateMoves) == 0:
- lostStates.add(currentState)
- return
- for move in candidateMoves:
- if moveStates[move] not in seenStates:
- tiles, previousMove = moveStates[move]
- break
- else:
- tiles, previousMove = next(iter(unseenStates)) # think this throws an error if unseenStates is empty, ie a true cycle?
- def makeMove(tiles, move):
- newTiles = list(tiles[::-1])
- newMove = (8-move[0], 8-move[1], move[2])
- newTiles[newMove[0]] -= newMove[2]
- newTiles[newMove[1]] += newMove[2]
- return tuple(newTiles), newMove
- if __name__ == '__main__':
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement