def test_Renderer_draw_rect(self):
     surface = SDL_CreateRGBSurface(0, 128, 128, 32, 0, 0, 0, 0).contents
     sdl2ext.fill(surface, 0x0)
     renderer = sdl2ext.Renderer(surface)
     renderer.draw_rect((40, 50, 32, 32), 0x0000FF)
     view = sdl2ext.PixelView(surface)
     self.check_lines(view, 128, 128, [
         ((40, 50), (71, 50)),
         ((40, 50), (40, 81)),
         ((40, 81), (71, 81)),
         ((71, 50), (71, 81))], 0x0000FF, (0x0,))
     del view
     sdl2ext.fill(surface, 0x0)
     renderer.draw_rect([(5, 5, 10, 10), (20, 15, 8, 10)], 0x0000FF)
     view = sdl2ext.PixelView(surface)
     self.check_lines(view, 128, 128, [
         ((5, 5), (14, 5)),
         ((5, 5), (5, 14)),
         ((5, 14), (14, 14)),
         ((14, 5), (14, 14)),
         ((20, 15), (27, 15)),
         ((20, 15), (20, 24)),
         ((20, 24), (27, 24)),
         ((27, 15), (27, 24))], 0x0000FF, (0x0,))
     del view
    def test_SpriteFactory(self):
        factory = sdl2ext.SpriteFactory(sdl2ext.SOFTWARE)
        assert isinstance(factory, sdl2ext.SpriteFactory)
        assert factory.default_args == {}

        factory = sdl2ext.SpriteFactory(sdl2ext.SOFTWARE, bananas="tasty")
        assert isinstance(factory, sdl2ext.SpriteFactory)
        assert factory.default_args == {"bananas": "tasty"}

        window = sdl2ext.Window("Test", size=(1, 1))
        renderer = sdl2ext.Renderer(window)

        factory = sdl2ext.SpriteFactory(sdl2ext.TEXTURE, renderer=renderer)
        assert isinstance(factory, sdl2ext.SpriteFactory)

        factory = sdl2ext.SpriteFactory(sdl2ext.TEXTURE, renderer=renderer)
        assert isinstance(factory, sdl2ext.SpriteFactory)
        assert factory.default_args == {"renderer": renderer}

        with pytest.raises(ValueError):
            sdl2ext.SpriteFactory("Test")
        with pytest.raises(ValueError):
            sdl2ext.SpriteFactory(-456)
        with pytest.raises(ValueError):
            sdl2ext.SpriteFactory(123)
        with pytest.raises(ValueError):
            sdl2ext.SpriteFactory(sdl2ext.TEXTURE)
        dogc()
def main():
    #cause I don't want to pass these around
    global WINDOW, REN, SPRITE_FACTORY, SPRITE_RENDERER, MUSIC

    SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO)

    WINDOW = ext.Window("Tetromino", size=(WINDOWWIDTH, WINDOWHEIGHT))
    REN = ext.Renderer(WINDOW)
    WINDOW.show()

    font_file = sysfont.get_font("freesans", sysfont.STYLE_BOLD)
    font_manager = ext.FontManager(font_file, size=18)

    #fontmanager=font_manager will be default_args passed to every sprite creation method
    SPRITE_FACTORY = ext.SpriteFactory(renderer=REN,
                                       fontmanager=font_manager,
                                       free=True)
    SPRITE_RENDERER = SPRITE_FACTORY.create_sprite_render_system(WINDOW)

    sdlmixer.Mix_Init(sdlmixer.MIX_INIT_OGG)
    sdlmixer.Mix_OpenAudio(22050, sdlmixer.MIX_DEFAULT_FORMAT, 2, 1024)
    #BEEP1 = sdlmixer.Mix_LoadWAV(b"beep1.ogg")

    showTextScreen("Tetromino")
    while True:
        if random.randint(0, 1) == 0:
            MUSIC = sdlmixer.Mix_LoadMUS(b"tetrisb.mid")
        else:
            MUSIC = sdlmixer.Mix_LoadMUS(b"tetrisc.mid")
        sdlmixer.Mix_PlayMusic(MUSIC, -1)
        runGame()
        sdlmixer.Mix_HaltMusic()
        showTextScreen("Game Over")
Example #4
0
def init(windowname='ZOMG FORGOT TO NAME IT', width=640, height=400):
    global renderer, window, window_width, window_height
    window_width = width
    window_height = height
    sdl.init()
    window = sdl.Window(windowname, size=(window_width, window_height))
    window.show()
    renderer = sdl.Renderer(window)
 def test_Renderer_draw_line(self):
     surface = SDL_CreateRGBSurface(0, 128, 128, 32, 0, 0, 0, 0).contents
     sdl2ext.fill(surface, 0x0)
     renderer = sdl2ext.Renderer(surface)
     renderer.draw_line((20, 10, 20, 86), 0x0000FF)
     view = sdl2ext.PixelView(surface)
     self.check_lines(view, 128, 128, [((20, 10), (20, 86))], 0x0000FF,
                      (0x0, ))
     del view
Example #6
0
 def __init__(self, entities, timer):
     self.entities = entities
     self.timer = timer
     self.window = sdle.Window("Game", size=(self.WINDOW_X, self.WINDOW_Y))
     self.renderer = sdle.Renderer(self.window,
                                   flags=sdl.SDL_RENDERER_ACCELERATED)
     self.texture = sdl.SDL_CreateTexture(self.renderer.renderer,
                                          sdl.SDL_PIXELFORMAT_ARGB8888,
                                          sdl.SDL_TEXTUREACCESS_STREAMING,
                                          self.WINDOW_X, self.WINDOW_Y)
     self.window.show()
 def test_Renderer_copy(self):
     surface = SDL_CreateRGBSurface(0, 128, 128, 32, 0, 0, 0, 0).contents
     sdl2ext.fill(surface, 0x0)
     renderer = sdl2ext.Renderer(surface)
     factory = sdl2ext.SpriteFactory(sdl2ext.TEXTURE, renderer=renderer)
     w, h = 32, 32
     sp = factory.from_color(0xFF0000, (w, h))
     sp.x, sp.y = 40, 50
     renderer.copy(sp, (0, 0, w, h), (sp.x, sp.y, w, h))
     view = sdl2ext.PixelView(surface)
     self.check_pixels(view, 128, 128, sp, 0xFF0000, (0x0, ))
     del view
    def test_Renderer(self):
        sf = SDL_CreateRGBSurface(0, 10, 10, 32, 0, 0, 0, 0).contents

        renderer = sdl2ext.Renderer(sf)
        self.assertEqual(renderer.rendertarget, sf)
        self.assertIsInstance(renderer.sdlrenderer.contents, SDL_Renderer)
        del renderer

        # Deprecated
        renderer = sdl2ext.Renderer(sf)
        self.assertEqual(renderer.rendertarget, sf)
        self.assertIsInstance(renderer.renderer.contents, SDL_Renderer)
        del renderer


        sprite = sdl2ext.SoftwareSprite(sf, True)
        renderer = sdl2ext.Renderer(sprite)
        self.assertEqual(renderer.rendertarget, sprite)
        self.assertIsInstance(renderer.sdlrenderer.contents, SDL_Renderer)
        del renderer
        dogc()

        window = sdl2ext.Window("Test", size=(1, 1))
        renderer = sdl2ext.Renderer(window)
        self.assertEqual(renderer.rendertarget, window)
        self.assertIsInstance(renderer.sdlrenderer.contents, SDL_Renderer)
        del renderer
        dogc()

        sdlwindow = window.window
        renderer = sdl2ext.Renderer(sdlwindow)
        self.assertEqual(renderer.rendertarget, sdlwindow)
        self.assertIsInstance(renderer.sdlrenderer.contents, SDL_Renderer)
        del renderer
        del window

        self.assertRaises(TypeError, sdl2ext.Renderer, None)
        self.assertRaises(TypeError, sdl2ext.Renderer, 1234)
        self.assertRaises(TypeError, sdl2ext.Renderer, "test")
        dogc()
    def test_Renderer(self):
        sf = SDL_CreateRGBSurface(0, 10, 10, 32, 0, 0, 0, 0).contents

        renderer = sdl2ext.Renderer(sf)
        assert renderer.rendertarget == sf
        assert isinstance(renderer.sdlrenderer.contents, SDL_Renderer)
        del renderer

        # Deprecated
        renderer = sdl2ext.Renderer(sf)
        assert renderer.rendertarget == sf
        assert isinstance(renderer.sdlrenderer.contents, SDL_Renderer)
        del renderer

        sprite = sdl2ext.SoftwareSprite(sf, True)
        renderer = sdl2ext.Renderer(sprite)
        assert renderer.rendertarget == sprite
        assert isinstance(renderer.sdlrenderer.contents, SDL_Renderer)
        del renderer
        dogc()

        window = sdl2ext.Window("Test", size=(1, 1))
        renderer = sdl2ext.Renderer(window)
        assert renderer.rendertarget == window
        assert isinstance(renderer.sdlrenderer.contents, SDL_Renderer)
        del renderer
        dogc()

        sdlwindow = window.window
        renderer = sdl2ext.Renderer(sdlwindow)
        assert renderer.rendertarget == sdlwindow
        assert isinstance(renderer.sdlrenderer.contents, SDL_Renderer)
        del renderer
        del window

        with pytest.raises(TypeError):
            sdl2ext.Renderer(None)
        with pytest.raises(TypeError):
            sdl2ext.Renderer(1234)
        with pytest.raises(TypeError):
            sdl2ext.Renderer("test")
        dogc()
Example #10
0
    def test_SpriteFactory_create_texture_sprite(self):
        window = sdl2ext.Window("Test", size=(1, 1))
        renderer = sdl2ext.Renderer(window)
        factory = sdl2ext.SpriteFactory(sdl2ext.TEXTURE, renderer=renderer)
        for w in range(1, 100):
            for h in range(1, 100):
                sprite = factory.create_texture_sprite(renderer, size=(w, h))
                self.assertIsInstance(sprite, sdl2ext.TextureSprite)
                del sprite

        # Test different access flags
        for flag in (SDL_TEXTUREACCESS_STATIC, SDL_TEXTUREACCESS_STREAMING,
                     SDL_TEXTUREACCESS_TARGET):
            sprite = factory.create_texture_sprite(renderer, size=(64, 64),
                                                   access=flag)
            self.assertIsInstance(sprite, sdl2ext.TextureSprite)
            del sprite
        dogc()
    def test_SpriteFactory_create_sprite(self):
        window = sdl2ext.Window("Test", size=(1, 1))
        renderer = sdl2ext.Renderer(window)
        tfactory = sdl2ext.SpriteFactory(sdl2ext.TEXTURE, renderer=renderer)
        sfactory = sdl2ext.SpriteFactory(sdl2ext.SOFTWARE)

        for w in range(0, 100):
            for h in range(0, 100):
                for bpp in (1, 4, 8, 12, 15, 16, 24, 32):
                    sprite = sfactory.create_sprite(size=(w, h), bpp=bpp)
                    assert isinstance(sprite, sdl2ext.SoftwareSprite)

                if w == 0 or h == 0:
                    with pytest.raises(sdl2ext.SDLError):
                        tfactory.create_sprite(size=(w, h))
                    continue
                sprite = tfactory.create_sprite(size=(w, h))
                assert isinstance(sprite, sdl2ext.TextureSprite)
        dogc()
 def test_Renderer_clear(self):
     sf = SDL_CreateRGBSurface(0, 10, 10, 32, 0xFF000000, 0x00FF0000,
                               0x0000FF00, 0x000000FF)
     renderer = sdl2ext.Renderer(sf.contents)
     self.assertIsInstance(renderer.color, sdl2ext.Color)
     self.assertEqual(renderer.color, sdl2ext.Color(0, 0, 0, 0))
     renderer.color = 0x00FF0000
     self.assertEqual(renderer.color, sdl2ext.Color(0xFF, 0, 0, 0))
     renderer.clear()
     view = sdl2ext.PixelView(sf.contents)
     self.check_areas(view, 10, 10, [[0, 0, 10, 10]], 0xFF000000, (0x0, ))
     del view
     renderer.clear(0xAABBCCDD)
     self.assertEqual(renderer.color, sdl2ext.Color(0xFF, 0, 0, 0))
     view = sdl2ext.PixelView(sf.contents)
     self.check_areas(view, 10, 10, [[0, 0, 10, 10]], 0xBBCCDDAA, (0x0, ))
     del view
     del renderer
     SDL_FreeSurface(sf)
     dogc()
    def test_SpriteFactory_from_image(self):
        window = sdl2ext.Window("Test", size=(1, 1))
        renderer = sdl2ext.Renderer(window)
        tfactory = sdl2ext.SpriteFactory(sdl2ext.TEXTURE, renderer=renderer)
        sfactory = sdl2ext.SpriteFactory(sdl2ext.SOFTWARE)

        for suffix in ("tif", "png", "jpg"):
            imgname = RESOURCES.get_path("surfacetest.%s" % suffix)
            tsprite = tfactory.from_image(imgname)
            self.assertIsInstance(tsprite, sdl2ext.TextureSprite)
            ssprite = sfactory.from_image(imgname)
            self.assertIsInstance(ssprite, sdl2ext.SoftwareSprite)

        for factory in (tfactory, sfactory):
            self.assertRaises((ArgumentError, ValueError), factory.from_image,
                              None)
            #self.assertRaises((IOError, SDLError),
            #                  factory.from_image, "banana")
            if not _ISPYPY:
                self.assertRaises(ArgumentError, factory.from_image, 12345)
        dogc()
Example #14
0
    def test_SpriteFactory_from_surface(self):
        window = sdl2ext.Window("Test", size=(1, 1))
        renderer = sdl2ext.Renderer(window)
        tfactory = sdl2ext.SpriteFactory(sdl2ext.TEXTURE, renderer=renderer)
        sfactory = sdl2ext.SpriteFactory(sdl2ext.SOFTWARE)

        sf = SDL_CreateRGBSurface(0, 10, 10, 32, 0, 0, 0, 0)
        tsprite = tfactory.from_surface(sf.contents)
        self.assertIsInstance(tsprite, sdl2ext.TextureSprite)
        ssprite = sfactory.from_surface(sf.contents)
        self.assertIsInstance(ssprite, sdl2ext.SoftwareSprite)
        SDL_FreeSurface(sf)

        for factory in (tfactory, sfactory):
            self.assertRaises((sdl2ext.SDLError, AttributeError, ArgumentError,
                               TypeError), factory.from_surface, None)
            self.assertRaises((AttributeError, ArgumentError, TypeError),
                              factory.from_surface, "test")
            # TODO: crashes pypy 2.0
            #self.assertRaises((AttributeError, ArgumentError, TypeError),
            #                  factory.from_surface, 1234)
        dogc()
    def test_SpriteFactory_from_text(self):
        sfactory = sdl2ext.SpriteFactory(sdl2ext.SOFTWARE)
        fm = sdl2ext.FontManager(RESOURCES.get_path("tuffy.ttf"))

        # No Fontmanager passed
        self.assertRaises(KeyError, sfactory.from_text, "Test")

        # Passing various keywords arguments
        sprite = sfactory.from_text("Test", fontmanager=fm)
        self.assertIsInstance(sprite, sdl2ext.SoftwareSprite)

        sprite = sfactory.from_text("Test", fontmanager=fm, alias="tuffy")
        self.assertIsInstance(sprite, sdl2ext.SoftwareSprite)

        # Get text from a texture sprite factory
        window = sdl2ext.Window("Test", size=(1, 1))
        renderer = sdl2ext.Renderer(window)
        tfactory = sdl2ext.SpriteFactory(sdl2ext.TEXTURE,
                                         renderer=renderer,
                                         fontmanager=fm)
        sprite = tfactory.from_text("Test", alias="tuffy")
        self.assertIsInstance(sprite, sdl2ext.TextureSprite)
        dogc()
    def test_SpriteFactory(self):
        factory = sdl2ext.SpriteFactory(sdl2ext.SOFTWARE)
        self.assertIsInstance(factory, sdl2ext.SpriteFactory)
        self.assertEqual(factory.default_args, {})

        factory = sdl2ext.SpriteFactory(sdl2ext.SOFTWARE, bananas="tasty")
        self.assertIsInstance(factory, sdl2ext.SpriteFactory)
        self.assertEqual(factory.default_args, {"bananas": "tasty"})

        window = sdl2ext.Window("Test", size=(1, 1))
        renderer = sdl2ext.Renderer(window)

        factory = sdl2ext.SpriteFactory(sdl2ext.TEXTURE, renderer=renderer)
        self.assertIsInstance(factory, sdl2ext.SpriteFactory)

        factory = sdl2ext.SpriteFactory(sdl2ext.TEXTURE, renderer=renderer)
        self.assertIsInstance(factory, sdl2ext.SpriteFactory)
        self.assertEqual(factory.default_args, {"renderer": renderer})

        self.assertRaises(ValueError, sdl2ext.SpriteFactory, "Test")
        self.assertRaises(ValueError, sdl2ext.SpriteFactory, -456)
        self.assertRaises(ValueError, sdl2ext.SpriteFactory, 123)
        self.assertRaises(ValueError, sdl2ext.SpriteFactory, sdl2ext.TEXTURE)
        dogc()
Example #17
0
def initiation(algorithm, data):
    '''initiate and return a window and renderer from the name of algorithm and maze data'''
    w = sdl.Window("%s simulation" % algorithm,
                   (len(data[0]) * SIZE, len(data) * SIZE))
    r = sdl.Renderer(w)
    return w, r
Example #18
0
def run():
    # Initialize PySDL2 stuff
    ext.init()
    window = ext.Window(title="Esper PySDL2 example", size=RESOLUTION)
    renderer = ext.Renderer(target=window)
    window.show()

    # Initialize Esper world, and create a "player" Entity with a few Components.
    world = esper.World()
    player = world.create_entity()
    world.add_component(player, Velocity(x=0, y=0))
    world.add_component(player, Renderable(texture=texture_from_image(renderer, "redsquare.png"),
                                           width=64, height=64, posx=100, posy=100))
    # Another motionless Entity:
    enemy = world.create_entity()
    world.add_component(enemy, Renderable(texture=texture_from_image(renderer, "bluesquare.png"),
                                          width=64, height=64, posx=400, posy=250))

    # Create some Processor instances, and asign them to be processed.
    render_processor = RenderProcessor(renderer=renderer)
    movement_processor = MovementProcessor(minx=0, maxx=RESOLUTION[0], miny=0, maxy=RESOLUTION[1])
    world.add_processor(render_processor)
    world.add_processor(movement_processor)

    # A simple main loop
    running = True
    while running:
        start_time = SDL_GetTicks()

        for event in ext.get_events():
            if event.type == SDL_QUIT:
                running = False
                break
            if event.type == SDL_KEYDOWN:
                if event.key.keysym.sym == SDLK_UP:
                    # Here is a way to directly access a specific Entity's Velocity
                    # Component's attribute (y) without making a temporary variable.
                    world.component_for_entity(player, Velocity).y = -3
                elif event.key.keysym.sym == SDLK_DOWN:
                    # For clarity, here is an alternate way in which a temporary variable
                    # is created and modified. The previous way above is recommended instead.
                    player_velocity_component = world.component_for_entity(player, Velocity)
                    player_velocity_component.y = 3
                elif event.key.keysym.sym == SDLK_LEFT:
                    world.component_for_entity(player, Velocity).x = -3
                elif event.key.keysym.sym == SDLK_RIGHT:
                    world.component_for_entity(player, Velocity).x = 3
                elif event.key.keysym.sym == SDLK_ESCAPE:
                    running = False
                    break
            elif event.type == SDL_KEYUP:
                if event.key.keysym.sym in (SDLK_UP, SDLK_DOWN):
                    world.component_for_entity(player, Velocity).y = 0
                if event.key.keysym.sym in (SDLK_LEFT, SDLK_RIGHT):
                    world.component_for_entity(player, Velocity).x = 0

        # A single call to world.process() will update all Processors:
        world.process()

        # A crude FPS limiter for about 60fps
        current_time = SDL_GetTicks()
        sleep_time = int(start_time + 16.667 - current_time)
        if sleep_time > 0:
            SDL_Delay(sleep_time)
Example #19
0
def run():
    lib.init()
    window = lib.Window('RLSnake', size=(window_width, window_height))
    window.show()

    renderer = lib.Renderer(window)
    fontManager = sdl2.ext.FontManager(font_path = "assets/fonts/Roboto-Regular.ttf", size = 14)
    factory = sdl2.ext.SpriteFactory(renderer=renderer)
    text = factory.from_text("Current score: ",fontmanager=fontManager)

    snake = Snake(n_grid_x, n_grid_y)
    snake.set_visibility_range(args.visibility_range)
    snake.reset()

    network = ActorCriticNetwork(4, fc1_dims=args.neurons, fc2_dims=args.neurons)
    agent = TfAgent(network)
    agent.load_weights(args.model_path)

    autoplay = args.autoplay
    moves = 0
    running = True
    game_over = False
    old_score = 0
    current_tiles = snake.get_tiles()
    while running:
        events = sdl2.ext.get_events()
        for event in events:
            if event.type == sdl2.SDL_QUIT:
                running = False
                break
            if event.type == sdl2.SDL_KEYDOWN:
                if event.key.keysym.sym == sdl2.SDLK_ESCAPE:
                    running = False
                    break
                if event.key.keysym.sym == 112:
                    autoplay = not autoplay
                if event.key.keysym.sym == 114:
                    snake.reset()
                    moves = 0
                    old_score = 0
                    game_over = False
                    current_tiles = snake.get_tiles()
                    break
                if not game_over:
                    if not autoplay:
                        if event.key.keysym.sym == sdl2.SDLK_SPACE:
                            action = agent.get_action(snake.get_view_obs())
                            _, game_over, _ = snake.step(action)
                            current_tiles = snake.get_tiles()
                            moves += 1

        if autoplay:
            action = agent.get_action(snake.get_view_obs())
            _, game_over, _ = snake.step(action)
            current_tiles = snake.get_tiles()
            moves += 1

        renderer.clear(sdl2.ext.Color(0, 0, 0))
        draw_grid(renderer)

        for x in range(len(current_tiles)):
            for y in range(len(current_tiles[x])):
                tile = current_tiles[x][y]
                if tile == 0:
                    continue
                if tile == 1:
                    continue
                if tile == 2:
                    if game_over:
                        fill_tile(renderer, int(x), int(y), COLOR_SNAKE_GAME_OVER)
                    else:
                        if snake.get_score() > old_score:
                            fill_tile(renderer, int(x), int(y), COLOR_SNAKE_EATEN)
                        else:
                            fill_tile(renderer, int(x), int(y), COLOR_SNAKE)
                if tile == 4:
                    if game_over:
                        fill_tile(renderer, int(x), int(y), COLOR_SNAKE_GAME_OVER)
                    else:
                        if snake.get_score() > old_score:
                            fill_tile(renderer, int(x), int(y), COLOR_SNAKE_HEAD_EATEN)
                        else:    
                            fill_tile(renderer, int(x), int(y), COLOR_SNAKE_HEAD)
                if tile == 3:
                    fill_circle(renderer, int(x), int(y), COLOR_FOOD)

        for tile in snake.get_current_view():
            fill_tile(renderer, int(tile[0]), int(tile[1]), COLOR_VIEW_RANGE)

        if snake.get_score() > old_score:
            old_score = snake.get_score()

        text = factory.from_text("Current score: " + str(snake.get_score()), fontmanager=fontManager)
        renderer.copy(text, dstrect=(0, 0, text.size[0],text.size[1]))
        if autoplay:
            text = factory.from_text("Move: " + str(moves) + " / " + str(MAX_MOVES), fontmanager=fontManager)
        else:
            text = factory.from_text("Move: " + str(moves), fontmanager=fontManager)
        renderer.copy(text, dstrect=(0, 14, text.size[0],text.size[1]))

        renderer.present()

        sdl2.SDL_Delay(args.sleep)

        if autoplay and (game_over or moves >= MAX_MOVES):
            snake.reset()
            moves = 0
            old_score = 0
            game_over = False

    return 0
 def test_SpriteFactory_from_object(self):
     window = sdl2ext.Window("Test", size=(1, 1))
     renderer = sdl2ext.Renderer(window)
     tfactory = sdl2ext.SpriteFactory(sdl2ext.TEXTURE, renderer=renderer)
     sfactory = sdl2ext.SpriteFactory(sdl2ext.SOFTWARE)
Example #21
0
def run():
    lib.init()
    window = lib.Window('RLSnake', size=(window_width, window_height))
    window.show()

    renderer = lib.Renderer(window)
    font_manager = sdl2.ext.FontManager(
        font_path="assets/fonts/Roboto-Regular.ttf", size=14)
    factory = sdl2.ext.SpriteFactory(renderer=renderer)
    text = factory.from_text("Current score: ", fontmanager=font_manager)

    snake = Snake(n_grid_x, n_grid_y)
    snake.reset()

    moves = 0
    running = True
    game_over = False
    current_tiles = snake.get_tiles()
    while running:
        events = sdl2.ext.get_events()
        for event in events:
            if event.type == sdl2.SDL_QUIT:
                running = False
                break
            if event.type == sdl2.SDL_KEYDOWN:
                if event.key.keysym.sym == sdl2.SDLK_ESCAPE:
                    running = False
                    break
                if event.key.keysym.sym == 114:
                    snake.reset()
                    game_over = False
                    current_tiles = snake.get_tiles()
                    moves = 0
                    break
                if not game_over:
                    if event.key.keysym.sym == sdl2.SDLK_UP:
                        _, game_over, _ = snake.step(3)
                        current_tiles = snake.get_tiles()
                        moves += 1
                    elif event.key.keysym.sym == sdl2.SDLK_DOWN:
                        _, game_over, _ = snake.step(2)
                        current_tiles = snake.get_tiles()
                        moves += 1
                    elif event.key.keysym.sym == sdl2.SDLK_LEFT:
                        _, game_over, _ = snake.step(1)
                        current_tiles = snake.get_tiles()
                        moves += 1
                    elif event.key.keysym.sym == sdl2.SDLK_RIGHT:
                        _, game_over, _ = snake.step(0)
                        current_tiles = snake.get_tiles()
                        moves += 1

        renderer.clear(sdl2.ext.Color(0, 0, 0))
        draw_grid(renderer)

        for x in range(len(current_tiles)):
            for y in range(len(current_tiles[x])):
                tile = current_tiles[x][y]
                if tile == 0:
                    continue
                if tile == 1:
                    continue
                if tile == 2:
                    if game_over:
                        fill_tile(renderer, int(x), int(y),
                                  COLOR_SNAKE_GAME_OVER)
                    else:
                        fill_tile(renderer, int(x), int(y), COLOR_SNAKE)
                if tile == 4:
                    if game_over:
                        fill_tile(renderer, int(x), int(y),
                                  COLOR_SNAKE_GAME_OVER)
                    else:
                        fill_tile(renderer, int(x), int(y), COLOR_SNAKE_HEAD)
                if tile == 3:
                    fill_circle(renderer, int(x), int(y), COLOR_FOOD)

        text = factory.from_text("Current score: " + str(snake.get_score()),
                                 fontmanager=font_manager)
        renderer.copy(text, dstrect=(0, 0, text.size[0], text.size[1]))
        text = factory.from_text("Move: " + str(moves),
                                 fontmanager=font_manager)
        renderer.copy(text, dstrect=(0, 14, text.size[0], text.size[1]))

        renderer.present()

        sdl2.SDL_Delay(33)
    return 0