testrro commited on
Commit
5f93005
·
verified ·
1 Parent(s): 1ff7210

Update alien_system.py

Browse files
Files changed (1) hide show
  1. alien_system.py +391 -42
alien_system.py CHANGED
@@ -1,42 +1,391 @@
1
- ---
2
- title: AVOLD Engine
3
- emoji: ✈️
4
- colorFrom: indigo
5
- colorTo: blue
6
- sdk: gradio
7
- sdk_version: 4.36.1
8
- python_version: "3.10"
9
- app_file: app.py
10
- pinned: false
11
- fullWidth: true
12
- short_description: টাইমার-ভিত্তিক RNG + এলিয়েন স্পনিং সিস্টেম
13
- tags:
14
- - aviator
15
- - rng
16
- - alien
17
- - game-engine
18
- - simulation
19
- disable_embedding: false
20
- ---
21
-
22
- # ✈️ AVOLD ENGINE - টাইমার-ভিত্তিRNG + এলিয়েন স্নিং সিস্টেম
23
-
24
- ## 📋 **ওভারভিউ**
25
- এই ইঞ্জিনটি PDF-এ বরণিত 6522 VIA টাইমার-ভিত্তিক র‍্যান্ডম নম্বর জেনারেটর এবং এিয়েন স্পনিং সিস্টেমেPython ইমপ্িমেন্টেশন।
26
-
27
- ## 🎯 **মূল বৈশিষ্ট্য**
28
-
29
- ### 🔢 **টাইমার-ভিত্তিক RNG সিস্টেম**
30
- - হার্ডওয়্যার টাইমা ইমুলেশন (মিলিয় Hz)
31
- - র‍্যান্ডম বাফার (SetRandomNumber/NextRandomNumber)
32
- - বাফার মনিটরিং ও স্বাস্থ্য পরীক্ষা
33
- - রেড-েফ অপারে
34
-
35
- ### 👾 **এলি়েন সিংিস্টে**
36
- - এলোমেলো স্পন পজিশন (RNG ব্যবহার করে)
37
- - ডিটারমিনিস্টিক এলিয়েন আচরণ (PDF অনুযায়ী)
38
- - ৪ টি এলিয়েন টাইপ (Scout, Fighter, Bomber, Boss)
39
- - ৬ টি বিহেভিয়ার প্যাটার্ন (Dive, Circle, Straight, Zigzag, Follow, Random)
40
- - প্াটার্সাইকলিং
41
-
42
- ## 🧠 **সিস্টেম আর্কিটেকচার**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import os
3
+ import random
4
+ from dataclasses import dataclass, asdict
5
+ from typing import List, Dict, Optional, Tuple
6
+ from enum import Enum
7
+ import math
8
+ from datetime import datetime
9
+
10
+ from rng_system import get_rng
11
+
12
+ class AlienType(Enum):
13
+ """এলিয়েনের ধরণ"""
14
+ SCOUT = "scout" # ছোট, দ্রুত
15
+ FIGHTER = "fighter" # মাঝারি, স্ট্যান্ডার্ড
16
+ BOMBER = "bomber" # বড়, ধীর
17
+ BOSS = "boss" # খুব বড়, শক্তিশালী
18
+
19
+ class AlienBehavior(Enum):
20
+ """এলিয়েনের আচরণের ধরণ (ডিটারমিনিস্টিক)"""
21
+ DIVE = "dive" # ডাইভ অ্যাটাক
22
+ CIRCLE = "circle" # বৃত্তার
23
+ STRAIGHT = "straight" # সরলরেখা
24
+ ZIGZAG = "zigzag" # জিগজ্যাগ
25
+ FOLLOW = "follow" # ্লয়
26
+ RANDOM = "random" # এলোমেলো (র‍্যান্ডম)
27
+
28
+ @dataclass
29
+ class AlienPattern:
30
+ """এলিয়েন আক্রমণের প্যাটারন (ডিটারমিনিস্টিক)"""
31
+ behavior: AlienBehavior
32
+ speed: float
33
+ amplitude: float # জিগজযাগ/সার্কলের জ্য
34
+ frequency: float # জিগজ্যাগের ফ্রিকোয়েন্সি
35
+ duration: float # প্াটার্ন চলার সময়
36
+ next_pattern: Optional['AlienPattern'] = None
37
+
38
+ @dataclass
39
+ class Alien:
40
+ """এলি়েঅবজক্ট"""
41
+ id: int
42
+ type: AlienType
43
+ x: float
44
+ y: float
45
+ health: int
46
+ pattern: AlienPattern
47
+ pattern_start_time: float
48
+ speed_multiplier: float
49
+
50
+ def to_dict(self):
51
+ return {
52
+ 'id': self.id,
53
+ 'type': self.type.value,
54
+ 'x': round(self.x, 2),
55
+ 'y': round(self.y, 2),
56
+ 'health': self.health,
57
+ 'pattern': self.pattern.behavior.value
58
+ }
59
+
60
+ @dataclass
61
+ class SpawnEvent:
62
+ """স্পন ইভেন্ট"""
63
+ time: float
64
+ alien_type: AlienType
65
+ x: float
66
+ y: float
67
+ pattern: AlienPattern
68
+
69
+
70
+ class AlienPatternLibrary:
71
+ """
72
+ এলিয়েন প্যাটার্ন লাইব্রেরি - ডিটারমিনিস্টিক প্যাটার্নের সেট
73
+ PDF অনুযায়ী: এলিয়েনরা ডিটারমিনিস্টিক, র‍্যান্ডম নয়
74
+ """
75
+
76
+ def __init__(self, patterns_file: str = "data/alien_patterns.json"):
77
+ self.patterns_file = patterns_file
78
+ self.patterns: Dict[AlienType, List[AlienPattern]] = {}
79
+ self._load_patterns()
80
+
81
+ def _load_patterns(self):
82
+ """প্যাটার্ন লোড করা"""
83
+ if os.path.exists(self.patterns_file):
84
+ with open(self.patterns_file, 'r') as f:
85
+ data = json.load(f)
86
+ for alien_type, patterns in data.items():
87
+ self.patterns[AlienType(alien_type)] = [
88
+ AlienPattern(**p) for p in patterns
89
+ ]
90
+ else:
91
+ # ডিফল্ট প্যাটার্ন তৈরি
92
+ self._create_default_patterns()
93
+
94
+ def _create_default_patterns(self):
95
+ """ডিফল্ট প্যাটার্ন তৈরি (PDF-এর মতো)"""
96
+
97
+ # Scout এলিয়েনের প্যাটার্ন
98
+ self.patterns[AlienType.SCOUT] = [
99
+ AlienPattern(AlienBehavior.DIVE, 5.0, 0, 0, 2.0),
100
+ AlienPattern(AlienBehavior.STRAIGHT, 4.0, 0, 0, 1.5),
101
+ AlienPattern(AlienBehavior.CIRCLE, 3.0, 50, 1, 3.0),
102
+ AlienPattern(AlienBehavior.ZIGZAG, 4.5, 30, 2, 2.5)
103
+ ]
104
+
105
+ # Fighter এলিয়েনের প্যাটার্ন
106
+ self.patterns[AlienType.FIGHTER] = [
107
+ AlienPattern(AlienBehavior.FOLLOW, 3.5, 0, 0, 3.0),
108
+ AlienPattern(AlienBehavior.DIVE, 4.0, 0, 0, 2.5),
109
+ AlienPattern(AlienBehavior.STRAIGHT, 3.0, 0, 0, 2.0),
110
+ AlienPattern(AlienBehavior.ZIGZAG, 3.5, 40, 1.5, 3.0)
111
+ ]
112
+
113
+ # Bomber এলিয়েনের প্যাটার্ন
114
+ self.patterns[AlienType.BOMBER] = [
115
+ AlienPattern(AlienBehavior.STRAIGHT, 2.0, 0, 0, 4.0),
116
+ AlienPattern(AlienBehavior.CIRCLE, 1.8, 80, 0.5, 5.0),
117
+ AlienPattern(AlienBehavior.FOLLOW, 2.2, 0, 0, 3.5)
118
+ ]
119
+
120
+ # Boss এলিয়েনের প্যাটার্ন
121
+ self.patterns[AlienType.BOSS] = [
122
+ AlienPattern(AlienBehavior.CIRCLE, 1.5, 100, 0.3, 8.0),
123
+ AlienPattern(AlienBehavior.FOLLOW, 2.0, 0, 0, 5.0),
124
+ AlienPattern(AlienBehavior.DIVE, 2.5, 0, 0, 4.0),
125
+ AlienPattern(AlienBehavior.STRAIGHT, 1.8, 0, 0, 6.0)
126
+ ]
127
+
128
+ def get_pattern_cycle(self, alien_type: AlienType) -> List[AlienPattern]:
129
+ """একটি এলিয়েনের জন্য প্যাটার্ন সাইকেল রিটার্ন করে"""
130
+ return self.patterns.get(alien_type, self.patterns[AlienType.FIGHTER])
131
+
132
+
133
+ class AlienSpawner:
134
+ """
135
+ এলিয়েন স্পনার - PDF-এর SpawnAlien রুটিনের ইমপ্লিমেন্টেশন
136
+ র‍্যান্ডম অবস্থান তৈরি করতে RNG ব্যবহার করে, কিন্তু এলিয়েনের আচরণ ডিটারমিনিস্টিক
137
+ """
138
+
139
+ def __init__(self, pattern_library: AlienPatternLibrary,
140
+ screen_width: int = 800, screen_height: int = 600):
141
+ self.rng = get_rng()
142
+ self.pattern_library = pattern_library
143
+ self.screen_width = screen_width
144
+ self.screen_height = screen_height
145
+
146
+ self.aliens: List[Alien] = []
147
+ self.spawn_history: List[SpawnEvent] = []
148
+ self.next_alien_id = 0
149
+
150
+ # স্পন প্যারামিটার
151
+ self.spawn_rate = 0.5 # প্রতি সেকেন্ডে এলিয়েন
152
+ self.last_spawn_time = time.time()
153
+ self.max_aliens = 20
154
+
155
+ # স্ট্যাটিস্টিক্স
156
+ self.total_spawned = 0
157
+ self.total_killed = 0
158
+
159
+ def _get_random_spawn_position(self) -> Tuple[float, float]:
160
+ """
161
+ এলোমেলো স্পন অবস্থান (র‍্যান্ডম - PDF অনুযায়ী)
162
+ """
163
+ side = self.rng.next_random_range(0, 3) # 0=উপরে, 1=নিচে, 2=বামে, 3=ডানে
164
+
165
+ if side == 0: # উপরে
166
+ x = self.rng.next_random_float(0, self.screen_width)
167
+ y = -50
168
+ elif side == 1: # নিচে
169
+ x = self.rng.next_random_float(0, self.screen_width)
170
+ y = self.screen_height + 50
171
+ elif side == 2: # বামে
172
+ x = -50
173
+ y = self.rng.next_random_float(0, self.screen_height)
174
+ else: # ডানে
175
+ x = self.screen_width + 50
176
+ y = self.rng.next_random_float(0, self.screen_height)
177
+
178
+ return x, y
179
+
180
+ def _select_alien_type(self) -> AlienType:
181
+ """
182
+ এলোমেলো এলিয়েন টাইপ সিলেক্ট (র‍্যান্ডম)
183
+ """
184
+ r = self.rng.next_random_float()
185
+ if r < 0.5: # ৫০% scout
186
+ return AlienType.SCOUT
187
+ elif r < 0.8: # ৩০% fighter
188
+ return AlienType.FIGHTER
189
+ elif r < 0.95: # ১৫% bomber
190
+ return AlienType.BOMBER
191
+ else: # ৫% boss
192
+ return AlienType.BOSS
193
+
194
+ def _create_alien(self, alien_type: AlienType, x: float, y: float) -> Alien:
195
+ """
196
+ নতুন এলিয়েন তৈরি
197
+ """
198
+ # এলিয়েন টাইপ অনুযায়ী স্বাস্থ্য
199
+ health_map = {
200
+ AlienType.SCOUT: 1,
201
+ AlienType.FIGHTER: 3,
202
+ AlienType.BOMBER: 5,
203
+ AlienType.BOSS: 20
204
+ }
205
+
206
+ # প্যাটার্ন সাইকেল থেকে প্রথম প্যাটার্ন নেওয়া
207
+ patterns = self.pattern_library.get_pattern_cycle(alien_type)
208
+ pattern = patterns[0]
209
+
210
+ # স্পিড মাল্টিপ্লায়ার (ছোট ভ্যারিয়েশন)
211
+ speed_multiplier = 0.9 + self.rng.next_random_float() * 0.2
212
+
213
+ alien = Alien(
214
+ id=self.next_alien_id,
215
+ type=alien_type,
216
+ x=x,
217
+ y=y,
218
+ health=health_map[alien_type],
219
+ pattern=pattern,
220
+ pattern_start_time=time.time(),
221
+ speed_multiplier=speed_multiplier
222
+ )
223
+
224
+ self.next_alien_id += 1
225
+ return alien
226
+
227
+ def update(self, dt: float, player_x: float = 400, player_y: float = 300):
228
+ """
229
+ প্রতি ফ্রেমে আপডেট
230
+ """
231
+ current_time = time.time()
232
+
233
+ # নতুন এলিয়েন স্পন
234
+ if (len(self.aliens) < self.max_aliens and
235
+ current_time - self.last_spawn_time > 1.0 / self.spawn_rate):
236
+
237
+ alien_type = self._select_alien_type()
238
+ x, y = self._get_random_spawn_position()
239
+ alien = self._create_alien(alien_type, x, y)
240
+
241
+ self.aliens.append(alien)
242
+ self.spawn_history.append(SpawnEvent(
243
+ time=current_time,
244
+ alien_type=alien_type,
245
+ x=x,
246
+ y=y,
247
+ pattern=alien.pattern
248
+ ))
249
+ self.total_spawned += 1
250
+ self.last_spawn_time = current_time
251
+
252
+ # এলিয়েনদের অবস্থান আপডেট (ডিটারমিনিস্টিক প্যাটার্ন অনুযায়ী)
253
+ aliens_to_remove = []
254
+ for alien in self.aliens:
255
+ self._update_alien_position(alien, dt, player_x, player_y)
256
+
257
+ # স্ক্রিনের বাইরে চলে গেলে রিমুভ
258
+ if (alien.x < -200 or alien.x > self.screen_width + 200 or
259
+ alien.y < -200 or alien.y > self.screen_height + 200):
260
+ aliens_to_remove.append(alien)
261
+
262
+ # মৃত এলিয়েন রিমুভ
263
+ for alien in aliens_to_remove:
264
+ if alien in self.aliens:
265
+ self.aliens.remove(alien)
266
+ self.total_killed += 1
267
+
268
+ def _update_alien_position(self, alien: Alien, dt: float,
269
+ player_x: float, player_y: float):
270
+ """
271
+ এলিয়েনের অবস্থান আপডেট (প্যাটার্ন অনুযায়ী - ডিটারমিনিস্টিক)
272
+ """
273
+ time_in_pattern = time.time() - alien.pattern_start_time
274
+
275
+ # প্যাটার্নের সময় শেষ হলে পরবর্তী প্যাটার্নে যাওয়া
276
+ if time_in_pattern > alien.pattern.duration:
277
+ patterns = self.pattern_library.get_pattern_cycle(alien.type)
278
+ current_index = patterns.index(alien.pattern) if alien.pattern in patterns else 0
279
+ next_index = (current_index + 1) % len(patterns)
280
+ alien.pattern = patterns[next_index]
281
+ alien.pattern_start_time = time.time()
282
+ time_in_pattern = 0
283
+
284
+ speed = alien.pattern.speed * alien.speed_multiplier * dt * 60 # 60 FPS ধরে
285
+
286
+ # প্যাটার্ন অনুযায়ী মুভমেন্ট
287
+ if alien.pattern.behavior == AlienBehavior.DIVE:
288
+ # প্লেয়ারের দিকে ডাইভ
289
+ dx = player_x - alien.x
290
+ dy = player_y - alien.y
291
+ dist = math.sqrt(dx*dx + dy*dy)
292
+ if dist > 0:
293
+ alien.x += (dx / dist) * speed
294
+ alien.y += (dy / dist) * speed
295
+
296
+ elif alien.pattern.behavior == AlienBehavior.CIRCLE:
297
+ # বৃত্তাকার পথ
298
+ angle = time_in_pattern * alien.pattern.frequency
299
+ alien.x += math.cos(angle) * speed
300
+ alien.y += math.sin(angle) * speed
301
+
302
+ elif alien.pattern.behavior == AlienBehavior.STRAIGHT:
303
+ # সরলরেখায় (পূর্ব নির্ধারিত দিকে)
304
+ alien.x -= speed # বামে
305
+
306
+ elif alien.pattern.behavior == AlienBehavior.ZIGZAG:
307
+ # জিগজ্যাগ প্যাটার্ন
308
+ alien.x -= speed
309
+ alien.y += math.sin(time_in_pattern * alien.pattern.frequency) * alien.pattern.amplitude * dt
310
+
311
+ elif alien.pattern.behavior == AlienBehavior.FOLLOW:
312
+ # প্লেয়ারকে ফলো
313
+ dx = player_x - alien.x
314
+ dy = player_y - alien.y
315
+ dist = math.sqrt(dx*dx + dy*dy)
316
+ if dist > 100: # ১০০ পিক্সেল দূরত্বে রাখে
317
+ if dist > 0:
318
+ alien.x += (dx / dist) * speed * 0.5
319
+ alien.y += (dy / dist) * speed * 0.5
320
+
321
+ # র‍্যান্ডম বিহেভিয়ার (শুধু যদি সেট করা থাকে)
322
+ elif alien.pattern.behavior == AlienBehavior.RANDOM:
323
+ alien.x += (self.rng.next_random_float() - 0.5) * speed * 2
324
+ alien.y += (self.rng.next_random_float() - 0.5) * speed * 2
325
+
326
+ def damage_alien(self, alien_id: int, damage: int = 1) -> bool:
327
+ """এলিয়েনকে আঘাত করা"""
328
+ for alien in self.aliens:
329
+ if alien.id == alien_id:
330
+ alien.health -= damage
331
+ if alien.health <= 0:
332
+ self.aliens.remove(alien)
333
+ self.total_killed += 1
334
+ return True
335
+ break
336
+ return False
337
+
338
+ def get_aliens_data(self) -> List[dict]:
339
+ """UI-এর জন্য এলিয়েন ডাটা"""
340
+ return [alien.to_dict() for alien in self.aliens]
341
+
342
+ def get_stats(self) -> dict:
343
+ """পরিসংখ্যান"""
344
+ return {
345
+ 'total_spawned': self.total_spawned,
346
+ 'total_killed': self.total_killed,
347
+ 'active_aliens': len(self.aliens),
348
+ 'spawn_rate': self.spawn_rate
349
+ }
350
+
351
+ def get_spawn_history(self, limit: int = 50) -> List[dict]:
352
+ """স্পন হিস্ট্রি"""
353
+ return [
354
+ {
355
+ 'time': datetime.fromtimestamp(e.time).strftime('%H:%M:%S'),
356
+ 'type': e.alien_type.value,
357
+ 'position': f"({int(e.x)},{int(e.y)})"
358
+ }
359
+ for e in self.spawn_history[-limit:]
360
+ ]
361
+
362
+
363
+ class AlienAIManager:
364
+ """
365
+ এলিয়েন এআই ম্যানেজার - ডিটারমিনিস্টিক প্যাটার্ন ম্যানেজ করে
366
+ PDF অনুযায়ী: এলিয়েনরা ডিটারমিনিস্টিক
367
+ """
368
+
369
+ def __init__(self):
370
+ self.pattern_library = AlienPatternLibrary()
371
+ self.current_cycle_index = 0
372
+ self.cycle_length = 4 # প্রতি ৪ রাউন্ডে প্যাটার্ন রিসেট
373
+
374
+ def get_attack_wave_pattern(self, wave_number: int) -> List[AlienPattern]:
375
+ """
376
+ ওয়েব নম্বর অনুযায়ী অ্যাটাক প্যাটার্ন
377
+ ডিটারমিনিস্টিক - প্রতি ওয়েভে একই প্যাটার্ন রিপিট
378
+ """
379
+ base_pattern = self.pattern_library.get_pattern_cycle(AlienType.FIGHTER)
380
+
381
+ # ওয়েব নম্বর অনুযায়ী প্যাটার্ন মডিফাই
382
+ wave_index = (wave_number // self.cycle_length) % len(base_pattern)
383
+
384
+ return [base_pattern[wave_index]]
385
+
386
+ def predict_next_attack(self, current_wave: int) -> str:
387
+ """
388
+ পরবর্তী অ্যাটাকের ধরণ প্রেডিক্ট (ডিটারমিনিস্টিক)
389
+ """
390
+ next_pattern = self.get_attack_wave_pattern(current_wave + 1)
391
+ return f"পরবর্তী অ্যাটাক: {next_pattern[0].behavior.value}"