Das Spiel Mastermind (auch SuperHirn genannt) ist ein Logikspiel für zwei Spieler aus den 1970er Jahren. Dabei gibt einer der Spieler einen Code, bestehend aus vier farbigen Stiften, vor und der andere Spieler versucht diesen, durch geschicktes logisches Schlussfolgern, zu erraten.
Das Spielprinzip ist das Folgende:
Spieler 1 steckt verdeckt einen Code aus vier farbigen Stiften. Es gibt 6 verschiedene Farben aus denen der Spieler wählen kann. Farben dürfen auch mehrfach vorkommen.
Eine Runde läuft dann folgendermaßen ab:
Beispiel: Im Bild unten in der zweiten Reihe (von oben) ist das Feedback ein weißer und ein schwarzer (bzw. roter) Stift. Der schwarze Stift ist dort, da im geratenen Code ein roter Stift an der richtigen Position (nämlich der zweiten von rechts) steckt. Den weißen Stift gibt es, da im geheimen Code zwar ein lilaner Stift vorkommt, dieser aber an der falschen Position steckt.
Das geht solange so weiter bis Spieler 2 entweder den Code erraten hat oder die vorher festgelegte maximale Rundenanzahl erreicht ist. Im ersten Fall gewinnt Spieler 2 und im letzteren gewinnt Spieler 1.
Wenn dir noch etwas unklar ist wie das Spiel gespielt wird oder du noch mehr wissen möchtest, dann schau dir folgende Links an:
https://de.wikipedia.org/wiki/Mastermind
https://www.spielregeln-spielanleitungen.de/spiel/mastermind-superhirn/
In dieser Aufgabe geht es darum, erst das Mastermind-Spiel zu implementieren und dann wollen wir eine KI programmieren, die den Code in möglichst wenig Versuchen erraten kann.
Je nach Mastermind-Spiel hat man ca. 8-12 Versuche, um den Code zu erraten. Die maximale Anzahl der Versuche wollen wir aber erstmal nicht als Bedingung in unser Spiel aufnehmen sondern stattdessen zählen wie viele Versuche ein Spieler braucht, um den Code zu erraten. Das heißt, je weniger Versuche der Spieler braucht, desto besser ist das Ergebnis.
In unserer Implementierung von Mastermind wird es so sein, dass die Rolle von Spieler 1 (in der Beschreibung oben) von unserem Programm übernommen wird. Das heißt der geheime Farbcode wird immer zufällig durch den Computer festgelegt (welcher auch das Feedback gibt) und der/die Spieler/in (oder KI) muss den Code erraten.
Die Methode "spiele_mastermind()", in der der Ablauf eines Mastermindspiels implementiert ist, ist schon vorgegeben. Die Methoden, die dort aufgerufen werden, müssen größtenteils aber noch implementiert werden. Außerdem wird der spiele_mastermind() Methode ein Spieler-Objekt übergeben. Deswegen werden wir, nachdem wir das eigentliche Spiel implementiert haben, noch jeweils Klassen für menschliche und KI-Spieler erstellen.
An den Stellen, an denen drei Punkte (...) sind, musst du Code ergänzen.
import numpy as np
import random
import copy
import itertools
from statistics import mean
# Die Farbzuordnung brauchen wir für die Eingabe eines menschlichen Spielers, damit er/sie nicht alle Farben
# ausschreiben muss sondern einfach die jeweiligen Buchstaben eingeben kann.
farbzuordnung = {'y':'Gelb', 'r':'Rot', 'b':'Blau', 'g':'Grün', 'o':'Orange', 'p':'Lila'}
farben = list(farbzuordnung.values())
# Lege zufällig einen verdeckten vierstelligen Farbcode fest z. B. ['Grün','Orange','Grün','Lila'].
# Verwende dazu die Variable "farben", die eine Liste mit den Farben enthält.
def farbcode_festlegen():
""" Legt zufällig einen verdeckten vierstelligen Farbcode fest
Returns:
geheimer_code (list): Liste mit vier Farben z. B. ['Grün','Orange','Grün','Lila']
"""
# BEGINN LÖSUNG
geheimer_code = random.choices(farben, k=4)
# ENDE LÖSUNG
return geheimer_code
def farbcode_raten(farbcode,code):
""" Überprüft vermuteten Code und erstellt Feedback
In dieser Methode wird überprüft wie viele farbige Stifte im geratenen Code mit dem verdeckten Code
übereinstimmen und entsprechendes Feedback gegeben.
Args:
farbcode (list): geheimer Farbcode als Liste mit 4 Strings
code (list): Vermutung für den Code, die überprüft werden soll; auch eine Liste mit 4 Strings
Returns:
anzahl_richtige_position (int): Anzahl der Stifte mit der richtigen Farbe und der richtigen Position
anzahl_richtige_farbe (int): Anzahl der Stifte mit der richtigen Farbe aber der falschen Position
"""
# Kopie erstellen damit übergebene Variablen nicht verändert werden
farbcode = farbcode.copy()
code = code.copy()
# BEGINN LÖSUNG
anzahl_richtige_position = 0
anzahl_richtige_farbe_alle = 0
for i in range(len(farbcode)):
if farbcode[i]==code[i]:
anzahl_richtige_position += 1
for element in farbcode:
if element in code:
anzahl_richtige_farbe_alle += 1
code.remove(element)
# Alternative Möglichkeit:
#anzahl_richtige_farbe_alle = sum([min(farbcode.count(farbe),code.count(farbe)) for farbe in farben])
# Da wir alle farbigen Stifte gezählt haben, die in beiden Codes vorkommen (egal an welcher Position),
# müssen wir die abziehen, die gleichzeitig auch an der richtigen Position sind, damit wir sie nicht doppelt zählen
anzahl_richtige_farbe = anzahl_richtige_farbe_alle - anzahl_richtige_position
# ENDE LÖSUNG
return anzahl_richtige_position,anzahl_richtige_farbe
def code_erraten(anzahl_richtige_position):
""" Diese Methode testet, ob der Farbcode erraten wurde
Args:
# BEGINN LÖSUNG
anzahl_richtige_position (int): Anzahl der Stifte mit der richtigen Farbe und der richtigen Position
# ENDE LÖSUNG
Returns:
erraten (bool): Boolscher Wert, der angibt, ob der Code erraten wurde (True) oder nicht (False)
"""
# BEGINN LÖSUNG
erraten = (anzahl_richtige_position == 4)
# ENDE LÖSUNG
return erraten
Im Folgenden findet ihr noch ein paar Hilfsfunktionen, die schon vorimplementiert sind. Sie sind dafür verantwortlich, dass je nach Spieler (Mensch oder KI) die richtigen Methoden für die Eingabe einer Code-Vermutung und für die Verarbeitung des Feedbacks aufgerufen werden.
# Diese Methode ist für die Code-Eingabe verantwortlich
def code_eingabe(spieler):
eingabe_methode = waehle_eingabe_methode(spieler)
return eingabe_methode()
# Diese Methode wählt die passende Eingabemethode aus je nachdem ob der/die Spieler/in ein Mensch oder eine KI ist.
# Die jeweiligen Methoden werden weiter unten als Teil der entsprechenen Klasse (Mensch/KI) definiert.
def waehle_eingabe_methode(spieler):
if spieler.typ == "Mensch":
return spieler.code_eingabe_mensch
elif spieler.typ == 'KI':
return spieler.tippe_code
else:
raise ValueError(spieler.typ)
# Diese Methode ist dafür verantworlich wie der Spieler das erhaltende Feedback verarbeitet
def feedback_verarbeiten(spieler, anzahl_richtige_position, anzahl_richtige_farbe):
feedback_methode = waehle_feedback_methode(spieler)
return feedback_methode(anzahl_richtige_position, anzahl_richtige_farbe)
# Diese Methode wählt die passende Feedbackmethode aus je nachdem ob der/die Spieler/in ein Mensch oder eine KI ist
# Die jeweiligen Methoden werden weiter unten als Teil der entsprechenen Klasse (Mensch/KI) definiert.
def waehle_feedback_methode(spieler):
if spieler.typ == "Mensch":
return spieler.feedback_mensch
elif spieler.typ == 'KI':
return spieler.feedback_ki
else:
raise ValueError(spieler.typ)
# Diese Methode gibt das Feedback einer Runde aus
def zeige_feedback(anzahl_richtige_position, anzahl_richtige_farbe):
print('\n'+'Feedback:')
print('Richtige Farbe und richtige Position: {}'.format(anzahl_richtige_position))
print('Richtige Farbe aber falsche Position: {}'.format(anzahl_richtige_farbe))
print('\n')
# Diese Methode wird am Anfang eines Spiels aufgerufen und zeigt an, welche Farben möglich sind
def zeige_beschreibung(name):
print('\nLass uns Mastermind spielen, {}!\n'.format(name))
print('Du kannst eine Vermutung äußern, indem du einen Code bestehend aus bis zu vier der folgenden Farben eingibst:')
print('Farben: Gelb(y), Rot(r), Blau(b), Grün(g), Orange(o), Lila(p)')
print('Beispiel: rrgb'+'\n')
print('Um das Spiel zu beenden, tippe "ende"!\n')
Im Folgenden Codeblock findet ihr die Methode, in der der Ablauf eines Mastermindspiels implementiert ist und die die Funktionen aufruft, die ihr oben implementiert habt.
def spiele_mastermind(spieler):
gewonnen = False
# hier wird der geheime Farbcode festgelegt
farbcode = farbcode_festlegen()
# falls der Spieler ein Mensch ist wird ihm eine kurze Beschreibung zum Spiel angezeigt
if spieler.typ == "Mensch":
name = spieler.name
zeige_beschreibung(name)
runde = 1
while gewonnen != True:
if spieler.typ == "Mensch":
print('Runde {}:'.format(runde))
# hier wird eine Vermutung für den geheimen Code vom Spieler gefordert
code = code_eingabe(spieler)
if len(code) == 0:
print('Das Spiel wurde abgebrochen.')
break
# Die farbcode_raten() Method wertet den vermuteten Code aus und gibt Feedback
anzahl_richtige_position, anzahl_richtige_farbe = farbcode_raten(farbcode,code)
# Die feedback_verarbeiten() Methode bestimmt wie der/die Spieler/in mit dem Feedback umgeht
feedback_verarbeiten(spieler,anzahl_richtige_position, anzahl_richtige_farbe)
# hier wird getestet, ob der Code bereits erraten wurde, ansonsten beginnt die nächste Runde
if code_erraten(anzahl_richtige_position):
if spieler.typ == "Mensch":
print('Bravo, {}! Du hast den Code in {} Versuchen erraten!'.format(spieler.name, runde))
gewonnen = True
else:
runde += 1
return runde
Um Mastermind spielen zu können, brauchen wir einen Spieler, entweder einen menschlichen Spieler oder eine KI. Wie wir oben gesehen haben bestimmt das Typ-Attribut dieses Spielers, welche Methoden für die Codeeingabe und die Feedbackverarbeitung aufgerufen werden.
Zunächst erstellen wir eine Spielerklasse "Mensch". Die Klasse hat die zwei Attribute Typ und Name und je eine Methode , um einen Code einzugeben und um Feedback zu "verarbeiten" (bzw. anzuzeigen).
class Mensch:
def __init__(self, name):
self.typ = 'Mensch'
self.name = name
# In dieser Methode ist die Eingabe einer Farbkombination für eine/n menschlichen Spieler/in implementiert
def code_eingabe_mensch(self):
farben_eingabe = []
while len(farben_eingabe) != 4:
code = input('Deine Vermutung:')
if code.lower() == 'ende':
break
farben_eingabe = [farbzuordnung[buchstabe] for buchstabe in code if buchstabe in farbzuordnung]
if len(farben_eingabe) == 4:
print(farben_eingabe)
else:
print("\033[31m Kein valider Farbcode! \033[0m")
print(" Bitte gib eine vierstellige Vermutung bestehend aus den oben genannten Farben ein!"+"\n")
return farben_eingabe
# Für einen Menschen wird das Feedback nur auf dem Bildschirm ausgegeben
def feedback_mensch(self, anzahl_richtige_position, anzahl_richtige_farbe):
zeige_feedback(anzahl_richtige_position, anzahl_richtige_farbe)
Super, jetzt sind wir startklar, um unser Mastermind-Spiel zu testen. Erstelle dir einen Spieler der Klasse Mensch mit deinem Namen und los geht's!
Hinweis: Um das Spiel vorzeitig zu beenden, gib statt einer Farbkombination das Wort "ende" ein.
name = input("Wie heißt du? ")
mein_spieler = Mensch(name)
anzahl_versuche = spiele_mastermind(mein_spieler)
Jetzt können wir unser Mastermind-Spiel schon selbst spielen. Als nächstes wollen wir eine KI programmieren, die Mastermind spielen kann.
Wir wollen mit einer sehr simplen KI beginnen. Diese KI erstellt eine Liste mit allen möglichen Codes und geht diese nacheinander durch, bis sie die richtige Lösung gefunden hat. Bei 4 farbigen Stiften gewählt aus 6 möglichen Farben (mit Zurücklegen und Beachten der Reihenfolge) gibt es $6^4 = 1296$ mögliche Kombinationen.
Wir definieren unsere KI als eigene Klasse. Wenn du dich mit Klassen (und Vererbung) in Python noch nicht so gut auskennst oder noch etwas dazulernen möchtest, dann schaue dir gerne die folgenden Links an:
https://www.python-kurs.eu/python3_klassen_instanzattribute.php
https://www.python-kurs.eu/python3_vererbung.php
In der __ init__() Methode (die auch Konstruktor genannt wird) unserer KI Klasse können wir die Attribute, d. h. die Eigenschaften definieren, die unsere Klasse haben soll. Wir können dann innerhalb der Klasse mit self.eigenschaft auf die jeweilige Eigenschaft zugreifen. Zum Beispiel gibt uns self.typ den Typ unserer Klasse, d. h in unserem Fall 'KI'.
Die ki_zuruecksetzen() Methode brauchen wir, da wir später viele Durchläufe des Spiels simulieren wollen, um zu testen wie viele Versuche die KI durchschnittlich braucht. Das heißt, falls du z. B. einen Index definierst, um durch alle möglichen Kombinationen durchzugehen, dann solltest du diesen in der ki_zuruecksetzen() Methode wieder auf den Anfangszustand zurücksetzen.
Die tippe_code() Methode wird im Spiel immer dann aufgerufen, wenn eine Vermutung für den Code abgegeben werden soll und der Spieler vom Typ KI ist. Das heißt, diese Methode soll eine Liste mit vier Strings zurückgeben, die den Farben aus der oben definierten Farbliste entsprechen. Ein Beispiel wäre: ['Rot','Gelb','Gelb','Grün'].
Da unsere simple KI das Feedback des Spiels nicht benutzt passiert nichts, wenn man die feedback_ki() Methode aufruft. Wir wollen diese Methode aber schon definieren, da die KI(s), die wir später erstellen wollen, von der simplen KI erben soll(en) und wir die Methode dann "überschreiben" also so anpassen, dass die KI das Feedback nutzen kann.
class Mastermind_KI:
def __init__(self):
self.typ = 'KI'
self.ki_zuruecksetzen()
def ki_zuruecksetzen(self):
# BEGINN LÖSUNG
self.index = 0
self.kombinationen = [list(kombination) for kombination in itertools.product(farben,repeat=4)]
# ENDE LÖSUNG
def tippe_code(self):
# BEGINN LÖSUNG
tipp = self.kombinationen[self.index].copy()
self.index += 1
# ENDE LÖSUNG
return tipp
def feedback_ki(self,anzahl_richtige_position, anzahl_richtige_farbe):
pass
Bis jetzt haben wir das Feedback des anderen Spielers gänzlich ignoriert. Als nächstes wollen wir unsere KI so erweitern, dass sie das Feedback nutzen kann, um den Suchraum zu verkleinern und so den Code in weniger Versuchen zu erraten.
Dafür gibt es natürlich verschiedene Strategien. Wir wollen die Folgende implementieren: Anstatt blind alle möglichen Kombinationen durchzugehen, soll die KI versuchen, erst einmal herauszufinden, welche Farben (nicht) im verdeckten Code vorkommen. Das verkleinert den Suchraum, da ja nur maximal vier der sechs Farben im Code vorkommen können. Dazu soll die KI erst alle einfarbigen Kombinationen, also z. B. ['Gelb','Gelb','Gelb','Gelb'] durchgehen und das Feedback nutzen, um die Kombinationen aus der Liste zu entfernen, die eine Farbe enthalten, die nicht vorkommt.
Tipp: Mit super().methodenname kann man die Methoden der Elternklasse aufrufen. Um z. B. den Konstruktor der Elternklasse aufzurufen benutzt man folgende Codezeile: super().__init__().
class Mastermind_KI_version_2(Mastermind_KI):
def __init__(self):
# BEGINN LÖSUNG
super().__init__()
self.farben_test = [[farbe]*4 for farbe in farben]
# ENDE LÖSUNG
def ki_zuruecksetzen(self):
# BEGINN LÖSUNG
super().ki_zuruecksetzen()
self.teste_farben = True
# ENDE LÖSUNG
def tippe_code(self):
# BEGINN LÖSUNG
if self.teste_farben:
tipp = self.farben_test[self.index].copy()
self.index += 1
if self.index == len(self.farben_test):
self.teste_farben = False
self.index = 0
else:
tipp = super().tippe_code()
# ENDE LÖSUNG
return tipp
def feedback_ki(self,anzahl_richtige_position, anzahl_richtige_farbe):
# BEGINN LÖSUNG
if self.teste_farben:
if (anzahl_richtige_position == 0) and (anzahl_richtige_farbe == 0):
self.kombinationen = [kombination for kombination in self.kombinationen if not farben[self.index-1] in kombination]
# ENDE LÖSUNG
Anhand von einem Durchgang eines Mastermind-Spiels lassen sich verschiedene Spieler nicht besonders gut vergleichen. Deswegen wollen wir viele Spiele (z. B. 1000) simulieren und die Anzahl der benötigten Versuche mitteln, um ein verlässlicheres Ergebnis zu bekommen.
def evaluiere_spieler(spieler, anzahl_durchlaeufe = 1000):
anzahl_versuche = []
for durchlauf in range(anzahl_durchlaeufe):
spieler.ki_zuruecksetzen()
ergebnis = spiele_mastermind(spieler)
anzahl_versuche.append(ergebnis)
mittel_anzahl_versuche = mean(anzahl_versuche)
return mittel_anzahl_versuche
# Erstelle jeweils eine Instanz unserer KI-Klassen
ki_1 = Mastermind_KI()
ki_2 = Mastermind_KI_version_2()
# Simuliere viele Spieldurchgänge (z. B. 1000) und berechne den Mittelwert der benötigten Versuche
mittel_anzahl_versuche_ki1 = evaluiere_spieler(ki_1)
mittel_anzahl_versuche_ki2 = evaluiere_spieler(ki_2)
Als nächstes wollen wir unsere Spielerevaluation für unsere beiden KIs in einer Graphik visualisieren.
Auf der X-Achse werden die Spieler/innen (KIs) dargestellt, die wir vergleichen wollen und auf der Y-Achse, die durchschnittliche Anzahl an Versuchen, die sie gebraucht haben, um den Code zu erraten (gemittelt wurde über 1000 Spiele).
Die gestrichelte Linie markiert die maximale Anzahl an Versuchen, die man brauchen kann, wenn man keine Kombination doppelt rät. Wie wir oben schon festgestellt haben, gibt es $6^4 = 1296$ Kombinationen.
import matplotlib.pyplot as plt
%matplotlib inline
# mit dieser Methode kann man ein Balkendiagramm erstellen, um die durchschnittlichen Ergebnisse der KIs zu vergleichen
def evaluations_plot(spieler_namen, durchschnitt_anzahl_versuche):
if len(spieler_namen) != len(durchschnitt_anzahl_versuche):
raise ValueError("Die Liste mit den Spielernamen und die Liste mit der durchschnittlichen Anzahl an Versuchen haben nicht die gleiche Länge!")
plt.figure(figsize=(8, 8), dpi=80)
plt.bar(range(len(durchschnitt_anzahl_versuche)),durchschnitt_anzahl_versuche, tick_label = spieler_namen, width=0.8)
plt.axhline(1296, linestyle=':', label='Maximal mögliche Anzahl')
plt.ylabel('Durchschnittliche Anzahl an Versuchen', fontsize=12)
plt.title("Evaluation der Mastermind-KIs", fontsize=14)
plt.legend()
# Mittelwerte als Zahlen anzeigen
for index, value in enumerate(durchschnitt_anzahl_versuche):
plt.text(index, value+20, str(round(value,2)), horizontalalignment='center')
spieler_namen = ['Mastermind_KI','Mastermind_KI_version_2']
durchschnitt_anzahl_versuche = [mittel_anzahl_versuche_ki1,mittel_anzahl_versuche_ki2]
evaluations_plot(spieler_namen, durchschnitt_anzahl_versuche)
Wir haben gesehen, dass wir die Anzahl an Versuchen, die die KI braucht um den Code zu erraten, um ein Vielfaches reduzieren können, wenn wir uns eine Strategie überlegen und das Feedback miteinbeziehen. Trotzdem würde die KI das Spiel selten gewinnen, da man im Spiel normalerweise nur 8-12 Versuche hat, um den Code zu erraten. Ansonsten gewinnt der/die Spieler/in, der/die sich den geheimen Code überlegt hat.
Hast du eine Idee, wie man die KI noch verbessern kann, so dass sie vielleicht durchschnittlich nur 50 oder sogar nur 20 Versuche benötigt?
Schreibe eine Klasse, die von einer der schon vorgegebenen KIs erbt und erweitere ihre Fähigkeiten, indem du die tippe_code() und/oder die feedback_ki() Methoden überschreibst oder neue Methoden hinzufügst.
Evaluiere die neue KI mit der evaluiere_spieler-Methode und erstelle eine neue Graphik mit der evaluations_plot() Methode mit allen drei KIs.
class Mastermind_KI_version_3(...):
def __init__(self):
...
def ki_zuruecksetzen(self):
...
def tippe_code(self):
...
return tipp
def feedback_ki(self,anzahl_richtige_position, anzahl_richtige_farbe):
...
...
Eine weitere Möglichkeit um unsere KI zu verbessern ist, das Feedback (das wir jede Runde bekommen) zu nutzen, um Kombinationen auszuschließen die damit nicht kompatibel sind.
Das heißt, jedes mal, wenn wir Feedback zu unserer Vermutung bekommen haben, gehen wir alle Kombinationen durch, die noch in unserer Liste mit möglichen Kandidaten für den geheimen Code sind. Für jede Kombination aus dieser Liste überprüfen wir, welches Feedback wir bekommen würden, wenn diese Kombination der geheime Code wäre und unsere Vermutung die ist, die wir tatsächlich eingegeben haben. Ist dieses hypothetische Feedback nicht das gleiche wie das, welches wir tatsächlich bekommen haben, dann können wir die entsprechende Kombination ausschließen, weil sie nicht als geheimer Code in Frage kommt.
Beispiel:
Stell dir vor, du hast die Vermutung ["Blau", "Blau", "Grün", "Grün"] geäußert und bekommst als Feedback, dass 1 Stift an der richtigen Position ist und die richtige Farbe hat und das 2 Stifte zwar die richtige Farbe haben, aber an der falschen Position sind.
Jetzt gehst du alle Kombinationen durch, die noch in der Liste der möglichen Kombinationen sind und testest, ob sie mit dem Feedback kompatibel ist. Stell dir z. B. vor, dass die Kombination ["Blau", "Blau", "Orange", "Gelb"] noch in deiner Liste von Kombinationen ist. Jetzt überprüfst du, welches Feedback du bekommen würdest, wenn diese Kombination der geheime Code wäre und du die obige Vermutung ["Blau", "Blau", "Grün", "Grün"] äußerst.
Das Feedback wäre, dass 2 Stifte an der richtigen Position sind und die richtige Farbe haben. Das ist nicht das gleiche Feedback, wie das, was du tatsächlich bekommen hast. Daraus kannst du schließen, dass die Kombination ["Blau", "Blau", "Orange", "Gelb"] nicht der geheime Code sein kann und sie aus deiner Liste mit möglichen Kombinationen entfernen.
class Mastermind_KI_version_3(Mastermind_KI):
def __init__(self):
super().__init__()
def ki_zuruecksetzen(self):
super().ki_zuruecksetzen()
# Diese Methode geht alle verbleibenden Kombinationen durch und testet, ob sie mit dem Feedback kompatibel sind
def feedback_testen(self):
for kombination in self.kombinationen:
if farbcode_raten(farbcode=kombination,code=self.tipp) != self.feedback:
self.kombinationen.remove(kombination)
def tippe_code(self):
# Einfachheitshalber wird die nächste Vermutung zufällig aus der Liste der verbleibenden Kombinationen ausgewählt
self.tipp = random.choice(self.kombinationen)
self.kombinationen.remove(self.tipp)
return self.tipp
def feedback_ki(self,anzahl_richtige_position, anzahl_richtige_farbe):
self.feedback = anzahl_richtige_position,anzahl_richtige_farbe
self.feedback_testen()
ki_3 = Mastermind_KI_version_3()
spiele_mastermind(ki_3)
mittel_anzahl_versuche_ki3 = evaluiere_spieler(ki_3)
if 'Mastermind_KI_version_3' not in spieler_namen:
spieler_namen.append('Mastermind_KI_version_3')
durchschnitt_anzahl_versuche.append(mittel_anzahl_versuche_ki3)
evaluations_plot(spieler_namen, durchschnitt_anzahl_versuche)
Wenn ihr Fragen oder Anregungen zu der Aufgabe (oder Lösung) habt, dann tauscht euch gerne im Chat darüber aus oder schreibt uns eine E-Mail (an info@bw-ki.de).
Wir freuen uns auch immer über Feedback (auch unter info@bw-ki.de):