generated from mwc/lab_retro
This is completely different than anything we did in unit 1. When creating the nav game all the code feels connected as the code was broken up into asteroid, asteroid spawner, game, and spaceship. I think this is so much easier to follow as it was easy to figure out what each thing did. Also, this uses classes which we did not use in unit 1.
This commit is contained in:
BIN
__pycache__/asteroid.cpython-312.pyc
Normal file
BIN
__pycache__/asteroid.cpython-312.pyc
Normal file
Binary file not shown.
BIN
__pycache__/asteroid_spawner.cpython-312.pyc
Normal file
BIN
__pycache__/asteroid_spawner.cpython-312.pyc
Normal file
Binary file not shown.
BIN
__pycache__/spaceship.cpython-312.pyc
Normal file
BIN
__pycache__/spaceship.cpython-312.pyc
Normal file
Binary file not shown.
23
asteroid.py
23
asteroid.py
@@ -2,3 +2,26 @@
|
||||
# ------------
|
||||
# By MWC Contributors
|
||||
# This module defines an asteroid agent class.
|
||||
class Asteroid:
|
||||
character = 'O'
|
||||
|
||||
def __init__(self, position):
|
||||
self.position = position
|
||||
|
||||
def play_turn(self, game):
|
||||
lives = 5
|
||||
width, height = game.board_size
|
||||
if game.turn_number % 2 == 0:
|
||||
x, y = self.position
|
||||
if y == height - 1:
|
||||
game.remove_agent(self)
|
||||
else:
|
||||
ship = game.get_agent_by_name('ship')
|
||||
new_position = (x, y + 1)
|
||||
if new_position == ship.position:
|
||||
lives = lives-1
|
||||
game.state["lives"] -=1
|
||||
if game.state["lives"] == 0:
|
||||
game.end()
|
||||
else:
|
||||
self.position = new_position
|
||||
@@ -2,3 +2,18 @@
|
||||
# -------------------
|
||||
# By MWC Contributors
|
||||
# This module defines an AsteroidSpawner agent class.
|
||||
from random import randint
|
||||
from asteroid import Asteroid
|
||||
|
||||
class AsteroidSpawner:
|
||||
display = False
|
||||
|
||||
def play_turn(self, game):
|
||||
width, height = game.board_size
|
||||
game.state['score'] += 1
|
||||
if self.should_spawn_asteroid(game.turn_number):
|
||||
asteroid = Asteroid((randint(0, width - 1), 0))
|
||||
game.add_agent(asteroid)
|
||||
|
||||
def should_spawn_asteroid(self, turn_number):
|
||||
return randint(0, 1000) < turn_number
|
||||
@@ -2,3 +2,12 @@
|
||||
# ------------
|
||||
# By MWC Contributors
|
||||
# This class implements a simple game where a spaceship avoids asteroids.
|
||||
from retro.game import Game
|
||||
from spaceship import Spaceship
|
||||
from asteroid_spawner import AsteroidSpawner
|
||||
|
||||
board_size = (25, 25)
|
||||
ship = Spaceship(board_size)
|
||||
spawner = AsteroidSpawner()
|
||||
game = Game([ship, spawner], {"score": 0,"lives":5}, board_size=board_size)
|
||||
game.play()
|
||||
20
spaceship.py
20
spaceship.py
@@ -2,3 +2,23 @@
|
||||
# ------------
|
||||
# By MWC Contributors
|
||||
# This module defines a spaceship agent class.
|
||||
class Spaceship:
|
||||
name = "ship"
|
||||
character = '^'
|
||||
|
||||
def __init__(self, board_size):
|
||||
board_width, board_height = board_size
|
||||
self.position = (board_width // 2, board_height - 1)
|
||||
|
||||
def handle_keystroke(self, keystroke, game):
|
||||
x, y = self.position
|
||||
if keystroke.name in ("KEY_LEFT", "KEY_RIGHT"):
|
||||
if keystroke.name == "KEY_LEFT":
|
||||
new_position = (x - 1, y)
|
||||
else:
|
||||
new_position = (x + 1, y)
|
||||
if game.on_board(new_position):
|
||||
if game.is_empty(new_position):
|
||||
self.position = new_position
|
||||
else:
|
||||
game.end()
|
||||
Reference in New Issue
Block a user