Spaces:
Sleeping
Sleeping
Create game.py
Browse files
game.py
ADDED
@@ -0,0 +1,77 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
class Game:
|
2 |
+
def __init__(self):
|
3 |
+
self.map_size = 10
|
4 |
+
self.terrain = self.generate_terrain()
|
5 |
+
self.player_pos = [1, 1] # [x, y]
|
6 |
+
self.player_health = 10
|
7 |
+
self.player_attack = 2
|
8 |
+
self.inventory = []
|
9 |
+
self.monsters = {tuple([5, 5]): {'type': 'goblin', 'health': 5, 'attack': 1}}
|
10 |
+
self.items = {tuple([3, 3]): 'potion', tuple([6, 6]): 'sword'}
|
11 |
+
|
12 |
+
def generate_terrain(self):
|
13 |
+
# Simple hardcoded 10x10 map: 'w' for wall, 'f' for floor
|
14 |
+
terrain = [['w' if x == 0 or x == 9 or y == 0 or y == 9 else 'f'
|
15 |
+
for x in range(self.map_size)]
|
16 |
+
for y in range(self.map_size)]
|
17 |
+
terrain[4][4] = 'w' # Add an inner wall for variety
|
18 |
+
return terrain
|
19 |
+
|
20 |
+
def get_entities_grid(self):
|
21 |
+
grid = [['' for _ in range(self.map_size)] for _ in range(self.map_size)]
|
22 |
+
grid[self.player_pos[1]][self.player_pos[0]] = 'player'
|
23 |
+
for pos, monster in self.monsters.items():
|
24 |
+
grid[pos[1]][pos[0]] = monster['type']
|
25 |
+
for pos, item in self.items.items():
|
26 |
+
grid[pos[1]][pos[0]] = item
|
27 |
+
return grid
|
28 |
+
|
29 |
+
def get_game_state(self):
|
30 |
+
return {
|
31 |
+
'terrain': self.terrain,
|
32 |
+
'entities': self.get_entities_grid(),
|
33 |
+
'health': self.player_health,
|
34 |
+
'inventory': self.inventory,
|
35 |
+
'attack': self.player_attack
|
36 |
+
}
|
37 |
+
|
38 |
+
def is_valid_position(self, x, y):
|
39 |
+
return (0 <= x < self.map_size and 0 <= y < self.map_size and
|
40 |
+
self.terrain[y][x] != 'w')
|
41 |
+
|
42 |
+
def move_player(self, direction):
|
43 |
+
dx, dy = {'up': (0, -1), 'down': (0, 1), 'left': (-1, 0), 'right': (1, 0)}[direction]
|
44 |
+
new_x, new_y = self.player_pos[0] + dx, self.player_pos[1] + dy
|
45 |
+
if self.is_valid_position(new_x, new_y):
|
46 |
+
self.player_pos = [new_x, new_y]
|
47 |
+
pos_tuple = tuple(self.player_pos)
|
48 |
+
# Check for monster
|
49 |
+
if pos_tuple in self.monsters:
|
50 |
+
self.handle_combat(pos_tuple)
|
51 |
+
# Check for item
|
52 |
+
elif pos_tuple in self.items:
|
53 |
+
item = self.items.pop(pos_tuple)
|
54 |
+
self.inventory.append(item)
|
55 |
+
if item == 'sword':
|
56 |
+
self.player_attack += 1
|
57 |
+
from flask_socketio import emit
|
58 |
+
emit('message', 'Picked up a sword! Attack increased.')
|
59 |
+
else:
|
60 |
+
emit('message', f'Picked up a {item}!')
|
61 |
+
|
62 |
+
def handle_combat(self, pos):
|
63 |
+
from flask_socketio import emit
|
64 |
+
monster = self.monsters[pos]
|
65 |
+
monster_health = monster['health']
|
66 |
+
while monster_health > 0 and self.player_health > 0:
|
67 |
+
monster_health -= self.player_attack
|
68 |
+
emit('message', f"You attack the {monster['type']} for {self.player_attack} damage.")
|
69 |
+
if monster_health <= 0:
|
70 |
+
emit('message', f"You defeated the {monster['type']}!")
|
71 |
+
del self.monsters[pos]
|
72 |
+
break
|
73 |
+
self.player_health -= monster['attack']
|
74 |
+
emit('message', f"The {monster['type']} attacks you for {monster['attack']} damage.")
|
75 |
+
if self.player_health <= 0:
|
76 |
+
emit('message', 'Game over! You were defeated.')
|
77 |
+
break
|