dungeon_game / game.py
broadfield-dev's picture
Create game.py
bd2a7ad verified
raw
history blame
3.3 kB
class Game:
def __init__(self):
self.map_size = 10
self.terrain = self.generate_terrain()
self.player_pos = [1, 1] # [x, y]
self.player_health = 10
self.player_attack = 2
self.inventory = []
self.monsters = {tuple([5, 5]): {'type': 'goblin', 'health': 5, 'attack': 1}}
self.items = {tuple([3, 3]): 'potion', tuple([6, 6]): 'sword'}
def generate_terrain(self):
# Simple hardcoded 10x10 map: 'w' for wall, 'f' for floor
terrain = [['w' if x == 0 or x == 9 or y == 0 or y == 9 else 'f'
for x in range(self.map_size)]
for y in range(self.map_size)]
terrain[4][4] = 'w' # Add an inner wall for variety
return terrain
def get_entities_grid(self):
grid = [['' for _ in range(self.map_size)] for _ in range(self.map_size)]
grid[self.player_pos[1]][self.player_pos[0]] = 'player'
for pos, monster in self.monsters.items():
grid[pos[1]][pos[0]] = monster['type']
for pos, item in self.items.items():
grid[pos[1]][pos[0]] = item
return grid
def get_game_state(self):
return {
'terrain': self.terrain,
'entities': self.get_entities_grid(),
'health': self.player_health,
'inventory': self.inventory,
'attack': self.player_attack
}
def is_valid_position(self, x, y):
return (0 <= x < self.map_size and 0 <= y < self.map_size and
self.terrain[y][x] != 'w')
def move_player(self, direction):
dx, dy = {'up': (0, -1), 'down': (0, 1), 'left': (-1, 0), 'right': (1, 0)}[direction]
new_x, new_y = self.player_pos[0] + dx, self.player_pos[1] + dy
if self.is_valid_position(new_x, new_y):
self.player_pos = [new_x, new_y]
pos_tuple = tuple(self.player_pos)
# Check for monster
if pos_tuple in self.monsters:
self.handle_combat(pos_tuple)
# Check for item
elif pos_tuple in self.items:
item = self.items.pop(pos_tuple)
self.inventory.append(item)
if item == 'sword':
self.player_attack += 1
from flask_socketio import emit
emit('message', 'Picked up a sword! Attack increased.')
else:
emit('message', f'Picked up a {item}!')
def handle_combat(self, pos):
from flask_socketio import emit
monster = self.monsters[pos]
monster_health = monster['health']
while monster_health > 0 and self.player_health > 0:
monster_health -= self.player_attack
emit('message', f"You attack the {monster['type']} for {self.player_attack} damage.")
if monster_health <= 0:
emit('message', f"You defeated the {monster['type']}!")
del self.monsters[pos]
break
self.player_health -= monster['attack']
emit('message', f"The {monster['type']} attacks you for {monster['attack']} damage.")
if self.player_health <= 0:
emit('message', 'Game over! You were defeated.')
break