예제 #1
0
파일: ai.py 프로젝트: Zolomon/reversi-ai
    def testAi(self):
        b = Board(False)

        b.set_white(4, 0)
        b.set_white(5, 0)
        b.set_white(6, 0)
        b.set_white(7, 0)
        b.set_white(3, 4)
        b.set_white(4, 4)
        b.set_white(4, 3)
        b.set_white(5, 3)
        b.set_white(5, 1)
        b.set_white(6, 1)

        b.set_black(1, 5)
        b.set_black(2, 0)
        b.set_black(2, 3)
        b.set_black(2, 4)
        b.set_black(3, 1)
        b.set_black(3, 2)
        b.set_black(3, 3)
        b.set_black(4, 1)
        b.set_black(4, 2)
        b.set_black(5, 2)
        b.set_black(6, 2)
        b.set_black(7, 1)
        b.set_black(7, 2)

        print(b.draw())

        ai = AiController(0, WHITE)
        move = ai.next_move(b)

        #self.assertEqual(, )
        self.assertIn(move, [p.get_position() for p in b.get_move_pieces(WHITE)])
예제 #2
0
    def test_ai(self):
        b = Board(False)

        b.set_black(4, 3)
        b.set_black(3, 4)
        b.set_white(4, 4)
        b.set_white(3, 3)

        b.clear_moves()
        b.mark_moves(BLACK)
        result = b.draw()
        canvas = """  a.b.c.d.e.f.g.h.
1 ................1
2 ................2
3 ......MM........3
4 ....MMWWBB......4
5 ......BBWWMM....5
6 ........MM......6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""
        self.assertEqual(result, canvas)
예제 #3
0
파일: board.py 프로젝트: Zolomon/reversi-ai
    def test_ai(self):
        b = Board(False)

        b.set_black(4, 3)
        b.set_black(3, 4)
        b.set_white(4, 4)
        b.set_white(3, 3)

        b.clear_moves()
        b.mark_moves(BLACK)
        result = b.draw()
        canvas = """  a.b.c.d.e.f.g.h.
1 ................1
2 ................2
3 ......MM........3
4 ....MMWWBB......4
5 ......BBWWMM....5
6 ........MM......6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""
        self.assertEqual(result, canvas)
예제 #4
0
    def testAi(self):
        b = Board(False)

        b.set_white(4, 0)
        b.set_white(5, 0)
        b.set_white(6, 0)
        b.set_white(7, 0)
        b.set_white(3, 4)
        b.set_white(4, 4)
        b.set_white(4, 3)
        b.set_white(5, 3)
        b.set_white(5, 1)
        b.set_white(6, 1)

        b.set_black(1, 5)
        b.set_black(2, 0)
        b.set_black(2, 3)
        b.set_black(2, 4)
        b.set_black(3, 1)
        b.set_black(3, 2)
        b.set_black(3, 3)
        b.set_black(4, 1)
        b.set_black(4, 2)
        b.set_black(5, 2)
        b.set_black(6, 2)
        b.set_black(7, 1)
        b.set_black(7, 2)

        print(b.draw())

        ai = AiController(0, WHITE)
        move = ai.next_move(b)

        #self.assertEqual(, )
        self.assertIn(move,
                      [p.get_position() for p in b.get_move_pieces(WHITE)])
예제 #5
0
    def test_draw(self):
        b = Board(False)

        b.set_black(0, 0)
        b.set_black(1, 0)
        b.set_white(1, 1)
        b.set_move(0, 1)
        result = b.draw()
        canvas = """  a.b.c.d.e.f.g.h.
1 BBBB............1
2 MMWW............2
3 ................3
4 ................4
5 ................5
6 ................6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""

        self.assertEqual(result, canvas)

        b.clear_moves()
        b.mark_moves(BLACK)
        result = b.draw()
        canvas = """  a.b.c.d.e.f.g.h.
1 BBBB............1
2 ..WW............2
3 ..MMMM..........3
4 ................4
5 ................5
6 ................6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""
        self.assertEqual(result, canvas)

        b.clear_moves()
        b = Board(False)
        b.set_white(3, 3)
        b.set_white(3, 4)
        b.set_white(4, 4)
        b.set_white(4, 3)
        b.set_black(2, 2)
        b.set_black(3, 2)
        b.set_black(4, 2)
        b.set_black(5, 2)
        b.set_black(2, 3)
        b.set_black(5, 3)
        b.set_black(2, 4)
        b.set_black(5, 4)
        b.set_black(2, 5)
        b.set_black(3, 5)
        b.set_black(4, 5)
        b.set_black(5, 5)

        b.clear_moves()
        b.mark_moves(WHITE)
        result = b.draw()
        canvas = """  a.b.c.d.e.f.g.h.
1 ................1
2 ..MMMMMMMMMMMM..2
3 ..MMBBBBBBBBMM..3
4 ..MMBBWWWWBBMM..4
5 ..MMBBWWWWBBMM..5
6 ..MMBBBBBBBBMM..6
7 ..MMMMMMMMMMMM..7
8 ................8
  a.b.c.d.e.f.g.h."""
        self.assertEqual(result, canvas)

        b = Board(False)
        b.set_white(3, 3)
        b.set_white(4, 4)
        b.set_black(3, 4)
        b.set_black(4, 3)

        b.mark_moves(BLACK)
        result = b.draw()
        canvas = """  a.b.c.d.e.f.g.h.
1 ................1
2 ................2
3 ......MM........3
4 ....MMWWBB......4
5 ......BBWWMM....5
6 ........MM......6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""

        b.clear_moves()
        b.make_move((3, 2), BLACK)
        b.mark_moves(WHITE)
        result = b.draw()
        canvas = """  a.b.c.d.e.f.g.h.
1 ................1
2 ................2
3 ....MMBBMM......3
4 ......BBBB......4
5 ....MMBBWW......5
6 ................6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""

        b.clear_moves()
        b.make_move((2, 2), WHITE)
        b.mark_moves(BLACK)
        result = b.draw()
        canvas = """  a.b.c.d.e.f.g.h.
1 ................1
2 ................2
3 ..MMWWBB........3
4 ....MMWWBB......4
5 ......BBWWMM....5
6 ........MM......6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""

        b = Board(False)
        b.set_white(6, 0)
        b.set_white(5, 1)
        b.set_white(3, 1)
        b.set_white(3, 2)
        b.set_white(4, 2)
        b.set_white(5, 2)
        b.set_white(3, 3)
        b.set_white(4, 3)

        b.set_black(2, 3)
        b.set_black(2, 4)
        b.set_black(3, 4)
        b.set_black(4, 4)
        b.set_black(1, 5)
        b.set_black(4, 5)
        b.mark_moves(BLACK)
        result = b.draw()
        canvas = """  a.b.c.d.e.f.g.h.
1 ......MM....WW..1
2 ......WWMMWWMM..2
3 ....MMWWWWWW....3
4 ....BBWWWWMM....4
5 ....BBBBBB......5
6 ..BB....BB......6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""

        self.assertEqual(result, canvas)

        b = Board(False)
        b.set_white(3, 4)
        b.set_white(4, 0)
        b.set_white(4, 3)
        b.set_white(4, 4)
        b.set_white(5, 0)
        b.set_white(5, 1)
        b.set_white(5, 3)
        b.set_white(6, 0)
        b.set_white(6, 1)
        b.set_white(7, 0)

        b.set_black(2, 0)
        b.set_black(3, 1)
        b.set_black(4, 1)
        b.set_black(7, 1)
        b.set_black(3, 2)
        b.set_black(4, 2)
        b.set_black(5, 2)
        b.set_black(6, 2)
        b.set_black(7, 2)
        b.set_black(3, 3)
        b.set_black(2, 3)
        b.set_black(2, 4)
        b.set_black(1, 5)

        b.mark_moves(BLACK)

        result = b.draw()
        #0 1 2 3 4 5 6 7
        canvas = """  a.b.c.d.e.f.g.h.
1 ....BB..WWWWWWWW1
2 ......BBBBWWWWBB2
3 ......BBBBBBBBBB3
4 ....BBBBWWWWMM..4
5 ....BBWWWWMMMM..5
6 ..BBMMMMMMMM....6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""

        self.assertEqual(result, canvas)

        b = Board(False)
        b.set_white(3, 4)
        b.set_white(4, 0)
        b.set_white(4, 3)
        b.set_white(4, 4)
        b.set_white(5, 0)
        b.set_white(5, 1)
        b.set_white(5, 3)
        b.set_white(6, 0)
        b.set_white(6, 1)
        b.set_white(7, 0)

        b.set_black(2, 0)
        b.set_black(3, 1)
        b.set_black(4, 1)
        b.set_black(7, 1)
        b.set_black(3, 2)
        b.set_black(4, 2)
        b.set_black(5, 2)
        b.set_black(6, 2)
        b.set_black(7, 2)
        b.set_black(3, 3)
        b.set_black(2, 3)
        b.set_black(2, 4)
        b.set_black(1, 5)

        b.mark_moves(BLACK)

        result = b.draw()
        #0 1 2 3 4 5 6 7
        canvas = """  a.b.c.d.e.f.g.h.
1 ....BB..WWWWWWWW1
2 ......BBBBWWWWBB2
3 ......BBBBBBBBBB3
4 ....BBBBWWWWMM..4
5 ....BBWWWWMMMM..5
6 ..BBMMMMMMMM....6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""

        self.assertEqual(result, canvas)

        b = Board(False)
        b.set_white(3, 2)
        b.set_white(4, 1)
        b.set_white(4, 2)
        b.set_white(5, 1)
        b.set_white(5, 2)
        b.set_white(6, 0)
        b.set_white(6, 1)
        b.set_white(6, 2)
        b.set_white(6, 3)

        b.set_black(1, 3)
        b.set_black(1, 5)
        b.set_black(2, 0)
        b.set_black(2, 3)
        b.set_black(2, 4)
        b.set_black(3, 1)
        b.set_black(3, 3)
        b.set_black(3, 4)
        b.set_black(3, 5)
        b.set_black(4, 3)
        b.set_black(4, 4)
        b.set_black(5, 3)
        b.set_black(5, 5)
        b.set_black(6, 4)
        b.set_black(7, 0)

        b.mark_moves(BLACK)

        result = b.draw()
        #0 1 2 3 4 5 6 7
        canvas = """  a.b.c.d.e.f.g.h.
1 ....BB..MMMMWWBB1
2 ....MMBBWWWWWWMM2
3 ......WWWWWWWW..3
4 ..BBBBBBBBBBWWMM4
5 ....BBBBBB..BB..5
6 ..BB..BB..BB....6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""

        self.assertEqual(result, canvas)

        b.clear_moves()
        b.mark_moves(WHITE)
        result = b.draw()

        canvas = """  a.b.c.d.e.f.g.h.
1 ....BBMM....WWBB1
2 ....MMBBWWWWWW..2
3 ......WWWWWWWW..3
4 MMBBBBBBBBBBWW..4
5 ..MMBBBBBBMMBB..5
6 ..BBMMBBMMBBMMMM6
7 MM..MMMM........7
8 ................8
  a.b.c.d.e.f.g.h."""

        self.assertEqual(result, canvas)

        ##b.clear_moves()
        ##b.mark_moves(WHITE)
        b.clear_moves()
        b.make_move((0, 3), WHITE)

        result = b.draw()
        #0 1 2 3 4 5 6 7
        canvas = """  a.b.c.d.e.f.g.h.
1 ....BB......WWBB1
2 ......BBWWWWWW..2
3 ......WWWWWWWW..3
4 WWWWWWWWWWWWWW..4
5 ....BBBBBB..BB..5
6 ..BB..BB..BB....6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""

        self.assertEqual(result, canvas)
class Game(object):
    def __init__(self, window, player_color, theme):
        self.window = window
        self.theme = theme
        self.move_history = MoveHistory()
        self.human = Human(player_color, self)
        self.turn = "White"

        # Game Over Conditions
        self.checkmate_win = False
        self.stalemate_draw = False
        self.threefold_draw = False
        self.no_captures_50 = False
        self.insufficient_material_draw = False
        self.resign = False

        if player_color == "White":
            self.board = Board("White")
            self.computer = Computer("Black")
        else:
            self.board = Board("Black")
            self.computer = Computer("White")

    def game_over(self):
        if self.checkmate_win or self.stalemate_draw or self.threefold_draw or \
                self.no_captures_50 or self.insufficient_material_draw or self.resign:
            return True
        return False

    def update_screen(self, valid_moves, board):
        # Draw Board
        self.board.create_board(self.window, themes[self.theme])

        # Draw Previous Move
        self.board.draw_previous_move(self.window)

        # Draw all valid moves for selected piece
        if self.board.show_valid_moves:
            self.board.draw_valid_moves(valid_moves, self.window)

        # Draw change theme buttons
        self.board.draw_theme_window(self.window)

        # Draw Game Buttons
        self.board.draw_game_buttons(self.window, themes[self.theme])

        # Draw Move Log
        self.move_history.draw_move_log(self.window)

        # Draw captured and advantages
        self.board.material.draw_captured(self.window, self.human.color)
        self.board.material.draw_advantages(self.window, self.human.color)

        # Draw the chess pieces
        self.board.draw(self.window, board)

        # Draw Promotion Menu
        if self.human.promoting:
            self.board.promotion_menu(self.human.color, self.window)

        # Update the screen
        pygame.display.update()

    def update_game(self):
        self.board.material.update_advantages(self.board)
        self.change_turn()
        self.update_all_valid_moves()

    def check_game_status(self):
        if self.king_checked():
            self.checkmate()
        self.stalemate()
        self.threefold_repetition()
        self.insufficient_material()
        self.no_captures_in_50()

    def update_all_valid_moves(self):
        for row in self.board.board:
            for piece in row:
                if isinstance(piece, (Knight, Bishop, Rook, Queen, King)):
                    piece.update_valid_moves(self.board.board)
                elif isinstance(piece, Pawn):
                    piece.update_valid_moves(self.board.board,
                                             self.move_history.move_log)

    def get_dangerous_squares(self):
        dangerous_squares = []
        for row in self.board.board:
            for piece in row:
                if isinstance(piece,
                              (Pawn, Knight, Bishop, Rook, Queen, King)):
                    if piece.color != self.turn:
                        for move in piece.valid_moves:
                            dangerous_squares.append(move)

        return dangerous_squares

    def king_checked(self):
        self.update_all_valid_moves()
        king = None
        dangerous_squares = self.get_dangerous_squares()
        king_pos = (None, None)
        for row in self.board.board:
            for piece in row:
                if isinstance(piece, King):
                    if piece.color == self.turn:
                        king = piece
                        king_pos = (piece.row, piece.col)
                        break

        if king_pos in dangerous_squares:
            king.is_checked = True
            return True

        king.is_checked = False
        return False

    def checkmate(self):
        for row in self.board.board:
            for piece in row:

                # Get all pieces that are the same color as the king in check
                if isinstance(piece,
                              (Pawn, Knight, Bishop, Rook, Queen, King)):
                    if piece.color == self.turn:
                        prev_row = piece.row
                        prev_col = piece.col

                        # Try all the moves available for each piece to see if they can escape check
                        for move in piece.valid_moves:
                            target = self.board.board[move[0]][move[1]]

                            # If capturing an enemy piece
                            if isinstance(
                                    target,
                                (Pawn, Knight, Bishop, Rook, Queen, King)):
                                if target.color != self.turn:
                                    self.board.board[move[0]][move[1]] = 0
                                    self.board.move(piece, move[0], move[1])

                                    # If king is still checked, undo move and go next
                                    if self.king_checked():
                                        self.board.move(
                                            piece, prev_row, prev_col)
                                        self.board.board[move[0]][
                                            move[1]] = target

                                    # If king is no longer checked, then there is no checkmate yet
                                    else:
                                        self.board.move(
                                            piece, prev_row, prev_col)
                                        self.board.board[move[0]][
                                            move[1]] = target
                                        return False

                            # If moving to an empty square
                            else:
                                self.board.move(piece, move[0], move[1])

                                # If king is still checked, undo move and go next
                                if self.king_checked():
                                    self.board.move(piece, prev_row, prev_col)

                                # If king is no longer checked, then there is no checkmate yet
                                else:
                                    self.board.move(piece, prev_row, prev_col)
                                    return False

        self.update_screen(self.human.valid_moves, self.board)
        self.checkmate_win = True

    def threefold_repetition(self):
        unique_moves = set()

        if len(self.move_history.move_log) > 9:
            for i in range(-1, -10, -1):
                move = self.move_history.move_log[i]
                unique_moves.add(move)

        if len(unique_moves) == 4:
            self.update_screen(self.human.valid_moves, self.board)
            self.threefold_draw = True

    def stalemate(self):
        all_valid_moves = []
        dangerous_squares = self.get_dangerous_squares()

        for row in self.board.board:
            for piece in row:
                # Get all pieces that are the same color as the current player's team
                if isinstance(piece,
                              (Pawn, Knight, Bishop, Rook, Queen, King)):
                    if piece.color == self.turn:

                        # Go through all possible moves to see if any are legal
                        if isinstance(piece, King):
                            for move in piece.valid_moves:
                                if move not in dangerous_squares:
                                    all_valid_moves.append(move)
                        else:
                            for move in piece.valid_moves:
                                all_valid_moves.append(move)

                # If there was a legal move, there is no stalemate yet
                if len(all_valid_moves) > 0:
                    return False

        # If there were no legal moves for the current player, its a stalemate
        if len(all_valid_moves) == 0:
            self.update_screen(self.human.valid_moves, self.board)
            self.stalemate_draw = True

    def no_captures_in_50(self):
        if len(self.move_history.move_log) > 50:
            moves = self.move_history.move_log[-50:]
            captures = [move for move in moves if "x" in move]
            if len(captures) == 0:
                self.no_captures_50 = True

    def insufficient_material(self):
        white_pieces = {"Knights": 0, "Bishops": 0}
        black_pieces = {"Knights": 0, "Bishops": 0}

        for row in self.board.board:
            for piece in row:

                # If there is a pawn, rook, or queen on the board, the game is still winnable
                if isinstance(piece, (Pawn, Rook, Queen)):
                    return False

                # Count number of knights on board
                elif isinstance(piece, Knight):
                    if piece.color == "White":
                        white_pieces["Knights"] += 1
                    else:
                        black_pieces["Knights"] += 1

                # Count number of bishops on board
                elif isinstance(piece, Bishop):
                    if piece.color == "Black":
                        black_pieces["Bishops"] += 1
                    else:
                        white_pieces["Bishops"] += 1

        white_material_remaining = white_pieces["Knights"] + white_pieces[
            "Bishops"]
        black_material_remaining = black_pieces["Knights"] + black_pieces[
            "Bishops"]

        # In the best case, there is a King + Knight or King + Bishop for either side (still a draw).
        if white_material_remaining * 3 <= 3 and black_material_remaining * 3 <= 3:
            self.update_screen(self.human.valid_moves, self.board)
            self.insufficient_material_draw = True

    def move_creates_check(self, move):
        self.change_turn()
        if self.king_checked():
            move += "+"
        self.change_turn()
        return move

    def change_turn(self):
        self.human.valid_moves = []
        if self.turn == "White":
            self.turn = "Black"
        else:
            self.turn = "White"

    def capture(self, piece):
        if piece.color == "Black":
            self.board.material.add_to_captured_pieces(
                piece, self.board.material.captured_black_pieces)
        if piece.color == "White":
            self.board.material.add_to_captured_pieces(
                piece, self.board.material.captured_white_pieces)

    def castle(self, king, rook, row, col, dangerous_squares, board):
        # Save a temp variable for rook column
        rook_col = rook.col

        # Long Castle
        if row == 0:
            if ((row + 1, col) and (row + 2, col)
                    and (row + 3, col)) not in dangerous_squares:
                board.move(rook, 3, king.col)
                board.move(king, 2, rook_col)
                board.move_notation = "O-O-O"
            else:
                return False

        # Short Castle
        elif row == 7:
            if (row - 1, col) and (row - 2, col) not in dangerous_squares:
                board.move(rook, 5, king.col)
                board.move(king, 6, rook_col)
                board.move_notation = "O-O"
            else:
                return False

        king.can_castle = False
        return True

    def detect_promotion(self, piece):
        # If a pawn reaches the other side of the board (any promotion square, let player choose how to promote)
        if isinstance(piece, Pawn):
            if (piece.color == "White"
                    and piece.col == 0) or (piece.color == "Black"
                                            and piece.col == 7):
                return True
        return False
예제 #7
0
class Game(object):
    """Game ties everything together. It has a board,
    two controllers, and can draw to the screen."""
    def __init__(self, timeout=1, players=['ai', 'ai'], colour=False):

        self.board = Board(colour)
        self.timeout = timeout
        self.ai_counter = 0
        self.list_of_colours = [BLACK, WHITE]
        self.ctrlers = deque([
            self.mk_ctrler(BLACK, players[0]),
            self.mk_ctrler(WHITE, players[1])
        ])
        self.player = self.ctrlers[0].get_colour()
        self.board.set_black(4, 3)
        self.board.set_black(3, 4)
        self.board.set_white(4, 4)
        self.board.set_white(3, 3)
        self.board.mark_moves(self.player)
        self.previous_move = [0, 0]
        self.previous_round_passed = False

    def mk_ctrler(self, colour, ctrler_type):
        """ Returns a controller with the specified colour.
            'player' == PlayerController,
            'ai' == AiController.
        """
        if ctrler_type == 'player':
            return PlayerController(colour)
        elif ctrler_type == 'random':
            return RandomController(colour)
        else:
            self.ai_counter += 1
            return AiController(self.ai_counter, colour, self.timeout)

    def show_info(self):
        """ Prints game information to stdout.
        """
        self.player = self.ctrlers[0].get_colour()
        print("Playing as:       " + self.player)
        print("Current turn:     " + str(self.ctrlers[0]))
        print("Previous move:    " + self.coordinate(self.previous_move))
        print("Number of Black:  " +
              str(len([p
                       for p in self.board.pieces if p.get_state() == BLACK])))
        print("Number of White:  " +
              str(len([p
                       for p in self.board.pieces if p.get_state() == WHITE])))

    def show_board(self):
        """ Prints the current state of the board to stdout.
        """
        self.board.mark_moves(self.player)
        print(self.board.draw())

    def show_commands(self):
        """ Prints the possible moves to stdout.
        """
        moves = [
            self.coordinate(piece.get_position())
            for piece in self.board.get_move_pieces(self.player)
        ]

        if not moves:
            raise NoMovesError

        print("Possible moves are: ", moves)
        self.board.clear_moves()

    def run(self):
        """ The game loop will print game information, the board, the possible moves, and then wait for the
            current player to make its decision before it processes it and then goes on repeating itself.
        """
        while True:
            os.system('clear')
            self.show_info()
            self.show_board()

            try:
                self.show_commands()
                next_move = self.ctrlers[0].next_move(self.board)
                self.board.make_move(next_move, self.ctrlers[0].get_colour())
                self.previous_round_passed = False
            except NoMovesError:
                if self.previous_round_passed:
                    print("Game Over")
                    blacks = len([
                        p for p in self.board.pieces if p.get_state() == BLACK
                    ])
                    whites = len([
                        p for p in self.board.pieces if p.get_state() == WHITE
                    ])

                    if blacks > whites:
                        print("BLACK won this game.")
                        exit()
                    elif blacks == whites:
                        print("This game was a tie.")
                        exit()
                    else:
                        print("WHITE won this game.")
                        exit()
                else:
                    self.previous_round_passed = True

            self.ctrlers.rotate()
            self.previous_move = next_move

    def coordinate(self, coordinate):
        """ Transforms an (x, y) tuple into (a-h, 1-8) tuple.
        """
        x, y = coordinate
        return '{0}{1}'.format(chr(ord('a') + x), y + 1)
예제 #8
0
def main_game(genomes, config):
  gameSpeed = 5
  gameOver = False

  nets = []
  genomes_track = []
  snakes = []

  for _, genome in genomes:
    net = neat.nn.FeedForwardNetwork.create(genome, config)
    nets.append(net)
    snake_initial_coord = unique_coords(snakes)
    snakes.append(Snake(snake_initial_coord, gameSpeed))
    genome.fitness = 0
    genomes_track.append(genome)

  #snake = Snake((int(BOARD_ROWS / 2), int(BOARD_COLS / 2)), gameSpeed)
  tile_coord = unique_coords(snakes)
  tile = Tile(tile_coord)
  board = Board(screen)
  score = Score(screen)
  
  #last_obstacle = pygame.sprite.Group()

  while not gameOver:

    for event in pygame.event.get():
      if event.type == QUIT:
        gameOver = True
        quit() 

      if event.type == KEYDOWN:
        if event.key == K_UP:
          for snake in snakes:
            snake.move_up()
        if event.key == K_DOWN:
          for snake in snakes:
            snake.move_down()
        if event.key == K_RIGHT:
          for snake in snakes:
            snake.move_right()
        if event.key == K_LEFT:
          for snake in snakes:
            snake.move_left()

    for snake in snakes:
      snake.update()

    check_collide(snakes, tile, genomes_track, nets)

    if tile.is_dead():
      score.update()
      #snake.eat_tile()
      tile_coord = unique_coords(snakes)
      tile = Tile(tile_coord)

    if len(snakes) == 0:
      gameOver = True
      quit() 

    board.clean_board()

    for snake in snakes:
      board.display_snake(snake.get_body())

    board.display_tile(tile.get_coord())

    update_fitness(snakes, tile, genomes_track, nets)

    if pygame.display.get_surface() != None:
      screen.fill(BG_COLOR)
      board.draw()
      score.draw()
      pygame.display.update()

    clock.tick(FPS)
예제 #9
0
파일: game.py 프로젝트: xbogdan/reversi-ai
class Game(object):
    """Game ties everything together. It has a board,
    two controllers, and can draw to the screen."""
    def __init__(self,
                 max_depth=1000,
                 display_moves=True,
                 players=['ai', 'ai'],
                 colour=False):

        self.board = Board(colour)
        self.max_depth = max_depth
        self.ai_counter = 0
        self.list_of_colours = [BLACK, WHITE]
        self.players = players
        self.display_moves = display_moves
        self.controllers = deque([
            self._make_controller(c, p)
            for c, p in zip(self.list_of_colours, self.players)
        ])
        self.player = self.controllers[0].get_colour()
        self.board.set_black(int(WIDTH / 2), int(WIDTH / 2 - 1))
        self.board.set_black(int(WIDTH / 2 - 1), int(WIDTH / 2))
        self.board.set_white(int(WIDTH / 2), int(WIDTH / 2))
        self.board.set_white(int(WIDTH / 2 - 1), int(WIDTH / 2 - 1))
        self.board.mark_moves(self.player)
        self.previous_move = None

    def _make_controller(self, colour, controller_type):
        """ Returns a controller with the specified colour.
            'player' == PlayerController,
            'ai' == AiController.
        """
        if controller_type == 'player':
            return PlayerController(colour)
        else:
            self.ai_counter += 1
            return AiController(self.ai_counter, colour, self.max_depth)

    def show_info(self):
        """ Prints game information to stdout.
        """
        print("Playing as:       " + self.player)
        print("Displaying moves: " + str(self.display_moves))
        print("Current turn:     " + str(self.controllers[0]))
        print("Number of Black:  " +
              str(len([p
                       for p in self.board.pieces if p.get_state() == BLACK])))
        print("Number of White:  " +
              str(len([p
                       for p in self.board.pieces if p.get_state() == WHITE])))

    def show_board(self):
        """ Prints the current state of the board to stdout.
        """
        self.player = self.controllers[0].get_colour()
        self.board.mark_moves(self.player)
        print(self.board.draw())

    def show_commands(self):
        """ Prints the possible moves to stdout.
        """
        moves = [
            self.to_board_coordinates(piece.get_position())
            for piece in self.board.get_move_pieces(self.player)
        ]

        if not moves:
            raise NoMovesError

        print("Possible moves are: ", moves)
        self.board.clear_moves()

    def run(self):
        """ The game loop will print game information, the board, the possible moves, and then wait for the
            current player to make its decision before it processes it and then goes on repeating itself.
        """
        while True:
            os.system('clear')
            self.show_info()
            self.show_board()

            try:
                self.show_commands()
                next_move = self.controllers[0].next_move(self.board)
                self.board.make_move(next_move,
                                     self.controllers[0].get_colour())
            except NoMovesError:
                print("Game Over")
                blacks = len(
                    [p for p in self.board.pieces if p.get_state() == BLACK])
                whites = len(
                    [p for p in self.board.pieces if p.get_state() == WHITE])

                if blacks > whites:
                    print("Black won this game.")
                    break
                elif blacks == whites:
                    print("This game was a tie.")
                    break
                else:
                    print("White won this game.")
                    break

            self.controllers.rotate()

            print("Current move is: ", self.to_board_coordinates(next_move))

            self.previous_move = next_move

        for i in range(1, SIZE):
            COMM.isend(-1, dest=i, tag=1)

    def to_board_coordinates(self, coordinate):
        """ Transforms an (x, y) tuple into (a-h, 1-8) tuple.
        """
        x, y = coordinate
        return '{0}{1}'.format(chr(ord('a') + x), y + 1)
예제 #10
0
class Game(object):
    """Game ties everything together. It has a board,
    two controllers, and can draw to the screen."""

    def __init__(self, timeout=1000,
                 display_moves=True,
                 players=['ai', 'ai'],
                 colour=False):

        self.board = Board(colour)
        self.timeout = timeout
        self.ai_counter = 0
        self.list_of_colours = [BLACK, WHITE]
        self.players = players
        self.display_moves = display_moves
        self.controllers = deque([self._make_controller(c, p) for c, p in zip(self.list_of_colours, self.players)])
        self.player = self.controllers[0].get_colour()
        self.board.set_black(4, 3)
        self.board.set_black(3, 4)
        self.board.set_white(4, 4)
        self.board.set_white(3, 3)
        self.board.mark_moves(self.player)
        self.previous_move = None

    def _make_controller(self, colour, controller_type):
        """ Returns a controller with the specified colour.
            'player' == PlayerController,
            'ai' == AiController.
        """
        if controller_type == 'player':
            return PlayerController(colour)
        else:
            self.ai_counter += 1
            return AiController(self.ai_counter, colour, self.timeout)

    def show_info(self):
        """ Prints game information to stdout.
        """
        print("Playing as:       " + self.player)
        print("Displaying moves: " + str(self.display_moves))
        print("Current turn:     " + str(self.controllers[0]))
        print("Number of Black:  " + str(
            len([p for p in self.board.pieces if p.get_state() == BLACK])))
        print("Number of White:  " + str(
            len([p for p in self.board.pieces if p.get_state() == WHITE])))

    def show_board(self):
        """ Prints the current state of the board to stdout.
        """
        self.player = self.controllers[0].get_colour()
        self.board.mark_moves(self.player)
        print(self.board.draw())

    def show_commands(self):
        """ Prints the possible moves to stdout.
        """
        moves = [self.to_board_coordinates(piece.get_position()) for piece in self.board.get_move_pieces(self.player)]

        if not moves:
            raise NoMovesError

        print("Possible moves are: ", moves)
        self.board.clear_moves()

    def run(self):
        """ The game loop will print game information, the board, the possible moves, and then wait for the
            current player to make its decision before it processes it and then goes on repeating itself.
        """
        while True:
            os.system('clear')
            self.show_info()
            self.show_board()

            try:
                self.show_commands()
                next_move = self.controllers[0].next_move(self.board)
                self.board.make_move(next_move, self.controllers[0].get_colour())
            except NoMovesError:
                print("Game Over")
                blacks = len([p for p in self.board.pieces if p.get_state() == BLACK])
                whites = len([p for p in self.board.pieces if p.get_state() == WHITE])

                if blacks > whites:
                    print("Black won this game.")
                    exit()
                elif blacks == whites:
                    print("This game was a tie.")
                    exit()
                else:
                    print("White won this game.")
                    exit()

            self.controllers.rotate()

            print("Current move is: ", self.to_board_coordinates(next_move))

            self.previous_move = next_move

    def to_board_coordinates(self, coordinate):
        """ Transforms an (x, y) tuple into (a-h, 1-8) tuple.
        """
        x, y = coordinate
        return '{0}{1}'.format(chr(ord('a') + x), y + 1)
예제 #11
0
파일: board.py 프로젝트: Zolomon/reversi-ai
    def test_draw(self):
        b = Board(False)

        b.set_black(0, 0)
        b.set_black(1, 0)
        b.set_white(1, 1)
        b.set_move(0, 1)
        result = b.draw()
        canvas = """  a.b.c.d.e.f.g.h.
1 BBBB............1
2 MMWW............2
3 ................3
4 ................4
5 ................5
6 ................6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""

        self.assertEqual(result, canvas)

        b.clear_moves()
        b.mark_moves(BLACK)
        result = b.draw()
        canvas = """  a.b.c.d.e.f.g.h.
1 BBBB............1
2 ..WW............2
3 ..MMMM..........3
4 ................4
5 ................5
6 ................6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""
        self.assertEqual(result, canvas)

        b.clear_moves()
        b = Board(False)
        b.set_white(3, 3)
        b.set_white(3, 4)
        b.set_white(4, 4)
        b.set_white(4, 3)
        b.set_black(2, 2)
        b.set_black(3, 2)
        b.set_black(4, 2)
        b.set_black(5, 2)
        b.set_black(2, 3)
        b.set_black(5, 3)
        b.set_black(2, 4)
        b.set_black(5, 4)
        b.set_black(2, 5)
        b.set_black(3, 5)
        b.set_black(4, 5)
        b.set_black(5, 5)

        b.clear_moves()
        b.mark_moves(WHITE)
        result = b.draw()
        canvas = """  a.b.c.d.e.f.g.h.
1 ................1
2 ..MMMMMMMMMMMM..2
3 ..MMBBBBBBBBMM..3
4 ..MMBBWWWWBBMM..4
5 ..MMBBWWWWBBMM..5
6 ..MMBBBBBBBBMM..6
7 ..MMMMMMMMMMMM..7
8 ................8
  a.b.c.d.e.f.g.h."""
        self.assertEqual(result, canvas)

        b = Board(False)
        b.set_white(3, 3)
        b.set_white(4, 4)
        b.set_black(3, 4)
        b.set_black(4, 3)

        b.mark_moves(BLACK)
        result = b.draw()
        canvas = """  a.b.c.d.e.f.g.h.
1 ................1
2 ................2
3 ......MM........3
4 ....MMWWBB......4
5 ......BBWWMM....5
6 ........MM......6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""

        b.clear_moves()
        b.make_move((3, 2), BLACK)
        b.mark_moves(WHITE)
        result = b.draw()
        canvas = """  a.b.c.d.e.f.g.h.
1 ................1
2 ................2
3 ....MMBBMM......3
4 ......BBBB......4
5 ....MMBBWW......5
6 ................6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""

        b.clear_moves()
        b.make_move((2, 2), WHITE)
        b.mark_moves(BLACK)
        result = b.draw()
        canvas = """  a.b.c.d.e.f.g.h.
1 ................1
2 ................2
3 ..MMWWBB........3
4 ....MMWWBB......4
5 ......BBWWMM....5
6 ........MM......6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""

        b = Board(False)
        b.set_white(6, 0)
        b.set_white(5, 1)
        b.set_white(3, 1)
        b.set_white(3, 2)
        b.set_white(4, 2)
        b.set_white(5, 2)
        b.set_white(3, 3)
        b.set_white(4, 3)

        b.set_black(2, 3)
        b.set_black(2, 4)
        b.set_black(3, 4)
        b.set_black(4, 4)
        b.set_black(1, 5)
        b.set_black(4, 5)
        b.mark_moves(BLACK)
        result = b.draw()
        canvas = """  a.b.c.d.e.f.g.h.
1 ......MM....WW..1
2 ......WWMMWWMM..2
3 ....MMWWWWWW....3
4 ....BBWWWWMM....4
5 ....BBBBBB......5
6 ..BB....BB......6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""

        self.assertEqual(result, canvas)

        b = Board(False)
        b.set_white(3, 4)
        b.set_white(4, 0)
        b.set_white(4, 3)
        b.set_white(4, 4)
        b.set_white(5, 0)
        b.set_white(5, 1)
        b.set_white(5, 3)
        b.set_white(6, 0)
        b.set_white(6, 1)
        b.set_white(7, 0)

        b.set_black(2, 0)
        b.set_black(3, 1)
        b.set_black(4, 1)
        b.set_black(7, 1)
        b.set_black(3, 2)
        b.set_black(4, 2)
        b.set_black(5, 2)
        b.set_black(6, 2)
        b.set_black(7, 2)
        b.set_black(3, 3)
        b.set_black(2, 3)
        b.set_black(2, 4)
        b.set_black(1, 5)

        b.mark_moves(BLACK)

        result = b.draw()
        #0 1 2 3 4 5 6 7
        canvas = """  a.b.c.d.e.f.g.h.
1 ....BB..WWWWWWWW1
2 ......BBBBWWWWBB2
3 ......BBBBBBBBBB3
4 ....BBBBWWWWMM..4
5 ....BBWWWWMMMM..5
6 ..BBMMMMMMMM....6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""

        self.assertEqual(result, canvas)

        b = Board(False)
        b.set_white(3, 4)
        b.set_white(4, 0)
        b.set_white(4, 3)
        b.set_white(4, 4)
        b.set_white(5, 0)
        b.set_white(5, 1)
        b.set_white(5, 3)
        b.set_white(6, 0)
        b.set_white(6, 1)
        b.set_white(7, 0)

        b.set_black(2, 0)
        b.set_black(3, 1)
        b.set_black(4, 1)
        b.set_black(7, 1)
        b.set_black(3, 2)
        b.set_black(4, 2)
        b.set_black(5, 2)
        b.set_black(6, 2)
        b.set_black(7, 2)
        b.set_black(3, 3)
        b.set_black(2, 3)
        b.set_black(2, 4)
        b.set_black(1, 5)

        b.mark_moves(BLACK)

        result = b.draw()
        #0 1 2 3 4 5 6 7
        canvas = """  a.b.c.d.e.f.g.h.
1 ....BB..WWWWWWWW1
2 ......BBBBWWWWBB2
3 ......BBBBBBBBBB3
4 ....BBBBWWWWMM..4
5 ....BBWWWWMMMM..5
6 ..BBMMMMMMMM....6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""

        self.assertEqual(result, canvas)

        b = Board(False)
        b.set_white(3, 2)
        b.set_white(4, 1)
        b.set_white(4, 2)
        b.set_white(5, 1)
        b.set_white(5, 2)
        b.set_white(6, 0)
        b.set_white(6, 1)
        b.set_white(6, 2)
        b.set_white(6, 3)

        b.set_black(1, 3)
        b.set_black(1, 5)
        b.set_black(2, 0)
        b.set_black(2, 3)
        b.set_black(2, 4)
        b.set_black(3, 1)
        b.set_black(3, 3)
        b.set_black(3, 4)
        b.set_black(3, 5)
        b.set_black(4, 3)
        b.set_black(4, 4)
        b.set_black(5, 3)
        b.set_black(5, 5)
        b.set_black(6, 4)
        b.set_black(7, 0)

        b.mark_moves(BLACK)

        result = b.draw()
        #0 1 2 3 4 5 6 7
        canvas = """  a.b.c.d.e.f.g.h.
1 ....BB..MMMMWWBB1
2 ....MMBBWWWWWWMM2
3 ......WWWWWWWW..3
4 ..BBBBBBBBBBWWMM4
5 ....BBBBBB..BB..5
6 ..BB..BB..BB....6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""

        self.assertEqual(result, canvas)

        b.clear_moves()
        b.mark_moves(WHITE)
        result = b.draw()

        canvas = """  a.b.c.d.e.f.g.h.
1 ....BBMM....WWBB1
2 ....MMBBWWWWWW..2
3 ......WWWWWWWW..3
4 MMBBBBBBBBBBWW..4
5 ..MMBBBBBBMMBB..5
6 ..BBMMBBMMBBMMMM6
7 MM..MMMM........7
8 ................8
  a.b.c.d.e.f.g.h."""

        self.assertEqual(result, canvas)

        ##b.clear_moves()
        ##b.mark_moves(WHITE)
        b.clear_moves()
        b.make_move((0, 3), WHITE)
        
        result = b.draw()
        #0 1 2 3 4 5 6 7
        canvas = """  a.b.c.d.e.f.g.h.
1 ....BB......WWBB1
2 ......BBWWWWWW..2
3 ......WWWWWWWW..3
4 WWWWWWWWWWWWWW..4
5 ....BBBBBB..BB..5
6 ..BB..BB..BB....6
7 ................7
8 ................8
  a.b.c.d.e.f.g.h."""

        self.assertEqual(result, canvas)