コード例 #1
0
    def __handle_hover(self, window: Window, hover: bool):
        cursor = None

        if hover:
            cursor = window.get_system_mouse_cursor(window.CURSOR_HAND)
            self._sprite = self._sprite_hover
        else:
            cursor = window.get_system_mouse_cursor(window.CURSOR_DEFAULT)
            self._sprite = self._sprite_normal

        window.set_mouse_cursor(cursor)
コード例 #2
0
ファイル: Nqueens.py プロジェクト: HudaF/N-queens-puzzle-game
def play():
    back_image1 = pyglet.resource.image('resources/1.jpg')  ##Cream Box
    back_image2 = pyglet.resource.image('resources/2.png')  ##Black Box
    red_queen = pyglet.resource.image("resources/queen_red.png")  ##Red queen
    queen = pyglet.resource.image(
        "resources/queen.png")  ##Queen which is being placed on the board
    cursor_image = pyglet.resource.image(
        "resources/Snowball_Cursor.png")  ##Spot Cursor

    Chess_Window = Window(
        back_image1.width * (number_queens),
        back_image2.height * (number_queens),
        resizable=False,  # Make sure it is not resizable
        caption="*** N QUEENS ***",  # Caption of window
        config=pyglet.gl.Config(double_buffer=True),  # Avoids flickers
        vsync=False  # For flicker-free animation
    )  # Calling base class constructor
    Chess_Window.set_visible(False)  #The main window for the game

    global queen_sprite, cursor_sprite, red_queen_sprite

    cimage = pyglet.image.load(("resources/cursor.png"))
    cursor = pyglet.window.ImageMouseCursor(cimage, 0, 50)
    Chess_Window.set_mouse_cursor(cursor)

    queen_sprite = [[0 for x in range(number_queens)]
                    for y in range(number_queens)]
    cursor_sprite = [[0 for x in range(number_queens)]
                     for y in range(number_queens)]
    red_queen_sprite = [[0 for x in range(number_queens)]
                        for y in range(number_queens)]

    def sprite(
    ):  #spreading the images over the constructed nxn matrix. One for each type of icon/image
        global number_queens, queen_sprite, cursor_sprite, red_queen_sprite
        queen_sprite = [[0 for x in range(number_queens)]
                        for y in range(number_queens)]
        cursor_sprite = [[0 for x in range(number_queens)]
                         for y in range(number_queens)]
        red_queen_sprite = [[0 for x in range(number_queens)]
                            for y in range(number_queens)]
        for i in range(number_queens):
            for j in range(number_queens):
                queen_sprite[j][i] = (pyglet.sprite.Sprite(
                    queen, (j * 60), (i * 60)))
                red_queen_sprite[j][i] = (pyglet.sprite.Sprite(
                    red_queen, (j * 60), (i * 60)))
                cursor_sprite[j][i] = (pyglet.sprite.Sprite(
                    cursor_image, (j * 60), (i * 60)))
                queen_sprite[j][i].visible = False
                cursor_sprite[j][i].visible = False
                red_queen_sprite[j][i].visible = False

    def resize(
    ):  #resizing the chess window according to selected number of queens
        Chess_Window.set_size(back_image1.width * (number_queens + 2),
                              back_image2.height * (number_queens))
        Chess_Window.set_visible(True)

    def on_mouse_motion(
        x, y, dx, dy
    ):  #for appearance of bulls-eye cursor on chess board when mouse is kept within chess board

        global cursor_co
        for index_11 in range(number_queens):
            for index_12 in range(number_queens):
                if (index_12 * 60 <= x <
                    (index_12 + 1) * 60) and (index_11 * 60 <= y <
                                              (index_11 + 1) * 60):
                    cursor_sprite[index_12][index_11].visible = True
                    cursor_co = (index_12, index_11)

                else:
                    cursor_sprite[index_12][index_11].visible = False

    def queen_checker(
    ):  #function that checks for queens in forbidden area. Highlights the wrongly placed queens and
        #runs on every click
        global number_queens, queen_sprite, cursor_sprite, red_queen_sprite
        for y in range(number_queens):  #y is row number
            for x in range(number_queens):  #x is column numer
                if queen_sprite[x][
                        y].visible == True:  ##Check if Queen is placed somewhere
                    for ind in range(number_queens):
                        ##Checks if no queen is already placed in the same row
                        if ind != x:  #consider ind as column number
                            if queen_sprite[ind][y].visible:
                                red_queen_sprite[ind][y].visible = True
                                red_queen_sprite[x][y].visible = True
                                danger = True

                        ##Checks if no queen is already placed in the same column
                        if ind != y:  #consider ind as row number
                            if queen_sprite[x][ind].visible:
                                red_queen_sprite[x][ind].visible = True
                                red_queen_sprite[x][y].visible = True
                                danger = True

                        if ind > 0:
                            if x + ind <= (number_queens - 1) and y + ind <= (
                                    number_queens -
                                    1):  ##for the secondary diagonal
                                if queen_sprite[x + ind][ind + y].visible:
                                    red_queen_sprite[ind + x][ind +
                                                              y].visible = True
                                    red_queen_sprite[x][y].visible = True
                                    danger = True

                            if x + ind <= (
                                    number_queens - 1
                            ) and y - ind >= 0:  ##for the main diagonal
                                if queen_sprite[x + ind][y - ind].visible:
                                    red_queen_sprite[x +
                                                     ind][y -
                                                          ind].visible = True
                                    red_queen_sprite[x][y].visible = True
                                    danger = True

    def replay(
    ):  #function for setting all variables to initial stages and replaying game from start.
        global win
        global danger
        for c in range(number_queens):
            for d in range(number_queens):
                queen_sprite[d][
                    c].visible = False  ##No queen is placed on the board
                cursor_sprite[d][
                    c].visible = False  ##No cursor sprite visible at the start
                red_queen_sprite[d][
                    c].visible = False  ##No error sprite appears
            del Queen_Storage[:]  ##deleting all the members of the list
        danger = False  ##No Queen then in danger
        win = False  ##Not won the game

    @Chess_Window.event()
    def on_mouse_press(x, y, button, modifiers):
        global number_queens, win, danger, Queen_Storage, queen_sprite, cursor_sprite, red_queen_sprite, cursor_co
        if x >= 0 and x <= (
                number_queens *
                60):  # loops running within the dimensions of the chessboard
            if y >= 0 and y <= (number_queens * 60):
                if button == mouse.LEFT:  ## if left mouse button is clicked
                    if not win:  ##Only allows execution of game is not won after starting it. Once won it stops working until play again execution.
                        for v in range(number_queens):
                            for w in range(number_queens):
                                if (w * 60 <= x <
                                    (w + 1) * 60) and (v * 60 <= y <
                                                       (v + 1) * 60):
                                    if queen_sprite[w][
                                            v].visible != True:  ##Checking if queen is already not placed
                                        if len(Queen_Storage) > (
                                            (number_queens) - 1
                                        ):  ##Don't allow the placement of queens of the number exceed the 8.
                                            queen_sprite[w][v].visible = False

                                        else:
                                            queen_sprite[w][v].visible = True
                                            Queen_Storage.append(
                                                queen_sprite[w][v].visible
                                            )  ##If queen is added to the board then it is also added to storage
                                            #print("Queen on Board: ", Queen_Storage) ##print the number of queens on board on console
                                            #print("Queen added at box (" + str(w+1) + "," + str(v+1) + ")\n") ##print the coordinates for the queen on console

                                    else:
                                        queen_sprite[w][
                                            v].visible = False  #if queen is already placed, then making dissapear.
                                        Queen_Storage.pop(
                                        )  ##If queen is removed from the board then it is also deleted from the storage

                        for index1 in range(number_queens):
                            for index2 in range(
                                    number_queens
                            ):  #setting all error queens to invisible so that  each queen be checked
                                red_queen_sprite[index2][
                                    index1].visible = False
                        danger = False
                        queen_checker()
        elif x > (number_queens * 60):
            if y >= 123 and y <= 180:
                danger = False
                win = False
                Queen_Storage = []
                number_queens = 0
                queen_sprite, cursor_sprite, red_queen_sprite = 0, 0, 0
                cursor_co = (0, 0)
                Chess_Window.close()

            elif y >= 229 and y <= 281:
                replay()

    @Chess_Window.event
    def on_mouse_motion(
        x, y, dx, dy
    ):  #for appearance of bulls-eye cursor on chess board when mouse is kept within chess board

        global cursor_co
        for index_11 in range(number_queens):
            for index_12 in range(number_queens):
                if (index_12 * 60 <= x <
                    (index_12 + 1) * 60) and (index_11 * 60 <= y <
                                              (index_11 + 1) * 60):
                    cursor_sprite[index_12][index_11].visible = True
                    cursor_co = (index_12, index_11)

                else:
                    cursor_sprite[index_12][index_11].visible = False

    def on_draw2(
    ):  #function for making visible the chess board and icons/images related to it
        global main
        global number_queens, queen_sprite, cursor_sprite, red_queen_sprite
        Chess_Window.clear()

        game_options = pyglet.sprite.Sprite(
            pyglet.image.load(("resources/game_options.jpg")),
            60 * (number_queens), 0)
        tile1 = back_image1  ##Setting images to new variables
        tile2 = back_image2
        for index_1 in range(
                number_queens):  ##Nested loops to draw total nxn boxes
            for index_2 in range(number_queens):
                if number_queens % 2 == 0:
                    if index_1 % 2 == 0:
                        tile1.blit(index_1 * 60,
                                   index_2 * 60)  ##Drawing Tile2 image
                        tile1, tile2 = tile2, tile1  ##Swaping the tiles
                    else:
                        tile2.blit(index_1 * 60,
                                   index_2 * 60)  ####Drawing Tile1 image
                        tile1, tile2 = tile2, tile1
                else:
                    if index_1 % 1 == 0:
                        tile1.blit(index_1 * 60,
                                   index_2 * 60)  ##Drawing Tile2 image
                        tile1, tile2 = tile2, tile1  ##Swaping the tiles
                    else:
                        tile2.blit(index_1 * 60,
                                   index_2 * 60)  ####Drawing Tile1 image
                        tile1, tile2 = tile2, tile1
        for p in range(
                number_queens
        ):  #drawing all the images on the matrix, visible and invisible
            for q in range(number_queens):
                queen_sprite[q][p].draw()
                red_queen_sprite[q][p].draw()
                cursor_sprite[q][p].draw()

        game_options.draw()
        game_options.visible = True

    # Updating the Window
    def update(d):
        on_draw2()

    resize()
    sprite()

    # Se    tting the time interval to update
    pyglet.clock.schedule_interval(update, 1 / 120)

    # Running Pyglet
    pyglet.app.run()