コード例 #1
0
    def getQueenMove(self, state):
        myInv = getCurrPlayerInventory(state)
        me = state.whoseTurn
        queen = myInv.getQueen()
        enemy = 1 - me
        attackers = getAntList(state, enemy, [SOLDIER, R_SOLDIER, DRONE])

        # if there are no attackers move to a default location
        if len(attackers) == 0:
            return Move(MOVE_ANT, createPathToward(state, queen.coords, (4, 3), UNIT_STATS[QUEEN][MOVEMENT]), None)

        # find the most worrying attacker
        dist = 99
        closest = None
        for ant in attackers:
            tmp = (ant.coords[1] - 3) / UNIT_STATS[ant.type][MOVEMENT]
            if tmp < dist:
                dist = tmp
                closest = ant

        if closest.coords[1] <= 4:
            path = createPathToward(state, queen.coords, (closest.coords[0], min(3, closest.coords[1])), UNIT_STATS[QUEEN][MOVEMENT])
        elif closest.type == R_SOLDIER:
            path = createPathToward(state, queen.coords, (closest.coords[0], 0), UNIT_STATS[QUEEN][MOVEMENT])
        else:
            path = createPathToward(state, queen.coords, (closest.coords[0], 2), UNIT_STATS[QUEEN][MOVEMENT])

        return Move(MOVE_ANT, path, None)
コード例 #2
0
 def move(self, state):
     mark = None
     if state.getState() == Const.STATE_TURN_O:
         mark = Const.MARK_O
     if state.getState() == Const.STATE_TURN_X:
         mark = Const.MARK_X
     if mark == None:
         raise ValueError("state must be playable")
     board = state.getBoard()
     playable = []
     for row in range(Const.ROWS):
         for col in range(Const.COLS):
             if board[row][col] == Const.MARK_NONE:
                 playable.append([row, col])
     #Instead of just picking a random spot. First check if there is a winnable Move
     tempMove = Move(0, 0, mark)
     for i in range(len(playable)):
         tempMove.play(playable[i][0], playable[i][0])
         #if the spot makes X win then it returns the move
         if self._state.getState() == Const.STATE_WIN_X:
             tempMove.undo(state)
             return tempMove
         #otherwise undo and try the next on
         playable[i].undo(state)
     spot = random.randint(0, len(playable) - 1)
     return Move(playable[spot][0], playable[spot][1], mark)
コード例 #3
0
def minimax(board, player_name, depth, start_time):
    if depth == MAX_SEARCH_DEPTH or is_out_of_time_for_move(
            start_time) or game_over(board):
        score = evaluate(board, player_name)
        return Move(-1, -1, score)

    best_move = Move(
        -1, -1, -infinity if player_name == PLAYER_NAMES['P1'] else +infinity)
    board_copy = board.get_cloned_board()
    for correct_move in get_all_correct_moves(board, player_name,
                                              board.fields):
        x, y, piece_x, piece_y = correct_move.x, correct_move.y, correct_move.piece_x, correct_move.piece_y
        move_single_piece(board, player_name, correct_move)
        player_to_move = get_opponent_player(board, player_name)
        potential_move = minimax(board, player_to_move, depth + 1, start_time)

        potential_move.x = x
        potential_move.y = y
        potential_move.piece_x = piece_x
        potential_move.piece_y = piece_y

        if is_better_score(potential_move, best_move, player_name):
            best_move.x = potential_move.x
            best_move.y = potential_move.y
            best_move.piece_x = potential_move.piece_x
            best_move.piece_y = potential_move.piece_y
            best_move.score = potential_move.score
        board = board_copy.get_cloned_board()

    return best_move
コード例 #4
0
ファイル: HW5.py プロジェクト: regier21/AI_HW5
    def getMove(self, currentState):
        # Setup
        if self.isFirstTurn:
            self.firstTurn(currentState)

        # Concede game if taking too long
        elif self.turnsPlayed > STALEMATE_TURNS:
            workers = getAntList(currentState, currentState.whoseTurn,
                                 (WORKER, ))
            for worker in workers:
                if not worker.hasMoved:
                    return Move(
                        MOVE_ANT,
                        createPathToward(currentState, worker.coords,
                                         self.enemyHill.coords,
                                         UNIT_STATS[WORKER][MOVEMENT]))
            return Move(END)

        # Look ahead to each possible state and find the one with the lowest output
        bestH = 100000000
        bestMove = None
        moves = listAllLegalMoves(currentState)
        for move in moves:
            features = self.extractFeatures(getNextState(currentState, move))
            netH = self.network.eval(self.normalizeFeatures(features))[0]
            if netH < bestH:
                bestH = netH
                bestMove = move
            if ONLINE_LEARNING:
                h = self.heuristicStepsToGoal(features)
                self.network.adjustWeights((normalizeHeuristic(h), ))
        if bestMove.moveType == END:
            self.turnsPlayed += 1
        return bestMove
コード例 #5
0
ファイル: TowerOfHanoi.py プロジェクト: bezgoan/PythonProg
 def make_move(self, move):
     self.moves_stack.append(move)
     if self.stacks[move.to_stack].is_valid(move.disk):
         if self.stacks[move.from_stack].peek() == move.disk:
             self.stacks[move.from_stack].pop()
             self.stacks[move.to_stack].push(move.disk)
             print(
                 f' Stack {move.from_stack} latest position is : {self.stacks[move.from_stack].show()}'
             )
             print(
                 f' Stack {move.to_stack} latest position is : {self.stacks[move.to_stack].show()}'
             )
             this_move = self.moves_stack.pop(len(self.moves_stack) - 1)
             if len(self.moves_stack) > 0:
                 next_move = self.moves_stack.pop(len(self.moves_stack) - 1)
                 self.make_move(next_move)
         else:
             dest_stack = self.get_dest_stack(move)
             src_stack = move.from_stack
             move_disk = self.stacks[src_stack].get_disk_before(move.disk)
             new_move = Move(move_disk, src_stack, dest_stack)
             self.make_move(new_move)
     else:
         to_stack_top = self.stacks[move.to_stack].last_disk()
         dest_stack = self.get_dest_stack(move)
         src_stack = move.to_stack
         shuffle_move = Move(to_stack_top, src_stack, dest_stack)
         self.make_move(shuffle_move)
コード例 #6
0
def test_get_bar_moves(test_bar):
    moves = [Move(0, 26, 24), Move(0, 26, 23)]
    test_bar.dice.set_dice(1, 2)
    assert test_bar.get_bar_moves() == moves

    test_bar.dice.set_dice(6, 6)
    assert test_bar.get_bar_moves() == []
コード例 #7
0
    def get_pawn_sq_moves(self, sq, color):
        moves = []
        attacks = Bitboard.pawn_attacks[color][sq]
        while attacks:
            end_sq = Bitboard.lsb(attacks)
            # valid capture
            if (abs(Bitboard.get_file(sq) - Bitboard.get_file(end_sq)) == 1
                    and self.get_square_piece(end_sq) != Piece.NONE
                    and self.get_square_color(end_sq) != color):
                # promotion
                if Bitboard.get_rank(end_sq) == 1 or Bitboard.get_rank(
                        end_sq) == 5:
                    moves.append(Move(sq, end_sq, Flags.KnightPromCap))
                    moves.append(Move(sq, end_sq, Flags.BishopPromCap))
                    moves.append(Move(sq, end_sq, Flags.RookPromCap))
                    moves.append(Move(sq, end_sq, Flags.QueenPromCap))
                else:
                    moves.append(Move(sq, end_sq, Flags.Capture))
            attacks = Bitboard.pop_lsb(attacks)

        end_sq = sq + 5 if color == Color.White else sq - 5
        if (Bitboard.is_valid_square(end_sq)
                and self.get_square_piece(end_sq) == Piece.NONE):
            if Bitboard.get_rank(end_sq) == 1 or Bitboard.get_rank(
                    end_sq) == 5:
                moves.append(Move(sq, end_sq, Flags.KnightProm))
                moves.append(Move(sq, end_sq, Flags.BishopProm))
                moves.append(Move(sq, end_sq, Flags.RookProm))
                moves.append(Move(sq, end_sq, Flags.QueenProm))
            else:
                moves.append(Move(sq, end_sq, Flags.Quiet))

        return moves
コード例 #8
0
ファイル: HeuristicAI.py プロジェクト: conn22/AI-assignment-2
    def moveWorker(self, currentState, workerList):
        inventory = getCurrPlayerInventory(currentState)
        for ant in workerList:
            if not ant.hasMoved:
                if (
                        ant.carrying
                ):  # has food, move toward hill/tunnell, whichever is closer

                    target = self.findClosestTo(
                        currentState, ant.coords,
                        ((inventory.getAnthill()).coords,
                         (inventory.getTunnels())[0].coords))

                    path = createPathToward(currentState, ant.coords, target,
                                            UNIT_STATS[WORKER][MOVEMENT])
                    return Move(MOVE_ANT, path, None)
                else:  # get food
                    foodCoords = []
                    for food in self.myFood:
                        foodCoords.append(food.coords)

                    target = self.findClosestTo(currentState, ant.coords,
                                                foodCoords)

                    path = createPathToward(currentState, ant.coords, target,
                                            UNIT_STATS[WORKER][MOVEMENT])
                    return Move(MOVE_ANT, path, None)
コード例 #9
0
def generate_king_moves(start_sq: int, piece: Piece, b: Board) -> [Move]:
    """Generates moves for Kings"""
    moves = []

    dire = [-7, -8, -9, -1, 1, 7, 8, 9]
    for i in dire:
        if not is_check(b, piece):
            target_sq = start_sq + i
            if target_sq > -1 and target_sq < 64:
                if not is_same_colour(piece, b.square[target_sq]):
                    moves.append(
                        Move(start_sq, target_sq,
                             get_move_notation(piece, start_sq, target_sq, b)))

    if castle(piece, True, deepcopy(b)):
        moves.append(
            Move(start_sq,
                 start_sq - 2,
                 get_move_notation(piece, start_sq, start_sq - 2, b),
                 special_turn=SpecialTurn.CastlingLong))
    if castle(piece, False, deepcopy(b)):
        moves.append(
            Move(start_sq,
                 start_sq + 2,
                 get_move_notation(piece, start_sq, start_sq + 2, b),
                 special_turn=SpecialTurn.CastlingShort))

    return moves
コード例 #10
0
ファイル: HeuristicAI.py プロジェクト: conn22/AI-assignment-2
    def spawnAnts(self, currentState, myInv, me):
        legalBuilds = listAllBuildMoves(currentState)
        if len(legalBuilds) < 1:
            return
        ants = getAntList(currentState, me,
                          (WORKER, DRONE, SOLDIER, R_SOLDIER))

        antNums = {
            "WORKER": [0, any(a.buildType == WORKER for a in legalBuilds)],
            "DRONE": [0, any(a.buildType == DRONE for a in legalBuilds)],
            "SOLDIER": [0, any(a.buildType == SOLDIER for a in legalBuilds)],
            "R_SOLDIER":
            [0, any(a.buildType == R_SOLDIER for a in legalBuilds)]
        }
        for ant in ants:
            antNums[antTypeToStr(ant.type)][0] += 1

        if (antNums["WORKER"][0] <
                self.antList["WORKER"]) and antNums["WORKER"][1]:
            return Move(BUILD, [myInv.getAnthill().coords], WORKER)
        elif (antNums["DRONE"][0] <
              self.antList["DRONE"]) and antNums["DRONE"][1]:
            return Move(BUILD, [myInv.getAnthill().coords], DRONE)
        elif (antNums["SOLDIER"][0] <
              self.antList["SOLDIER"]) and antNums["SOLDIER"][1]:
            return Move(BUILD, [myInv.getAnthill().coords], SOLDIER)

        else:
            return None
コード例 #11
0
def test_move_to_string():
    move = Move(0, 24, 23)
    assert move.move_to_string(
    ) == "BLACK checker moves from point 24 to point 23"

    move = Move(1, 11, 10)
    assert move.move_to_string(
    ) == "WHITE checker moves from point 11 to point 10"
コード例 #12
0
 def get_bar_moves(self):
     bar_moves = []
     move = Move(self.player.colour, 26, 25 - self.dice.die1)
     if self.is_valid_move_from_bar(move):
         bar_moves.append(move)
     move = Move(self.player.colour, 26, 25 - self.dice.die2)
     if self.is_valid_move_from_bar(move):
         bar_moves.append(move)
     return bar_moves
コード例 #13
0
    def getPossibleMoves(self):
        # Function run to yield a group of all possible legal and illegal
        # 'Move' objects to the calling function. Does this by running through
        # a list of movements and testing for valid moves before yielding them.
        # Also handles the promotion of pieces and the ability for a piece to
        # move two spaces forward on its first move.
        pos = self.position
        movement = C(0, 1) if self.side == WHITE else C(0, -1)
        advanceOnePos = pos + movement
        if self.board.isValidPos(advanceOnePos):
            if self.board.pieceAtPosition(advanceOnePos) is None:
                col = advanceOnePos[1]
                if col in [7, 0]:
                    piecesForPromotion = \
                        [Rook(self.board, self.side, advanceOnePos),
                         Knight(self.board, self.side, advanceOnePos),
                         Bishop(self.board, self.side, advanceOnePos),
                         Queen(self.board, self.side, advanceOnePos)]
                    for piece in piecesForPromotion:
                        move = Move(self, advanceOnePos)
                        move.promotion = True
                        piece.movesMade = self.movesMade
                        move.specialMovePiece = piece
                        yield move
                else:
                    yield Move(self, advanceOnePos)

        if self.movesMade == 0:
            advanceTwoPos = pos + movement + movement
            if self.board.isValidPos(advanceTwoPos):
                if self.board.pieceAtPosition(advanceTwoPos) is None and \
                        self.board.pieceAtPosition(advanceOnePos) is None:
                    yield Move(self, advanceTwoPos)

        movements = [C(1, 1), C(
            -1, 1)] if self.side == WHITE else [C(1, -1), C(-1, -1)]
        for movement in movements:
            newPos = self.position + movement
            if self.board.isValidPos(newPos):
                pieceToTake = self.board.pieceAtPosition(newPos)
                if pieceToTake and pieceToTake.side != self.side:
                    col = newPos[1]
                    if col in [7, 0]:
                        piecesForPromotion = \
                            [Rook(self.board, self.side, newPos),
                             Knight(self.board, self.side, newPos),
                             Bishop(self.board, self.side, newPos),
                             Queen(self.board, self.side, newPos)]
                        for piece in piecesForPromotion:
                            move = Move(self,
                                        newPos,
                                        pieceToCapture=pieceToTake)
                            move.promotion = True
                            move.specialMovePiece = piece
                            yield move
                    else:
                        yield Move(self, newPos, pieceToCapture=pieceToTake)
コード例 #14
0
ファイル: Search.py プロジェクト: osu-uwrt/riptide_autonomy
 def execute(self, userdata):
     status = 'Success'
     sm = smach.StateMachine(outcomes=['Success', 'Failure'])
     if userdata.search_object == 'Gate':
         with sm:
             sm.userdata.type = 'depth'
             sm.userdata.args = {
                 'depth': .65,
                 'x': 2,
                 'y': -.8,
                 'obj': 'Gate',
                 'bboxWidth': .07,
                 'hold': True
             }
             smach.StateMachine.add('MOVE_DOWN',
                                    Move(),
                                    transitions={
                                        'Success': 'Success',
                                        'Failure': 'Failure'
                                    },
                                    remapping={
                                        'type': 'type',
                                        'args': 'args'
                                    })
             smach.StateMachine.add('ALIGN',
                                    Align(),
                                    transitions={
                                        'Success': 'Success',
                                        'Failure': 'Failure'
                                    })
             smach.StateMachine.add('DISTANCE',
                                    Distance(),
                                    transitions={
                                        'Success': 'Success',
                                        'Failure': 'Failure'
                                    },
                                    remapping={
                                        'type': 'type',
                                        'args': 'args'
                                    })
             smach.StateMachine.add('MOVE_AWAY',
                                    Move(),
                                    transitions={
                                        'Success': 'Success',
                                        'Failure': 'Failure'
                                    },
                                    remapping={
                                        'type': 'type',
                                        'args': 'args'
                                    })
         status = sm.execute()
     else:
         Logger.loginfo('object does not exist')
         status = 'Failure'
     return status
コード例 #15
0
ファイル: Player.py プロジェクト: Fejcvk/MSI2-Pan-Card-Game
    def list_possible_moves(self, pile: [Card]) -> [Move]:
        occurrences = {}
        move_id = 0

        for card in self.cards:
            if card.string_value in occurrences:
                occurrences[card.string_value] += 1
            else:
                occurrences[card.string_value] = 1
        possible_moves = []

        if len(pile) > 1:
            number_of_cards_to_draw = 3
            if len(pile) - 1 < number_of_cards_to_draw:
                number_of_cards_to_draw = len(pile) - 1
            draw_move = Move(
                action_type=ActionType.DRAW,
                number_of_actionable_cards=number_of_cards_to_draw,
                move_id=move_id)
            move_id += 1
            possible_moves.append(draw_move)

        for k, v in occurrences.items():
            if not self.can_throw_card_on_pile(
                    card_value=inverted_card_values[k], pile=pile):
                continue
            if v >= 1:
                # throw one card
                move = Move(action_type=ActionType.THROW,
                            number_of_actionable_cards=1,
                            card_value=k,
                            move_id=move_id)
                move_id += 1
                possible_moves.append(move)
            if v >= 3:
                # throw three cards
                move = Move(action_type=ActionType.THROW,
                            number_of_actionable_cards=3,
                            card_value=k,
                            move_id=move_id)
                move_id += 1
                possible_moves.append(move)
            if v == 4:
                move = Move(action_type=ActionType.THROW,
                            number_of_actionable_cards=4,
                            card_value=k,
                            move_id=move_id)
                move_id += 1
                possible_moves.append(move)

        for move in possible_moves:
            move.print()

        return possible_moves
コード例 #16
0
 def __init__(self):
     self.all_moves = self.read_combos()
     self.begin = Move("Begin Round")
     self.rest = Move("Rest")
     self.complete = Move("Complete")
     self.create_file(self.begin.get_file_name(),self.begin.get_moves())
     self.create_file(self.rest.get_file_name(),self.rest.get_moves())
     self.create_file(self.complete.get_file_name(),self.complete.get_moves())
     # Create all the files you need
     for combo  in self.all_moves:
         self.create_file(combo.get_file_name(), combo.get_moves())
コード例 #17
0
def test_next_move(monkeypatch, test_humanplayer):
    board = Board()
    dice = Dice()
    dice.set_dice(2, 1)
    monkeypatch.setattr('builtins.input', lambda x: '13 11')
    assert test_humanplayer.next_move(board, dice) == Move(0, 13, 11)

    monkeypatch.setattr('builtins.input', lambda x: '24 23')
    assert test_humanplayer.next_move(board, dice) == Move(0, 24, 23)

    monkeypatch.setattr('builtins.input', lambda x: '6 5')
    assert test_humanplayer.next_move(board, dice) == Move(0, 6, 5)
コード例 #18
0
ファイル: SnakeGame.py プロジェクト: ManonVessiot/SnakeGame
    def reset(self):
        self.move = Move()
        time.sleep(self.secs)

        self.buildGrid()

        self.move = Move()
        self.snake = Snake(self.width, self.height, self.border)
        self.food = Food(self.width, self.height, self.snake)
        self.score = 0

        self.reseting = True
コード例 #19
0
def bestMoveTest():
    state = getGameState()
    move1 = Move(None,None,None)
    node1 = SearchNode(move1,state,None)
    node1.evaluation = 10

    move2 = Move(None,None,None)
    node2 = SearchNode(move2,state,None)
    node2.evaluation = 5
    actualMove = bestMove([node1, node2])

    if actualMove is not move2:
        print("Best Move Test error")
コード例 #20
0
 def movesInDirectionFromPos(self, pos, direction, side) :
     for dis in range(1, 8) :
         movement = C(dis * direction[X], dis * direction[Y])
         newPos = pos + movement
         if self.board.isValidPos(newPos) :
             pieceAtNewPos = self.board.pieceAtPosition(newPos)
             if pieceAtNewPos is None :
                 yield Move(self, newPos)
             
             elif pieceAtNewPos is not None :
                 if pieceAtNewPos.side != side :
                     yield Move(self, newPos, pieceToCapture = pieceAtNewPos)
                 return
コード例 #21
0
    def get_piece_moves(self, sq, attacks, color):
        moves = []
        while attacks:
            end_sq = Bitboard.lsb(attacks)
            end_sq_color = self.get_square_color(end_sq)
            if end_sq_color == Color.NONE:
                moves.append(Move(sq, end_sq, Flags.Quiet))
            elif end_sq_color != color:
                moves.append(Move(sq, end_sq, Flags.Capture))

            attacks = Bitboard.pop_lsb(attacks)

        return moves
コード例 #22
0
ファイル: shapeShifter.py プロジェクト: holbrook20/AI_HW4
    def getQueenMove(self, state):
        myInv = getCurrPlayerInventory(state)
        me = state.whoseTurn
        queen = myInv.getQueen()
        enemy = 1 - me
        attackers = getAntList(state, enemy, [SOLDIER, R_SOLDIER, DRONE])

        # if there are no attackers move to a default location
        if len(attackers) == 0:
            return Move(
                MOVE_ANT,
                createPathToward(state, queen.coords, (4, 1),
                                 UNIT_STATS[QUEEN][MOVEMENT]), None)

        #keep queen from going onto food
        foods = getConstrList(state, None, (FOOD, ))
        for food in foods:
            if queen.coords == food.coords:
                path = createPathToward(state, queen.coords, (7, 3),
                                        UNIT_STATS[QUEEN][MOVEMENT])
                return Move(MOVE_ANT, path, None)

        # if health is lower than 6, run away and let defense do it's job
        queenHealth = queen.health
        queenCoords = queen.coords
        dist = 99
        closest = None

        # find the most worrying attacker
        for ant in attackers:
            tmp = (ant.coords[1] - 3) / UNIT_STATS[ant.type][MOVEMENT]
            if tmp < dist:
                dist = tmp
                closest = ant

        if closest.coords[1] <= 4:
            path = createPathToward(
                state, queen.coords,
                (closest.coords[0], min(3, closest.coords[1])),
                UNIT_STATS[QUEEN][MOVEMENT])
        elif closest.type == R_SOLDIER:
            path = createPathToward(state, queen.coords,
                                    (closest.coords[0], 0),
                                    UNIT_STATS[QUEEN][MOVEMENT])
        else:
            path = createPathToward(state, queen.coords,
                                    (closest.coords[0], 2),
                                    UNIT_STATS[QUEEN][MOVEMENT])

        return Move(MOVE_ANT, path, None)
コード例 #23
0
ファイル: Ghost.py プロジェクト: Dawid12/Pacman2d
 def moveInDirection(self, direction, walls, teleports):
     move = Move.initWithDirection(Enums.Direction(direction))
     if self.canMove(move, pygame.Rect((self.x, self.y), (18,18)), walls):
         teleport = self.recognizeTeleport(move, pygame.Rect((self.x, self.y), (18,18)), teleports)
         if teleport != None:
             if teleport.left == 0:
                 self.makeMove(Move(500, 0))
             else:
                 self.makeMove(Move(-500, 0))
         else:
             self.makeMove(move)
     else:
         self.makeRandomMove(move, walls, teleports)
     return
コード例 #24
0
ファイル: HeuristicAI.py プロジェクト: conn22/AI-assignment-2
    def moveQueen(self, currentState, myInv, me):
        # if the queen is on the anthill move her off
        myQueen = myInv.getQueen()
        if myQueen.coords == myInv.getAnthill().coords and not myQueen.hasMoved \
                or (myQueen.coords != (3,1) and not myQueen.hasMoved):
            return Move(
                MOVE_ANT,
                createPathToward(currentState,
                                 myInv.getQueen().coords, (3, 1),
                                 UNIT_STATS[QUEEN][MOVEMENT]), None)

        # move queen in place to attack
        if (not myQueen.hasMoved):
            return Move(MOVE_ANT, [myQueen.coords], None)
コード例 #25
0
 def updateNextAnt(self):
     for ant in self.antList:
         currentAnt = getAntAt(self.state, ant)
         if currentAnt is not None:
             if not currentAnt.hasMoved:
                 if currentAnt.carrying:
                     path = createPathToward(self.state, ant, self.deposit, UNIT_STATS[WORKER][MOVEMENT])
                     self.antList.append(path[len(path) - 1])
                     return Move(MOVE_ANT, path, None)
                 else:
                     path = createPathToward(self.state, ant, self.food, UNIT_STATS[WORKER][MOVEMENT])
                     self.antList.append(path[len(path) - 1])
                     return Move(MOVE_ANT, path, None)
     return None
コード例 #26
0
    def getMove(self, currentState):
        #Useful pointers
        myInv = getCurrPlayerInventory(currentState)
        me = currentState.whoseTurn

        #the first time this method is called, the food and tunnel locations
        #need to be recorded in their respective instance variables
        if (self.myTunnel == None):
            self.myTunnel = getConstrList(currentState, me, (TUNNEL, ))[0]
        if (self.myFood == None):
            foods = getConstrList(currentState, None, (FOOD, ))
            self.myFood = foods[0]
            #find the food closest to the tunnel
            bestDistSoFar = 1000  #i.e., infinity
            for food in foods:
                dist = stepsToReach(currentState, self.myTunnel.coords,
                                    food.coords)
                if (dist < bestDistSoFar):
                    self.myFood = food
                    bestDistSoFar = dist

        #if the hasn't moved, have her move in place so she will attack
        myQueen = myInv.getQueen()
        if (not myQueen.hasMoved):
            return Move(MOVE_ANT, [myQueen.coords], None)

        #if I don't have a worker, give up.  QQ
        numAnts = len(myInv.ants)
        if (numAnts == 1):
            return Move(END, None, None)

        #if the worker has already moved, we're done
        myWorker = getAntList(currentState, me, (WORKER, ))[0]
        if (myWorker.hasMoved):
            return Move(END, None, None)

        #if the worker has food, move toward tunnel
        if (myWorker.carrying):
            path = createPathToward(currentState, myWorker.coords,
                                    self.myTunnel.coords,
                                    UNIT_STATS[WORKER][MOVEMENT])
            return Move(MOVE_ANT, path, None)

        #if the worker has no food, move toward food
        else:
            path = createPathToward(currentState, myWorker.coords,
                                    self.myFood.coords,
                                    UNIT_STATS[WORKER][MOVEMENT])
            return Move(MOVE_ANT, path, None)
コード例 #27
0
def test_mark_used_die(test_dice):
    test_dice.set_dice(1, 2)
    move = Move(0, 24, 22)
    test_dice.mark_used_die(move)
    assert test_dice.die2 == 0

    test_dice.set_dice(4, 2)
    move = Move(0, 24, 20)
    test_dice.mark_used_die(move)
    assert test_dice.die1 == 0

    test_dice.set_dice(2, 3)
    move = Move(0, 26, 23)
    test_dice.mark_used_die(move)
    assert test_dice.die1 == 0
コード例 #28
0
def test_is_valid_move(test_rulebook):
    move1 = Move(0, 6, 4)
    move2 = Move(0, 13, 14)
    move3 = Move(0, 12, 13)

    test_rulebook.dice.set_dice(1, 2)

    test_rulebook.move = move1
    assert test_rulebook.is_valid_move(move1)

    test_rulebook.move = move2
    assert not test_rulebook.is_valid_move(move2)

    test_rulebook.move = move3
    assert not test_rulebook.is_valid_move(move3)
コード例 #29
0
ファイル: Player.py プロジェクト: diggerdata/GomokuNEO
def readMoveFile(board):
    with open(move_file) as fp:
        line = fp.readline()
        if line:
            move = Move()
            move.parseMove(line)
            board.Click(move.x, move.y)
コード例 #30
0
ファイル: Player.py プロジェクト: diggerdata/GomokuNEO
    def __init__(self, engine, name, timeout=10):
        """
        name: string
        timeout: int (default 10) 

        name is the name of the player (individual/team)
        timeout is the time limit for a move, in seconds
        """
        self.timeout = timeout
        self.name = name
        game = engine

        # start watching
        self.observer = Observer()
        self.observer.schedule(self.TurnFileHandler(name), '.', recursive=True)
        self.observer.start()
        try:
            while True:
                if myTurn == True:
                    readMoveFile(game.getBoard())
                    coords = ai.play(game.getBoard(), t=9.0)
                    move = Move(name, coords[0], coords[1])
                    game.getBoard().Click(coords[0], coords[1])
                    writeMoveFile(name, move)
                    time.sleep(1)
                else:
                    print('Waiting turn...')

        except Exception as err:
            self.observer.stop()
            print('Error: {0}'.format(err))

        self.observer.join()