Reversi KI
Übersicht

Gehe zu Seite Zurück 1, 2, 3, 4
neolein |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Na gut.... "Es gibt nirgends eine Regel, die verbietet, dass in einem Thread nur zwei Leute aktiv mitmachen dürften."
Wir haben keine Regel, es dürfen Alle mitmachen. Also dann eben kein Worklog. Richtig, wir erarbeiten einen Code in BlitzBasic, ich wäre sehr überrascht, wenn das in einem BlitzBasic-Forum nicht möglich sein sollte, denn dafür ist es ja da. Aber eben dafür ist das allg. Forum nicht flexibel genug, weil immer Alles wiederholt eingegeben werden muß, besser wäre es, Rechte an einen Dritten zu vergeben, damit auch er an einem bestehenden Code etwas ändern kann. Ist aber nur meine persönliche Meinung, mal sehen, ob es jetzt so gut läuft, wie Midimaster es vorgeschlagen hat. Das ist immerhin ein Kompromiß. |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
@D2006
vorneweg: Ich bin vollkommen einverstanden mit euerer Entscheidung. Es ist euer Forum! Ihr bestimmt, wohin es gehen soll. Und ihr macht eueren Job gut! ![]() an das Code-Pasting dachte ich auch als Allererstes...Aber der Nachteil wäre, das der link auf ein solches Pasting in den Posts nach einigen Tagen tot wäre. Auch das priv. Archiv scheidet leider aus, weil man dort zwar Code hochladen kann, aber ein EDIT nicht möglich ist. Durch ein erneutes Hochladen erhält man immer eine neue URL und damit wären in den Postings wieder tote Links. Das ist Schade. Das Forum könnte hier mehr Möglichkeit offerieren. Auch den Gedanke von Neolein, zwei Accounts könnten gemeinsam einen Archiveintrag bearbeiten, finde ich gut. Das wäre hilfreich. Aber sicherlich habt ihr dieses Thema schon einmal besprochen und entschieden, dem gemeinschaftlichen Code-Arbeiten im Portal nicht mehr Möglichkeiten einzuräumen? Danke auch für den Hinweis, wie es zu den 1000 Aufrufen kommt. Ich wußte nicht, dass die autom. Vorlage bei den Moderatoren da mitgezählt wird. Das relativiert ja vieles... @Neolein klar, bau es doch ein, deshalb haben wir ja das SpielFeldMalen() in eine Funktion gekapselt. Jetzt kann man nach Herzenslust darin herumändern. Es beeinflusst den eingentlichen Code garantiert nicht. Du musst aber dringen die Zufallsoptimierung beginnen! Das ginge vor! |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich dräng mich mal kurz dazwischen, da ich auch mal genau das gleiche Spiel programmiert hatte. Nur ich kannte das Spiel unter den Namen ''Othello'', welches ich dann auf BB programmiert hatte.
https://www.blitzforum.de/foru...ht=othello Nebenbei noch: Ich kannte die Spielregeln damals nicht 100%ig korrekt, was zur Folge hat, dass sobald ein Spieler keine Zugmöglichkeit hat, automatisch das Spiel beendet bzw. ausgewertet wird. Das ist in den üblichen Regeln nicht richtig. In so einem Fall spielt der Gegner weiter. Das heisst, der eine Spieler muß einmal aussetzen. Diese Möglichkeit wurde also nicht richtig interpretiert. Interessant könnte es aber dennoch sein, weil die von Midimaster beschriebene Richtungsangaben um mit nur einer Funktion auszukommen die gleich alle Richtungen bearbeiten kann auch eingesetzt wurde. Hier werden die X/Y-Richtungen in den beiden Arrays xc und yc gespeichert. Außerdem erhält jedes Feld eine Gewichtung wie wichtig es für den weiteren Spielverlauf ist, gespeichert in den Data-Zeilen die auf das 2D-Array vn übertragen wird. So ist die KI ohne Vorberechnung des weiteren Spielverlaufen durchaus in der Lage Sinnvolle Züge zu leisten. Ist somit aber auch schlagbar. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Hectic
danke für deinen Hinweis und den Link ![]() ich hab Deine Version gleich mal gespielt (und gleich verloren ![]() Die von dir erwähnte Spielregel ist daher ebenfalls bereits eingebaut. Durch den Trick, nicht alle 8 wirklichen Richtungen, sonder mutig 9 Richtungen (also auch "0,0") zuzulassen ist mein Code wahrscheinlich etwas eleganter und schlanker als deiner. Aber der wirkliche Hammer ist die KI von dir! Dein "Computer" spielt wirklich gut! Wie hast du das ermittelt? Ich werde mich mal daran machen, deine KI in unseren Code zu übertragen. Unser Code ist so konzipiert, dass man schnell verschiedene KI's gegeneinander antreten lassen kann. Es gibt keine Unterscheidung Mensch - Computer. So kann man auch Computer-Computer spielen. So wie ich es sehe, ist es eine Tabelle mit Werteinschätzungen der einzelnen Spielfelder. Was ich noch nicht verstehe, du rechnest da was negatives in die Felder rein. Die scheinen bei dir also nicht nur 0,1 oder 2 sein zu können. Verwendest du sie als eine Art "Zwischenspeicher"?. Was ich auch noch nicht so blicke: Fliessen in diese Entscheidung auch die zu gewinnenden Steine mit ein, oder wird nur der neue Setzpunkt alleine für sich betrachtet? |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Klar, es wird praktisch auch hier kein Unterschied zwischen den Spieler oder KI gemacht. Einzig den Fehler hab ich gemacht, dass zwei Variablen in der Funktion computer statisch waren. Setzt man diese auf einen variablen Parameterwert, so wird das ganze auch KI vs. KI spielbar.
Das KI-Prinzip beruht einfach nur darauf, dass bestimmte Felder eher gemieden bzw. gevorzugt werden. Jedes Feld hat also eine art Punkte, die zusätzlich mit den einzunehmenden Spielsteinen addiert werden. Je nachdem welches Feld geprüft wird kommt also die Summe einzunehmender Gegenspielersteite + Die Punktzahl des aktuellen Spielfeld (siehe Vor/Nachteile-Tabelle). Die KI spielt somit ~relativ~gut~, ohne Spielkombinationen speichern und verwerten zu müssen. Lediglich die augenblickliche Situation wird berechnet. Der große Nachteil bei so einer KI ist einfach, dass das Spielprinzip nach mehreren Spielen durchschaut wird. Letztendlich gewinnt der, der als zweites dran kommt. Denn der Spielstarter muß somit als erstes aus dem zu vermiedenen Spielbereich ein Stein setzen, wodurch der andere dann schon mal vorsorglich den Rand anspielen kann. Diese sind nämlich schwerer einzunehmen. Besonders bevorzugt werden die Ecken... KI vs. KI Code: [AUSKLAPPEN] ; Das Programm darf frei verwendet werden
; Programmautor: Darko Najman, 04.08.2005 ; Othello Version 1.1 ; Graphics 320,320,16,2 SetBuffer BackBuffer() ClsColor 120,120,120 AppTitle "Othello" ;Variablendeklarationen Global x%=0 ;Schleifenvariable X-Spielfeld Global y%=0 ;Schleifenvariable Y-Spielfeld Global q%=0 ;Allgemeine Schleifenvariable Global w%=0 ;Allgemeine Schleifenvariable Global ok%=0 ;Fehlervariable zum finden Global mx%=0 ;Maus-X-Spielfeldposition Global my%=0 ;Maus-Y-Spielfeldposition Global ic%=1 ;Spielmodus bestimmen Global gn%=0 ;Geht noch ein weiterer Zug Global s1%=0 ;Spielwertzähler Spieler Global s2%=0 ;Spielwertzähler Computer Global cx%=0 ;Computer X-Position Global cy%=0 ;Computer Y-Position Global ct%=0 ;Computer Treffpunkte ;Spielfeld Dim xy%(9,9) xy(4,4)=1 xy(5,4)=2 xy(4,5)=2 xy(5,5)=1 ;Koordination X Dim xc%(7) xc(0)=0 xc(1)=1 xc(2)=1 xc(3)=1 xc(4)=0 xc(5)=-1 xc(6)=-1 xc(7)=-1 ;Koordination Y Dim yc%(7) yc(0)=-1 yc(1)=-1 yc(2)=0 yc(3)=1 yc(4)=1 yc(5)=1 yc(6)=0 yc(7)=-1 ;Vor/Nachteile Dim vn%(9,9) ;Sprungmarke setzen Restore vornachteile ;Vor/Nachteiletabelle einlesen For y=0 To 9:Read vn(0,y),vn(1,y),vn(2,y),vn(3,y),vn(4,y),vn(5,y),vn(6,y),vn(7,y),vn(8,y),vn(9,y):Next ;Zufallsgenerator SeedRnd MilliSecs() ;Level Zeichnen zeichnen() ;Beginerentscheid ic=Rand(1,2) finden(ic) Delay 500 ;HAUPTSCHLEIFE While Not KeyHit(1) ;Computerspielmodus If ic=2 Then ;Computer spielen computer(2) ;Level Zeichnen zeichnen() ;Für Benutzermodus finden(1):ic=1 End If ;HIER SPIELT DIE KI DEN SPIELER If ic=1 Then ;Computer spielen computer(1) ;Level Zeichnen zeichnen() ;Für Benutzermodus finden(2):ic=2 End If ;HIER SPIELT DER SPIELER DEN SPIELER ; ;Benutzerspielmodus ; If ic=1 Then ; ; ;Maus erfassen ; mx=MouseX()/32 ; my=MouseY()/32 ; ; ;Maus einschränken ; If mx>9 Then mx=9 ; If my>9 Then my=9 ; ; ;Wenn Auswahl mit Maus getroffen ; If MouseHit(1) And xy(mx,my)<0 Then ic=2:steine(mx,my,1) ; ; ;Level Zeichnen ; zeichnen() ; End If Wend ;Wer gewonnen finden(1) ;Spiel beenden beenden(0) ;COMPUTER-KI Function computer(wer) cx=0 cy=0 ct=0 ;Vermenschlichung Delay 100 ;Möglichkeit finden finden(wer) ;Möglichkeiten spielen For x=0 To 9 For y=0 To 9 If xy(x,y)<0 Then ;Vorteile sichern xy(x,y)=xy(x,y)-vn(x,y)*1.5 ;Spielentscheidung festlegen If ct>xy(x,y) Then cx=x:cy=y:ct=xy(x,y) If ct=xy(x,y) Then If Rnd(0,1)>0.5 Then cx=x:cy=y:ct=xy(x,y) End If Next Next ;Steinreihen setzen steine(cx,cy,wer) End Function ;ZEICHNEN Function zeichnen() Cls ;Spielsteine zeichnen For x=0 To 9 For y=0 To 9 Color 080,080,080:Rect x*32,y*32,32,32,0 If xy(x,y)=1 Then Color 240,240,240:Oval 2+x*32,2+y*32,28,28,1 If xy(x,y)=2 Then Color 000,000,000:Oval 2+x*32,2+y*32,28,28,1 If xy(x,y)<0 Then Color 140,140,140:Rect 6+x*32,6+y*32,20,20,0;:Color 0,0,0:Text 2+x*32,2+y*32,Abs(xy(x,y)) If ic=1 Then Color 240,240,240:Rect mx*32,my*32,32,32,0 Next Next ;Anzahl Steine anzeigen If MouseDown(2) Then Color 080,080,080:Rect 137,24,45,15,1 Color 255,255,255:Rect 136,23,47,17,0 Text 139,25,Right$("00"+s1,2)+"/"+Right$("00"+s2,2) End If Flip End Function ;MÖGLICHKEITEN Function finden(s) ;Für Spielende bereiten gn=0:s1=0:s2=0 ;Spielfeld überprüfen For x=0 To 9 For y=0 To 9 ;Alte Möglichkeit löschen If xy(x,y)<0 Then xy(x,y)=0 ;Spielsteine zusammenzählen If xy(x,y)=1 Then s1=s1+1 If xy(x,y)=2 Then s2=s2+1 ;Eventuelle Möglichkeit prüfen If xy(x,y)=0 Then ;Alle 8 Richtungen prüfen For q=0 To 7 ;Richtung bis Spielfeldende ok=0:For w=1 To 9 ;Nur wenn kein Spielfeldende If Not x+xc(q)*w<0 Then If Not x+xc(q)*w>9 Then If Not y+yc(q)*w<0 Then If Not y+yc(q)*w>9 Then ;Spielsteinmöglichkeit prüfen If xy(x+xc(q)*w,y+yc(q)*w)=0 Then ok=-1 If xy(x+xc(q)*w,y+yc(q)*w)<0 Then ok=-1 If xy(x+xc(q)*w,y+yc(q)*w)=3-s And ok<>-1 Then ok=1 If xy(x+xc(q)*w,y+yc(q)*w)=s And ok=1 Then gn=1:xy(x,y)=xy(x,y)-w+1 If xy(x+xc(q)*w,y+yc(q)*w)=s Then ok=-1 End If End If End If End If Next Next End If Next Next ;Keine Möglichkeiten If gn=0 Then beenden(s) End Function ;SPIELSTEINE ZEICHNEN Function steine(x,y,s) ;Ersten Stein setzen xy(x,y)=s ;Alle 8 Richtungen prüfen For q=0 To 7 ;Richtung bis Spielfeldende ok=0:For w=1 To 9 ;Nur wenn kein Spielfeldende If Not x+xc(q)*w<0 Then If Not x+xc(q)*w>9 Then If Not y+yc(q)*w<0 Then If Not y+yc(q)*w>9 Then ;Spielsteinmöglichkeit prüfen If xy(x+xc(q)*w,y+yc(q)*w)=0 Then ok=-1 If xy(x+xc(q)*w,y+yc(q)*w)<0 Then ok=-1 If xy(x+xc(q)*w,y+yc(q)*w)=s And ok=0 Then ok=1 End If End If End If End If ;Nur bis Reichweite der Richtung If ok=1 Then For w=1 To 9 ;Nur wenn kein Spielfeldende If Not x+xc(q)*w<0 Then If Not x+xc(q)*w>9 Then If Not y+yc(q)*w<0 Then If Not y+yc(q)*w>9 Then If xy(x+xc(q)*w,y+yc(q)*w)=s Then ok=-1 If ok=1 Then xy(x+xc(q)*w,y+yc(q)*w)=s End If End If End If End If Next End If Next Next End Function ;SPIEL BEENDEN Function beenden(s) ;Aktuelles Bild zeigen Flip:Delay 1000 ;Bild verdunkeln Color 0,0,0 For q=-320 To 320 Step 2 Line q,0,q+320,320 Next ;Texthintergrund Color 40,40,40 Rect 0,25,320,15,1 Rect 0,57,320,15,1 Rect 0,89,320,15,1 Rect 0,121,320,15,1 Rect 0,217,320,15,1 Rect 0,249,320,15,1 Rect 0,281,320,15,1 ;Informationsausgabe Color 255,255,255 If s=0 Then Text 0,25,"Spiel abgebrochen, Spiel verloren" If s=1 Then Text 0,25,"Sie haben keine Möglichkeiten mehr" If s=2 Then Text 0,25,"Computer hat keine Möglichkeiten mehr" Text 0,57,s1+" Spielsteine Spieler" Text 0,89,s2+" Spielsteine Computer" If s1<s2 Then s1=0:s2=1:Text 0,121,"Sie haben verloren" If s>0 And s1>s2 Then s1=1:s2=0:Text 0,121,"Sie haben gewonnen" If s=0 And s1=>s2 Then s1=0:s2=1:Text 0,121,"Warum tun Sie sowas?" If s1=s2 Then s1=0:s2=0:Text 0,121,"Das Spiel ist unentschieden" ;Prüfen ob Spielstände verfügbar If FileType("othello.dat")=1 Then ;Bisherige Spielstände lesen othello=ReadFile("othello.dat") s1=s1+ReadInt(othello) s2=s2+ReadInt(othello) CloseFile othello End If ;Bisherige Ergebnisse anzeigen Text 0,217,s1+" Spiele gewonnen" Text 0,249,s2+" Spiele verloren" If (s1+s2)>0 Then Text 0,281,100/(s1+s2)*s1+"% aller Spiele gewonnen" ;Neue Werte in Datei schreiben othello=WriteFile("othello.dat") WriteInt othello,s1 WriteInt othello,s2 CloseFile othello ;Bild zeigen Flip ;Warten auf Reaktion FlushKeys WaitKey End End Function .vornachteile Data 9,2,7,7,7,7,7,7,2,9 Data 2,0,2,2,2,2,2,2,0,2 Data 7,2,4,4,4,4,4,4,2,7 Data 7,2,4,4,4,4,4,4,2,7 Data 7,2,4,4,0,0,4,4,2,7 Data 7,2,4,4,0,0,4,4,2,7 Data 7,2,4,4,4,4,4,4,2,7 Data 7,2,4,4,4,4,4,4,2,7 Data 2,0,2,2,2,2,2,2,0,2 Data 9,2,7,7,7,7,7,7,2,9 |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
neolein |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@hectic - die KI von Othello ist doch etwas anders, aber mit dem anderen Wissen könntest du dein Spiel vielleicht fortsetzen.
1. Das Feld muß 8x8 groß sein 2. Schwarz fängt immer an, daher hat weiß, bei einem normalen Spiel, wo jeder abwechelnd setzt den Vorteil des letzten Zuges. 3. Die Ränder und sogar die Ecken sind nicht in jedem Fall von Vorteil, sie können sogar bei bestimmten Konstellationen von Nachteil ) sein (Stichwort Stoner Trap oder Swindle) ebenso ist die Maximumstrategie zu vermeiden, d.h. möglichst viele Steine des Gegners umzusetzen. Die einzig sinnvolle Strategie für den Anfang ist, die Anzahl der Züge des Gegners einzuschränken und die eigene zu erhöhen, deswegen MUß in die KI eine Vorausberechnung in den nächst höheren Ebenen stattfinden. Ich gebe nur die Stichworte Mobilität, Tempo, Quit Moves, Waiting Moves und Parität, gerade und ungerade Lücken. Das mit den C- und X- Feldern (z.B. a2, b1, b2) ist sicherlich richtig, es gibt aber auch hier Ausnahmen. Ich wollte eigentlich noch nicht in die Tiefen der KI gehen, sondern nur vermeiden, daß wir womöglich von unserem Kurs abkommen, wenn wir etwas Neues in unseren Code implementieren. Da ich schon X Programme kenne, seit 10 Jahren spiele (bei den dt. Meisterschaften 2006 immerhin auf Platz 8 ![]() Zur Maximumstrategie hier ein berühmtes Beispiel, wer gewinnt? Die Function FindeAlleLeeren() habe ich angefangen, aber ich glaube ich muß passen, hier ist mein erster "Entwurf": Code: [AUSKLAPPEN] Function SpielerSetzt() ZugFestlegen Methode(Spieler) MausX=ZufallX MausY=ZufallY If EsIstHierErlaubt(MausX,MausY,Spieler) Feld(Ebene,MausX,MausY)=Spieler DebugLog "Spieler " + Spieler + " setzt auf " + MausX + "/" + MausY AllesDrehen(MausX,MausY,Spieler) Spieler=3-Spieler DebugLog "bald ist Spieler " + Spieler + " dran" ; dieser Teil stellt später fest, ob der gegner im anschluss überhaupt ziehen kann FindeAlleLeeren If AnzahlLeere=0 DebugLog "(SpielerSetzt) Gegner " + Spieler + " kann nicht" Spieler=3-Spieler FindeAlleLeeren If AnzahlLeere=0 DebugLog "(SpielerSetzt) Auch Gegner " + Spieler + " kann nicht" SpielEnde=1 EndIf WaitKey EndIf EndIf End Function Function FindeAlleLeeren() For Such.LeerTyp = Each LeerTyp Delete Such Next For X=1 To 8 For Y=1 To 8 If EsIstHierErlaubt(X%,Y%,Spieler) Neu.LeerTyp= New LeerTyp Neu\X= X Neu\Y= Y AnzahlLeere% = AnzahlLeere + 1 EndIf Next Next ;For Such.LeerTyp = Each LeerTyp ; RotX=Such\X ; RotY=Such\Y ;....entscheiden, ob dies der nächste Zug wird. ;Next End Function |
||
- Zuletzt bearbeitet von neolein am Mi, Feb 10, 2010 20:54, insgesamt 8-mal bearbeitet
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
die Typ-Definition ist richtig, steht aber immer ganz oben im Programm
Beim finden aller leeren Felder scannst du das ganze spielfeld durch BlitzBasic: [AUSKLAPPEN] For X=1 To 8 erst, wenn diese Bedingung erfüllt ist, legst du einen neuen Eintrag in der Liste an: BlitzBasic: [AUSKLAPPEN] Neu.LeerTyp= New LeerTyp Das Anlegen hast du richtig gemacht, aber eben nicht 60 auf einmal! Dadurch zeigt auch AnzahlLeere% später genau die gefundene Anzahl an. Da du die FindeAlleLeeren() ja mehrfach aufrufen wirst, ist es noch wichtig zu Beginn der Function die alte Liste vom vorherigen Mal zu leeren: BlitzBasic: [AUSKLAPPEN] For Such.Leere = Each Leere Die letzten 3 Zeilen sind Unsinn. Wozu hattest du sie gedacht? Erst später, dort wo jetzt der einfache Zufall ( =Rand(1,8)...) steht, greifst du ein Element aus der Liste heraus, oder arbeitest sie alle systematisch durch. BlitzBasic: [AUSKLAPPEN] For Such.Leere = Each Leere Hectic-KI Bitte mach das nicht gleich nieder! Der Vorteil von Hectic's KI ist ihre Einfachheit. Und sie ist auf jeden Fall besser als unser aktueller Zufalls-Algo. In einem zukünftigen Spiel würde ich sie auf jeden Fall als eine der Levelstufen aufnehmen wollen. Auch in einem System mit vielen Ebenen werden wir über seinen Ansatz einer Feldbewertung glücklich sein. Vielleicht wird es ja bei dir darauf hinauslaufen, für jede Situation eine neue Feldbewertung aufzustellen. Dass ändert aber nichts daran, dass wir diese Situation wahrscheinlich wieder mit Hectics Code-Algo beschreiben werden. |
||
neolein |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
OK, lass uns Hectics KI mit einbauen... aber langsam OK? es ist schon jetzt schwer am Ball zu bleiben, wenn da nicht die Familie wär.... ![]() also ich habe im letzten Beitrag den Code für SpielerSetzt() und FindeAlleLeeren() aktualisiert, das Spiel läuft zwar, aber meine Vermutung ist ziemlich vage, daß der Code so richtig ist. Den Type LeerTyp Field X% Field Y% End Type habe ich ganz an den Anfang des Codes gesetzt. Ich habe außerdem im allerersten Beitrag den Gesamtcode so geändert, daß jetzt alle Reihen und Spalten beschriftet sind, das mit den Spalten (A-H) würde ich allerdings gerne eleganter hinbekommen (auch in einer Schleife, wie die Reihen 1-8). Im Gesamtcode sind noch nicht die neuen Funktionen SpielerSetzt() und FindeAlleLeeren() implementiert. Frage, können wir IstEsHierErlaubt() in EsIstHierErlaubt() umbenennen, denn sonst klingt es wie eine Frage. Wenn IstEsHiererlaubt() zutrifft dann wäre mir EsIstHierErlaubt() lieber. |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vernünftige Idee!
Da du ja selbst ja schon bei den Codes von mir etwas ruderst, aber ja unbedingt deine eigene KI schreiben willst, wäre der Einbau sicherlich eine gute Vorbereitung und Übung. Beschriftung Eine elegantere Beschriftung machts Du mit der Funktion Chr$(i) und i läuft von 65 bis72 Umbenennen Du kannst natürlich jede Funktion umbenennen, aber ist das Wesen dieser Funktion nicht wirklich eine "Anfrage"? BlitzBasic: [AUSKLAPPEN] If IstEsHierErlaubt() Then... Wir nennen es einfach um! Es heißt jetzt: EsIstHierErlaubt() Deine FindeLeere() Ist fast perfekt. Allerdings hat der Zufall in ihr nichts mehr zu suchen. Der Sinn eines neuen Listeneintrags Leer.LeerTyp ist es ja, sich die Koordinaten X% und Y% zu merken, bei denen EsIstHierErlaubt() zutraf. Da spielt Zufall noch keine Rolle. Wir sammeln ganz ordentlich alle zutreffenden Koordinatenpaare. Also muss es heißen: BlitzBasic: [AUSKLAPPEN] Neu\X= X Der Teil BlitzBasic: [AUSKLAPPEN] For Such.LeerTyp = Each LeerTyp ist grundsätzlich ebenfalls schon richtig, doch darf er nicht schon in der FindeAlleLeeren() abgearbeitet werden, weil dies den Arbeitsauftrag der Funktion überschreitet. Die Entscheidung fällt erst später in einer KI. |
||
- Zuletzt bearbeitet von Midimaster am Fr, Feb 12, 2010 15:39, insgesamt einmal bearbeitet
neolein |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
So, die Formel zur Spaltenbeschriftung ist
Code: [AUSKLAPPEN] For i = 65 To 72 Text Xpos,25,Chr$(i) Xpos = Xpos + 50 Next Zu mehr bin ich nocht leider nicht gekommen ![]() Cyrano ist ein gutes & bekanntes Reversi Trainings Tool; "Debutant" ist leicht, auf "Amateur" kann man es noch gut schlagen, bei "Fort" braucht man schon viel Konzentration. In jedem Fall ist es ein gutes Beispiel zur Veranschaulichung der Strategie |
||
Gehe zu Seite Zurück 1, 2, 3, 4
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group