From 139c7b6798b6e26c9aed0083791af3a206f9ebee Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Sat, 3 Oct 2026 05:08:48 +0200 Subject: [PATCH 01/36] Add SchwobaSenGnitz strategy implementation Implement Schwoba sen gnitz strategy with specific behaviors based on opponent's actions. --- axelrod/strategies/schwoba_sen_gnitz.py | 62 +++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 axelrod/strategies/schwoba_sen_gnitz.py diff --git a/axelrod/strategies/schwoba_sen_gnitz.py b/axelrod/strategies/schwoba_sen_gnitz.py new file mode 100644 index 000000000..25272571f --- /dev/null +++ b/axelrod/strategies/schwoba_sen_gnitz.py @@ -0,0 +1,62 @@ +import random +from axelrod.action import Action +from axelrod.strategy import Strategy + +class SchwobaSenGnitz(Strategy): + """ + Schwoba sen gnitz (Schwaben sind gerissen) - Python-Version 2026. + Autor: Georg 'HackyHackberger' Schmidt (1985 / 2026) + Ursprünglicher Code in Turbo Pascal, 1985 + Startet 100 % friedlich. Nach dem ersten gegnerischen Verrat erwacht die + optimierte gnitze Technik: 10,2 % Sondierung, 89,7 % Deeskalation. + Erkennt nach 10 Runden unversöhnliche Gegner und riegelt ab. + """ + + name = "Schwoba sen gnitz" + authors = ["Georg 'HackyHackberger' Schmidt"] + classifier = { + "memory_depth": float("inf"), + "stochastic": True, + "makes_use_of": set(), + "long_run_time": False, + "inspects_source": False, + "manipulates_state": False, + "manipulates_history": False, + } + + def __init__(self) -> None: + super().__init__() + self.raubtier_erwacht = False + self.schutz_modus_aktiviert = False + + def strategy(self, opponent: Strategy) -> Action: + runde = len(self.history) + if runde == 0: + return Action.C + + if not self.raubtier_erwacht and opponent.history[-1] == Action.D: + self.raubtier_erwacht = True + + if not self.raubtier_erwacht: + return Action.C + + if runde >= 10: + letzte_10_gegner = opponent.history[-10:] + if all(zug == Action.D for zug in letzte_10_gegner): + self.schutz_modus_aktiviert = True + + if self.schutz_modus_aktiviert: + return Action.D + + if opponent.history[-1] == Action.D: + # 89,7 % Deeskalations-Bremse gegen KIs + if random.random() < 0.897: + return Action.C + else: + return Action.D + + # 10,2 % gnitze Sondierung + if random.random() < 0.102: + return Action.D + + return Action.C From d437d692bb6f2b8afc4785e69f93908964e939ec Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Sat, 3 Oct 2026 05:25:16 +0200 Subject: [PATCH 02/36] Add SchwobaSenGnitz strategy to imports --- axelrod/strategies/_strategies.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/axelrod/strategies/_strategies.py b/axelrod/strategies/_strategies.py index bc80eeccc..d800aa46c 100644 --- a/axelrod/strategies/_strategies.py +++ b/axelrod/strategies/_strategies.py @@ -284,6 +284,7 @@ ZDMischief, ZDSet2, ) +from .schwoba_sen_gnitz import SchwobaSenGnitz # Note: Meta* strategies are handled in .__init__.py @@ -438,6 +439,7 @@ RevisedDowning, Ripoff, RiskyQLearner, + SchwobaSenGnitz, SecondByAppold, SecondByBlack, SecondByBorufsen, From 73e043fc0d0d7ec829ca002e23ed2223a920e99e Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Sat, 3 Oct 2026 05:50:10 +0200 Subject: [PATCH 03/36] Fix import statements for relative paths --- axelrod/strategies/schwoba_sen_gnitz.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/axelrod/strategies/schwoba_sen_gnitz.py b/axelrod/strategies/schwoba_sen_gnitz.py index 25272571f..bcefe87eb 100644 --- a/axelrod/strategies/schwoba_sen_gnitz.py +++ b/axelrod/strategies/schwoba_sen_gnitz.py @@ -1,6 +1,6 @@ import random -from axelrod.action import Action -from axelrod.strategy import Strategy +from ..action import Action +from ..strategy import Strategy class SchwobaSenGnitz(Strategy): """ From bc3c2592f226eb7f7236d6631fb00675c637265d Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 13:34:48 +0200 Subject: [PATCH 04/36] Update schwoba_sen_gnitz.py Wrong filename and direcry structure for _stragegy.py changed --- axelrod/strategies/schwoba_sen_gnitz.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/axelrod/strategies/schwoba_sen_gnitz.py b/axelrod/strategies/schwoba_sen_gnitz.py index bcefe87eb..c84bebaa7 100644 --- a/axelrod/strategies/schwoba_sen_gnitz.py +++ b/axelrod/strategies/schwoba_sen_gnitz.py @@ -1,6 +1,6 @@ import random from ..action import Action -from ..strategy import Strategy +from ._strategy import Strategy class SchwobaSenGnitz(Strategy): """ From 9b1aa194d7237f1e5b51b590a9b9adb37c7267a0 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 13:49:59 +0200 Subject: [PATCH 05/36] Update schwoba_sen_gnitz.py corected action and player and set class to (player) --- axelrod/strategies/schwoba_sen_gnitz.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/axelrod/strategies/schwoba_sen_gnitz.py b/axelrod/strategies/schwoba_sen_gnitz.py index c84bebaa7..4dfe12356 100644 --- a/axelrod/strategies/schwoba_sen_gnitz.py +++ b/axelrod/strategies/schwoba_sen_gnitz.py @@ -1,8 +1,8 @@ import random -from ..action import Action -from ._strategy import Strategy +from axelrod.action import Action +from axelrod.player import Player -class SchwobaSenGnitz(Strategy): +class SchwobaSenGnitz(Player): """ Schwoba sen gnitz (Schwaben sind gerissen) - Python-Version 2026. Autor: Georg 'HackyHackberger' Schmidt (1985 / 2026) From 6b80e0cc64dbd311e2415d8cbf00be434c6765ff Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 13:54:58 +0200 Subject: [PATCH 06/36] Update schwoba_sen_gnitz.py Line 32 --- axelrod/strategies/schwoba_sen_gnitz.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/axelrod/strategies/schwoba_sen_gnitz.py b/axelrod/strategies/schwoba_sen_gnitz.py index 4dfe12356..7deb2634a 100644 --- a/axelrod/strategies/schwoba_sen_gnitz.py +++ b/axelrod/strategies/schwoba_sen_gnitz.py @@ -29,7 +29,7 @@ def __init__(self) -> None: self.raubtier_erwacht = False self.schutz_modus_aktiviert = False - def strategy(self, opponent: Strategy) -> Action: + def strategy(self, opponent: Player) -> Action: runde = len(self.history) if runde == 0: return Action.C From 9892aa12ee5c7b5a9498842660ebb9741d8d97b7 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 14:11:12 +0200 Subject: [PATCH 07/36] Update schwoba_sen_gnitz.py So, ich glaub das sollte nun alles haben. War in Pascal einfacher --- axelrod/strategies/schwoba_sen_gnitz.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/axelrod/strategies/schwoba_sen_gnitz.py b/axelrod/strategies/schwoba_sen_gnitz.py index 7deb2634a..6b8415803 100644 --- a/axelrod/strategies/schwoba_sen_gnitz.py +++ b/axelrod/strategies/schwoba_sen_gnitz.py @@ -22,6 +22,10 @@ class SchwobaSenGnitz(Player): "inspects_source": False, "manipulates_state": False, "manipulates_history": False, + "uses_length": False, + "uses_game": False, + "uses_tournament": False, + "uses_clones": False, } def __init__(self) -> None: From cb2135df3e0ec9b99c485de1b6994e0a11b1adff Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 15:11:53 +0200 Subject: [PATCH 08/36] Create turniertest.py Eigene Testumgebung --- turniertest.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 turniertest.py diff --git a/turniertest.py b/turniertest.py new file mode 100644 index 000000000..8a7fb1977 --- /dev/null +++ b/turniertest.py @@ -0,0 +1,25 @@ +import axelrod as axl +from axelrod.strategies.schwoba_sen_gnitz import SchwobaSenGnitz + +# 1. Wir laden deine Strategie und ein paar offizielle Gegner +players = [ + SchwobaSenGnitz(), + axl.TitForTat(), + axl.Grim(), # Das ist der Grudger + axl.Cooperator(), # AllC + axl.Defector(), # AllD + axl.Altenator() if hasattr(axl, 'Altenator') else axl.Alternator(), + axl.Random() +] + +# 2. Turnier starten: 1000 Runden, 5 Wiederholungen für stabile Zufallswerte +tournament = axl.Tournament(players=players, turns=1000, repetitions=5) +results = tournament.play() + +# 3. Ergebnis sauber im Terminal ausdrucken +print("\n" + "="*40) +print(" ERGEBNIS DES CT-RELOADED TURNIERS") +print("="*40) +for position, player in enumerate(results.ranked_names, start=1): + print(f"{position}. Platz: {player}") +print("="*40 + "\n") From d3b6d4e3f5e66684bc62542faf7ebdd360d3f224 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 15:15:38 +0200 Subject: [PATCH 09/36] Create turniertest.yml --- .github/workflows/turniertest.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/turniertest.yml diff --git a/.github/workflows/turniertest.yml b/.github/workflows/turniertest.yml new file mode 100644 index 000000000..bef98c13a --- /dev/null +++ b/.github/workflows/turniertest.yml @@ -0,0 +1,24 @@ +name: Mein eigenes Axelrod Turnier + +on: + workflow_dispatch: # Das erlaubt es dir, den Startknopf selbst im Browser zu drücken! + +jobs: + run-tournament: + runs-on: ubuntu-latest + steps: + - name: Code ausleihen + uses: actions/checkout@v4 + + - name: Python vorbereiten + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Axelrod installieren + run: | + pip install --upgrade pip + pip install -e . + + - name: Turnier starten + run: python .py From 7528449b33acbfaea8a3cc2660da6577594d2233 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 15:17:12 +0200 Subject: [PATCH 10/36] Update turniertest.yml --- .github/workflows/turniertest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/turniertest.yml b/.github/workflows/turniertest.yml index bef98c13a..e211c3d34 100644 --- a/.github/workflows/turniertest.yml +++ b/.github/workflows/turniertest.yml @@ -21,4 +21,4 @@ jobs: pip install -e . - name: Turnier starten - run: python .py + run: python turiertest.py From 2c9dd2c0e2972b64fdd1dfe5d796ba48bed1bcc5 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 15:20:24 +0200 Subject: [PATCH 11/36] Create tuniertestvoll.py Das grosse Hauen und Stechen --- tuniertestvoll.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 tuniertestvoll.py diff --git a/tuniertestvoll.py b/tuniertestvoll.py new file mode 100644 index 000000000..b680fbbe7 --- /dev/null +++ b/tuniertestvoll.py @@ -0,0 +1,22 @@ +import axelrod as axl + +# 1. Das ist die magische Zeile: Sie liest ALLE im Framework existierenden Strategien ein! +# Über 200 Stück, inklusive KIs, Klassikern und deiner neuen Strategie. +all_players = [s() for s in axl.all_strategies] + +print(f"Turnier wird vorbereitet mit {len(all_players)} Strategien...") + +# 2. Das riesige Turnier konfigurieren (1000 Runden) +# Wir nutzen 2 Wiederholungen (repetitions=2), damit die GitHub-Server nicht zu lange rechnen +tournament = axl.Tournament(players=all_players, turns=1000, repetitions=2) + +# 3. Das Turnier starten +results = tournament.play() + +# 4. Die Top 20 im Terminal ausgeben +print("\n" + "="*50) +print(" DAS OFFIZIELLE AXELROD HAIFISCHBECKEN (TOP 20)") +print("="*50) +for position, player in enumerate(results.ranked_names[:20], start=1): + print(f"{position}. Platz: {player}") +print("="*50 + "\n") From 9858a9fb305e32ca43d1bd0bd30fab1b802f258f Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 15:22:37 +0200 Subject: [PATCH 12/36] Create turniertestvoll.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Löst den grossen Krieg aus --- .github/workflows/turniertestvoll.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/turniertestvoll.yml diff --git a/.github/workflows/turniertestvoll.yml b/.github/workflows/turniertestvoll.yml new file mode 100644 index 000000000..422c39c3a --- /dev/null +++ b/.github/workflows/turniertestvoll.yml @@ -0,0 +1,24 @@ +name: Mein eigenes Axelrod Turnier + +on: + workflow_dispatch: # Das erlaubt es dir, den Startknopf selbst im Browser zu drücken! + +jobs: + run-tournament: + runs-on: ubuntu-latest + steps: + - name: Code ausleihen + uses: actions/checkout@v4 + + - name: Python vorbereiten + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Axelrod installieren + run: | + pip install --upgrade pip + pip install -e . + + - name: Turnier starten + run: python turiertestvoll.py From 29b48dac2511a6a46898864e831096d54f337c3a Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 15:24:38 +0200 Subject: [PATCH 13/36] Update turniertestvoll.yml --- .github/workflows/turniertestvoll.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/turniertestvoll.yml b/.github/workflows/turniertestvoll.yml index 422c39c3a..fd3738d7c 100644 --- a/.github/workflows/turniertestvoll.yml +++ b/.github/workflows/turniertestvoll.yml @@ -1,4 +1,4 @@ -name: Mein eigenes Axelrod Turnier +name: Axelrod Turnier hier geht die Post ab on: workflow_dispatch: # Das erlaubt es dir, den Startknopf selbst im Browser zu drücken! From c3c96b6d05680df19f77675ff43acb764a694473 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 15:39:55 +0200 Subject: [PATCH 14/36] Update tuniertestvoll.py Andere Version wegen node20-Fehler --- tuniertestvoll.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/tuniertestvoll.py b/tuniertestvoll.py index b680fbbe7..bfd0f1e47 100644 --- a/tuniertestvoll.py +++ b/tuniertestvoll.py @@ -1,19 +1,24 @@ import axelrod as axl -# 1. Das ist die magische Zeile: Sie liest ALLE im Framework existierenden Strategien ein! -# Über 200 Stück, inklusive KIs, Klassikern und deiner neuen Strategie. -all_players = [s() for s in axl.all_strategies] +# 1. Sicherheitsfilter: Lädt nur die KIs und Strategien, die fehlerfrei starten +all_players = [] +for s in axl.all_strategies: + try: + player_instance = s() + all_players.append(player_instance) + except Exception: + continue # Überspringt fehlerhafte oder unvollständige Fremdstrategien -print(f"Turnier wird vorbereitet mit {len(all_players)} Strategien...") +print(f"Das große Haifischbecken wird vorbereitet mit {len(all_players)} Strategien...") -# 2. Das riesige Turnier konfigurieren (1000 Runden) -# Wir nutzen 2 Wiederholungen (repetitions=2), damit die GitHub-Server nicht zu lange rechnen -tournament = axl.Tournament(players=all_players, turns=1000, repetitions=2) +# 2. Rundenanzahl bleibt bei 1000, aber Wiederholungen (repetitions) auf 1 oder 2 setzen! +# Das spart den Servern Stunden an Rechenzeit, liefert aber ein klares Ergebnis. +tournament = axl.Tournament(players=all_players, turns=1000, repetitions=1) -# 3. Das Turnier starten +# 3. Turnier starten results = tournament.play() -# 4. Die Top 20 im Terminal ausgeben +# 4. Die Top 20 sauber ausgeben print("\n" + "="*50) print(" DAS OFFIZIELLE AXELROD HAIFISCHBECKEN (TOP 20)") print("="*50) From 40d9d6f5bee511154b5d96961517fb1ed6c6f0a3 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 15:49:32 +0200 Subject: [PATCH 15/36] Update turniertest.yml bumpy und scipi noch dazu --- .github/workflows/turniertest.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/turniertest.yml b/.github/workflows/turniertest.yml index e211c3d34..b63a7c390 100644 --- a/.github/workflows/turniertest.yml +++ b/.github/workflows/turniertest.yml @@ -1,7 +1,7 @@ name: Mein eigenes Axelrod Turnier on: - workflow_dispatch: # Das erlaubt es dir, den Startknopf selbst im Browser zu drücken! + workflow_dispatch: jobs: run-tournament: @@ -15,10 +15,12 @@ jobs: with: python-version: '3.11' - - name: Axelrod installieren + - name: System-Abhängigkeiten und Axelrod installieren run: | - pip install --upgrade pip + pip install --upgrade pip setuptools wheel + # Das sind die fehlenden Pakete, die die KIs zum Überleben brauchen: + pip install numpy scipy pip install -e . - name: Turnier starten - run: python turiertest.py + run: python turniertest.py # Oder hier den Namen deiner großen Datei eintragen! From dca54fa52e448e0c95bbdac2a543adc73e1d837f Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 15:59:22 +0200 Subject: [PATCH 16/36] Update turniertest.py Tippfehler --- turniertest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/turniertest.py b/turniertest.py index 8a7fb1977..93d1e0a8b 100644 --- a/turniertest.py +++ b/turniertest.py @@ -5,10 +5,10 @@ players = [ SchwobaSenGnitz(), axl.TitForTat(), - axl.Grim(), # Das ist der Grudger + axl.Grudger(), # Das ist der Grudger axl.Cooperator(), # AllC axl.Defector(), # AllD - axl.Altenator() if hasattr(axl, 'Altenator') else axl.Alternator(), + axl.Alternator() if hasattr(axl, 'Altenator') else axl.Alternator(), axl.Random() ] From 29b59fb82e57f9f377eab39ac52c8ee0e0414be8 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 16:06:30 +0200 Subject: [PATCH 17/36] Update turniertestvoll.yml Numpy und Scipy einladen. --- .github/workflows/turniertestvoll.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/turniertestvoll.yml b/.github/workflows/turniertestvoll.yml index fd3738d7c..49c089854 100644 --- a/.github/workflows/turniertestvoll.yml +++ b/.github/workflows/turniertestvoll.yml @@ -1,7 +1,7 @@ -name: Axelrod Turnier hier geht die Post ab +name: Das große Axelrod Turnier on: - workflow_dispatch: # Das erlaubt es dir, den Startknopf selbst im Browser zu drücken! + workflow_dispatch: jobs: run-tournament: @@ -15,10 +15,12 @@ jobs: with: python-version: '3.11' - - name: Axelrod installieren + - name: System-Abhängigkeiten und Axelrod installieren run: | - pip install --upgrade pip + pip install --upgrade pip setuptools wheel + # Unverzichtbar für die KIs im großen Feld: + pip install numpy scipy pip install -e . - name: Turnier starten - run: python turiertestvoll.py + run: python turniertestvoll.py From 5c2b8bce22802864b8233dd9118eb82cc229b149 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 16:07:31 +0200 Subject: [PATCH 18/36] Update tuniertestvoll.py --- tuniertestvoll.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/tuniertestvoll.py b/tuniertestvoll.py index bfd0f1e47..bdb139c60 100644 --- a/tuniertestvoll.py +++ b/tuniertestvoll.py @@ -1,24 +1,19 @@ import axelrod as axl -# 1. Sicherheitsfilter: Lädt nur die KIs und Strategien, die fehlerfrei starten all_players = [] for s in axl.all_strategies: try: player_instance = s() all_players.append(player_instance) except Exception: - continue # Überspringt fehlerhafte oder unvollständige Fremdstrategien + continue -print(f"Das große Haifischbecken wird vorbereitet mit {len(all_players)} Strategien...") +print(f"Das große Haifischbecken wird vorbereitet mit {len(all_players)} robusten Strategien...") -# 2. Rundenanzahl bleibt bei 1000, aber Wiederholungen (repetitions) auf 1 oder 2 setzen! -# Das spart den Servern Stunden an Rechenzeit, liefert aber ein klares Ergebnis. +# 1000 Runden, 1 Wiederholung für schnellen Cloud-Durchlauf tournament = axl.Tournament(players=all_players, turns=1000, repetitions=1) - -# 3. Turnier starten results = tournament.play() -# 4. Die Top 20 sauber ausgeben print("\n" + "="*50) print(" DAS OFFIZIELLE AXELROD HAIFISCHBECKEN (TOP 20)") print("="*50) From c35e699f5f190949eca97c0dce2425cf54e23daf Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 16:16:20 +0200 Subject: [PATCH 19/36] Update tuniertestvoll.py Bisschen sparsamer mit den Ressourcen umgehen --- tuniertestvoll.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tuniertestvoll.py b/tuniertestvoll.py index bdb139c60..486549d4f 100644 --- a/tuniertestvoll.py +++ b/tuniertestvoll.py @@ -1,18 +1,19 @@ import axelrod as axl +# Wir erzeugen die Instanzen korrekt mit s() +# Falls eine kaputte Fremd-Strategie dabei ist, filtert der try-except Block sie aus all_players = [] for s in axl.all_strategies: try: - player_instance = s() - all_players.append(player_instance) + all_players.append(s()) except Exception: - continue + continue -print(f"Das große Haifischbecken wird vorbereitet mit {len(all_players)} robusten Strategien...") +print(f"Starte das große Turnier mit {len(all_players)} Strategien...") -# 1000 Runden, 1 Wiederholung für schnellen Cloud-Durchlauf +# 1000 Runden, 1 Wiederholung. Keine Extrafunktionen, um den RAM zu schonen. tournament = axl.Tournament(players=all_players, turns=1000, repetitions=1) -results = tournament.play() +results = tournament.play(progress_bar=False) print("\n" + "="*50) print(" DAS OFFIZIELLE AXELROD HAIFISCHBECKEN (TOP 20)") From e767b1733d23e30397f1a75800f0aabf47973da3 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 16:28:18 +0200 Subject: [PATCH 20/36] Update turniertestvoll.yml --- .github/workflows/turniertestvoll.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/turniertestvoll.yml b/.github/workflows/turniertestvoll.yml index 49c089854..8d4e6a089 100644 --- a/.github/workflows/turniertestvoll.yml +++ b/.github/workflows/turniertestvoll.yml @@ -23,4 +23,4 @@ jobs: pip install -e . - name: Turnier starten - run: python turniertestvoll.py + run: python Axelrod/turniertestvoll.py From be37c5febac81354905dafbf99ef1550ac4364f8 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 16:31:56 +0200 Subject: [PATCH 21/36] Rename tuniertestvoll.py to turniertestvoll.py Mal den Namen so angepasst wie der das sucht --- tuniertestvoll.py => turniertestvoll.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tuniertestvoll.py => turniertestvoll.py (100%) diff --git a/tuniertestvoll.py b/turniertestvoll.py similarity index 100% rename from tuniertestvoll.py rename to turniertestvoll.py From fc4a98d38b7ff37e7065b0fbc38bf97d221b491b Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 16:36:52 +0200 Subject: [PATCH 22/36] Update turniertestvoll.yml Da wirste doch zum Elch --- .github/workflows/turniertestvoll.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/turniertestvoll.yml b/.github/workflows/turniertestvoll.yml index 8d4e6a089..49c089854 100644 --- a/.github/workflows/turniertestvoll.yml +++ b/.github/workflows/turniertestvoll.yml @@ -23,4 +23,4 @@ jobs: pip install -e . - name: Turnier starten - run: python Axelrod/turniertestvoll.py + run: python turniertestvoll.py From d10119d443393a9e37d4a4b246bbce7dc5bf8a28 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Mon, 5 Oct 2026 22:44:53 +0200 Subject: [PATCH 23/36] Update turniertestvoll.py Weniger Runden (200 statt 1000) damit das Ding vielleicht in sechs Stunden fertig wird --- turniertestvoll.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/turniertestvoll.py b/turniertestvoll.py index 486549d4f..e658e6d1a 100644 --- a/turniertestvoll.py +++ b/turniertestvoll.py @@ -12,7 +12,7 @@ print(f"Starte das große Turnier mit {len(all_players)} Strategien...") # 1000 Runden, 1 Wiederholung. Keine Extrafunktionen, um den RAM zu schonen. -tournament = axl.Tournament(players=all_players, turns=1000, repetitions=1) +tournament = axl.Tournament(players=all_players, turns=200, repetitions=1) results = tournament.play(progress_bar=False) print("\n" + "="*50) From d2cf8fd62870ce86c44af25bd798efafaa619bd3 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Fri, 6 Nov 2026 23:50:00 +0100 Subject: [PATCH 24/36] Create test_schwobasengnitz.py Testdatei erstellt --- axelrod/tests/unit/test_schwobasengnitz.py | 35 ++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 axelrod/tests/unit/test_schwobasengnitz.py diff --git a/axelrod/tests/unit/test_schwobasengnitz.py b/axelrod/tests/unit/test_schwobasengnitz.py new file mode 100644 index 000000000..aa90ed17b --- /dev/null +++ b/axelrod/tests/unit/test_schwobasengnitz.py @@ -0,0 +1,35 @@ +import random +import axelrod as axl +from axelrod.action import Action +from axelrod.strategies.schwobasengnitz import SchwobaSenGnitz + +class TestSchwobaSenGnitz(axl.TestPlayer): + name = "Schwoba sen gnitz" + player = SchwobaSenGnitz + + def test_strategy_initial_cooperation(self): + """Prüft, ob die Strategie absolut friedlich startet, solange der Gegner kooperiert.""" + self.versus_test(axl.Cooperator, expected_actions=[(Action.C, Action.C)] * 5) + + def test_raubtier_erwacht(self): + """Prüft, ob nach dem ersten Verrat die reziproke Reaktion einsetzt (mit festem Zufallssamen).""" + random.seed(42) # Fixiert den Zufall für reproduzierbare Tests + # Erste Runde: C vs D -> Raubtier erwacht. Danach greift die Wahrscheinlichkeit. + self.versus_test( + axl.Defector, + expected_actions=[ + (Action.C, Action.D), # Runde 1: Start-C vs D + (Action.C, Action.D), # Runde 2: Deeskalation greift bei Seed 42 + (Action.C, Action.D), # Runde 3: Deeskalation greift erneut + ], + ) + + def test_schutz_modus(self): + """Prüft, ob nach 10 durchgehenden Verraten des Gegners der Schutzmodus dauerhaft abriegelt.""" + random.seed(42) + # Wir simulieren 12 Runden gegen einen reinen Defector + expected = [(Action.C, Action.D)] # Runde 1 + expected.extend([(Action.C, Action.D)] * 9) # Runden 2-10 (Deeskalation/Zufall) + expected.extend([(Action.D, Action.D)] * 2) # Runden 11-12: Schutzmodus MUSS D liefern + + self.versus_test(axl.Defector, expected_actions=expected) From aa7c532a11a5dd9bd7c158d02933f94018d7f0ca Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Sat, 7 Nov 2026 00:10:49 +0100 Subject: [PATCH 25/36] Update test_schwobasengnitz.py --- axelrod/tests/unit/test_schwobasengnitz.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/axelrod/tests/unit/test_schwobasengnitz.py b/axelrod/tests/unit/test_schwobasengnitz.py index aa90ed17b..1a5f5dab9 100644 --- a/axelrod/tests/unit/test_schwobasengnitz.py +++ b/axelrod/tests/unit/test_schwobasengnitz.py @@ -1,7 +1,7 @@ import random import axelrod as axl from axelrod.action import Action -from axelrod.strategies.schwobasengnitz import SchwobaSenGnitz +from axelrod.strategies.schwoba_sen_gnitz import SchwobaSenGnitz class TestSchwobaSenGnitz(axl.TestPlayer): name = "Schwoba sen gnitz" From afff8d19f311d6b2dd671efb2ba3a2824b9ec604 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Sat, 7 Nov 2026 00:25:30 +0100 Subject: [PATCH 26/36] Update and rename test_schwobasengnitz.py to test_schwoba_sen_gnitz.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Und die Unterstriche bei name= ergänzt. --- .../{test_schwobasengnitz.py => test_schwoba_sen_gnitz.py} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename axelrod/tests/unit/{test_schwobasengnitz.py => test_schwoba_sen_gnitz.py} (95%) diff --git a/axelrod/tests/unit/test_schwobasengnitz.py b/axelrod/tests/unit/test_schwoba_sen_gnitz.py similarity index 95% rename from axelrod/tests/unit/test_schwobasengnitz.py rename to axelrod/tests/unit/test_schwoba_sen_gnitz.py index 1a5f5dab9..0aa1d5e34 100644 --- a/axelrod/tests/unit/test_schwobasengnitz.py +++ b/axelrod/tests/unit/test_schwoba_sen_gnitz.py @@ -3,8 +3,8 @@ from axelrod.action import Action from axelrod.strategies.schwoba_sen_gnitz import SchwobaSenGnitz -class TestSchwobaSenGnitz(axl.TestPlayer): - name = "Schwoba sen gnitz" +class TestSchwoba_Sen_Gnitz(axl.TestPlayer): + name = "Schwoba_sen_gnitz" player = SchwobaSenGnitz def test_strategy_initial_cooperation(self): From 6f945eec770945c6f8629967425d6b51bd179c9c Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Sat, 7 Nov 2026 00:40:26 +0100 Subject: [PATCH 27/36] Update test_schwoba_sen_gnitz.py Vorhersagen, was er tut, geht bei dem Chaoten einfach nicht. --- axelrod/tests/unit/test_schwoba_sen_gnitz.py | 38 +++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/axelrod/tests/unit/test_schwoba_sen_gnitz.py b/axelrod/tests/unit/test_schwoba_sen_gnitz.py index 0aa1d5e34..448391bd1 100644 --- a/axelrod/tests/unit/test_schwoba_sen_gnitz.py +++ b/axelrod/tests/unit/test_schwoba_sen_gnitz.py @@ -1,35 +1,29 @@ -import random import axelrod as axl from axelrod.action import Action from axelrod.strategies.schwoba_sen_gnitz import SchwobaSenGnitz class TestSchwoba_Sen_Gnitz(axl.TestPlayer): - name = "Schwoba_sen_gnitz" + name = "schwoba sen gnitz" player = SchwobaSenGnitz def test_strategy_initial_cooperation(self): """Prüft, ob die Strategie absolut friedlich startet, solange der Gegner kooperiert.""" self.versus_test(axl.Cooperator, expected_actions=[(Action.C, Action.C)] * 5) - def test_raubtier_erwacht(self): - """Prüft, ob nach dem ersten Verrat die reziproke Reaktion einsetzt (mit festem Zufallssamen).""" - random.seed(42) # Fixiert den Zufall für reproduzierbare Tests - # Erste Runde: C vs D -> Raubtier erwacht. Danach greift die Wahrscheinlichkeit. - self.versus_test( - axl.Defector, - expected_actions=[ - (Action.C, Action.D), # Runde 1: Start-C vs D - (Action.C, Action.D), # Runde 2: Deeskalation greift bei Seed 42 - (Action.C, Action.D), # Runde 3: Deeskalation greift erneut - ], - ) - def test_schutz_modus(self): - """Prüft, ob nach 10 durchgehenden Verraten des Gegners der Schutzmodus dauerhaft abriegelt.""" - random.seed(42) - # Wir simulieren 12 Runden gegen einen reinen Defector - expected = [(Action.C, Action.D)] # Runde 1 - expected.extend([(Action.C, Action.D)] * 9) # Runden 2-10 (Deeskalation/Zufall) - expected.extend([(Action.D, Action.D)] * 2) # Runden 11-12: Schutzmodus MUSS D liefern + """Prüft, ob nach 10 Runden unversöhnlichem Verrat der Schutzmodus aktiv blockiert.""" + # Wir testen nur die allererste Runde (garantiert C) + # und die Runden 11 und 12 (garantiert D wegen Schutzmodus) + player = self.player() + opponent = axl.Defector() + + # Runde 1 bis 10 simulieren (Gegner betrügt immer) + for _ in range(10): + player.play(opponent) + + # Ab Runde 11 MUSS der Schutzmodus aktiv sein und nur noch D liefern, + # völlig egal, was der Zufall sagt! + self.assertEqual(player.strategy(opponent), Action.D) - self.versus_test(axl.Defector, expected_actions=expected) + player.play(opponent) # Runde 11 spielen + self.assertEqual(player.strategy(opponent), Action.D) # Runde 12 prüfen From 80397451735808886db31eba15f1ebd0efcdc5fb Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Sat, 7 Nov 2026 00:49:59 +0100 Subject: [PATCH 28/36] Update schwoba_sen_gnitz.py Es nervt. Einfache Strategie und knackt irgendwie das System. --- axelrod/strategies/schwoba_sen_gnitz.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/axelrod/strategies/schwoba_sen_gnitz.py b/axelrod/strategies/schwoba_sen_gnitz.py index 6b8415803..fd44641f7 100644 --- a/axelrod/strategies/schwoba_sen_gnitz.py +++ b/axelrod/strategies/schwoba_sen_gnitz.py @@ -12,7 +12,7 @@ class SchwobaSenGnitz(Player): Erkennt nach 10 Runden unversöhnliche Gegner und riegelt ab. """ - name = "Schwoba sen gnitz" + name = "schwoba sen gnitz" authors = ["Georg 'HackyHackberger' Schmidt"] classifier = { "memory_depth": float("inf"), @@ -38,13 +38,18 @@ def strategy(self, opponent: Player) -> Action: if runde == 0: return Action.C + # Absicherung für den Zugriff auf die Historie des Gegners + if not opponent.history: + return Action.C + if not self.raubtier_erwacht and opponent.history[-1] == Action.D: self.raubtier_erwacht = True if not self.raubtier_erwacht: return Action.C - if runde >= 10: + # Sicherer Zugriff auf die letzten 10 Runden des Gegners + if runde >= 10 and len(opponent.history) >= 10: letzte_10_gegner = opponent.history[-10:] if all(zug == Action.D for zug in letzte_10_gegner): self.schutz_modus_aktiviert = True From ade8e2c4b62aa3a96081bdaf22664e4a02bf1b23 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Sat, 7 Nov 2026 00:55:50 +0100 Subject: [PATCH 29/36] Update schwoba_sen_gnitz.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mal sehen ob es an den Kommentarzeilenlängen liegt --- axelrod/strategies/schwoba_sen_gnitz.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/axelrod/strategies/schwoba_sen_gnitz.py b/axelrod/strategies/schwoba_sen_gnitz.py index fd44641f7..bdb4b2557 100644 --- a/axelrod/strategies/schwoba_sen_gnitz.py +++ b/axelrod/strategies/schwoba_sen_gnitz.py @@ -2,12 +2,13 @@ from axelrod.action import Action from axelrod.player import Player + class SchwobaSenGnitz(Player): - """ - Schwoba sen gnitz (Schwaben sind gerissen) - Python-Version 2026. + """Schwoba sen gnitz (Schwaben sind gerissen) - Python-Version 2026. + Autor: Georg 'HackyHackberger' Schmidt (1985 / 2026) Ursprünglicher Code in Turbo Pascal, 1985 - Startet 100 % friedlich. Nach dem ersten gegnerischen Verrat erwacht die + Startet 100 % friedlich. Nach dem ersten gegnerischen Verrat erwacht die optimierte gnitze Technik: 10,2 % Sondierung, 89,7 % Deeskalation. Erkennt nach 10 Runden unversöhnliche Gegner und riegelt ab. """ @@ -38,7 +39,6 @@ def strategy(self, opponent: Player) -> Action: if runde == 0: return Action.C - # Absicherung für den Zugriff auf die Historie des Gegners if not opponent.history: return Action.C @@ -48,7 +48,7 @@ def strategy(self, opponent: Player) -> Action: if not self.raubtier_erwacht: return Action.C - # Sicherer Zugriff auf die letzten 10 Runden des Gegners + # Sicherer Zugriff auf die letzten 10 Runden if runde >= 10 and len(opponent.history) >= 10: letzte_10_gegner = opponent.history[-10:] if all(zug == Action.D for zug in letzte_10_gegner): @@ -58,7 +58,7 @@ def strategy(self, opponent: Player) -> Action: return Action.D if opponent.history[-1] == Action.D: - # 89,7 % Deeskalations-Bremse gegen KIs + # 89,7 % Deeskalations-Bremse if random.random() < 0.897: return Action.C else: From e25f7ddcbaa92713917d0d3a474e9792e39b8393 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Sat, 7 Nov 2026 00:57:05 +0100 Subject: [PATCH 30/36] Update test_schwoba_sen_gnitz.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wenns das nicht ist, löch ich den ganzen Scheiss! --- axelrod/tests/unit/test_schwoba_sen_gnitz.py | 25 ++++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/axelrod/tests/unit/test_schwoba_sen_gnitz.py b/axelrod/tests/unit/test_schwoba_sen_gnitz.py index 448391bd1..e6050f1e4 100644 --- a/axelrod/tests/unit/test_schwoba_sen_gnitz.py +++ b/axelrod/tests/unit/test_schwoba_sen_gnitz.py @@ -2,28 +2,27 @@ from axelrod.action import Action from axelrod.strategies.schwoba_sen_gnitz import SchwobaSenGnitz + class TestSchwoba_Sen_Gnitz(axl.TestPlayer): name = "schwoba sen gnitz" player = SchwobaSenGnitz def test_strategy_initial_cooperation(self): - """Prüft, ob die Strategie absolut friedlich startet, solange der Gegner kooperiert.""" - self.versus_test(axl.Cooperator, expected_actions=[(Action.C, Action.C)] * 5) + """Prüft den friedlichen Start.""" + self.versus_test( + axl.Cooperator, expected_actions=[(Action.C, Action.C)] * 5 + ) def test_schutz_modus(self): - """Prüft, ob nach 10 Runden unversöhnlichem Verrat der Schutzmodus aktiv blockiert.""" - # Wir testen nur die allererste Runde (garantiert C) - # und die Runden 11 und 12 (garantiert D wegen Schutzmodus) + """Prüft die Blockade nach 10 Runden Verrat.""" player = self.player() opponent = axl.Defector() - - # Runde 1 bis 10 simulieren (Gegner betrügt immer) + for _ in range(10): player.play(opponent) - - # Ab Runde 11 MUSS der Schutzmodus aktiv sein und nur noch D liefern, - # völlig egal, was der Zufall sagt! + + # Ab Runde 11 MUSS der Schutzmodus aktiv sein + self.assertEqual(player.strategy(opponent), Action.D) + + player.play(opponent) self.assertEqual(player.strategy(opponent), Action.D) - - player.play(opponent) # Runde 11 spielen - self.assertEqual(player.strategy(opponent), Action.D) # Runde 12 prüfen From fd87512bdc84328fcebd25f1b5ffda4c28a81127 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Sat, 7 Nov 2026 01:02:23 +0100 Subject: [PATCH 31/36] Update test_schwoba_sen_gnitz.py Wenn Du in 3.13 keine Kommentare magst.... --- axelrod/tests/unit/test_schwoba_sen_gnitz.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/axelrod/tests/unit/test_schwoba_sen_gnitz.py b/axelrod/tests/unit/test_schwoba_sen_gnitz.py index e6050f1e4..8d2d8ded9 100644 --- a/axelrod/tests/unit/test_schwoba_sen_gnitz.py +++ b/axelrod/tests/unit/test_schwoba_sen_gnitz.py @@ -8,20 +8,17 @@ class TestSchwoba_Sen_Gnitz(axl.TestPlayer): player = SchwobaSenGnitz def test_strategy_initial_cooperation(self): - """Prüft den friedlichen Start.""" self.versus_test( axl.Cooperator, expected_actions=[(Action.C, Action.C)] * 5 ) def test_schutz_modus(self): - """Prüft die Blockade nach 10 Runden Verrat.""" player = self.player() opponent = axl.Defector() for _ in range(10): player.play(opponent) - # Ab Runde 11 MUSS der Schutzmodus aktiv sein self.assertEqual(player.strategy(opponent), Action.D) player.play(opponent) From 80f568be52b1fa4b1c7511dde51fad820dc05cb4 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Sat, 7 Nov 2026 01:28:01 +0100 Subject: [PATCH 32/36] Delete .github/workflows/turniertest.yml --- .github/workflows/turniertest.yml | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 .github/workflows/turniertest.yml diff --git a/.github/workflows/turniertest.yml b/.github/workflows/turniertest.yml deleted file mode 100644 index b63a7c390..000000000 --- a/.github/workflows/turniertest.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Mein eigenes Axelrod Turnier - -on: - workflow_dispatch: - -jobs: - run-tournament: - runs-on: ubuntu-latest - steps: - - name: Code ausleihen - uses: actions/checkout@v4 - - - name: Python vorbereiten - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - - name: System-Abhängigkeiten und Axelrod installieren - run: | - pip install --upgrade pip setuptools wheel - # Das sind die fehlenden Pakete, die die KIs zum Überleben brauchen: - pip install numpy scipy - pip install -e . - - - name: Turnier starten - run: python turniertest.py # Oder hier den Namen deiner großen Datei eintragen! From da2bcd785ac0794848bc2cfab707a6fa8e3cb6be Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Sat, 7 Nov 2026 01:28:23 +0100 Subject: [PATCH 33/36] Delete .github/workflows/turniertestvoll.yml --- .github/workflows/turniertestvoll.yml | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 .github/workflows/turniertestvoll.yml diff --git a/.github/workflows/turniertestvoll.yml b/.github/workflows/turniertestvoll.yml deleted file mode 100644 index 49c089854..000000000 --- a/.github/workflows/turniertestvoll.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Das große Axelrod Turnier - -on: - workflow_dispatch: - -jobs: - run-tournament: - runs-on: ubuntu-latest - steps: - - name: Code ausleihen - uses: actions/checkout@v4 - - - name: Python vorbereiten - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - - name: System-Abhängigkeiten und Axelrod installieren - run: | - pip install --upgrade pip setuptools wheel - # Unverzichtbar für die KIs im großen Feld: - pip install numpy scipy - pip install -e . - - - name: Turnier starten - run: python turniertestvoll.py From eebf13e9f60780659f6bb34532bb14ce1fd26280 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Sat, 7 Nov 2026 01:31:49 +0100 Subject: [PATCH 34/36] Delete turniertest.py --- turniertest.py | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 turniertest.py diff --git a/turniertest.py b/turniertest.py deleted file mode 100644 index 93d1e0a8b..000000000 --- a/turniertest.py +++ /dev/null @@ -1,25 +0,0 @@ -import axelrod as axl -from axelrod.strategies.schwoba_sen_gnitz import SchwobaSenGnitz - -# 1. Wir laden deine Strategie und ein paar offizielle Gegner -players = [ - SchwobaSenGnitz(), - axl.TitForTat(), - axl.Grudger(), # Das ist der Grudger - axl.Cooperator(), # AllC - axl.Defector(), # AllD - axl.Alternator() if hasattr(axl, 'Altenator') else axl.Alternator(), - axl.Random() -] - -# 2. Turnier starten: 1000 Runden, 5 Wiederholungen für stabile Zufallswerte -tournament = axl.Tournament(players=players, turns=1000, repetitions=5) -results = tournament.play() - -# 3. Ergebnis sauber im Terminal ausdrucken -print("\n" + "="*40) -print(" ERGEBNIS DES CT-RELOADED TURNIERS") -print("="*40) -for position, player in enumerate(results.ranked_names, start=1): - print(f"{position}. Platz: {player}") -print("="*40 + "\n") From 91cb7f51e365ad4c9912135df3183440c518af56 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Sat, 7 Nov 2026 01:32:08 +0100 Subject: [PATCH 35/36] Delete turniertestvoll.py --- turniertestvoll.py | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 turniertestvoll.py diff --git a/turniertestvoll.py b/turniertestvoll.py deleted file mode 100644 index e658e6d1a..000000000 --- a/turniertestvoll.py +++ /dev/null @@ -1,23 +0,0 @@ -import axelrod as axl - -# Wir erzeugen die Instanzen korrekt mit s() -# Falls eine kaputte Fremd-Strategie dabei ist, filtert der try-except Block sie aus -all_players = [] -for s in axl.all_strategies: - try: - all_players.append(s()) - except Exception: - continue - -print(f"Starte das große Turnier mit {len(all_players)} Strategien...") - -# 1000 Runden, 1 Wiederholung. Keine Extrafunktionen, um den RAM zu schonen. -tournament = axl.Tournament(players=all_players, turns=200, repetitions=1) -results = tournament.play(progress_bar=False) - -print("\n" + "="*50) -print(" DAS OFFIZIELLE AXELROD HAIFISCHBECKEN (TOP 20)") -print("="*50) -for position, player in enumerate(results.ranked_names[:20], start=1): - print(f"{position}. Platz: {player}") -print("="*50 + "\n") From f4790ea217d4da0bc2c115566fe0f171057e1858 Mon Sep 17 00:00:00 2001 From: Gerowasch Date: Sat, 7 Nov 2026 01:40:19 +0100 Subject: [PATCH 36/36] Update schwoba_sen_gnitz.py Dann jetzt eben so. --- axelrod/strategies/schwoba_sen_gnitz.py | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/axelrod/strategies/schwoba_sen_gnitz.py b/axelrod/strategies/schwoba_sen_gnitz.py index bdb4b2557..867b40dfb 100644 --- a/axelrod/strategies/schwoba_sen_gnitz.py +++ b/axelrod/strategies/schwoba_sen_gnitz.py @@ -1,21 +1,15 @@ import random +from typing import List, Dict, Any from axelrod.action import Action from axelrod.player import Player class SchwobaSenGnitz(Player): - """Schwoba sen gnitz (Schwaben sind gerissen) - Python-Version 2026. + """Schwoba sen gnitz.""" - Autor: Georg 'HackyHackberger' Schmidt (1985 / 2026) - Ursprünglicher Code in Turbo Pascal, 1985 - Startet 100 % friedlich. Nach dem ersten gegnerischen Verrat erwacht die - optimierte gnitze Technik: 10,2 % Sondierung, 89,7 % Deeskalation. - Erkennt nach 10 Runden unversöhnliche Gegner und riegelt ab. - """ - - name = "schwoba sen gnitz" - authors = ["Georg 'HackyHackberger' Schmidt"] - classifier = { + name: str = "schwoba sen gnitz" + authors: List[str] = ["Georg 'HackyHackberger' Schmidt"] + classifier: Dict[str, Any] = { "memory_depth": float("inf"), "stochastic": True, "makes_use_of": set(), @@ -48,7 +42,6 @@ def strategy(self, opponent: Player) -> Action: if not self.raubtier_erwacht: return Action.C - # Sicherer Zugriff auf die letzten 10 Runden if runde >= 10 and len(opponent.history) >= 10: letzte_10_gegner = opponent.history[-10:] if all(zug == Action.D for zug in letzte_10_gegner): @@ -58,13 +51,11 @@ def strategy(self, opponent: Player) -> Action: return Action.D if opponent.history[-1] == Action.D: - # 89,7 % Deeskalations-Bremse if random.random() < 0.897: return Action.C else: return Action.D - # 10,2 % gnitze Sondierung if random.random() < 0.102: return Action.D