Skip to content

Commit e78d382

Browse files
authored
Improve piranhas 2026 (#98)
* feat: add compares: == and != in python, use Copy trait for some structs and add deepcopy() methods * chore: bump version to v4.2.0 * fix: merge error
1 parent cf41140 commit e78d382

File tree

12 files changed

+288
-14
lines changed

12 files changed

+288
-14
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "_socha"
3-
version = "4.1.1"
3+
version = "4.2.0"
44
edition = "2021"
55

66
[lib]

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "maturin"
44

55
[project]
66
name = "socha"
7-
version = "4.1.1"
7+
version = "4.2.0"
88
authors = [
99
{ name = "yoente", email = "stu250140@mail.uni-kiel.de" },
1010
{ name = "maxblan", email = "stu222782@mail.uni-kiel.de" },

python/socha/_socha.pyi

Lines changed: 234 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,36 @@ class Coordinate:
1616
def __init__(self, x: int, y: int) -> None: ...
1717
def __str__(self) -> str: ...
1818
def __repr__(self) -> str: ...
19+
def __eq__(self, other: Coordinate) -> bool:
20+
"""
21+
Unterstützt den Vergleichsoperator ==, um die Werte mit denen eines
22+
weiteren Objektes zuvergleichen.
23+
24+
Args:
25+
other: (Coordinate): Die andere Koordinate.
26+
27+
Returns:
28+
bool: Das Ergebnis des Vergleichs.
29+
"""
30+
...
31+
def __ne__(self, other: Coordinate) -> bool:
32+
"""
33+
Unterstützt den Vergleichsoperator !=, um die Werte mit denen eines
34+
weiteren Objektes zuvergleichen.
35+
36+
Args:
37+
other: (Coordinate): Die andere Koordinate.
38+
39+
Returns:
40+
bool: Das Ergebnis des Vergleichs.
41+
"""
42+
...
43+
44+
def deepcopy(self) -> Coordinate:
45+
"""
46+
Kopiert das Objekt rekursiv.
47+
"""
48+
...
1949

2050
def add_vector(self, vector: Vector) -> Coordinate:
2151
"""
@@ -65,6 +95,36 @@ class Vector:
6595
def __init__(self, delta_x: int, delta_y: int) -> None: ...
6696
def __str__(self) -> str: ...
6797
def __repr__(self) -> str: ...
98+
def __eq__(self, other: Vector) -> bool:
99+
"""
100+
Unterstützt den Vergleichsoperator ==, um die Werte mit denen eines
101+
weiteren Objektes zuvergleichen.
102+
103+
Args:
104+
other: (Vector): Die andere Koordinate.
105+
106+
Returns:
107+
bool: Das Ergebnis des Vergleichs.
108+
"""
109+
...
110+
def __ne__(self, other: Vector) -> bool:
111+
"""
112+
Unterstützt den Vergleichsoperator !=, um die Werte mit denen eines
113+
weiteren Objektes zuvergleichen.
114+
115+
Args:
116+
other: (Vector): Die andere Koordinate.
117+
118+
Returns:
119+
bool: Das Ergebnis des Vergleichs.
120+
"""
121+
...
122+
123+
def deepcopy(self) -> GameState:
124+
"""
125+
Kopiert das Objekt rekursiv.
126+
"""
127+
...
68128

69129
def add_vector(self, other: Vector) -> Vector:
70130
"""
@@ -158,6 +218,30 @@ class Direction(Enum):
158218

159219
def __str__(self) -> str: ...
160220
def __repr__(self) -> str: ...
221+
def __eq__(self, other: Direction) -> bool:
222+
"""
223+
Unterstützt den Vergleichsoperator ==, um die Werte mit denen eines
224+
weiteren Objektes zuvergleichen.
225+
226+
Args:
227+
other: (Direction): Die andere Koordinate.
228+
229+
Returns:
230+
bool: Das Ergebnis des Vergleichs.
231+
"""
232+
...
233+
def __ne__(self, other: Direction) -> bool:
234+
"""
235+
Unterstützt den Vergleichsoperator !=, um die Werte mit denen eines
236+
weiteren Objektes zuvergleichen.
237+
238+
Args:
239+
other: (Direction): Die andere Koordinate.
240+
241+
Returns:
242+
bool: Das Ergebnis des Vergleichs.
243+
"""
244+
...
161245

162246
@staticmethod
163247
def from_vector(vector: Vector) -> Optional[Direction]:
@@ -242,6 +326,30 @@ class FieldType(Enum):
242326

243327
def __str__(self) -> str: ...
244328
def __repr__(self) -> str: ...
329+
def __eq__(self, other: FieldType) -> bool:
330+
"""
331+
Unterstützt den Vergleichsoperator ==, um die Werte mit denen eines
332+
weiteren Objektes zuvergleichen.
333+
334+
Args:
335+
other: (FieldType): Die andere Koordinate.
336+
337+
Returns:
338+
bool: Das Ergebnis des Vergleichs.
339+
"""
340+
...
341+
def __ne__(self, other: FieldType) -> bool:
342+
"""
343+
Unterstützt den Vergleichsoperator !=, um die Werte mit denen eines
344+
weiteren Objektes zuvergleichen.
345+
346+
Args:
347+
other: (FieldType): Die andere Koordinate.
348+
349+
Returns:
350+
bool: Das Ergebnis des Vergleichs.
351+
"""
352+
...
245353

246354
def get_value(self) -> int:
247355
"""
@@ -288,6 +396,30 @@ class TeamEnum(Enum):
288396

289397
def __str__(self) -> str: ...
290398
def __repr__(self) -> str: ...
399+
def __eq__(self, other: TeamEnum) -> bool:
400+
"""
401+
Unterstützt den Vergleichsoperator ==, um die Werte mit denen eines
402+
weiteren Objektes zuvergleichen.
403+
404+
Args:
405+
other: (TeamEnum): Die andere Koordinate.
406+
407+
Returns:
408+
bool: Das Ergebnis des Vergleichs.
409+
"""
410+
...
411+
def __ne__(self, other: TeamEnum) -> bool:
412+
"""
413+
Unterstützt den Vergleichsoperator !=, um die Werte mit denen eines
414+
weiteren Objektes zuvergleichen.
415+
416+
Args:
417+
other: (TeamEnum): Die andere Koordinate.
418+
419+
Returns:
420+
bool: Das Ergebnis des Vergleichs.
421+
"""
422+
...
291423

292424
def get_fish_types(self) -> List[FieldType]:
293425
"""
@@ -323,6 +455,37 @@ class Board:
323455
def __init__(self, map: List[List[FieldType]]) -> None: ...
324456
def __str__(self) -> str: ...
325457
def __repr__(self) -> str: ...
458+
459+
def __eq__(self, other: TeamEnum) -> bool:
460+
"""
461+
Unterstützt den Vergleichsoperator ==, um die Werte mit denen eines
462+
weiteren Objektes zuvergleichen.
463+
464+
Args:
465+
other: (TeamEnum): Die andere Koordinate.
466+
467+
Returns:
468+
bool: Das Ergebnis des Vergleichs.
469+
"""
470+
...
471+
def __ne__(self, other: TeamEnum) -> bool:
472+
"""
473+
Unterstützt den Vergleichsoperator !=, um die Werte mit denen eines
474+
weiteren Objektes zuvergleichen.
475+
476+
Args:
477+
other: (TeamEnum): Die andere Koordinate.
478+
479+
Returns:
480+
bool: Das Ergebnis des Vergleichs.
481+
"""
482+
...
483+
484+
def deepcopy(self) -> GameState:
485+
"""
486+
Kopiert das Objekt rekursiv.
487+
"""
488+
...
326489

327490
def get_field(self, position: Coordinate) -> Optional[FieldType]:
328491
"""
@@ -410,6 +573,37 @@ class Move:
410573
def __init__(self, start: Coordinate, direction: Direction) -> None: ...
411574
def __str__(self) -> str: ...
412575
def __repr__(self) -> str: ...
576+
577+
def __eq__(self, other: Move) -> bool:
578+
"""
579+
Unterstützt den Vergleichsoperator ==, um die Werte mit denen eines
580+
weiteren Objektes zuvergleichen.
581+
582+
Args:
583+
other: (Move): Die andere Koordinate.
584+
585+
Returns:
586+
bool: Das Ergebnis des Vergleichs.
587+
"""
588+
...
589+
def __ne__(self, other: Move) -> bool:
590+
"""
591+
Unterstützt den Vergleichsoperator !=, um die Werte mit denen eines
592+
weiteren Objektes zuvergleichen.
593+
594+
Args:
595+
other: (Move): Die andere Koordinate.
596+
597+
Returns:
598+
bool: Das Ergebnis des Vergleichs.
599+
"""
600+
...
601+
602+
def deepcopy(self) -> GameState:
603+
"""
604+
Kopiert das Objekt rekursiv.
605+
"""
606+
...
413607

414608
class GameState:
415609
"""
@@ -428,6 +622,46 @@ class GameState:
428622
def __init__(self, board: Board, turn: int, last_move: Optional[Move]) -> None: ...
429623
def __str__(self) -> str: ...
430624
def __repr__(self) -> str: ...
625+
def __eq__(self, other: GameState) -> bool:
626+
"""
627+
Unterstützt den Vergleichsoperator ==, um die Werte mit denen eines
628+
weiteren Objektes zuvergleichen.
629+
630+
Args:
631+
other: (GameState): Die andere Koordinate.
632+
633+
Returns:
634+
bool: Das Ergebnis des Vergleichs.
635+
"""
636+
...
637+
def __ne__(self, other: GameState) -> bool:
638+
"""
639+
Unterstützt den Vergleichsoperator !=, um die Werte mit denen eines
640+
weiteren Objektes zuvergleichen.
641+
642+
Args:
643+
other: (GameState): Die andere Koordinate.
644+
645+
Returns:
646+
bool: Das Ergebnis des Vergleichs.
647+
"""
648+
...
649+
650+
def deepcopy(self) -> GameState:
651+
"""
652+
Kopiert das Objekt rekursiv.
653+
"""
654+
...
655+
656+
def set_board_field(self, position: Coordinate, field: FieldType) -> None:
657+
"""
658+
Ändert ein Feld auf dem Spielfeld an einer Koordinate.
659+
660+
Args:
661+
position (Coordinate): Die Position des Feldes, das geändert werden soll.
662+
field (FieldType): Das Feld, was dort platziert werden soll.
663+
"""
664+
...
431665

432666
def possible_moves_for(self, start: Coordinate) -> List[Move]:
433667
"""
@@ -498,7 +732,6 @@ class RulesEngine:
498732
"""
499733
...
500734

501-
502735
@staticmethod
503736
def target_position(board: Board, move_: Move) -> Coordinate:
504737
"""

src/plugin2026/board.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::plugin2026::{
1010
};
1111

1212
#[pyclass]
13-
#[derive(PartialEq, Eq, PartialOrd, Clone, Debug, Hash)]
13+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1414
pub struct Board {
1515
#[pyo3(get, set)]
1616
pub map: Vec<Vec<FieldType>>,
@@ -25,6 +25,10 @@ impl Board {
2525

2626
pub fn __str__(&self) -> String {self.to_string()}
2727
pub fn __repr__(&self) -> String {format!("{:?}", self)}
28+
pub fn __eq__(&self, other: &Board) -> bool {self == other}
29+
pub fn __ne_(&self, other: &Board) -> bool {self != other}
30+
31+
pub fn deepcopy(&self) -> Board {self.clone()}
2832

2933
pub fn get_field(&self, position: &Coordinate) -> Option<FieldType> {
3034

src/plugin2026/field_type.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use pyo3::*;
33
use crate::plugin2026::utils::team::TeamEnum;
44

55
#[pyclass]
6-
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Hash)]
6+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
77
pub enum FieldType {
88
OneS,
99
OneM,
@@ -19,6 +19,8 @@ pub enum FieldType {
1919
impl FieldType {
2020
pub fn __str__(&self) -> String {self.to_string()}
2121
pub fn __repr__(&self) -> String {format!("{:?}", self)}
22+
pub fn __eq__(&self, other: &FieldType) -> bool {self == other}
23+
pub fn __ne_(&self, other: &FieldType) -> bool {self != other}
2224

2325
pub fn get_value(&self) -> usize {
2426
match self {

src/plugin2026/game_state.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::plugin2026::{
88
};
99

1010
#[pyclass]
11-
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Hash)]
11+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1212
pub struct GameState {
1313
#[pyo3(get, set)]
1414
pub board: Board,
@@ -31,6 +31,23 @@ impl GameState {
3131

3232
pub fn __str__(&self) -> String {self.to_string()}
3333
pub fn __repr__(&self) -> String {format!("{:?}", self)}
34+
pub fn __eq__(&self, other: &GameState) -> bool {self == other}
35+
pub fn __ne__(&self, other: &GameState) -> bool {self != other}
36+
37+
pub fn deepcopy(&self) -> GameState {self.clone()}
38+
39+
pub fn set_board_field(&mut self, position: &Coordinate, field: FieldType) -> Result<(), PyErr> {
40+
let x = position.x as usize;
41+
let y = position.y as usize;
42+
43+
if y >= self.board.map.len() || x >= self.board.map[0].len() {
44+
return Err(PiranhasError::new_err("Position not in bounds of map"));
45+
}
46+
47+
self.board.map[y][x] = field;
48+
49+
Ok(())
50+
}
3451

3552
pub fn possible_moves_for(&self, start: &Coordinate) -> Vec<Move> {
3653
let mut moves: Vec<Move> = Vec::new();

0 commit comments

Comments
 (0)