Spaces:
Sleeping
Sleeping
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 |