broadfield-dev commited on
Commit
bd2a7ad
·
verified ·
1 Parent(s): a78e101

Create game.py

Browse files
Files changed (1) hide show
  1. game.py +77 -0
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