File size: 3,299 Bytes
bd2a7ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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