Mods
This commit is contained in:
		
							
								
								
									
										0
									
								
								cromulant/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								cromulant/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -1,4 +1,6 @@ | ||||
| from __future__ import annotations | ||||
|  | ||||
| import random | ||||
| from typing import ClassVar, Any | ||||
|  | ||||
| from .config import Config | ||||
| @@ -76,7 +78,7 @@ class Ants: | ||||
|         ant.color = Utils.random_color() | ||||
|  | ||||
|         Ants.ants.append(ant) | ||||
|         Storage.save_ants(Ants.ants) | ||||
|         Ants.save() | ||||
|         Utils.print(f"Ant hatched: {ant.name}") | ||||
|  | ||||
|     @staticmethod | ||||
| @@ -85,4 +87,17 @@ class Ants: | ||||
|  | ||||
|     @staticmethod | ||||
|     def get_names() -> list[str]: | ||||
|         return [ant.name for ant in Ants.ants] | ||||
|         return [ant.name for ant in Ants.ants] | ||||
|  | ||||
|     @staticmethod | ||||
|     def save() -> None: | ||||
|         Storage.save_ants(Ants.ants) | ||||
|  | ||||
|     @staticmethod | ||||
|     def get_lazy() -> Ant: | ||||
|         return min(Ants.ants, key=lambda ant: ant.updated) | ||||
|  | ||||
|     @staticmethod | ||||
|     def get_other(ant: Ant) -> Ant: | ||||
|         ants = [a for a in Ants.ants if a.name != ant.name] | ||||
|         return random.choice(ants) | ||||
|   | ||||
| @@ -1,20 +1,21 @@ | ||||
| from __future__ import annotations | ||||
|  | ||||
| from pathlib import Path | ||||
|  | ||||
| import appdirs  # type: ignore | ||||
|  | ||||
|  | ||||
| class Config: | ||||
|     title = "Cromulant" | ||||
|     width = 800 | ||||
|     height = 600 | ||||
|     max_ants = 100 | ||||
|     here: str | ||||
|     title: str = "Cromulant" | ||||
|     width: int = 800 | ||||
|     height: int = 600 | ||||
|     max_ants: int = 100 | ||||
|     here: Path | ||||
|     ants_json: Path | ||||
|     icon_path: Path | ||||
|     image_path: Path | ||||
|     names_json: Path | ||||
|  | ||||
|  | ||||
|     @staticmethod | ||||
|     def prepare() -> None: | ||||
|         Config.here = Path(__file__).parent | ||||
| @@ -26,4 +27,4 @@ class Config: | ||||
|  | ||||
|         Config.icon_path = Config.here / "img" / "icon_4.jpg" | ||||
|         Config.image_path = Config.here / "img" / "icon_7.jpg" | ||||
|         Config.names_json = Config.here / "data" / "names.json" | ||||
|         Config.names_json = Config.here / "data" / "names.json" | ||||
|   | ||||
| @@ -1,21 +1,30 @@ | ||||
| from PySide6.QtWidgets import QWidget | ||||
| from PySide6.QtGui import QColor | ||||
| from __future__ import annotations | ||||
|  | ||||
| import random | ||||
|  | ||||
| from PySide6.QtWidgets import QWidget  # type: ignore | ||||
| from PySide6.QtGui import QColor  # type: ignore | ||||
| from PySide6.QtGui import QPainter | ||||
| from PySide6.QtCore import Qt | ||||
| from PySide6.QtCore import Qt  # type: ignore | ||||
| from PySide6.QtWidgets import QHBoxLayout | ||||
| from PySide6.QtWidgets import QLabel | ||||
| from PySide6.QtGui import QPaintEvent | ||||
|  | ||||
| from wonderwords import RandomSentence  # type: ignore | ||||
|  | ||||
| from .ants import Ant | ||||
| from .ants import Ants | ||||
| from .window import Window | ||||
|  | ||||
|  | ||||
| class CircleWidget(QWidget): | ||||
|     def __init__(self, color, parent=None): | ||||
|         super().__init__(parent) | ||||
| class CircleWidget(QWidget):  # type: ignore | ||||
|     def __init__(self, color: tuple[int, int, int]) -> None: | ||||
|         super().__init__(None) | ||||
|         self.color = QColor(*color) | ||||
|         self.setFixedSize(20, 20) | ||||
|  | ||||
|     def paintEvent(self, event): | ||||
|     def paintEvent(self, event: QPaintEvent) -> None: | ||||
|         print(type(event)) | ||||
|         painter = QPainter(self) | ||||
|         painter.setRenderHint(QPainter.Antialiasing) | ||||
|         painter.setBrush(self.color) | ||||
| @@ -25,16 +34,38 @@ class CircleWidget(QWidget): | ||||
|  | ||||
| class Game: | ||||
|     @staticmethod | ||||
|     def update_view() -> None: | ||||
|         for ant in Ants.ants: | ||||
|             container = QHBoxLayout() | ||||
|             circle = CircleWidget(ant.color) | ||||
|             text = QLabel(ant.status) | ||||
|             container.addWidget(circle) | ||||
|             container.addWidget(text) | ||||
|             Window.view.addLayout(container) | ||||
|  | ||||
|     def add_status(ant: Ant) -> None: | ||||
|         container = QHBoxLayout() | ||||
|         circle = CircleWidget(ant.color) | ||||
|         text = QLabel(ant.status) | ||||
|         container.addWidget(circle) | ||||
|         container.addWidget(text) | ||||
|         Window.view.addLayout(container) | ||||
|  | ||||
|     @staticmethod | ||||
|     def log(message: str) -> None: | ||||
|         Window.log.append(message) | ||||
|         Window.log.append(message) | ||||
|  | ||||
|     @staticmethod | ||||
|     def get_status() -> None: | ||||
|         ant = Ants.get_lazy() | ||||
|         num = random.randint(1, 10) | ||||
|  | ||||
|         if num == 1: | ||||
|             ant.hits += 1 | ||||
|             ant.status = f"Took a hit ({ant.hits} total)" | ||||
|         elif num == 2: | ||||
|             ant.triumph += 1 | ||||
|             ant.status = f"Scored a triumph ({ant.triumph} total)" | ||||
|         elif num == 3: | ||||
|             s = RandomSentence() | ||||
|             ant.status = s.simple_sentence() | ||||
|         elif (num == 4) and (len(Ants.ants) > 1): | ||||
|             other = Ants.get_other(ant) | ||||
|             ant.status = f"Is thinking about {other.name}" | ||||
|         else: | ||||
|             s = RandomSentence() | ||||
|             ant.status = s.bare_bone_with_adjective() | ||||
|  | ||||
|         Game.add_status(ant) | ||||
|         Ants.save() | ||||
|   | ||||
| @@ -35,6 +35,11 @@ select = [ | ||||
|     "PLR1711", | ||||
| ] | ||||
|  | ||||
| ignore = [ | ||||
|     "W292", | ||||
|     "N802", | ||||
| ] | ||||
|  | ||||
| exclude = [ | ||||
|     "pyperclip.py", | ||||
|     "tests.py", | ||||
|   | ||||
| @@ -1,5 +1,7 @@ | ||||
| from __future__ import annotations | ||||
|  | ||||
| import json | ||||
| from typing import TYPE_CHECKING | ||||
| from typing import TYPE_CHECKING, Any | ||||
|  | ||||
| from .config import Config | ||||
|  | ||||
| @@ -9,18 +11,18 @@ if TYPE_CHECKING: | ||||
|  | ||||
| class Storage: | ||||
|     @staticmethod | ||||
|     def get_ants() -> None: | ||||
|     def get_ants() -> Any: | ||||
|         with Config.ants_json.open() as file: | ||||
|             return json.load(file) | ||||
|  | ||||
|     @staticmethod | ||||
|     def save_ants(ants: list["Ant"]) -> None: | ||||
|     def save_ants(ants: list[Ant]) -> None: | ||||
|         objs = [ant.to_dict() for ant in ants] | ||||
|  | ||||
|         with Config.ants_json.open("w") as file: | ||||
|             json.dump(objs, file) | ||||
|  | ||||
|     @staticmethod | ||||
|     def get_names() -> None: | ||||
|     def get_names() -> Any: | ||||
|         with Config.names_json.open() as file: | ||||
|             return json.load(file) | ||||
|             return json.load(file) | ||||
|   | ||||
| @@ -1,11 +1,15 @@ | ||||
| from __future__ import annotations | ||||
|  | ||||
| import random | ||||
| import colorsys | ||||
| import time | ||||
| from typing import ClassVar | ||||
|  | ||||
| from .storage import Storage | ||||
|  | ||||
|  | ||||
| class Utils: | ||||
|     names: list[str] = [] | ||||
|     names: ClassVar[list[str]] = [] | ||||
|  | ||||
|     @staticmethod | ||||
|     def prepare() -> None: | ||||
| @@ -64,9 +68,14 @@ class Utils: | ||||
|         print(text)  # noqa: T201 | ||||
|  | ||||
|     @staticmethod | ||||
|     def random_color() -> str: | ||||
|         h,s,l = random.random(), 0.5 + random.random()/2.0, 0.4 + random.random()/5.0 | ||||
|         r, g, b = [int(256*i) for i in colorsys.hls_to_rgb(h,l,s)] | ||||
|     def random_color() -> tuple[int, int, int]: | ||||
|         h, s, l = ( | ||||
|             random.random(), | ||||
|             0.5 + random.random() / 2.0, | ||||
|             0.4 + random.random() / 5.0, | ||||
|         ) | ||||
|  | ||||
|         r, g, b = (int(256 * i) for i in colorsys.hls_to_rgb(h, l, s)) | ||||
|         return r, g, b | ||||
|  | ||||
|     @staticmethod | ||||
| @@ -75,4 +84,4 @@ class Utils: | ||||
|  | ||||
|         used = Ants.get_names() | ||||
|         filtered = [name for name in Utils.names if name not in used] | ||||
|         return random.choice(filtered) | ||||
|         return random.choice(filtered) | ||||
|   | ||||
| @@ -10,9 +10,10 @@ from PySide6.QtWidgets import QPushButton | ||||
| from PySide6.QtWidgets import QHBoxLayout | ||||
| from PySide6.QtWidgets import QTextEdit | ||||
| from PySide6.QtWidgets import QLabel | ||||
| from PySide6.QtGui import QPixmap | ||||
| from PySide6.QtGui import QPixmap  # type: ignore | ||||
| from PySide6.QtGui import QIcon | ||||
| from PySide6.QtCore import Qt | ||||
| from PySide6.QtCore import Qt  # type: ignore | ||||
| from PySide6.QtCore import QTimer | ||||
|  | ||||
| from .config import Config | ||||
|  | ||||
| @@ -24,6 +25,7 @@ class Window: | ||||
|     view: QGraphicsView | ||||
|     view_scene: QGraphicsScene | ||||
|     log: QTextEdit | ||||
|     timer: QTimer | ||||
|  | ||||
|     @staticmethod | ||||
|     def prepare() -> None: | ||||
| @@ -31,6 +33,7 @@ class Window: | ||||
|         Window.add_buttons() | ||||
|         Window.add_view() | ||||
|         Window.add_log() | ||||
|         Window.start_timer() | ||||
|         Window.start() | ||||
|  | ||||
|     @staticmethod | ||||
| @@ -51,18 +54,15 @@ class Window: | ||||
|     def add_buttons() -> None: | ||||
|         btn_hatch = QPushButton("Hatch") | ||||
|         btn_terminate = QPushButton("Terminate") | ||||
|         btn_update = QPushButton("Update") | ||||
|         btn_close = QPushButton("Close") | ||||
|  | ||||
|         btn_hatch.clicked.connect(Window.hatch) | ||||
|         btn_terminate.clicked.connect(Window.terminate) | ||||
|         btn_update.clicked.connect(Window.update_view) | ||||
|         btn_close.clicked.connect(Window.close) | ||||
|  | ||||
|         layout = QHBoxLayout() | ||||
|         layout.addWidget(btn_hatch) | ||||
|         layout.addWidget(btn_terminate) | ||||
|         layout.addWidget(btn_update) | ||||
|         layout.addWidget(btn_close) | ||||
|  | ||||
|         Window.root.addLayout(layout) | ||||
| @@ -78,7 +78,9 @@ class Window: | ||||
|  | ||||
|         image_label = QLabel() | ||||
|         pixmap = QPixmap(str(Config.image_path)) | ||||
|         scaled_pixmap = pixmap.scaled(100, pixmap.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation) | ||||
|         scaled_pixmap = pixmap.scaled( | ||||
|             100, pixmap.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation | ||||
|         ) | ||||
|         image_label.setPixmap(scaled_pixmap) | ||||
|         image_label.setFixedWidth(100) | ||||
|         container.addWidget(image_label) | ||||
| @@ -90,21 +92,27 @@ class Window: | ||||
|  | ||||
|         Window.root.addLayout(container) | ||||
|  | ||||
|     @staticmethod | ||||
|     def update_view() -> None: | ||||
|         from .game import Game | ||||
|         Game.update_view() | ||||
|  | ||||
|     @staticmethod | ||||
|     def hatch() -> None: | ||||
|         from .ants import Ants | ||||
|  | ||||
|         Ants.hatch() | ||||
|  | ||||
|     @staticmethod | ||||
|     def terminate() -> None: | ||||
|         from .ants import Ants | ||||
|  | ||||
|         Ants.terminate() | ||||
|  | ||||
|     @staticmethod | ||||
|     def start_timer() -> None: | ||||
|         from .game import Game | ||||
|  | ||||
|         interval_ms = 3_000 | ||||
|         Window.timer = QTimer() | ||||
|         Window.timer.timeout.connect(Game.get_status) | ||||
|         Window.timer.start(interval_ms) | ||||
|  | ||||
|     @staticmethod | ||||
|     def start() -> None: | ||||
|         Window.window.show() | ||||
|   | ||||
| @@ -1,2 +1,3 @@ | ||||
| PySide6 == 6.7.2 | ||||
| appdirs == 1.4.4 | ||||
| appdirs == 1.4.4 | ||||
| wonderwords == 2.2.0 | ||||
		Reference in New Issue
	
	Block a user
	 Auric Vente
					Auric Vente