socha 3.7.0__cp313-none-win32.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- socha/__init__.py +1 -0
- socha/_socha.cp313-win32.pyd +0 -0
- socha/_socha.pyi +541 -0
- socha/api/__init__.py +0 -0
- socha/api/networking/__init__.py +0 -0
- socha/api/networking/game_client.py +387 -0
- socha/api/networking/network_socket.py +82 -0
- socha/api/networking/utils.py +146 -0
- socha/api/networking/xml_protocol_interface.py +201 -0
- socha/api/protocol/__init__.py +0 -0
- socha/api/protocol/protocol.py +972 -0
- socha/api/protocol/protocol_packet.py +10 -0
- socha/api/protocol/room_message.py +25 -0
- socha/py.typed +0 -0
- socha/starter.py +252 -0
- socha/utils/package_builder.py +256 -0
- socha-3.7.0.dist-info/METADATA +254 -0
- socha-3.7.0.dist-info/RECORD +20 -0
- socha-3.7.0.dist-info/WHEEL +4 -0
- socha-3.7.0.dist-info/license_files/LICENSE +21 -0
socha/__init__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from ._socha import *
|
|
Binary file
|
socha/_socha.pyi
ADDED
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
from typing import List, Optional
|
|
3
|
+
|
|
4
|
+
class Card(Enum):
|
|
5
|
+
"""
|
|
6
|
+
Eine Karte, die im Spiel verwendet werden kann.
|
|
7
|
+
|
|
8
|
+
Attributes:
|
|
9
|
+
FallBack (int): Die Karte, die den Spieler zurückfallen lässt.
|
|
10
|
+
HurryAhead (int): Die Karte, die den Spieler vorrücken lässt.
|
|
11
|
+
EatSalad (int): Die Karte, die den Spieler Salat essen lässt.
|
|
12
|
+
SwapCarrots (int): Die Karte, die die Karotten der Spieler tauscht.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
FallBack: int = 0
|
|
16
|
+
HurryAhead: int = 1
|
|
17
|
+
EatSalad: int = 2
|
|
18
|
+
SwapCarrots: int = 3
|
|
19
|
+
|
|
20
|
+
def __init__(self) -> None: ...
|
|
21
|
+
def moves(self) -> bool:
|
|
22
|
+
"""
|
|
23
|
+
Gibt an, ob die Karte den Spieler bewegt.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
None
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
bool: True, wenn die Karte den Spieler bewegt, False sonst.
|
|
30
|
+
"""
|
|
31
|
+
...
|
|
32
|
+
|
|
33
|
+
def perform(self, state: GameState, remaining_cards: List[Card]) -> None:
|
|
34
|
+
"""
|
|
35
|
+
Führt die Karte aus.\n
|
|
36
|
+
Diese Methode **kann** den GameState **mutieren**, unabhängig vom Erfolg des Zuges.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
state (GameState): Der aktuelle Spielzustand.
|
|
40
|
+
remaining_cards (List[Card]): Die verbleibenden Karten.
|
|
41
|
+
|
|
42
|
+
Raises:
|
|
43
|
+
HUIError: Ein Fehler, wenn die Karte nicht ausgeführt werden kann.
|
|
44
|
+
"""
|
|
45
|
+
...
|
|
46
|
+
|
|
47
|
+
class Advance:
|
|
48
|
+
"""
|
|
49
|
+
Eine Klasse, die einen Vorwärtszug im Spiel darstellt.
|
|
50
|
+
|
|
51
|
+
Attributes:
|
|
52
|
+
distance (int): Die Anzahl der Felder, die der Spieler vorrücken soll.
|
|
53
|
+
cards (List[Card]): Die Karten, die während des Vorgangs gespielt werden.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
distance: int
|
|
57
|
+
cards: List[Card]
|
|
58
|
+
|
|
59
|
+
def __init__(self, distance: int, cards: List[Card]): ...
|
|
60
|
+
def perform(self, state: GameState) -> None:
|
|
61
|
+
"""
|
|
62
|
+
Führt den Vorwärtszug aus.\n
|
|
63
|
+
Diese Methode **kann** den GameState **mutieren**, unabhängig vom Erfolg des Zuges.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
state (GameState): Der aktuelle Zustand des Spiels.
|
|
67
|
+
|
|
68
|
+
Raises:
|
|
69
|
+
HUIError: Wenn der Vorwärtszug nicht erfolgreich ausgeführt werden kann.
|
|
70
|
+
"""
|
|
71
|
+
...
|
|
72
|
+
|
|
73
|
+
class EatSalad:
|
|
74
|
+
def __init__(self) -> None: ...
|
|
75
|
+
def perform(self, state: GameState) -> None:
|
|
76
|
+
"""
|
|
77
|
+
Führt die Salat-Fressen Aktion aus.\n
|
|
78
|
+
Diese Methode **kann** den GameState **mutieren**, unabhängig vom Erfolg des Zuges.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
state (GameState): Der aktuelle Zustand des Spiels.
|
|
82
|
+
|
|
83
|
+
Raises:
|
|
84
|
+
HUIError: Wenn der Salat nicht erfolgreich gegessen werden kann.
|
|
85
|
+
"""
|
|
86
|
+
...
|
|
87
|
+
|
|
88
|
+
class ExchangeCarrots:
|
|
89
|
+
amount: int
|
|
90
|
+
|
|
91
|
+
def __init__(self, amount: int) -> None: ...
|
|
92
|
+
def perform(self, state: GameState) -> None:
|
|
93
|
+
"""
|
|
94
|
+
Führt die Karotten-Tausch-Aktion aus.\n
|
|
95
|
+
Diese Methode **kann** den GameState **mutieren**, unabhängig vom Erfolg des Zuges.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
state (GameState): Der aktuelle Zustand des Spiels.
|
|
99
|
+
|
|
100
|
+
Raises:
|
|
101
|
+
HUIError: Wenn die Karotten nicht erfolgreich getauscht werden können.
|
|
102
|
+
"""
|
|
103
|
+
...
|
|
104
|
+
|
|
105
|
+
class FallBack:
|
|
106
|
+
def __init__(self) -> None: ...
|
|
107
|
+
def perform(self, state: GameState) -> None: ...
|
|
108
|
+
|
|
109
|
+
class Field(Enum):
|
|
110
|
+
Position1: int = 0
|
|
111
|
+
"""
|
|
112
|
+
Zahlfeld
|
|
113
|
+
"""
|
|
114
|
+
Position2: int = 1
|
|
115
|
+
"""
|
|
116
|
+
Flaggenfeld
|
|
117
|
+
"""
|
|
118
|
+
Hedgehog: int = 2
|
|
119
|
+
"""
|
|
120
|
+
Igelfeld: Hierauf kann nur rückwärts gezogen werden.
|
|
121
|
+
"""
|
|
122
|
+
Salad: int = 3
|
|
123
|
+
"""
|
|
124
|
+
Salatfeld: Beim Betreten wird im nächsten Zug ein Salat gegessen.
|
|
125
|
+
"""
|
|
126
|
+
Carrots: int = 4
|
|
127
|
+
"""
|
|
128
|
+
Karottenfeld: Hier dürfen Karotten getauscht werden.
|
|
129
|
+
"""
|
|
130
|
+
Hare: int = 5
|
|
131
|
+
"""
|
|
132
|
+
Hasenfeld: Hier wird sofort eine Hasenkarte gespielt.
|
|
133
|
+
"""
|
|
134
|
+
Market: int = 6
|
|
135
|
+
"""
|
|
136
|
+
Marktfeld: Hier wird eine Hasenkarte gekauft (Variation).
|
|
137
|
+
"""
|
|
138
|
+
Goal: int = 7
|
|
139
|
+
"""
|
|
140
|
+
Zielfeld
|
|
141
|
+
"""
|
|
142
|
+
Start: int = 8
|
|
143
|
+
"""
|
|
144
|
+
Startfeld
|
|
145
|
+
"""
|
|
146
|
+
|
|
147
|
+
class Board:
|
|
148
|
+
"""
|
|
149
|
+
Ein Spielbrett, das die Felder des Spiels enthält.
|
|
150
|
+
|
|
151
|
+
Attributes:
|
|
152
|
+
track (List[Field]): Die Liste der Felder, die das Spielbrett darstellen
|
|
153
|
+
"""
|
|
154
|
+
|
|
155
|
+
track: list[Field]
|
|
156
|
+
|
|
157
|
+
def __init__(self, track: list[Field]) -> None: ...
|
|
158
|
+
def get_field(self, index: int) -> Optional[Field]:
|
|
159
|
+
"""
|
|
160
|
+
Gibt das Feld am angegebenen Index zurück.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
index (int): Der Index des Feldes, das abgerufen werden soll.
|
|
164
|
+
|
|
165
|
+
Returns:
|
|
166
|
+
Field: Das Feld am angegebenen Index, oder None, wenn außerhalb des gültigen Bereichs.
|
|
167
|
+
"""
|
|
168
|
+
...
|
|
169
|
+
def find_field(self, field: Field, start: int, end: int) -> Optional[int]:
|
|
170
|
+
"""
|
|
171
|
+
Findet den ersten Index des angegebenen Feldes innerhalb des angegebenen Bereichs.
|
|
172
|
+
|
|
173
|
+
Args:
|
|
174
|
+
field (Field): Das Feld, nach dem gesucht werden soll.
|
|
175
|
+
start (int): Der Startindex des Bereichs, in dem gesucht werden soll.
|
|
176
|
+
end (int): Der Endindex des Bereichs, in dem gesucht werden soll.
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
int: Der Index des Feldes, wenn gefunden, oder None, wenn nicht gefunden.
|
|
180
|
+
"""
|
|
181
|
+
...
|
|
182
|
+
def get_previous_field(self, field: Field, index: int) -> Optional[int]:
|
|
183
|
+
"""
|
|
184
|
+
Findet die vorherige Vorkommen des angegebenen Feldes vor dem angegebenen Index.
|
|
185
|
+
|
|
186
|
+
Args:
|
|
187
|
+
field (Field): Das Feld, nach dem gesucht werden soll.
|
|
188
|
+
index (int): Der Index, von dem aus gesucht werden soll.
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
int: Der Index des vorherigen Vorkommens des Feldes, oder None, wenn nicht gefunden.
|
|
192
|
+
"""
|
|
193
|
+
...
|
|
194
|
+
def get_next_field(self, field: Field, index: int) -> Optional[int]:
|
|
195
|
+
"""
|
|
196
|
+
Findet das nächste Vorkommen des angegebenen Feldes nach dem angegebenen Index.
|
|
197
|
+
|
|
198
|
+
Args:
|
|
199
|
+
field (Field): Das Feld, nach dem gesucht werden soll.
|
|
200
|
+
index (int): Der Index, von dem aus gesucht werden soll.
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
int: Der Index des nächsten Vorkommens des Feldes, oder None, wenn nicht gefunden.
|
|
204
|
+
"""
|
|
205
|
+
...
|
|
206
|
+
|
|
207
|
+
class TeamEnum(Enum):
|
|
208
|
+
One: int = 0
|
|
209
|
+
"""
|
|
210
|
+
Team 1
|
|
211
|
+
"""
|
|
212
|
+
Two: int = 1
|
|
213
|
+
"""
|
|
214
|
+
Team 2
|
|
215
|
+
"""
|
|
216
|
+
|
|
217
|
+
def __repr__(self) -> str: ...
|
|
218
|
+
|
|
219
|
+
class Hare:
|
|
220
|
+
"""
|
|
221
|
+
Repräsentiert einen Hasen im Spiel.
|
|
222
|
+
|
|
223
|
+
Attribute:
|
|
224
|
+
team (TeamEnum): Das Team, dem der Hase angehört.
|
|
225
|
+
position (int): Die aktuelle Position des Hasen auf dem Brett.
|
|
226
|
+
salads (int): Die Anzahl der Salate, die der Hase hat.
|
|
227
|
+
carrots (int): Die Anzahl der Karotten, die der Hase hat.
|
|
228
|
+
last_move (Optional[Move]): Der letzte Zug, den der Hase gemacht hat.
|
|
229
|
+
cards (List[Card]): Die Karten, die der Hase hat.
|
|
230
|
+
"""
|
|
231
|
+
|
|
232
|
+
team: TeamEnum
|
|
233
|
+
position: int
|
|
234
|
+
salads: int
|
|
235
|
+
carrots: int
|
|
236
|
+
last_move: Optional[Move]
|
|
237
|
+
cards: List[Card]
|
|
238
|
+
|
|
239
|
+
def __init__(
|
|
240
|
+
self,
|
|
241
|
+
team: TeamEnum,
|
|
242
|
+
cards: Optional[List[Card]] = None,
|
|
243
|
+
carrots: Optional[int] = None,
|
|
244
|
+
salads: Optional[int] = None,
|
|
245
|
+
last_move: Optional[Move] = None,
|
|
246
|
+
position: Optional[int] = None,
|
|
247
|
+
) -> None: ...
|
|
248
|
+
def is_in_goal(self) -> bool:
|
|
249
|
+
"""
|
|
250
|
+
Überprüft, ob der Hase im Ziel ist.
|
|
251
|
+
|
|
252
|
+
Returns:
|
|
253
|
+
bool: True, wenn der Hase im Ziel ist, False sonst.
|
|
254
|
+
"""
|
|
255
|
+
...
|
|
256
|
+
|
|
257
|
+
def can_enter_goal(self) -> bool:
|
|
258
|
+
"""
|
|
259
|
+
Überprüft, ob der Hase das Ziel betreten kann.
|
|
260
|
+
|
|
261
|
+
Returns:
|
|
262
|
+
bool: True, wenn der Hase das Ziel betreten kann, False sonst.
|
|
263
|
+
"""
|
|
264
|
+
...
|
|
265
|
+
|
|
266
|
+
def advance_by(self, state: GameState, distance: int, cards: List[Card]) -> None:
|
|
267
|
+
"""
|
|
268
|
+
Rückt den Hasen um eine bestimmte Entfernung vor.
|
|
269
|
+
|
|
270
|
+
Args:
|
|
271
|
+
state (GameState): Der aktuelle Spielzustand.
|
|
272
|
+
distance (int): Die Entfernung, um die der Hase vorrücken soll.
|
|
273
|
+
cards (List[Card]): Die Karten, die während des Vorgangs gespielt werden.
|
|
274
|
+
|
|
275
|
+
Raises:
|
|
276
|
+
HUIError: Wenn der Hase nicht vorrücken kann.
|
|
277
|
+
"""
|
|
278
|
+
...
|
|
279
|
+
|
|
280
|
+
def exchange_carrots(self, state: GameState, carrots: int) -> None:
|
|
281
|
+
"""
|
|
282
|
+
Tauscht Karotten mit dem Hasen.
|
|
283
|
+
|
|
284
|
+
Args:
|
|
285
|
+
state (GameState): Der aktuelle Spielzustand.
|
|
286
|
+
carrots (int): Die Anzahl der Karotten, die getauscht werden sollen.
|
|
287
|
+
|
|
288
|
+
Raises:
|
|
289
|
+
HUIError: Wenn die Karotten nicht getauscht werden können.
|
|
290
|
+
"""
|
|
291
|
+
...
|
|
292
|
+
|
|
293
|
+
def consume_carrots(self, state: GameState, carrots: int) -> None:
|
|
294
|
+
"""
|
|
295
|
+
Verbraucht Karotten vom Hasen.
|
|
296
|
+
|
|
297
|
+
Args:
|
|
298
|
+
state (GameState): Der aktuelle Spielzustand.
|
|
299
|
+
carrots (int): Die Anzahl der Karotten, die verbraucht werden sollen.
|
|
300
|
+
|
|
301
|
+
Raises:
|
|
302
|
+
HUIError: Wenn die Karotten nicht verbraucht werden können.
|
|
303
|
+
"""
|
|
304
|
+
...
|
|
305
|
+
|
|
306
|
+
def eat_salad(self, state: GameState) -> None:
|
|
307
|
+
"""
|
|
308
|
+
Lässt den Hasen einen Salat essen.
|
|
309
|
+
|
|
310
|
+
Args:
|
|
311
|
+
state (GameState): Der aktuelle Spielzustand.
|
|
312
|
+
"""
|
|
313
|
+
...
|
|
314
|
+
|
|
315
|
+
def get_fall_back(self, state: GameState) -> Optional[int]:
|
|
316
|
+
"""
|
|
317
|
+
Gibt den nächsten möglich Index zurück, an dem der Hase zurückfallen kann.
|
|
318
|
+
|
|
319
|
+
Args:
|
|
320
|
+
state (GameState): Der aktuelle Spielzustand.
|
|
321
|
+
|
|
322
|
+
Returns:
|
|
323
|
+
Optional[int]: Die Rückfallposition des Hasen, oder None, wenn nicht gefunden.
|
|
324
|
+
"""
|
|
325
|
+
...
|
|
326
|
+
|
|
327
|
+
def fall_back(self, state: GameState) -> None:
|
|
328
|
+
"""
|
|
329
|
+
Lässt den Hasen zu einer vorherigen Position zurückfallen.
|
|
330
|
+
|
|
331
|
+
Args:
|
|
332
|
+
state (GameState): Der aktuelle Spielzustand.
|
|
333
|
+
|
|
334
|
+
Raises:
|
|
335
|
+
HUIError: Wenn der Hase nicht zurückfallen kann.
|
|
336
|
+
"""
|
|
337
|
+
...
|
|
338
|
+
|
|
339
|
+
def is_ahead(self, state: GameState) -> bool:
|
|
340
|
+
"""
|
|
341
|
+
Überprüft, ob der Hase vor dem anderen Spieler ist.
|
|
342
|
+
|
|
343
|
+
Args:
|
|
344
|
+
state (GameState): Der aktuelle Spielzustand.
|
|
345
|
+
|
|
346
|
+
Returns:
|
|
347
|
+
bool: True, wenn der Hase vor dem anderen Spieler ist, False sonst.
|
|
348
|
+
"""
|
|
349
|
+
...
|
|
350
|
+
|
|
351
|
+
class Move:
|
|
352
|
+
"""
|
|
353
|
+
Repräsentiert einen Zug im Spiel.
|
|
354
|
+
|
|
355
|
+
Attribute:
|
|
356
|
+
action (Advance | EatSalad | ExchangeCarrots | FallBack): Die Aktion, die der Zug ausführt.
|
|
357
|
+
"""
|
|
358
|
+
|
|
359
|
+
action: Advance | EatSalad | ExchangeCarrots | FallBack
|
|
360
|
+
|
|
361
|
+
def __init__(
|
|
362
|
+
self, action: Advance | EatSalad | ExchangeCarrots | FallBack
|
|
363
|
+
) -> None: ...
|
|
364
|
+
def perform(self, state: GameState) -> None:
|
|
365
|
+
"""
|
|
366
|
+
Führt den Zug aus.
|
|
367
|
+
|
|
368
|
+
Args:
|
|
369
|
+
state (GameState): Der aktuelle Spielzustand.
|
|
370
|
+
|
|
371
|
+
Raises:
|
|
372
|
+
HUIError: Wenn der Zug nicht ausgeführt werden kann.
|
|
373
|
+
"""
|
|
374
|
+
...
|
|
375
|
+
def __repr__(self) -> str: ...
|
|
376
|
+
|
|
377
|
+
class GameState:
|
|
378
|
+
"""
|
|
379
|
+
Repräsentiert den aktuellen Zustand des Spiels.
|
|
380
|
+
|
|
381
|
+
Attribute:
|
|
382
|
+
board (Board): Das Spielbrett.
|
|
383
|
+
turn (int): Die aktuelle Runde.
|
|
384
|
+
"""
|
|
385
|
+
|
|
386
|
+
board: Board
|
|
387
|
+
turn: int
|
|
388
|
+
last_move: Optional[Move]
|
|
389
|
+
|
|
390
|
+
def __init__(
|
|
391
|
+
self, board: Board, turn: int, player_one: Hare, player_two: Hare, last_move: Optional[Move]
|
|
392
|
+
) -> None: ...
|
|
393
|
+
def perform_move(self, move: Move) -> GameState:
|
|
394
|
+
"""
|
|
395
|
+
Führt einen Zug aus und gibt den neuen Spielzustand zurück.
|
|
396
|
+
|
|
397
|
+
Args:
|
|
398
|
+
move (Move): Der Zug, der ausgeführt werden soll.
|
|
399
|
+
|
|
400
|
+
Returns:
|
|
401
|
+
GameState: Der neue Spielzustand.
|
|
402
|
+
|
|
403
|
+
Raises:
|
|
404
|
+
HUIError: Wenn der Zug nicht ausgeführt werden kann.
|
|
405
|
+
"""
|
|
406
|
+
...
|
|
407
|
+
|
|
408
|
+
def clone_current_player(self) -> Hare:
|
|
409
|
+
"""
|
|
410
|
+
Gibt eine Kopie des aktuellen Spielers zurück.
|
|
411
|
+
|
|
412
|
+
Returns:
|
|
413
|
+
Hare: Eine Kopie des aktuellen Spielers.
|
|
414
|
+
"""
|
|
415
|
+
...
|
|
416
|
+
|
|
417
|
+
def clone_other_player(self) -> Hare:
|
|
418
|
+
"""
|
|
419
|
+
Gibt eine Kopie des anderen Spielers zurück.
|
|
420
|
+
|
|
421
|
+
Returns:
|
|
422
|
+
Hare: Eine Kopie des anderen Spielers.
|
|
423
|
+
"""
|
|
424
|
+
...
|
|
425
|
+
|
|
426
|
+
def update_player(self, player: Hare) -> None:
|
|
427
|
+
"""
|
|
428
|
+
Aktualisiert den Spieler.
|
|
429
|
+
|
|
430
|
+
Args:
|
|
431
|
+
player (Hare): Der Spieler, der aktualisiert werden soll.
|
|
432
|
+
"""
|
|
433
|
+
...
|
|
434
|
+
|
|
435
|
+
def is_over(self) -> bool:
|
|
436
|
+
"""
|
|
437
|
+
Überprüft, ob das Spiel vorbei ist.
|
|
438
|
+
|
|
439
|
+
Returns:
|
|
440
|
+
bool: True, wenn das Spiel vorbei ist, False sonst.
|
|
441
|
+
"""
|
|
442
|
+
...
|
|
443
|
+
|
|
444
|
+
def possible_moves(self) -> List[Move]:
|
|
445
|
+
"""
|
|
446
|
+
Gibt eine Liste aller möglichen Züge zurück.
|
|
447
|
+
|
|
448
|
+
Returns:
|
|
449
|
+
List[Move]: Eine Liste aller möglichen Züge.
|
|
450
|
+
"""
|
|
451
|
+
...
|
|
452
|
+
|
|
453
|
+
class RulesEngine:
|
|
454
|
+
"""
|
|
455
|
+
Dient zur Überprüfung der Spielregeln.
|
|
456
|
+
"""
|
|
457
|
+
|
|
458
|
+
@staticmethod
|
|
459
|
+
def calculates_carrots(distance: int) -> int:
|
|
460
|
+
"""
|
|
461
|
+
Berechnet die Anzahl der Karotten, die für einen Zug benötigt werden.
|
|
462
|
+
|
|
463
|
+
Args:
|
|
464
|
+
distance (int): Die Entfernung, die zurückgelegt werden soll.
|
|
465
|
+
|
|
466
|
+
Returns:
|
|
467
|
+
int: Die Anzahl der Karotten, die benötigt werden.
|
|
468
|
+
"""
|
|
469
|
+
...
|
|
470
|
+
|
|
471
|
+
@staticmethod
|
|
472
|
+
def can_exchange_carrots(board: Board, player: Hare, count: int) -> None:
|
|
473
|
+
"""
|
|
474
|
+
Überprüft, ob ein Spieler Karotten tauschen kann.
|
|
475
|
+
|
|
476
|
+
Args:
|
|
477
|
+
board (Board): Das Spielbrett.
|
|
478
|
+
player (Hare): Der Spieler, der Karotten tauschen möchte.
|
|
479
|
+
count (int): Die Anzahl der Karotten, die getauscht werden sollen.
|
|
480
|
+
|
|
481
|
+
Raises:
|
|
482
|
+
HUIError: Wenn der Spieler nicht genug Karotten hat oder wenn das Feld nicht ein Karottenfeld ist.
|
|
483
|
+
"""
|
|
484
|
+
...
|
|
485
|
+
|
|
486
|
+
@staticmethod
|
|
487
|
+
def can_eat_salad(board: Board, player: Hare) -> None:
|
|
488
|
+
"""
|
|
489
|
+
Überprüft, ob ein Spieler einen Salat essen kann.
|
|
490
|
+
|
|
491
|
+
Args:
|
|
492
|
+
board (Board): Das Spielbrett.
|
|
493
|
+
player (Hare): Der Spieler, der einen Salat essen möchte.
|
|
494
|
+
|
|
495
|
+
Raises:
|
|
496
|
+
HUIError: Wenn der Spieler keinen Salat hat oder wenn das Feld nicht ein Salatfeld ist.
|
|
497
|
+
"""
|
|
498
|
+
...
|
|
499
|
+
|
|
500
|
+
@staticmethod
|
|
501
|
+
def has_to_eat_salad(board: Board, player: Hare) -> None:
|
|
502
|
+
"""
|
|
503
|
+
Überprüft, ob ein Spieler einen Salat essen muss.
|
|
504
|
+
|
|
505
|
+
Args:
|
|
506
|
+
board (Board): Das Spielbrett.
|
|
507
|
+
player (Hare): Der Spieler, der einen Salat essen muss.
|
|
508
|
+
|
|
509
|
+
Raises:
|
|
510
|
+
Exception: Wenn der Spieler nicht genug Salate hat oder wenn das Feld nicht ein Salatfeld ist.
|
|
511
|
+
"""
|
|
512
|
+
...
|
|
513
|
+
|
|
514
|
+
@staticmethod
|
|
515
|
+
def can_move_to(
|
|
516
|
+
board: Board,
|
|
517
|
+
new_position: int,
|
|
518
|
+
player: Hare,
|
|
519
|
+
other_player: Hare,
|
|
520
|
+
cards: List[Card],
|
|
521
|
+
) -> None:
|
|
522
|
+
"""
|
|
523
|
+
Überprüft, ob ein Spieler zu einem bestimmten Feld ziehen kann.
|
|
524
|
+
|
|
525
|
+
Args:
|
|
526
|
+
board (Board): Das Spielbrett.
|
|
527
|
+
new_position (int): Die neue Position, zu der der Spieler ziehen möchte.
|
|
528
|
+
player (Hare): Der Spieler, der ziehen möchte.
|
|
529
|
+
other_player (Hare): Der andere Spieler.
|
|
530
|
+
cards (List[Card]): Die Karten, die der Spieler spielen möchte.
|
|
531
|
+
|
|
532
|
+
Raises:
|
|
533
|
+
Exception: Wenn das Feld besetzt ist oder wenn der Spieler nicht genug Karotten hat.
|
|
534
|
+
"""
|
|
535
|
+
...
|
|
536
|
+
|
|
537
|
+
class PluginConstants:
|
|
538
|
+
NUM_FIELDS: int
|
|
539
|
+
INITIAL_SALADS: int
|
|
540
|
+
INITIAL_CARROTS: int
|
|
541
|
+
ROUND_LIMIT: int
|
socha/api/__init__.py
ADDED
|
File without changes
|
|
File without changes
|