text: import arcade
  
  # Constants
  SCREEN_WIDTH = 1000
  SCREEN_HEIGHT = 650
  SCREEN_TITLE = "INT 2.1"
  
  # Constants used to scale our sprites from their original size
  CHARACTER_SCALING = 1
  TILE_SCALING = 0.5
  COIN_SCALING = 0.5
  
  # Movement speed of player, in pixels per frame
  PLAYER_MOVEMENT_SPEED = 5
  GRAVITY = 1
  PLAYER_JUMP_SPEED = 20
  
  # How many pixels to keep as a minimum margin between the character
  # and the edge of the screen.
  LEFT_VIEWPORT_MARGIN = 250
  RIGHT_VIEWPORT_MARGIN = 250
  BOTTOM_VIEWPORT_MARGIN = 50
  TOP_VIEWPORT_MARGIN = 100
  
  
  class MyGame(arcade.Window):
      """
      Main application class.
      """
  
      def __init__(self):
  
          # Call the parent class and set up the window
          super().__init__(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
  
          # These are 'lists' that keep track of our sprites. Each sprite should
          # go into a list.
          self.coin_list = None
          self.wall_list = None
          self.player_list = None
  
          # Separate variable that holds the player sprite
          self.player_sprite = None
  
          # Our physics engine
          self.physics_engine = None
  
          # Used to keep track of our scrolling
          self.view_bottom = 0
          self.view_left = 0
  
          arcade.set_background_color(arcade.csscolor.CORNFLOWER_BLUE)
  
      def setup(self):
          """ Set up the game here. Call this function to restart the game. """
  
          # Used to keep track of our scrolling
          self.view_bottom = 0
          self.view_left = 0
  
          # Create the Sprite lists
          self.player_list = arcade.SpriteList()
          self.wall_list = arcade.SpriteList()
          self.coin_list = arcade.SpriteList()
  
          # Set up the player, specifically placing it at these coordinates.
          image_source = ":resources:images/animated_characters/female_adventurer/femaleAdventurer_idle.png"
          self.player_sprite = arcade.Sprite(image_source, CHARACTER_SCALING)
          self.player_sprite.center_x = 64
          self.player_sprite.center_y = 96
          self.player_list.append(self.player_sprite)
  
          # Create the ground
          # This shows using a loop to place multiple sprites horizontally
          for x in range(0, 1250, 64):
              wall = arcade.Sprite(":resources:images/tiles/grassMid.png", TILE_SCALING)
              wall.center_x = x
              wall.center_y = 32
              self.wall_list.append(wall)
  
          # Put some crates on the ground
          # This shows using a coordinate list to place sprites
          coordinate_list = [[256, 96],
                             [512, 96],
                             [768, 96]]
  
          for coordinate in coordinate_list:
              # Add a crate on the ground
              wall = arcade.Sprite(":resources:images/tiles/boxCrate_double.png", TILE_SCALING)
              wall.position = coordinate
              self.wall_list.append(wall)
  
          # Create the 'physics engine'
          self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite,
                                                               self.wall_list,
                                                               GRAVITY)
  
      def on_draw(self):
          """ Render the screen. """
  
          # Clear the screen to the background color
          arcade.start_render()
  
          # Draw our sprites
          self.wall_list.draw()
          self.coin_list.draw()
          self.player_list.draw()
  
      def on_key_press(self, key, modifiers):
          """Called whenever a key is pressed. """
  
          if key == arcade.key.UP or key == arcade.key.W or key == arcade.key.SPACE:
              if self.physics_engine.can_jump():
                  self.player_sprite.change_y = PLAYER_JUMP_SPEED
          elif key == arcade.key.LEFT or key == arcade.key.A:
              self.player_sprite.change_x = -PLAYER_MOVEMENT_SPEED
          elif key == arcade.key.RIGHT or key == arcade.key.D:
              self.player_sprite.change_x = PLAYER_MOVEMENT_SPEED
  
      def on_key_release(self, key, modifiers):
          """Called when the user releases a key. """
  
          if key == arcade.key.LEFT or key == arcade.key.A:
              self.player_sprite.change_x = 0
          elif key == arcade.key.RIGHT or key == arcade.key.D:
              self.player_sprite.change_x = 0
  
      def on_update(self, delta_time):
          """ Movement and game logic """
  
          # Move the player with the physics engine
          self.physics_engine.update()
  
          # --- Manage Scrolling ---
  
          # Track if we need to change the viewport
  
          changed = False
  
          # Scroll left
          left_boundary = self.view_left + LEFT_VIEWPORT_MARGIN
          if self.player_sprite.left < left_boundary:
              self.view_left -= left_boundary - self.player_sprite.left
              changed = True
  
          # Scroll right
          right_boundary = self.view_left + SCREEN_WIDTH - RIGHT_VIEWPORT_MARGIN
          if self.player_sprite.right > right_boundary:
              self.view_left += self.player_sprite.right - right_boundary
              changed = True
  
          # Scroll up
          top_boundary = self.view_bottom + SCREEN_HEIGHT - TOP_VIEWPORT_MARGIN
          if self.player_sprite.top > top_boundary:
              self.view_bottom += self.player_sprite.top - top_boundary
              changed = True
  
          # Scroll down
          bottom_boundary = self.view_bottom + BOTTOM_VIEWPORT_MARGIN
          if self.player_sprite.bottom < bottom_boundary:
              self.view_bottom -= bottom_boundary - self.player_sprite.bottom
              changed = True
  
          if changed:
              # Only scroll to integers. Otherwise we end up with pixels that
              # don't line up on the screen
              self.view_bottom = int(self.view_bottom)
              self.view_left = int(self.view_left)
  
              # Do the scrolling
              arcade.set_viewport(self.view_left,
                                  SCREEN_WIDTH + self.view_left,
                                  self.view_bottom,
                                  SCREEN_HEIGHT + self.view_bottom)
  
  
  def main():
      """ Main method """
      window = MyGame()
      window.setup()
      arcade.run()
  
  
  if __name__ == "__main__":
      main()
  