Exemplo n.º 1
0
def genMoves(state, chain=[]):
    """
    List possible moves. Moves are a list of moves, because some moves
    result in the player getting to move again.
    >>> genMoves([1, 2, 4, 4, 5, 6, 0, 12, 11, 10, 9, 8, 7, 0, 0])
    ([[0], [1], [2, 0], [2, 1], [2, 3], [2, 4], [2, 5], [3], [4], [5]], 11)
    >>> genMoves([0, 2, 0, 0, 1, 5, 17, 0, 0, 0, 0, 0, 1, 20, 1])
    ([[12]], 1)
    """
    movecount = 0
    player = s.getCurrentPlayer(state)
    new = s.getLegalMoves(state)
    if len(new) == 0:
        # no legal moves, so game is over: return move chain so far
        result = [chain] if len(chain) > 0 else []
    else:
        result = []
        for m in new:
            movecount += 1
            newstate = s.doMove(state, m)
            currentChain = chain + [m]
            if player == s.getCurrentPlayer(newstate):
                # still our move after move m, so recurse and grow the chain
                r, moves = genMoves(newstate, currentChain)
                movecount = movecount + moves
                # r is list of move chains we generated, so merge lists
                result = result + r
            else:
                # no more moves in this chain, add it to result list
                result = result + [currentChain]
    return (result, movecount)
Exemplo n.º 2
0
 def getMove(self, state):
     # rotate the board for current player
     player = s.getCurrentPlayer(state)
     if player != 0:
         flip = True
         board = s.flipBoard(state)
     else:
         flip = False
         board = state
     # get output of neural network
     fd = {self.x: [self.makeInputVector(board[:14])], self.keep_prob: 1.0}
     y = self.sess.run(self.y, fd)
     # y is a list containing a single output vector
     # y == [[0.0108906 0.1377293 0.370027 0.2287382 0.0950692 0.1575449]]
     scores = list(y[0])
     # we only want to pick from legal moves (the nn will learn these
     # eventually, but we're helping him with this constraint)
     legalMoves = s.getLegalMoves(board)
     move = self.chooseMoveRandomly(scores, legalMoves)
     if len([x for x in scores if math.isnan(x)]) > 0:
         logger.error(self.name + " returned NaN!")
     # if we rotated the board before, rotate it back
     if flip:
         move = s.flipMove(move, player)
     return move
Exemplo n.º 3
0
def play_game(players):
    game = s.init()
    done = False
    moves = []
    while not done:
        # do move for someone
        player = s.getCurrentPlayer(game)
        move = players[player]['ai'].move(game)
        if move is None:
            print("null move! ", game)
        mt = {
            "move": s.flipMove(move, player),
            "board": s.flipBoardCurrentPlayer(game),
            "player": player,
            "name": players[player]['module'].__name__
        }
        moves.append(mt)
        game = s.doMove(game, move)
        done = s.isGameOver(game)
    winner = s.getWinner(game)
    # make training set with move, gamestate, and 1 for win, 0 for lose
    trainingset = [dict(d, winner=int(winner == d['player'])) for d in moves]
    i = 0
    for p in players:
        p['ai'].gameOver(i == winner)
        i += 1
    return (winner, trainingset)
Exemplo n.º 4
0
def play_one_game(players, lucky):
    game = s.init()
    done = False
    moves = []
    while not done:
        # do move for someone
        player = s.getCurrentPlayer(game)
        if needRandomMove(len(moves)):
            move = lucky.move(game)
        else:
            move = players[player]['ai'].move(game)
        if move is None:
            logger.error("null move! ", game)
        mt = [s.flipBoardCurrentPlayer(game), s.flipMove(move, player), player]
        moves.append(mt)
        game = s.doMove(game, move)
        done = s.isGameOver(game)
    winner = s.getWinner(game)
    score = s.getScore(game)
    # make training set with move, gamestate, and 1 for win, 0 for lose
    trainingset = [
        d[0:2] + [int(winner == d[2])] + list(score)[::1 - d[2] * 2]
        for d in moves
    ]
    for move in trainingset:
        results.info(move)
    i = 0
    for p in players:
        isWinner = (1 if i == winner else 0)
        p['ai'].gameOver(isWinner)
        p['wins'] += isWinner
        i += 1
    return (winner, trainingset)
Exemplo n.º 5
0
 def setPrompt(self):
     names = ["Player 1", "Player 2"]
     promptlines = [
         d.getStateDrawing(self.game.gamestate, self.game.priorstate),
         d.getCommandOptionsLine(),
         names[s.getCurrentPlayer(self.game.gamestate)] + ': '
     ]
     self.prompt = "\n".join(promptlines)
Exemplo n.º 6
0
def play_game(*players):
    game = s.init()
    done = False
    while not done:
        player = s.getCurrentPlayer(game)
        move = players[player].move(game)
        game = s.doMove(game, move)
        done = s.isGameOver(game)
    return s.getWinner(game)
Exemplo n.º 7
0
def oldmain(name="nn", inputfile='trainingmoves.csv'):
    ai = importlib.import_module('ai.' + name)

    player = ai.AI()

    player.train(datafile=inputfile)

    state = s.randomState()
    move = player.move(state)
    draw_game.drawState(state)
    print("player: {}".format(s.getCurrentPlayer(state)))
    print("move: {}".format(move))
Exemplo n.º 8
0
 def move(self, state):
     player = s.getCurrentPlayer(state)
     if player != 0:
         flip = True
         board = s.flipBoard(state)
     else:
         flip = False
         board = state
     move = self.nn.getMove(board)
     if flip:
         move = s.flipMove(move, player)
     return move
Exemplo n.º 9
0
def makeVector(state, m=None, isWinner=None, myscore=None, oppscore=None):
    """
    Create a vector of scores for winning moves and losing moves. Treat any
    illegal move as a losing move.

    >>> state = [1, 2, 3, 4, 5, 6, 0, 12, 11, 10, 9, 8, 7, 0, 0]
    >>> makeVector(state, 0, 1)
    [101, 1, 1, 2, 2, 2]

    >>> state = [1, 2, 3, 0, 5, 6, 0, 12, 11, 7, 9, 8, 7, 0, 0]
    >>> makeVector(state, 2, 0)
    [1, 9, 0, 0, 2, 2]

    >>> state = [1, 2, 3, 0, 5, 6, 0, 12, 11, 7, 9, 8, 7, 0, 0]
    >>> makeVector(state)
    [1, 9, 1, 0, 2, 2]
    """
    score_now = s.getScore(state)
    vector = ([0] * 6)[:]
    for move in range(6):
        if s.isLegalMove(state, move):
            # legal, so start at 1
            vector[move] = 1
            newstate = s.doMove(state, move)
            score_new = s.getScore(newstate)
            if s.getCurrentPlayer(newstate) == s.getCurrentPlayer(state):
                vector[move] += SCORE_MOVE_AGAIN
            vector[move] += SCORE_CAPTURE * (score_new[0] - score_now[0])
            if move == m:
                if isWinner:
                    vector[move] += SCORE_WINNER_MOVE
                else:
                    vector[move] -= SCORE_LOSER_MOVE
        else:
            # illegal, always zero
            vector[move] = 0
        vector[move] = max(0, vector[move])
    return vector[:6]
Exemplo n.º 10
0
 def betweenMoves(self):
     current = s.getCurrentPlayer(self.gamestate)
     module = self.player_algorithm.get(current)
     isHumanNext = True if module is None else False
     while not isHumanNext:
         if s.isGameOver(self.gamestate):
             raise EndGame(self.gamestate)
         current = s.getCurrentPlayer(self.gamestate)
         module = self.player_algorithm.get(current)
         isHumanNext = True if module is None else False
         if not isHumanNext:
             try:
                 d.drawState(self.gamestate, self.priorstate)
                 cprint("My move!", PLAYER_COLORS[current])
                 move = module.move(self.gamestate)
                 self.priorstate = self.gamestate[:]
                 self.gamestate = s.doMove(self.gamestate, move)
                 cprint(module.taunt(), PLAYER_COLORS[current])
             except s.NoMoves as n:
                 cprint("Oops! I have no moves!", PLAYER_COLORS[current])
                 raise EndGame(self.gamestate)
             except Exception:
                 raise NoAI(current)
     pass
Exemplo n.º 11
0
def computeScore(state):
    """
    Return a numeric score for a board position.
    >>> computeScore([1, 2, 4, 4, 5, 6, 0, 12, 11, 10, 9, 8, 7, 0, 0])
    35
    """
    score = 0
    for p in range(s.NUM_PLAYERS):
        row = s.getRow(state, p)
        rcnt = 0
        for b in row:
            rcnt += b
        cnt = s.getBowlCount(state, s.getMancalaIndex(p))
        if p == s.getCurrentPlayer(state):
            score -= cnt * 2
            score -= rcnt
        else:
            score += cnt * 2
            score += rcnt
    return score
Exemplo n.º 12
0
    def move(self, state):
        # rotate the board for current player
        player = s.getCurrentPlayer(state)
        if player != 0:
            flip = True
            board = s.flipBoard(state)
        else:
            flip = False
            board = state

        # pick best move
        vector = moveToVector(board)
        bestmove = None
        bestscore = 0
        for i in range(6):
            move = 5 - i
            if vector[move] > bestscore:
                bestmove = move
                bestscore = vector[move]

        # flip move
        if flip:
            bestmove = s.flipMove(bestmove, player)
        return bestmove