{"id":111,"date":"2026-05-15T13:56:56","date_gmt":"2026-05-15T13:56:56","guid":{"rendered":"https:\/\/theroyalscode.com\/students\/c_menhart\/?p=111"},"modified":"2026-05-15T13:56:56","modified_gmt":"2026-05-15T13:56:56","slug":"5-15","status":"publish","type":"post","link":"https:\/\/theroyalscode.com\/students\/c_menhart\/2026\/05\/15\/5-15\/","title":{"rendered":"5\/15"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">i used ai and some of the code from the platform game we are working on and some from tetris <br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import pygame\nimport random\nimport math\n\npygame.init()\n\nSCREEN_WIDTH = 1400\nSCREEN_HEIGHT = 1000\nFPS = 60\n\nBLACK = (0, 0, 0)\nWHITE = (255, 255, 255)\nGREEN = (34, 177, 76)\nBLUE = (52, 152, 219)\nRED = (231, 76, 60)\nYELLOW = (241, 196, 15)\nORANGE = (230, 126, 34)\nPURPLE = (155, 89, 182)\nCYAN = (52, 211, 153)\nPINK = (236, 112, 186)\nLIME = (46, 204, 113)\n\nGRAVITY = 0.7\nJUMP_POWER = -18\nPLAYER_SPEED = 7\nMAX_FALL_SPEED = 20\n\nSTATE_PLAYING = \"playing\"\nSTATE_GAME_OVER = \"game_over\"\nSTATE_LEVEL_COMPLETE = \"level_complete\"\nSTATE_MENU = \"menu\"\nSTATE_PAUSED = \"paused\"\nSTATE_PLAYER_SELECT = \"player_select\"\n\nPOWERUP_SHIELD = \"shield\"\nPOWERUP_SPEED = \"speed\"\nPOWERUP_SLOW_TIME = \"slow_time\"\nPOWERUP_MAGNET = \"magnet\"\nPOWERUP_SMALL = \"small\"\nPOWERUP_BIG = \"big\"\nPOWERUP_INVINCIBLE = \"invincible\"\n\nclass Platform(pygame.sprite.Sprite):\n    def __init__(self, x, y, width, height, color=GREEN, platform_type=\"normal\", moving=False, move_range=0, crumble_time=0):\n        super().__init__()\n        self.x = x\n        self.y = y\n        self.start_x = x\n        self.start_y = y\n        self.width = width\n        self.height = height\n        self.color = color\n        self.platform_type = platform_type\n        self.image = pygame.Surface((width, height))\n        self.image.fill(color)\n        self.rect = self.image.get_rect(topleft=(x, y))\n        \n        self.moving = moving\n        self.move_range = move_range\n        self.speed = 3\n        self.direction = 1\n        \n        self.crumble_time = crumble_time\n        self.crumble_counter = 0\n        self.is_crumbling = False\n        \n        self.draw_platform()\n        \n    def draw_platform(self):\n        self.image.fill(self.color)\n        pygame.draw.rect(self.image, (255, 255, 255), self.image.get_rect(), 2)\n        \n        if self.platform_type == \"bouncy\":\n            pygame.draw.circle(self.image, YELLOW, (self.width \/\/ 2, self.height \/\/ 2), 4)\n        elif self.platform_type == \"crumbling\":\n            for i in range(3):\n                pygame.draw.line(self.image, RED, (i * self.width \/\/ 3, 0), (i * self.width \/\/ 3, self.height), 1)\n        elif self.platform_type == \"ice\":\n            for i in range(self.width \/\/ 10):\n                pygame.draw.line(self.image, CYAN, (i * 10, 0), (i * 10 + 5, self.height), 1)\n        elif self.platform_type == \"spike\":\n            for i in range(0, self.width, 15):\n                pygame.draw.polygon(self.image, RED, &#91;(i, self.height), (i + 7, 0), (i + 14, self.height)])\n        \n    def update(self):\n        if self.moving:\n            self.x += self.speed * self.direction\n            if abs(self.x - self.start_x) >= self.move_range:\n                self.direction *= -1\n            self.rect.x = self.x\n            \n        if self.platform_type == \"crumbling\" and self.is_crumbling:\n            self.crumble_counter += 1\n            if self.crumble_counter > self.crumble_time:\n                self.kill()\n            \n    def trigger_crumble(self):\n        if self.platform_type == \"crumbling\":\n            self.is_crumbling = True\n            \n    def draw(self, surface):\n        surface.blit(self.image, self.rect)\n\nclass Particle(pygame.sprite.Sprite):\n    def __init__(self, x, y, vel_x, vel_y, color, lifetime=30):\n        super().__init__()\n        self.x = x\n        self.y = y\n        self.vel_x = vel_x\n        self.vel_y = vel_y\n        self.color = color\n        self.lifetime = lifetime\n        self.age = 0\n        self.image = pygame.Surface((5, 5))\n        self.image.fill(color)\n        self.rect = self.image.get_rect(center=(x, y))\n        \n    def update(self):\n        self.age += 1\n        self.x += self.vel_x\n        self.y += self.vel_y\n        self.vel_y += 0.5\n        self.rect.center = (self.x, self.y)\n        \n        if self.age >= self.lifetime:\n            self.kill()\n\nclass PowerUp(pygame.sprite.Sprite):\n    def __init__(self, x, y, powerup_type=POWERUP_SHIELD):\n        super().__init__()\n        self.x = x\n        self.y = y\n        self.powerup_type = powerup_type\n        self.size = 20\n        self.image = pygame.Surface((self.size, self.size))\n        self.rect = self.image.get_rect(center=(x, y))\n        self.rotation_angle = 0\n        self.bounce_offset = 0\n        \n        self.update_image()\n        \n    def update_image(self):\n        self.image.fill(BLACK)\n        self.image.set_colorkey(BLACK)\n        \n        if self.powerup_type == POWERUP_SHIELD:\n            pygame.draw.circle(self.image, PINK, (self.size \/\/ 2, self.size \/\/ 2), self.size \/\/ 2)\n            pygame.draw.circle(self.image, (255, 200, 200), (self.size \/\/ 2, self.size \/\/ 2), self.size \/\/ 2 - 3)\n        elif self.powerup_type == POWERUP_SPEED:\n            pygame.draw.rect(self.image, LIME, (2, 2, self.size - 4, self.size - 4))\n            pygame.draw.polygon(self.image, WHITE, &#91;(15, 5), (15, 15), (18, 10)])\n        elif self.powerup_type == POWERUP_SLOW_TIME:\n            pygame.draw.circle(self.image, PURPLE, (self.size \/\/ 2, self.size \/\/ 2), self.size \/\/ 2)\n            pygame.draw.circle(self.image, WHITE, (self.size \/\/ 2, self.size \/\/ 2), 3)\n        elif self.powerup_type == POWERUP_MAGNET:\n            pygame.draw.polygon(self.image, RED, &#91;(5, 2), (15, 2), (15, 12), (5, 12)])\n            pygame.draw.polygon(self.image, BLUE, &#91;(5, 12), (15, 12), (15, 18), (5, 18)])\n        elif self.powerup_type == POWERUP_SMALL:\n            pygame.draw.circle(self.image, CYAN, (self.size \/\/ 2, self.size \/\/ 2), 3)\n        elif self.powerup_type == POWERUP_BIG:\n            pygame.draw.circle(self.image, ORANGE, (self.size \/\/ 2, self.size \/\/ 2), self.size \/\/ 2)\n        elif self.powerup_type == POWERUP_INVINCIBLE:\n            pygame.draw.polygon(self.image, YELLOW, &#91;(self.size \/\/ 2, 2), (self.size - 2, self.size \/\/ 2), (self.size \/\/ 2, self.size - 2), (2, self.size \/\/ 2)])\n    \n    def update(self):\n        self.rotation_angle += 5\n        self.bounce_offset = abs(math.sin(pygame.time.get_ticks() \/ 200) * 5)\n        self.rect.y = self.y - self.bounce_offset\n        self.update_image()\n\nclass Enemy(pygame.sprite.Sprite):\n    def __init__(self, x, y, width=40, height=40, color=RED, enemy_type=\"walker\"):\n        super().__init__()\n        self.x = x\n        self.y = y\n        self.start_x = x\n        self.width = width\n        self.height = height\n        self.color = color\n        self.enemy_type = enemy_type\n        self.image = pygame.Surface((width, height))\n        self.image.fill(color)\n        self.rect = self.image.get_rect(topleft=(x, y))\n        \n        self.speed = 3\n        self.direction = 1\n        self.move_range = 150\n        self.vel_y = 0\n        \n        self.float_offset = 0\n        \n        if enemy_type == \"walker\":\n            pygame.draw.polygon(self.image, (255, 100, 100), &#91;(width\/\/2, 0), (width, height\/\/2), (width\/\/2, height), (0, height\/\/2)])\n        elif enemy_type == \"flyer\":\n            pygame.draw.circle(self.image, PINK, (width\/\/2, height\/\/2), width\/\/2)\n            pygame.draw.line(self.image, (255, 100, 100), (5, height\/\/2), (width-5, height\/\/2), 2)\n        elif enemy_type == \"jumper\":\n            pygame.draw.rect(self.image, (255, 150, 100), (0, 0, width, height))\n            pygame.draw.circle(self.image, WHITE, (10, 10), 3)\n            pygame.draw.circle(self.image, WHITE, (width-10, 10), 3)\n        \n    def update(self, platforms):\n        if self.enemy_type == \"walker\" or self.enemy_type == \"jumper\":\n            self.x += self.speed * self.direction\n            if abs(self.x - self.start_x) >= self.move_range:\n                self.direction *= -1\n            self.rect.x = self.x\n            \n            self.vel_y += GRAVITY\n            if self.vel_y > MAX_FALL_SPEED:\n                self.vel_y = MAX_FALL_SPEED\n            self.rect.y += self.vel_y\n            \n            for platform in platforms:\n                if (self.vel_y > 0 and \n                    self.rect.bottom >= platform.rect.top and \n                    self.rect.bottom &lt;= platform.rect.bottom and\n                    self.rect.right > platform.rect.left and\n                    self.rect.left &lt; platform.rect.right):\n                    \n                    self.rect.bottom = platform.rect.top\n                    self.vel_y = 0\n                    \n                    if self.enemy_type == \"jumper\" and random.random() &lt; 0.1:\n                        self.vel_y = -12\n                        \n        elif self.enemy_type == \"flyer\":\n            self.x += self.speed * self.direction\n            if abs(self.x - self.start_x) >= self.move_range:\n                self.direction *= -1\n            self.rect.x = self.x\n            \n            self.float_offset += 0.05\n            self.rect.y = self.start_x + math.sin(self.float_offset) * 30\n\nclass Player(pygame.sprite.Sprite):\n    def __init__(self, x, y, player_num=1):\n        super().__init__()\n        self.width = 40\n        self.height = 40\n        self.player_num = player_num\n        self.image = pygame.Surface((self.width, self.height))\n        \n        if player_num == 1:\n            self.color = BLUE\n        else:\n            self.color = ORANGE\n            \n        self.image.fill(self.color)\n        self.rect = self.image.get_rect(topleft=(x, y))\n        \n        pygame.draw.circle(self.image, WHITE, (10, 10), 3)\n        pygame.draw.circle(self.image, WHITE, (30, 10), 3)\n        pygame.draw.circle(self.image, BLACK, (10, 10), 1)\n        pygame.draw.circle(self.image, BLACK, (30, 10), 1)\n        \n        self.vel_y = 0\n        self.vel_x = 0\n        self.on_ground = False\n        self.double_jump_available = True\n        \n        self.health = 3\n        self.max_health = 3\n        self.invincible_time = 0\n        self.score_multiplier = 1\n        self.current_size = 1.0\n        \n        self.shield = False\n        self.shield_time = 0\n        self.speed_boost = False\n        self.speed_boost_time = 0\n        self.slow_time = False\n        self.slow_time_time = 0\n        self.magnet = False\n        self.magnet_time = 0\n        self.magnet_range = 150\n        self.invincible = False\n        self.invincible_time_powerup = 0\n        \n    def handle_input(self, keys, player_num):\n        speed = PLAYER_SPEED\n        if self.speed_boost:\n            speed = PLAYER_SPEED * 1.5\n            \n        self.vel_x = 0\n        \n        if player_num == 1:\n            if keys&#91;pygame.K_a]:\n                self.vel_x = -speed\n            if keys&#91;pygame.K_d]:\n                self.vel_x = speed\n            if keys&#91;pygame.K_w]:\n                if self.on_ground:\n                    self.vel_y = JUMP_POWER\n                    self.on_ground = False\n                    self.double_jump_available = True\n                elif self.double_jump_available:\n                    self.vel_y = JUMP_POWER\n                    self.double_jump_available = False\n        else:\n            if keys&#91;pygame.K_LEFT]:\n                self.vel_x = -speed\n            if keys&#91;pygame.K_RIGHT]:\n                self.vel_x = speed\n            if keys&#91;pygame.K_UP]:\n                if self.on_ground:\n                    self.vel_y = JUMP_POWER\n                    self.on_ground = False\n                    self.double_jump_available = True\n                elif self.double_jump_available:\n                    self.vel_y = JUMP_POWER\n                    self.double_jump_available = False\n                \n    def update(self, platforms, enemies, particles, powerups):\n        gravity = GRAVITY\n        if self.slow_time:\n            gravity *= 0.5\n            \n        self.vel_y += gravity\n        if self.vel_y > MAX_FALL_SPEED:\n            self.vel_y = MAX_FALL_SPEED\n        \n        self.rect.x += self.vel_x\n        \n        if self.rect.left &lt; 0:\n            self.rect.left = 0\n        if self.rect.right > SCREEN_WIDTH:\n            self.rect.right = SCREEN_WIDTH\n            \n        self.rect.y += self.vel_y\n        self.on_ground = False\n        \n        for platform in platforms:\n            if (self.vel_y > 0 and \n                self.rect.bottom >= platform.rect.top and \n                self.rect.bottom &lt;= platform.rect.bottom + 5 and\n                self.rect.right > platform.rect.left and\n                self.rect.left &lt; platform.rect.right):\n                \n                self.rect.bottom = platform.rect.top\n                self.vel_y = 0\n                self.on_ground = True\n                self.double_jump_available = True\n                \n                if platform.platform_type == \"ice\":\n                    self.vel_x *= 1.1\n                \n                elif platform.platform_type == \"spike\":\n                    if not self.shield and not self.invincible:\n                        self.health -= 1\n                        self.invincible_time = 60\n                    else:\n                        self.shield = False\n                        self.shield_time = 0\n                \n                elif platform.platform_type == \"bouncy\":\n                    self.vel_y = JUMP_POWER * 1.5\n                    self.on_ground = False\n                    \n                elif platform.platform_type == \"crumbling\":\n                    platform.trigger_crumble()\n                    \n                for _ in range(5):\n                    angle = random.uniform(0, 2 * math.pi)\n                    speed = random.uniform(2, 6)\n                    vx = math.cos(angle) * speed\n                    vy = math.sin(angle) * speed - 2\n                    particles.add(Particle(self.rect.centerx, self.rect.centery, vx, vy, CYAN))\n        \n        for enemy in enemies:\n            if self.rect.colliderect(enemy.rect):\n                if self.vel_y > 0 and self.rect.bottom &lt;= enemy.rect.centery:\n                    self.vel_y = JUMP_POWER\n                    self.on_ground = False\n                    enemy.kill()\n                    self.score_multiplier += 0.1\n                else:\n                    if not self.shield and not self.invincible:\n                        self.health -= 1\n                        self.invincible_time = 60\n                    else:\n                        self.shield = False\n                        self.shield_time = 0\n        \n        for powerup in powerups:\n            if self.rect.colliderect(powerup.rect):\n                self.activate_powerup(powerup.powerup_type)\n                powerup.kill()\n        \n        if self.magnet:\n            for powerup in powerups:\n                dx = self.rect.centerx - powerup.rect.centerx\n                dy = self.rect.centery - powerup.rect.centery\n                distance = math.sqrt(dx**2 + dy**2)\n                if distance &lt; self.magnet_range and distance > 0:\n                    speed = 5\n                    powerup.x += (dx \/ distance) * speed\n                    powerup.y += (dy \/ distance) * speed\n                    powerup.rect.center = (int(powerup.x), int(powerup.y))\n        \n        if self.shield:\n            self.shield_time -= 1\n            if self.shield_time &lt;= 0:\n                self.shield = False\n                \n        if self.speed_boost:\n            self.speed_boost_time -= 1\n            if self.speed_boost_time &lt;= 0:\n                self.speed_boost = False\n                \n        if self.slow_time:\n            self.slow_time_time -= 1\n            if self.slow_time_time &lt;= 0:\n                self.slow_time = False\n                \n        if self.magnet:\n            self.magnet_time -= 1\n            if self.magnet_time &lt;= 0:\n                self.magnet = False\n        \n        if self.invincible:\n            self.invincible_time_powerup -= 1\n            if self.invincible_time_powerup &lt;= 0:\n                self.invincible = False\n        \n        if self.invincible_time > 0:\n            self.invincible_time -= 1\n            \n    def activate_powerup(self, powerup_type):\n        if powerup_type == POWERUP_SHIELD:\n            self.shield = True\n            self.shield_time = 300\n        elif powerup_type == POWERUP_SPEED:\n            self.speed_boost = True\n            self.speed_boost_time = 300\n        elif powerup_type == POWERUP_SLOW_TIME:\n            self.slow_time = True\n            self.slow_time_time = 300\n        elif powerup_type == POWERUP_MAGNET:\n            self.magnet = True\n            self.magnet_time = 300\n        elif powerup_type == POWERUP_SMALL:\n            self.current_size = 0.5\n            self.width = 20\n            self.height = 20\n        elif powerup_type == POWERUP_BIG:\n            self.current_size = 1.5\n            self.width = 60\n            self.height = 60\n        elif powerup_type == POWERUP_INVINCIBLE:\n            self.invincible = True\n            self.invincible_time_powerup = 300\n            \n    def draw(self, surface):\n        if self.invincible_time > 0 and self.invincible_time % 10 &lt; 5:\n            return\n        \n        if self.shield:\n            pygame.draw.circle(surface, PINK, self.rect.center, 50, 2)\n        \n        if self.invincible:\n            pygame.draw.circle(surface, YELLOW, self.rect.center, self.width \/\/ 2 + 10, 3)\n        \n        surface.blit(self.image, self.rect)\n\nclass Level:\n    def __init__(self, level_num=1):\n        self.level_num = level_num\n        self.platforms = pygame.sprite.Group()\n        self.enemies = pygame.sprite.Group()\n        self.powerups = pygame.sprite.Group()\n        self.generate_level()\n        \n    def generate_level(self):\n        self.platforms.add(Platform(SCREEN_WIDTH \/\/ 2 - 75, SCREEN_HEIGHT - 80, 150, 30, GREEN))\n        \n        difficulty = 1 + (self.level_num - 1) * 0.3\n        \n        num_platforms = int(10 + self.level_num * 2)\n        for i in range(num_platforms):\n            x = random.randint(50, SCREEN_WIDTH - 100)\n            y = SCREEN_HEIGHT - 200 - i * 80\n            width = int(random.randint(50, 120) \/ difficulty)\n            \n            platform_type = \"normal\"\n            moving = False\n            move_range = 0\n            color = random.choice(&#91;GREEN, BLUE, YELLOW])\n            \n            rand = random.random()\n            \n            if rand &lt; 0.25 * difficulty:\n                moving = True\n                move_range = random.randint(60, 150)\n                color = ORANGE\n                \n            elif rand &lt; 0.45 * difficulty:\n                platform_type = \"bouncy\"\n                color = YELLOW\n                \n            elif rand &lt; 0.6 * difficulty:\n                platform_type = \"crumbling\"\n                color = RED\n                \n            elif rand &lt; 0.75 * difficulty:\n                platform_type = \"ice\"\n                color = CYAN\n                \n            elif rand &lt; 0.9 * difficulty and self.level_num > 3:\n                platform_type = \"spike\"\n                color = (200, 0, 0)\n                \n            self.platforms.add(Platform(x, y, width, 20, color, platform_type, moving, move_range, 60))\n            \n            if random.random() &lt; 0.2 * difficulty and i > 2:\n                ex = random.randint(50, SCREEN_WIDTH - 100)\n                ey = y - 100\n                enemy_type = random.choice(&#91;\"walker\", \"flyer\", \"jumper\"])\n                self.enemies.add(Enemy(ex, ey, enemy_type=enemy_type))\n            \n            if random.random() &lt; 0.1 * (self.level_num \/ 5):\n                px = random.randint(50, SCREEN_WIDTH - 50)\n                py = y - 50\n                ptype = random.choice(&#91;POWERUP_SHIELD, POWERUP_SPEED, POWERUP_SLOW_TIME, POWERUP_MAGNET, POWERUP_SMALL, POWERUP_BIG, POWERUP_INVINCIBLE])\n                self.powerups.add(PowerUp(px, py, ptype))\n    \n    def generate_level_two_player(self):\n        self.platforms.add(Platform(250 - 75, SCREEN_HEIGHT - 80, 150, 30, BLUE))\n        self.platforms.add(Platform(SCREEN_WIDTH - 250 - 75, SCREEN_HEIGHT - 80, 150, 30, ORANGE))\n        \n        difficulty = 1 + (self.level_num - 1) * 0.3\n        \n        num_platforms = int(10 + self.level_num * 2)\n        for i in range(num_platforms):\n            x = random.randint(50, SCREEN_WIDTH - 100)\n            y = SCREEN_HEIGHT - 200 - i * 80\n            width = int(random.randint(50, 120) \/ difficulty)\n            \n            platform_type = \"normal\"\n            moving = False\n            move_range = 0\n            color = random.choice(&#91;GREEN, BLUE, YELLOW])\n            \n            rand = random.random()\n            \n            if rand &lt; 0.25 * difficulty:\n                moving = True\n                move_range = random.randint(60, 150)\n                color = ORANGE\n                \n            elif rand &lt; 0.45 * difficulty:\n                platform_type = \"bouncy\"\n                color = YELLOW\n                \n            elif rand &lt; 0.6 * difficulty:\n                platform_type = \"crumbling\"\n                color = RED\n                \n            elif rand &lt; 0.75 * difficulty:\n                platform_type = \"ice\"\n                color = CYAN\n                \n            elif rand &lt; 0.9 * difficulty and self.level_num > 3:\n                platform_type = \"spike\"\n                color = (200, 0, 0)\n                \n            self.platforms.add(Platform(x, y, width, 20, color, platform_type, moving, move_range, 60))\n            \n            if random.random() &lt; 0.2 * difficulty and i > 2:\n                ex = random.randint(50, SCREEN_WIDTH - 100)\n                ey = y - 100\n                enemy_type = random.choice(&#91;\"walker\", \"flyer\", \"jumper\"])\n                self.enemies.add(Enemy(ex, ey, enemy_type=enemy_type))\n            \n            if random.random() &lt; 0.1 * (self.level_num \/ 5):\n                px = random.randint(50, SCREEN_WIDTH - 50)\n                py = y - 50\n                ptype = random.choice(&#91;POWERUP_SHIELD, POWERUP_SPEED, POWERUP_SLOW_TIME, POWERUP_MAGNET, POWERUP_SMALL, POWERUP_BIG, POWERUP_INVINCIBLE])\n                self.powerups.add(PowerUp(px, py, ptype))\n    \n    def update(self):\n        for platform in self.platforms:\n            platform.update()\n        for enemy in self.enemies:\n            enemy.update(self.platforms)\n        for powerup in self.powerups:\n            powerup.update()\n\nclass Game:\n    def __init__(self):\n        self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))\n        pygame.display.set_caption(\"PLATFORM MASTER - ADVANCED EDITION\")\n        self.clock = pygame.time.Clock()\n        self.running = True\n        self.font_large = pygame.font.Font(None, 48)\n        self.font_medium = pygame.font.Font(None, 36)\n        self.font_small = pygame.font.Font(None, 24)\n        \n        self.level_num = 1\n        self.level = None\n        self.player1 = None\n        self.player2 = None\n        self.num_players = 1\n        self.particles = pygame.sprite.Group()\n        self.score1 = 0\n        self.score2 = 0\n        self.game_state = STATE_MENU\n        self.highest_y1 = SCREEN_HEIGHT\n        self.highest_y2 = SCREEN_HEIGHT\n        self.time_elapsed = 0\n        self.best_score1 = 0\n        self.best_score2 = 0\n        \n    def handle_events(self):\n        for event in pygame.event.get():\n            if event.type == pygame.QUIT:\n                self.running = False\n            if event.type == pygame.KEYDOWN:\n                if event.key == pygame.K_ESCAPE:\n                    if self.game_state == STATE_PLAYING:\n                        self.game_state = STATE_PAUSED\n                    elif self.game_state == STATE_PAUSED:\n                        self.game_state = STATE_PLAYING\n                    elif self.game_state in &#91;STATE_MENU, STATE_GAME_OVER, STATE_PLAYER_SELECT]:\n                        self.running = False\n                        \n                if event.key == pygame.K_r:\n                    if self.game_state in &#91;STATE_GAME_OVER, STATE_PLAYER_SELECT]:\n                        self.game_state = STATE_PLAYER_SELECT\n                    elif self.game_state == STATE_LEVEL_COMPLETE:\n                        self.next_level()\n                        \n                if event.key == pygame.K_1:\n                    if self.game_state == STATE_PLAYER_SELECT:\n                        self.num_players = 1\n                        self.reset_game()\n                        \n                if event.key == pygame.K_2:\n                    if self.game_state == STATE_PLAYER_SELECT:\n                        self.num_players = 2\n                        self.reset_game()\n                    \n                if event.key == pygame.K_SPACE:\n                    if self.game_state == STATE_MENU:\n                        self.game_state = STATE_PLAYER_SELECT\n                    \n    def handle_input(self):\n        keys = pygame.key.get_pressed()\n        if self.player1:\n            self.player1.handle_input(keys, 1)\n        if self.player2:\n            self.player2.handle_input(keys, 2)\n        \n    def update(self):\n        if self.game_state == STATE_PLAYING:\n            self.time_elapsed += 1\n            self.level.update()\n            \n            if self.player1:\n                self.player1.update(self.level.platforms, self.level.enemies, self.particles, self.level.powerups)\n                \n                current_height = SCREEN_HEIGHT - self.player1.rect.y\n                if current_height > self.highest_y1:\n                    self.highest_y1 = current_height\n                    base_score = int(self.highest_y1)\n                    self.score1 = int(base_score * self.player1.score_multiplier)\n                    if self.score1 > self.best_score1:\n                        self.best_score1 = self.score1\n                \n                if self.player1.rect.y > SCREEN_HEIGHT or self.player1.health &lt;= 0:\n                    if self.num_players == 1:\n                        self.game_state = STATE_GAME_OVER\n                    else:\n                        self.player1 = None\n            \n            if self.player2:\n                self.player2.update(self.level.platforms, self.level.enemies, self.particles, self.level.powerups)\n                \n                current_height = SCREEN_HEIGHT - self.player2.rect.y\n                if current_height > self.highest_y2:\n                    self.highest_y2 = current_height\n                    base_score = int(self.highest_y2)\n                    self.score2 = int(base_score * self.player2.score_multiplier)\n                    if self.score2 > self.best_score2:\n                        self.best_score2 = self.score2\n                \n                if self.player2.rect.y > SCREEN_HEIGHT or self.player2.health &lt;= 0:\n                    self.player2 = None\n                \n                if self.player1 is None and self.player2 is None:\n                    self.game_state = STATE_GAME_OVER\n            \n            self.particles.update()\n            \n            if len(self.level.platforms) > 0:\n                if self.num_players == 1 and self.player1 and self.player1.rect.y &lt; 100:\n                    self.game_state = STATE_LEVEL_COMPLETE\n                elif self.num_players == 2 and ((self.player1 and self.player1.rect.y &lt; 100) or (self.player2 and self.player2.rect.y &lt; 100)):\n                    self.game_state = STATE_LEVEL_COMPLETE\n                \n    def draw(self):\n        self.screen.fill(BLACK)\n        \n        for x in range(0, SCREEN_WIDTH, 50):\n            pygame.draw.line(self.screen, (30, 30, 30), (x, 0), (x, SCREEN_HEIGHT), 1)\n        for y in range(0, SCREEN_HEIGHT, 50):\n            pygame.draw.line(self.screen, (30, 30, 30), (0, y), (SCREEN_WIDTH, y), 1)\n        \n        if self.game_state == STATE_MENU:\n            self.draw_menu()\n        elif self.game_state == STATE_PLAYER_SELECT:\n            self.draw_player_select()\n        elif self.game_state == STATE_PLAYING:\n            self.draw_game()\n        elif self.game_state == STATE_PAUSED:\n            self.draw_game()\n            self.draw_pause_screen()\n        elif self.game_state == STATE_GAME_OVER:\n            self.draw_game()\n            self.draw_game_over()\n        elif self.game_state == STATE_LEVEL_COMPLETE:\n            self.draw_game()\n            self.draw_level_complete()\n        \n        pygame.display.flip()\n        \n    def draw_game(self):\n        for platform in self.level.platforms:\n            platform.draw(self.screen)\n        for enemy in self.level.enemies:\n            self.screen.blit(enemy.image, enemy.rect)\n        for powerup in self.level.powerups:\n            self.screen.blit(powerup.image, powerup.rect)\n        \n        if self.player1:\n            self.player1.draw(self.screen)\n        if self.player2:\n            self.player2.draw(self.screen)\n            \n        for particle in self.particles:\n            self.screen.blit(particle.image, particle.rect)\n        \n        if self.num_players == 1:\n            score_text = self.font_medium.render(f\"SCORE: {self.score1}\", True, WHITE)\n            self.screen.blit(score_text, (10, 10))\n            \n            level_text = self.font_medium.render(f\"LEVEL: {self.level_num}\", True, CYAN)\n            self.screen.blit(level_text, (SCREEN_WIDTH - 300, 10))\n            \n            if self.player1:\n                health_text = self.font_medium.render(f\"LIVES: {self.player1.health}\", True, RED)\n                self.screen.blit(health_text, (10, 50))\n                \n                powerup_y = 90\n                if self.player1.shield:\n                    shield_text = self.font_small.render(f\"SHIELD: {self.player1.shield_time \/\/ 60}s\", True, PINK)\n                    self.screen.blit(shield_text, (10, powerup_y))\n                    powerup_y += 30\n                if self.player1.speed_boost:\n                    speed_text = self.font_small.render(f\"SPEED: {self.player1.speed_boost_time \/\/ 60}s\", True, LIME)\n                    self.screen.blit(speed_text, (10, powerup_y))\n                    powerup_y += 30\n                if self.player1.slow_time:\n                    slow_text = self.font_small.render(f\"SLOW: {self.player1.slow_time_time \/\/ 60}s\", True, PURPLE)\n                    self.screen.blit(slow_text, (10, powerup_y))\n                    powerup_y += 30\n                if self.player1.magnet:\n                    magnet_text = self.font_small.render(f\"MAGNET: {self.player1.magnet_time \/\/ 60}s\", True, ORANGE)\n                    self.screen.blit(magnet_text, (10, powerup_y))\n                    powerup_y += 30\n                if self.player1.invincible:\n                    inv_text = self.font_small.render(f\"INVINCIBLE: {self.player1.invincible_time_powerup \/\/ 60}s\", True, YELLOW)\n                    self.screen.blit(inv_text, (10, powerup_y))\n                    powerup_y += 30\n                if self.player1.current_size == 0.5:\n                    small_text = self.font_small.render(\"SMALL MODE\", True, CYAN)\n                    self.screen.blit(small_text, (10, powerup_y))\n                    powerup_y += 30\n                if self.player1.current_size == 1.5:\n                    big_text = self.font_small.render(\"BIG MODE\", True, ORANGE)\n                    self.screen.blit(big_text, (10, powerup_y))\n                \n                if self.player1.score_multiplier > 1:\n                    mult_text = self.font_small.render(f\"MULTIPLIER: {self.player1.score_multiplier:.1f}x\", True, YELLOW)\n                    self.screen.blit(mult_text, (SCREEN_WIDTH - 350, 50))\n        else:\n            level_text = self.font_medium.render(f\"LEVEL: {self.level_num}\", True, CYAN)\n            self.screen.blit(level_text, (SCREEN_WIDTH \/\/ 2 - 100, 10))\n            \n            p1_label = self.font_medium.render(\"P1\", True, BLUE)\n            self.screen.blit(p1_label, (10, 10))\n            \n            score_text1 = self.font_medium.render(f\"SCORE: {self.score1}\", True, BLUE)\n            self.screen.blit(score_text1, (10, 50))\n            \n            if self.player1:\n                health_text1 = self.font_medium.render(f\"LIVES: {self.player1.health}\", True, RED)\n                self.screen.blit(health_text1, (10, 90))\n            else:\n                dead_text1 = self.font_medium.render(\"DEAD\", True, RED)\n                self.screen.blit(dead_text1, (10, 90))\n            \n            p2_label = self.font_medium.render(\"P2\", True, ORANGE)\n            self.screen.blit(p2_label, (SCREEN_WIDTH - 100, 10))\n            \n            score_text2 = self.font_medium.render(f\"SCORE: {self.score2}\", True, ORANGE)\n            self.screen.blit(score_text2, (SCREEN_WIDTH - 350, 50))\n            \n            if self.player2:\n                health_text2 = self.font_medium.render(f\"LIVES: {self.player2.health}\", True, RED)\n                self.screen.blit(health_text2, (SCREEN_WIDTH - 250, 90))\n            else:\n                dead_text2 = self.font_medium.render(\"DEAD\", True, RED)\n                self.screen.blit(dead_text2, (SCREEN_WIDTH - 250, 90))\n    \n    def draw_menu(self):\n        title_text = self.font_large.render(\"PLATFORM MASTER\", True, CYAN)\n        subtitle_text = self.font_medium.render(\"ADVANCED EDITION\", True, WHITE)\n        start_text = self.font_medium.render(\"PRESS SPACE TO SELECT MODE\", True, LIME)\n        controls_text = self.font_small.render(\"P1: A\/D MOVE, W JUMP | P2: ARROW KEYS MOVE\/JUMP\", True, WHITE)\n        \n        self.screen.blit(title_text, (SCREEN_WIDTH \/\/ 2 - 350, 100))\n        self.screen.blit(subtitle_text, (SCREEN_WIDTH \/\/ 2 - 120, 180))\n        self.screen.blit(start_text, (SCREEN_WIDTH \/\/ 2 - 300, 450))\n        self.screen.blit(controls_text, (SCREEN_WIDTH \/\/ 2 - 450, 600))\n    \n    def draw_player_select(self):\n        title_text = self.font_large.render(\"SELECT GAME MODE\", True, CYAN)\n        one_player_text = self.font_medium.render(\"PRESS 1 FOR SINGLE PLAYER\", True, BLUE)\n        two_player_text = self.font_medium.render(\"PRESS 2 FOR TWO PLAYER\", True, ORANGE)\n        \n        self.screen.blit(title_text, (SCREEN_WIDTH \/\/ 2 - 280, 150))\n        self.screen.blit(one_player_text, (SCREEN_WIDTH \/\/ 2 - 300, 350))\n        self.screen.blit(two_player_text, (SCREEN_WIDTH \/\/ 2 - 300, 500))\n        \n    def draw_pause_screen(self):\n        self.draw_overlay()\n        pause_text = self.font_large.render(\"PAUSED\", True, YELLOW)\n        resume_text = self.font_medium.render(\"PRESS ESC TO RESUME\", True, WHITE)\n        self.screen.blit(pause_text, (SCREEN_WIDTH \/\/ 2 - 150, SCREEN_HEIGHT \/\/ 2 - 50))\n        self.screen.blit(resume_text, (SCREEN_WIDTH \/\/ 2 - 200, SCREEN_HEIGHT \/\/ 2 + 50))\n        \n    def draw_game_over(self):\n        self.draw_overlay()\n        game_over_text = self.font_large.render(\"GAME OVER!\", True, RED)\n        \n        if self.num_players == 1:\n            final_score_text = self.font_medium.render(f\"FINAL SCORE: {self.score1}\", True, WHITE)\n            best_score_text = self.font_medium.render(f\"BEST SCORE: {self.best_score1}\", True, YELLOW)\n            self.screen.blit(game_over_text, (SCREEN_WIDTH \/\/ 2 - 200, SCREEN_HEIGHT \/\/ 2 - 150))\n            self.screen.blit(final_score_text, (SCREEN_WIDTH \/\/ 2 - 200, SCREEN_HEIGHT \/\/ 2 - 20))\n            self.screen.blit(best_score_text, (SCREEN_WIDTH \/\/ 2 - 200, SCREEN_HEIGHT \/\/ 2 + 40))\n        else:\n            if self.score1 > self.score2:\n                winner_text = self.font_medium.render(\"PLAYER 1 WINS!\", True, BLUE)\n            elif self.score2 > self.score1:\n                winner_text = self.font_medium.render(\"PLAYER 2 WINS!\", True, ORANGE)\n            else:\n                winner_text = self.font_medium.render(\"TIE GAME!\", True, YELLOW)\n            \n            score_text1 = self.font_medium.render(f\"P1 SCORE: {self.score1}\", True, BLUE)\n            score_text2 = self.font_medium.render(f\"P2 SCORE: {self.score2}\", True, ORANGE)\n            \n            self.screen.blit(game_over_text, (SCREEN_WIDTH \/\/ 2 - 200, SCREEN_HEIGHT \/\/ 2 - 200))\n            self.screen.blit(winner_text, (SCREEN_WIDTH \/\/ 2 - 200, SCREEN_HEIGHT \/\/ 2 - 80))\n            self.screen.blit(score_text1, (SCREEN_WIDTH \/\/ 2 - 200, SCREEN_HEIGHT \/\/ 2 + 20))\n            self.screen.blit(score_text2, (SCREEN_WIDTH \/\/ 2 - 200, SCREEN_HEIGHT \/\/ 2 + 70))\n        \n        restart_text = self.font_medium.render(\"PRESS R TO RESTART | ESC TO MENU\", True, WHITE)\n        self.screen.blit(restart_text, (SCREEN_WIDTH \/\/ 2 - 350, SCREEN_HEIGHT \/\/ 2 + 150))\n        \n    def draw_level_complete(self):\n        self.draw_overlay()\n        complete_text = self.font_large.render(\"LEVEL COMPLETE!\", True, YELLOW)\n        next_level_text = self.font_medium.render(f\"PRESS R FOR LEVEL {self.level_num + 1}\", True, WHITE)\n        \n        if self.num_players == 1:\n            score_text = self.font_medium.render(f\"SCORE: {self.score1}\", True, LIME)\n            self.screen.blit(complete_text, (SCREEN_WIDTH \/\/ 2 - 250, SCREEN_HEIGHT \/\/ 2 - 100))\n            self.screen.blit(score_text, (SCREEN_WIDTH \/\/ 2 - 100, SCREEN_HEIGHT \/\/ 2))\n        else:\n            score_text1 = self.font_medium.render(f\"P1 SCORE: {self.score1}\", True, BLUE)\n            score_text2 = self.font_medium.render(f\"P2 SCORE: {self.score2}\", True, ORANGE)\n            self.screen.blit(complete_text, (SCREEN_WIDTH \/\/ 2 - 250, SCREEN_HEIGHT \/\/ 2 - 120))\n            self.screen.blit(score_text1, (SCREEN_WIDTH \/\/ 2 - 200, SCREEN_HEIGHT \/\/ 2 - 20))\n            self.screen.blit(score_text2, (SCREEN_WIDTH \/\/ 2 - 200, SCREEN_HEIGHT \/\/ 2 + 30))\n        \n        self.screen.blit(next_level_text, (SCREEN_WIDTH \/\/ 2 - 300, SCREEN_HEIGHT \/\/ 2 + 120))\n        \n    def draw_overlay(self):\n        overlay = pygame.Surface((SCREEN_WIDTH, SCREEN_HEIGHT))\n        overlay.set_alpha(200)\n        overlay.fill(BLACK)\n        self.screen.blit(overlay, (0, 0))\n        \n    def reset_game(self):\n        self.level_num = 1\n        self.level = Level(self.level_num)\n        \n        if self.num_players == 1:\n            self.player1 = Player(SCREEN_WIDTH \/\/ 2 - 20, SCREEN_HEIGHT - 130, 1)\n            self.player2 = None\n            self.level.generate_level()\n            self.highest_y1 = SCREEN_HEIGHT\n        else:\n            self.player1 = Player(250 - 20, SCREEN_HEIGHT - 130, 1)\n            self.player2 = Player(SCREEN_WIDTH - 250 - 20, SCREEN_HEIGHT - 130, 2)\n            self.level.generate_level_two_player()\n            self.highest_y1 = SCREEN_HEIGHT\n            self.highest_y2 = SCREEN_HEIGHT\n        \n        self.particles = pygame.sprite.Group()\n        self.score1 = 0\n        self.score2 = 0\n        self.game_state = STATE_PLAYING\n        self.time_elapsed = 0\n        \n    def next_level(self):\n        self.level_num += 1\n        self.level = Level(self.level_num)\n        \n        if self.num_players == 1:\n            self.player1 = Player(SCREEN_WIDTH \/\/ 2 - 20, SCREEN_HEIGHT - 130, 1)\n            self.player2 = None\n            self.level.generate_level()\n            self.highest_y1 = SCREEN_HEIGHT\n        else:\n            self.player1 = Player(250 - 20, SCREEN_HEIGHT - 130, 1)\n            self.player2 = Player(SCREEN_WIDTH - 250 - 20, SCREEN_HEIGHT - 130, 2)\n            self.level.generate_level_two_player()\n            self.highest_y1 = SCREEN_HEIGHT\n            self.highest_y2 = SCREEN_HEIGHT\n        \n        self.particles = pygame.sprite.Group()\n        self.game_state = STATE_PLAYING\n        self.time_elapsed = 0\n        \n    def run(self):\n        while self.running:\n            self.handle_events()\n            if self.game_state == STATE_PLAYING:\n                self.handle_input()\n            self.update()\n            self.draw()\n            self.clock.tick(FPS)\n            \n        pygame.quit()\n\nif __name__ == \"__main__\":\n    game = Game()\n    game.run()\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">i wanna make a flappy bird game or a math app <\/p>\n","protected":false},"excerpt":{"rendered":"<p>i used ai and some of the code from the platform game we are working on and some from tetris [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-111","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/posts\/111","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/comments?post=111"}],"version-history":[{"count":1,"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/posts\/111\/revisions"}],"predecessor-version":[{"id":112,"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/posts\/111\/revisions\/112"}],"wp:attachment":[{"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/media?parent=111"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/categories?post=111"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/theroyalscode.com\/students\/c_menhart\/wp-json\/wp\/v2\/tags?post=111"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}