From c02f514871306bf53b6b219a70f1748dd547c5dd Mon Sep 17 00:00:00 2001 From: Nils Pukropp Date: Sat, 16 Dec 2023 10:52:49 +0100 Subject: [PATCH] added some stuff --- .vscode/settings.json | 3 + Tutorium/tut09/slides.pdf | Bin 141895 -> 141882 bytes Tutorium/tut09/src/my_collections.py | 31 ++++----- Tutorium/tut10/README.md | 17 +++++ Tutorium/tut10/src/main.py | 26 ++++++++ Tutorium/tut10/src/result.py | 92 +++++++++++++++++++++++++++ Tutorium/tut10/src/spacearena.py | 44 +++++++++++++ Tutorium/tut10/src/ui.py | 79 +++++++++++++++++++++++ 8 files changed, 277 insertions(+), 15 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 Tutorium/tut10/src/main.py create mode 100644 Tutorium/tut10/src/result.py create mode 100644 Tutorium/tut10/src/spacearena.py create mode 100644 Tutorium/tut10/src/ui.py diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..457f44d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.analysis.typeCheckingMode": "basic" +} \ No newline at end of file diff --git a/Tutorium/tut09/slides.pdf b/Tutorium/tut09/slides.pdf index f6ee11587134a216139c117865ec555598f7341b..196224e01a863c15f31473dd00a7e07d58c90176 100644 GIT binary patch delta 12395 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
5b0&f2@MEl?iYypkNAX&utTlyRdI6aV)>p$kX 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 delta 12322 zcmcJVLwF_7wr=B8Y}>YN+qP|E$F^;wV%x4*JGPUmBo*V3Z3etKWy8xjuvV~cO+ezu2#+ks0KVEko(y6$ zJp>@!2~FjHi9xYq78vjCpN7}cl6we>O?s^R6*WBH2EP6Y<&NI9gm!%qnzR%qhA?Pv!_Um zAvI5o(u7v#0V7Xxwm{=vPM0)Ul@CVSfh_B=6v_l-dCd7nvN`<0vj>1;Y3!#ch>kJ}CZ3+@)DIJj(jLo`+4Jbnwhr^d3ZW5>= zfq;QL#-<^!JVzlBV>Ip(&jpzQpL&@P9e=8tE9)}m6vA52M8H6g$q8LlGfASgx8KrL zZ%?@bl(mcef@*g#3)8?xigiU%Nde;;qR~>pT^X&tW*f`9a#O%SijAT90oS0sV%aOZ zXkI4=Sy^nrPann8o;!as?k2tfg+W|g!K@gWl^Qwvo(@NwmL$mumxG$nBQkr5Qg-9A za4=uN47pMBgb+ zGv3SNC?fT|8`Qb9lJwiBQ>VUU-r86+-bY^$){lD0noUCy0aF%vr;!Fc*2I1*k<=0s z;G!mqkv=pms{quffvP}eZlGnpH^wCCPSJ9}nI$Q!7_QLY#W8gn7RDT%eQ+ZHdVhwn`Pdd~)b}aQdlVy?hbg2TSBmz5vZL~p>Wix z*|Jo!+KKWz#k=XFnp$P@rM$UaPQ5+15fJjK)JOAMe#tl^$^bABVI^Y9@srd5T0&|u ziMEy@a~FcuGgJ}$u7V7|l=g@3`AYTZ(Y=e-<&x@cHiut%C$`}wZAo?pjUT<3jD+LP z`n4u`dyD06m^SK@yrP>)_WSQLKxPrrx}-<&XidjWF!$=!{*v=XXk4+ma5R&-&7s8O z!QPbu@z;cLS6e%$)c$d6jzHt)87I?-JKvoZ89UZi+G*Ivl8fm`86kNMB3^GU!>k)s z7A)j=9hoX2|7r`PVd*;@z{^GnXAULv}D<1!R zV{K2yii^}OhaK;LKVPAuCH%tPORP8k$ut78I(#b-uyi*nJ9p@ndod7Gf(V0(+Pn^* z%-1pj70r1spCl~3o`C9>J}VG-yFQ?gth3vGLG2PY zkeqK8bYtDCvk2!pNa8pKFs0g9LcQS6KZ8**Tt+k0mWjC5>2&wi&wJ3>MNH;y%0Dc2hvf<$@Z0UANut8Ei?nxtp!XW~ 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 LVJRs7b&>x8J8tq{ diff --git a/Tutorium/tut09/src/my_collections.py b/Tutorium/tut09/src/my_collections.py index a8986c0..d7f8d31 100644 --- a/Tutorium/tut09/src/my_collections.py +++ b/Tutorium/tut09/src/my_collections.py @@ -3,27 +3,27 @@ from dataclasses import dataclass, InitVar @dataclass class MyList[T]: - internal_list: InitVar[list[T]] - length: InitVar[int] - - def __init__(self): - self.__internal_list = [] + _internal_list: InitVar[list[T]] + _length: InitVar[int] + + def __init__(self) -> None: + self.__internal_list: list[T] = [] self.__length = 0 - - def add(self, item: T): + + def add(self, item: T) -> None: self.__internal_list += [item] self.__length += 1 - @property def length(self) -> int: return self.__length + @dataclass class GameObject: - position: InitVar[tuple[int, int]] + _position: InitVar[tuple[int, int]] - def __post_init__(self, position: tuple[int, int]): + def __post_init__(self, position: tuple[int, int]) -> None: assert (0, 0) <= position self.__position = position @@ -32,16 +32,17 @@ class GameObject: return self.__position @position.setter - def position(self, position: tuple[int, int]): + def position(self, position: tuple[int, int]) -> None: if (0, 0) > position: return self.__position = position - + + if __name__ == "__main__": xs: MyList[int] = MyList() xs.add(100) assert xs.length == 1 - position = (0, 0) + position: tuple[int, int] = (0, 0) my_obj = GameObject(position) assert my_obj.position == (0, 0) try: @@ -49,7 +50,7 @@ if __name__ == "__main__": except AssertionError: pass else: - raise AssertionError(f"{my_obj} should have thrown a assertation error") + raise AssertionError( + f"{my_obj} should have thrown a assertation error") my_obj.position = (-1, 0) assert my_obj.position == (0, 0) - \ No newline at end of file diff --git a/Tutorium/tut10/README.md b/Tutorium/tut10/README.md index e69de29..d28f04d 100644 --- a/Tutorium/tut10/README.md +++ b/Tutorium/tut10/README.md @@ -0,0 +1,17 @@ +--- +marp: true +paginate: true +class: invert +# theme: uncover +footer: Tutorium 10 - 22.12.2023 - Nils Pukropp - https://s.narl.io/s/tutorium-10 +header: +--- + +# Tutorium 10 - 22.12.2023 + +Weihnachtsaufgabe :) + +--- + +# Aufgabe - SpaceArena + diff --git a/Tutorium/tut10/src/main.py b/Tutorium/tut10/src/main.py new file mode 100644 index 0000000..d643987 --- /dev/null +++ b/Tutorium/tut10/src/main.py @@ -0,0 +1,26 @@ +from result import Err, Ok, Panick, Result +from ui import run_command, Color +from spacearena import Difficulty, SpaceArena + + + +if __name__ == '__main__': + + +if __name__ == '__main__': + difficulty: Difficulty | None = None + while not difficulty: + difficulty = Difficulty.get_difficulty( + input(f"Choose your difficulty {[e.name.lower() for e in list(Difficulty)]}\n> ").upper()) + print(f"Difficulty: {difficulty} selected!") + game = SpaceArena(difficulty) + print("Starting game!") + while game.is_running: + Err("error value hehe").unwrap_or("yay still works") + match run_command(input("> "), game): + case Ok(value): + print(f"{Color.OK}{value}{Color.ENDC}") + case Err(value): + print(f"{Color.BOLD}{Color.FAIL}Error:{Color.ENDC} {Color.WARNING}{value}{Color.ENDC}") + + diff --git a/Tutorium/tut10/src/result.py b/Tutorium/tut10/src/result.py new file mode 100644 index 0000000..a013f39 --- /dev/null +++ b/Tutorium/tut10/src/result.py @@ -0,0 +1,92 @@ +from abc import ABC +from dataclasses import dataclass +from typing import Callable, overload + +class Panick(Exception): + def __init__(self, msg_res: 'Err | str') -> None: + match msg_res: + case str(msg): + super().__init__(msg) + case _: + super().__init__(f"thread `__main__` panicked:\ncalled `Result::unwrap()` on an `Err` value: \"{msg_res.value}\"") + + +@dataclass +class Result[V, E](ABC): + def unwrap(self) -> V: + match self: + case Ok(value): + return value + raise Panick(self) # type: ignore + + def expect(self, msg: str) -> V: + match self: + case Ok(value): + return value + raise Panick(msg) + + def is_ok(self) -> bool: + return isinstance(self, Ok) + + def is_err(self) -> bool: + return isinstance(self, Err) + + def unwrap_or(self, value: V) -> V: + match self: + case Ok(val): + return val + return value + + def and_[O](self, other: 'Result[O, E]') -> 'Result[O, E]': + match self, other: + case Err(value), _: + return Err(value) + return other + + def and_then[O](self, func: Callable[[V], 'Result[O, E]']) -> 'Result[O, E]': + match self: + case Ok(value): + return func(value) + return Err(self.value) # type: ignore + +@dataclass +class Ok[V, E](Result[V, E]): + value: V + +@dataclass +class Err[V, E](Result[V, E]): + value: E + +def __sqrt(num: float) -> Result[float, str]: + if num < 0: + return Err('negative sqrt') + return Ok(num ** 0.5) + +def test_result() -> None: + assert Ok(4.0).and_then(__sqrt) == Ok(2.0) + assert Ok(-5.0).and_then(__sqrt) == Err('negative sqrt') + assert Err("haha error").and_then(__sqrt) == Err("haha error") + assert Ok("test").unwrap() == "test" + try: + Err("haha error").unwrap() + except Panick: + pass + else: + assert False, 'didn\'t throw Panick' + assert Err('haha error').unwrap_or("doch nicht") == 'doch nicht' + + result = Ok('test result') + + match result: + case Ok(res): + assert res == 'test result' + case Err(): + pass + + result = Err('test result') + + match result: + case Ok(): + pass + case Err(res): + assert res == 'test result' \ No newline at end of file diff --git a/Tutorium/tut10/src/spacearena.py b/Tutorium/tut10/src/spacearena.py new file mode 100644 index 0000000..c0b5863 --- /dev/null +++ b/Tutorium/tut10/src/spacearena.py @@ -0,0 +1,44 @@ +from dataclasses import dataclass, InitVar +from enum import Enum +from typing import Optional + + +class Difficulty(Enum): + EASY = 0.5 + NORMAL = 1.0 + HARD = 2.0 + + @staticmethod + def get_difficulty(input: str) -> Optional['Difficulty']: + for e in list(Difficulty): + if e.name == input: + return e + + def __str__(self): + return self.name + + + +@dataclass +class SpaceArena: + _difficulty: InitVar[Difficulty] = Difficulty.NORMAL + + def __post_init__(self, difficulty: Difficulty = Difficulty.NORMAL) -> None: + self.__difficulty = difficulty + self.__is_running = True + + + @property + def difficulty(self) -> Difficulty: + return self.__difficulty + + @difficulty.setter + def difficulty(self, new_diff: Difficulty): + self.__difficulty = new_diff + + @property + def is_running(self) -> bool: + return self.__is_running + + def stop(self): + self.__is_running = False \ No newline at end of file diff --git a/Tutorium/tut10/src/ui.py b/Tutorium/tut10/src/ui.py new file mode 100644 index 0000000..409c47f --- /dev/null +++ b/Tutorium/tut10/src/ui.py @@ -0,0 +1,79 @@ +from abc import ABC, abstractmethod +from enum import Enum +import re +from typing import override +from result import Ok, Err, Result +from spacearena import Difficulty, SpaceArena + +class Color(Enum): + OK = '\033[92m' + FAIL = '\033[91m' + WARNING = '\033[93m' + ENDC = '\033[0m' + BOLD = '\033[1m' + UNDERLINE = '\033[4m' + + def __str__(self) -> str: + return self.value + + +class AbstractCommand(ABC): + + def matches(self, inp: str) -> Result[re.Match[str], None]: + if m := re.match(self.pattern(), inp): + return Ok(m) + return Err(None) + + @abstractmethod + def pattern(self) -> str: + pass + + @abstractmethod + def run(self, game: SpaceArena, args: list[str]) -> Result[str, str]: + pass + + +class QuitCommand(AbstractCommand): + @override + def pattern(self) -> str: + return r"(quit)" + + @override + def run(self, game: SpaceArena, _: list[str]) -> Result[str, str]: + game.stop() + return Ok('quitting game!') + +class DifficultyCommand(AbstractCommand): + @override + def pattern(self) -> str: + return r"(difficulty|diff)\s+(increase|decrease)" + + @override + def run(self, game: SpaceArena, args: list[str]) -> Result[str, str]: + diffs = list(Difficulty) + curr = diffs.index(game.difficulty) + + match args[0]: + case 'increase' if curr + 1 < len(diffs): + game.difficulty = diffs[curr + 1] + return Ok(f"Increasing difficulty to {game.difficulty}") + case 'increase': + return Err("maximum difficulty") + case 'decrease' if curr - 1 >= 0: + game.difficulty = diffs[curr - 1] + return Ok(f"Decreasing difficulty to {game.difficulty}") + case 'decrease': + return Err("minimum difficulty") + return Err("invalid input") + +ALL_COMMANDS: list[AbstractCommand] = [QuitCommand(), DifficultyCommand()] + +def run_command(inp: str, game: SpaceArena, commands: list[AbstractCommand] = ALL_COMMANDS) -> Result[str, str]: + for command in commands: + match command.matches(inp): + case Ok(value): + args = [str(s) for s in value.groups()] + return command.run(game, args[1:]) + + + return Err("command not found") \ No newline at end of file