Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| ef:gameprojekt:gruppenseiten:gruppe5:start [2023/02/06 09:21] – schallern | ef:gameprojekt:gruppenseiten:gruppe5:start [2023/02/10 21:51] (aktuell) – [Bomb It mit Python] amackert | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | **Bomb It mit Python** | + | =====Bomb It mit Python===== |
| - | Wir wollen | + | Wir haben ein Spiel programmiert, in welchem man mit dem Spieler auf einem Feld herumlaufen kann. Es gibt feste Hindernisse und auch zerstörbare. Der Spieler kann Bomben platzieren, diese zerstören Hindernisse, |
| - | <sxh python> | + | ====Unsere Quellen: |
| - | import arcade | + | |
| - | import random | + | |
| - | #Scaling of Tiles from Tilset and of Player | + | * Die [[https:// |
| - | TILE_SCALING = 1 | + | * Unsere Tiles haben wir von [[https:// |
| - | PLAYER_SCALING | + | |
| - | #Scaling of Sprites | + | ====Verbesserungen: |
| - | NATIVE_SPRITE_SIZE | + | |
| - | SPRITE_SCALING | + | |
| - | SPRITE_SIZE | + | |
| - | #Scaling of the Bomb | + | * Einen künstlichen Gegener erstellen um alleine Spielen zu können |
| - | BOMB_SCALING = 0.2 | + | * Einen Modus um Münzen zu sammeln erstellen, wenn man stirbt wird man wieder an den Anfange gebracht und Münzen werden abgezogen und dem Töter gegeben |
| + | * Den Spieler vor dem Start die Farbe des Roboters entscheiden lassen oder durch Zufall unterschiedliche Farben abgeben und weiter Farben einbauen | ||
| + | * Weiter Items wie ein Schild, welches den Spieler einmalig vor der Bombe schützt, eine Pistole, oder eine Mine, welche den Spieler langsamer macht | ||
| - | #Datas for cration of Window Class | ||
| - | SCREEN_WIDTH = 800 | ||
| - | SCREEN_HEIGHT = 800 | ||
| - | SCREEN_TITLE = " | ||
| - | GRID_PIXEL_SIZE = NATIVE_SPRITE_SIZE * TILE_SCALING | ||
| - | |||
| - | #The Speed with witch the Player moves | ||
| - | MOVEMENT_SPEED = 1 | ||
| - | |||
| - | #For the Creation of the Maze -> Do not Change!!!! | ||
| - | TILE_EMPTY = 0 | ||
| - | TILE_CRATE = 1 | ||
| - | |||
| - | # Gridsize of the Maze | ||
| - | # Maze must have an ODD number of rows and columns. | ||
| - | # Walls go on EVEN rows/ | ||
| - | # Openings go on ODD rows/ | ||
| - | MAZE_HEIGHT = 21 | ||
| - | MAZE_WIDTH = 21 | ||
| - | |||
| - | #Maze Sprite Technologie | ||
| - | MERGE_SPRITES = False | ||
| - | |||
| - | #Create Empty Grid for the Maze | ||
| - | def create_empty_grid(width, | ||
| - | """ | ||
| - | grid = [] | ||
| - | for row in range(height): | ||
| - | grid.append([]) | ||
| - | for column in range(width): | ||
| - | grid[row].append(default_value) | ||
| - | return grid | ||
| - | |||
| - | #Create the Maze Structure | ||
| - | def make_maze_recursive_call(maze, | ||
| - | """ | ||
| - | Recursive function to divide up the maze in four sections | ||
| - | and create three gaps. | ||
| - | Walls can only go on even numbered rows/ | ||
| - | Gaps can only go on odd numbered rows/ | ||
| - | Maze must have an ODD number of rows and columns. | ||
| - | """ | ||
| - | |||
| - | # Figure out where to divide horizontally | ||
| - | start_range = bottom + 2 | ||
| - | end_range = top - 1 | ||
| - | y = random.randrange(start_range, | ||
| - | |||
| - | # Do the division | ||
| - | for column in range(left + 1, right): | ||
| - | maze[y][column] = TILE_CRATE | ||
| - | |||
| - | # Figure out where to divide vertically | ||
| - | start_range = left + 2 | ||
| - | end_range = right - 1 | ||
| - | x = random.randrange(start_range, | ||
| - | |||
| - | # Do the division | ||
| - | for row in range(bottom + 1, top): | ||
| - | maze[row][x] = TILE_CRATE | ||
| - | |||
| - | # Now we'll make a gap on 3 of the 4 walls. | ||
| - | # Figure out which wall does NOT get a gap. | ||
| - | wall = random.randrange(4) | ||
| - | if wall != 0: | ||
| - | gap = random.randrange(left + 1, x, 2) | ||
| - | maze[y][gap] = TILE_EMPTY | ||
| - | |||
| - | if wall != 1: | ||
| - | gap = random.randrange(x + 1, right, 2) | ||
| - | maze[y][gap] = TILE_EMPTY | ||
| - | |||
| - | if wall != 2: | ||
| - | gap = random.randrange(bottom + 1, y, 2) | ||
| - | maze[gap][x] = TILE_EMPTY | ||
| - | |||
| - | if wall != 3: | ||
| - | gap = random.randrange(y + 1, top, 2) | ||
| - | maze[gap][x] = TILE_EMPTY | ||
| - | |||
| - | # If there' | ||
| - | if top > y + 3 and x > left + 3: | ||
| - | make_maze_recursive_call(maze, | ||
| - | |||
| - | if top > y + 3 and x + 3 < right: | ||
| - | make_maze_recursive_call(maze, | ||
| - | |||
| - | if bottom + 3 < y and x + 3 < right: | ||
| - | make_maze_recursive_call(maze, | ||
| - | |||
| - | if bottom + 3 < y and x > left + 3: | ||
| - | make_maze_recursive_call(maze, | ||
| - | |||
| - | |||
| - | #Create the Maze | ||
| - | def make_maze_recursion(maze_width, | ||
| - | """ | ||
| - | maze = create_empty_grid(maze_width, | ||
| - | |||
| - | # Start the recursive process | ||
| - | make_maze_recursive_call(maze, | ||
| - | return maze | ||
| - | |||
| - | #Class to Create the Player | ||
| - | class Player(arcade.Sprite): | ||
| - | def update(self): | ||
| - | """ | ||
| - | # Move player. | ||
| - | # Remove these lines if physics engine is moving player. | ||
| - | self.center_x += self.change_x | ||
| - | self.center_y += self.change_y | ||
| - | |||
| - | # Check for out-of-bounds | ||
| - | if self.left < 0: | ||
| - | self.left = 0 | ||
| - | elif self.right > SCREEN_WIDTH - 1: | ||
| - | self.right = SCREEN_WIDTH - 1 | ||
| - | |||
| - | if self.bottom < 0: | ||
| - | self.bottom = 0 | ||
| - | elif self.top > SCREEN_HEIGHT - 1: | ||
| - | self.top = SCREEN_HEIGHT - 1 | ||
| - | |||
| - | # Klasse für die Bombe definieren | ||
| - | class Bomb(arcade.Sprite): | ||
| - | def __init__(self, | ||
| - | super().__init__(": | ||
| - | self.center_x = x | ||
| - | self.center_y = y | ||
| - | # Timer für die Explosion starten | ||
| - | arcade.schedule(self.explode, | ||
| - | self.explosion_sound = arcade.load_sound(': | ||
| - | | ||
| - | def explode(self, | ||
| - | self.append_texture(arcade.load_texture(' | ||
| - | self.set_texture(1) | ||
| - | arcade.sound.play_sound(self.explosion_sound) | ||
| - | arcade.unschedule(self.explode) | ||
| - | arcade.schedule(self.remove_bomb, | ||
| - | |||
| - | #Bombe aus der Sprite-Liste entfernen | ||
| - | def remove_bomb(self, | ||
| - | self.remove_from_sprite_lists() | ||
| - | arcade.unschedule(self.remove_bomb) | ||
| - | |||
| - | |||
| - | class MyGame(arcade.Window): | ||
| - | |||
| - | def __init__(self): | ||
| - | |||
| - | super().__init__(SCREEN_WIDTH, | ||
| - | |||
| - | self.tile_map = None | ||
| - | |||
| - | self.player_list = None | ||
| - | self.wall_list = None | ||
| - | self.ground_list = None | ||
| - | self.fence_list = None | ||
| - | self.wall_list = None | ||
| - | |||
| - | self.player_sprite = None | ||
| - | |||
| - | self.physics_engine = None | ||
| - | |||
| - | |||
| - | def setup(self): | ||
| - | |||
| - | self.player_list = arcade.SpriteList() | ||
| - | self.wall_list = arcade.SpriteList() | ||
| - | self.bomb_list = arcade.SpriteList() | ||
| - | self.exploded_list = arcade.SpriteList() | ||
| - | |||
| - | # Create the maze | ||
| - | maze = make_maze_recursion(MAZE_WIDTH, | ||
| - | |||
| - | # Create sprites based on 2D grid | ||
| - | if not MERGE_SPRITES: | ||
| - | # This is the simple-to-understand method. Each grid location | ||
| - | # is a sprite. | ||
| - | for row in range(MAZE_HEIGHT): | ||
| - | for column in range(MAZE_WIDTH): | ||
| - | if maze[row][column] == 1: | ||
| - | wall = arcade.Sprite(" | ||
| - | wall.center_x = (column * SPRITE_SIZE + SPRITE_SIZE / 2)+64 | ||
| - | wall.center_y = (row * SPRITE_SIZE + SPRITE_SIZE / 2)+64 | ||
| - | self.wall_list.append(wall) | ||
| - | else: | ||
| - | # This uses new Arcade 1.3.1 features, that allow me to create a | ||
| - | # larger sprite with a repeating texture. So if there are multiple | ||
| - | # cells in a row with a wall, we merge them into one sprite, with a | ||
| - | # repeating texture for each cell. This reduces our sprite count. | ||
| - | for row in range(MAZE_HEIGHT): | ||
| - | column = 0 | ||
| - | while column < len(maze): | ||
| - | while column < len(maze) and maze[row][column] == 0: | ||
| - | column += 1 | ||
| - | start_column = column | ||
| - | while column < len(maze) and maze[row][column] == 1: | ||
| - | column += 1 | ||
| - | end_column = column - 1 | ||
| - | |||
| - | column_count = end_column - start_column + 1 | ||
| - | column_mid = (start_column + end_column) / 2 | ||
| - | |||
| - | wall = arcade.Sprite(" | ||
| - | wall.center_x = (column_mid * SPRITE_SIZE + SPRITE_SIZE / 2)+64 | ||
| - | wall.center_y = (row * SPRITE_SIZE + SPRITE_SIZE / 2)+64 | ||
| - | wall.width = SPRITE_SIZE * column_count | ||
| - | self.wall_list.append(wall) | ||
| - | |||
| - | self.player_sprite = Player( | ||
| - | ": | ||
| - | PLAYER_SCALING, | ||
| - | ) | ||
| - | |||
| - | playerPosition = random.randrange(4) | ||
| - | if(playerPosition == 0): | ||
| - | self.player_sprite.center_x = 80 | ||
| - | self.player_sprite.center_y = 80 | ||
| - | elif(playerPosition == 1): | ||
| - | self.player_sprite.center_x = 800-80 | ||
| - | self.player_sprite.center_y = 80 | ||
| - | elif(playerPosition == 2): | ||
| - | self.player_sprite.center_x = 800-80 | ||
| - | self.player_sprite.center_y = 800-80 | ||
| - | elif(playerPosition == 3): | ||
| - | self.player_sprite.center_x = 80 | ||
| - | self.player_sprite.center_y = 800-80 | ||
| - | else: | ||
| - | self.player_sprite.center_x = 80 | ||
| - | self.player_sprite.center_y = 80 | ||
| - | |||
| - | self.player_list.append(self.player_sprite) | ||
| - | |||
| - | map_name = " | ||
| - | |||
| - | layer_options = { | ||
| - | " | ||
| - | " | ||
| - | } | ||
| - | |||
| - | self.tile_map = arcade.load_tilemap( | ||
| - | ' | ||
| - | ) | ||
| - | self.end_of_map = self.tile_map.width * GRID_PIXEL_SIZE | ||
| - | |||
| - | self.ground_list = self.tile_map.sprite_lists[" | ||
| - | self.fence_list = self.tile_map.sprite_lists[" | ||
| - | |||
| - | if self.tile_map.background_color: | ||
| - | arcade.set_background_color(self.tile_map.background_color) | ||
| - | |||
| - | self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, | ||
| - | |||
| - | def on_draw(self): | ||
| - | self.clear() | ||
| - | |||
| - | | ||
| - | self.ground_list.draw() | ||
| - | self.fence_list.draw() | ||
| - | self.player_list.draw() | ||
| - | self.wall_list.draw() | ||
| - | self.bomb_list.draw() | ||
| - | self.exploded_list.draw() | ||
| - | |||
| - | |||
| - | def on_key_press(self, | ||
| - | |||
| - | if key == arcade.key.UP: | ||
| - | self.player_sprite.change_y = MOVEMENT_SPEED | ||
| - | elif key == arcade.key.DOWN: | ||
| - | self.player_sprite.change_y = -MOVEMENT_SPEED | ||
| - | elif key == arcade.key.LEFT: | ||
| - | self.player_sprite.change_x = -MOVEMENT_SPEED | ||
| - | elif key == arcade.key.RIGHT: | ||
| - | self.player_sprite.change_x = MOVEMENT_SPEED | ||
| - | |||
| - | # Bombe legen mit der Leertaste | ||
| - | elif key == arcade.key.SPACE: | ||
| - | bomb = Bomb((self.player_sprite.center_x// | ||
| - | self.bomb_list.append(bomb) | ||
| - | |||
| - | def on_key_release(self, | ||
| - | | ||
| - | if key == arcade.key.UP or key == arcade.key.DOWN: | ||
| - | self.player_sprite.change_y = 0 | ||
| - | elif key == arcade.key.LEFT or key == arcade.key.RIGHT: | ||
| - | self.player_sprite.change_x = 0 | ||
| - | |||
| - | def on_update(self, | ||
| - | |||
| - | |||
| - | |||
| - | self.player_list.update() | ||
| - | self.physics_engine.update() | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | def main(): | ||
| - | window = MyGame() | ||
| - | window.setup() | ||
| - | arcade.run() | ||
| - | |||
| - | |||
| - | if __name__ == " | ||
| - | main() | ||
| - | </ | ||