Benutzer-Werkzeuge

Webseiten-Werkzeuge


ws1516:interaktives_spiel_gegen_ki:protokoll

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
ws1516:interaktives_spiel_gegen_ki:protokoll [2016/02/22 11:50]
DoVaDe
ws1516:interaktives_spiel_gegen_ki:protokoll [2016/05/10 14:46] (aktuell)
Zeile 254: Zeile 254:
  
 Um zunächst einmal alle günstigen Situationen zu erhalten, welche den Sieg bringen oder zum sicheren Sieg führen würden, mussten wir unser Spielfeld von einer Tabelle aus Arrays in einen String umwandeln und wieder umgekehrt. ​ Um zunächst einmal alle günstigen Situationen zu erhalten, welche den Sieg bringen oder zum sicheren Sieg führen würden, mussten wir unser Spielfeld von einer Tabelle aus Arrays in einen String umwandeln und wieder umgekehrt. ​
 +  
 +Von der Tabelle zum String:
     def tabelle_to_string(brett):​     def tabelle_to_string(brett):​
      t= ''​      t= ''​
Zeile 265: Zeile 266:
     print tabelle_to_string(spielbrett)     print tabelle_to_string(spielbrett)
     #​WSWSWxSSxxWxxSWx     #​WSWSWxSSxxWxxSWx
 +    ​
 +Vom String zur Tabelle:
 +    def string_to_tabelle(string):​
 + b =[]
 + while len(string) != 0:
 + a=[]
 + for i in range(0,5):
 + a.append(string[i])
 + string = string[5:]
 + b.append(a)
 + return b
 +
 +Danach musste Dominic leider aus privaten Gründen gehen und Lea arbeitete alleine an der KI weiter. In dem folgenden Programmabschnitt wurde versucht, alle Möglichkeiten in einem Wörterbuch abzulegen. Dies ist dann mithilfe von Listen ermöglicht worden, wobei erstmal alle erreichbaren Positionen auf dem Spielfeld erzeugt werden, was ungefähr 3^16 ist. Um diesen Programmcode vielleicht noch zu optimieren, wird noch die Dauer des Rechenprozesses ausgegeben, welche ca. 4 Minuten beträgt: ​
 +
 +    wb ={
 +
 +
 +    }
 +
 +    def ALLE_positionen():​
 +     m = (0,1,2)
 +     alles= [(i1,​i2,​i3,​i4,​i5,​i6,​i7,​i8,​i9,​i10,​i11,​i12,​i13,​i14,​i15,​i16) ​
 +       for i1 in m
 +       for i2 in m
 +       for i3 in m
 +       for i4 in m
 +       for i5 in m
 +       for i6 in m
 +       for i7 in m
 +       for i8 in m
 +       for i9 in m
 +       for i10 in m
 +       for i11 in m
 +       for i12 in m
 +       for i13 in m
 +       for i14 in m
 +       for i15 in m
 +       for i16 in m]
 +     print(len(alles))
 +     return alles
 +
 +    def test1():
 +     [i for i in range(43000000)]
 +
 +    def test():
 +     m = (0,1,2)
 +     alles= [(i1,​i2,​i3,​i4,​i5,​i6,​i7,​i8,​i9,​i10) ​
 +       for i1 in m
 +       for i2 in m
 +       for i3 in m
 +       for i4 in m
 +       for i5 in m
 +       for i6 in m
 +       for i7 in m
 +       for i8 in m
 +       for i9 in m
 +       for i10 in m]
 +     print(len(alles))
 +     return alles
 +
 +    def situationen(liste):​
 +     if liste.count(2) <=6 and liste.count(1)<​= 6 and liste.count(1) >2 and liste.count(2) > 2:
 +     wb[liste] = 0
 +     if liste.count(2) >= 3 and liste.count(1) == 2:
 +     wb[liste]= 1
 +     if liste.count(1) >= 3 and liste.count(2) == 2:
 +     wb[liste] = -1
 +
 +    l = ALLE_positionen()
 +    start= time.time()
 +    while len(l) != 0:
 +        situationen(l[0])
 +     del l[0]
 +
 +    end = time.time()
 +    dauer = end - start
 +    print "​Dauer:",​ dauer
 +
 +
 +
 +    # 1 Weiß gewinnt
 +    # -1 Schwarz gewinnt
 +    # 0 unentschieden \ noch nicht bekannt
 +
 +    #1 schwarz
 +    # 2 weiß
 +    start = time.time()
 +    with open("​bsp.pickle","​w"​) as f:
 +     p=cpickle.Pickler(f)
 +     p.dump(wb)
 +    end = time.time()
 +    dauer =end - start
 +    print '​Dauer:',​ dauer
 +
 +    start = time.time()
 +    with open("​bsp.pickle",​ "​r"​) as f:
 +     u=cpickle.Unpickler(f)
 +     wb2 = u.load()
 +    end = time.time()
 +    dauer =end - start
 +    print '​Dauer:',​ dauer
 +
 +
 +==== DAY TWELVE (22.02.2016) ====
 +
 +Heute, am ersten der drei Projekttage,​ ist Lea leider erkrankt, weshalb Dominic alleine versucht, an der KI und dem Spiel weiterzuarbeiten. Als erstes wurde die Dokumentation mit dem Protokoll für Tag 11 vervollständigt,​ wobei die Arbeitsschritte vom letzten Mal zunächst revidiert werden mussten. ​
 +Leider beherrsche ich Programmiersprachen trotz alledem leider so gut wie gar nicht und deshalb habe ich mich, neben ein wenig angeeignetem Verständnis für das Programm, mit einer Konsolen-Ausgabe für das Spiel beschäftigt,​ damit nicht mehr der Computer gegen sich selbst spielt, sondern auch ein Individuum während des Spiels eingreifen kann.
 +
 +Hier die kleine Überlegung in gedankenhaften Quellcode gebracht (ACHTUNG, vermutlich komplett falsch, noch ungetestet):​
 +
 +{{:​ws1516:​interaktives_spiel_gegen_ki:​imagthsfjge1.jpg?​300|}}
 +
 +Als Ausblick für den morgigen Tag hoffe ich, dass Lea wieder mit an Bord ist, um mehr und besser als heute voranzukommen,​ da die Arbeit mit mir alleine leider stagniert und ich auch kaum gezielte Fragen stellen kann, da ich mich während des Semesters zu wenig mit dem Lernen von Python beschäftigt habe.
 +==== DAY THIRTEEN (23.02.2016) ====
 +
 +Da der programmierende Kopf der Gruppe (Lea) leider immer noch fehlt und die Zeit aufgrund der Vorträge, sowie aus privaten Gründen, etwas knapp wurde, ist das Projekt nicht vorangekommen. ​
 +Es wurde sich mit dem Verstehen von Pickle, welches zur Weiterarbeit benötigt wird, beschäftigt,​ was letztendlich jedoch nicht geglückt ist. 
 +==== DAY FOURTEEN (24.02.2016) ====
 +
 +Dies ist der letzte Projektwochentag und somit auch die letzte Möglichkeit,​ in diesem Semester noch an dem Projekt weiterzuarbeiten. Damit wenigstens an etwas gearbeitet wird, habe ich mich erneut mit dem beschäftigt,​ was unser Porgramm alles benötigt, um zu funktionieren.
 +{{ :​ws1516:​interaktives_spiel_gegen_ki:​last_one.jpg |}}
 +
 +Da alle Positionen, die einen Zug vor einer Gewinnposition stehen, relativ simpel zu codieren waren, habe ich mir dieses vorgenommen:​
 +
 +<​code>​
 +gewinnpos =             ​[[(0,​0),​(0,​2),​(2,​4)],​
 + [(0,​0),​(0,​4),​(1,​2)],​
 + [(0,​2),​(0,​4),​(2,​0)],​ #Block1Ende
 + [(0,​0),​(2,​0),​(4,​2)],​
 + [(0,​0),​(4,​0),​(2,​1)],​
 + [(2,​0),​(4,​0),​(0,​2)],​ #Block2Ende
 + [(1,​1),​(2,​1),​(3,​2)],​
 + [(1,​1),​(3,​1),​(2,​0)],​
 + [(2,​1),​(3,​1),​(1,​2)],​ #Block3Ende
 + [(1,​1),​(1,​2),​(2,​3)],​
 + [(1,​1),​(1,​3),​(0,​2)],​
 + [(1,​2),​(1,​3),​(2,​1)],​ #Block4Ende
 + [(1,​3),​(2,​3),​(3,​2)],​
 + [(1,​3),​(3,​3),​(2,​4)],​
 + [(2,​3),​(3,​3),​(1,​2)],​ #Block5Ende
 + [(3,​1),​(3,​2),​(2,​3)],​
 + [(3,​1),​(3,​3),​(4,​2)],​
 + [(3,​2),​(3,​3),​(2,​1)],​ #Block6Ende
 + [(0,​4),​(2,​4),​(4,​2)],​
 + [(0,​4),​(4,​4),​(2,​3)],​
 + [(2,​4),​(4,​4),​(0,​2)],​ #Block7Ende
 + [(4,​0),​(4,​2),​(2,​4)],​
 + [(4,​0),​(4,​4),​(3,​2)],​
 + [(4,​2),​(4,​4),​(2,​0)]] #Block8Ende
 +
 +#gewinnpos beschreibt alle Möglichkeiten,​ die einen Zug vor einer Mühle stehen.
 +#​Ausgeschlossen sind natürlich jene Züge, bei welchen ein gegnerischer Stein im Weg steht.
 +#z.B. wenn schwarz Steine bei [(0,​0),​(0,​2),​(2,​4)] hat und weiß (0,4) dazwischen besetzt.
 +</​code>​
 +
 +Die Beschreibung setzt voraus, dass man weiß, wie das Spielfeld aufgebaut ist. Deshalb hier die Mitschrift zum Prozess:
 +
 +{{ :​ws1516:​interaktives_spiel_gegen_ki:​muehletry.jpg |}}
 +
 +Da der Code auch schon für die Ansammlung an Möglichkeiten eine Mühle zu erzielen funktioniert hat, könnte er theoretisch auch für die Gewinnpositionen korrekt sein, was ich zwar bezweifle, aber vielleicht klappt er.
 +
 +<​code>​
 +'''​def pruefe_gewinnpos(farbe,​ brett):
 + u=[]
 + for situation in muehlen:
 +
 + feld1 = brett[situation[0][0]][situation[0][1]]
 + feld2 = brett[situation[1][0]][situation[1][1]]
 + feld3 = brett[situation[2][0]][situation[2][1]]
 + if feld1 == feld3 and feld3 == feld2 and feld1 != '​x':​
 + u.append(situation)
 + return u'''​
 +</​code>​
 +
 +In der TUBcloud wurde eine Mühle Version für C++ und eine für Java hochgeladen. Diese dient zur Hilfe und Orientierung,​ wenn man nicht weiter weiß.
ws1516/interaktives_spiel_gegen_ki/protokoll.1456138235.txt.gz · Zuletzt geändert: 2016/05/10 14:46 (Externe Bearbeitung)