Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

1

06.05.2012, 23:35

If-else if-else Problem

Guten Abend Community,

Ich versuche zurzeit eine mehr oder weniger gute KI für mein 4Gewinnt zu basteln.
Funktioniert soweit alles ganz gut, aber ich hab ein sehr komisches Problem:

In der Konstruktion sind die wichtigeren Befehle weiter oben und die weniger wichtigen weiter unten, also dass der PC gewinnt ist ganz oben und dass er den Sieg des Spielers verhindert weiter unten. Wenn ich das aber ausprobiere und es zu einer Situation kommt, wo ich UND der PC mit dem nächsten Stein/Münze gewinnen würden, dann blockiert der PC meinen Sieg, anstatt zu gewinnen!

Der Teil des Problems:
(.Player ist die Art von Stein/Münze die auf dem Feld ist (ich weiß der Name Player passt nicht wirklich ;) ) 1 = Spieler, 2 = PC, 0 = NIX)



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
                if(Field[x][y].Player == 2 && Field[x+1][y].Player == 2 && Field[x+2][y].Player == 2 && Field[x+3][y].Player == 0 &&
                    Field[x+3][y+1].Player != 0)
                {SetPCCoin(x+3); x=8; y=7; Nothing = false;}    //Rechts setzen
                else if(Field[x][y].Player == 2 && Field[x-1][y].Player == 2 && Field[x-2][y].Player == 2 && Field[x-3][y].Player == 0 &&
                    Field[x-3][y+1].Player != 0)
                {SetPCCoin(x-3); x=8; y=7; Nothing = false;}    //Links setzen
                else if(Field[x][y].Player == 2 && Field[x][y-1].Player == 2 && Field[x][y-2].Player == 2 && Field[x][y-3].Player == 0)
                {SetPCCoin(x); x=8; y=7; Nothing = false;}      //Oben setzen
                            .
                            .
                            .
                else if(Field[x][y].Player == 1 && Field[x+1][y].Player == 1 && Field[x+2][y].Player == 1 && Field[x+3][y].Player == 0 &&
                    Field[x+3][y+1].Player != 0)
                {SetPCCoin(x+3); x=8; y=7; Nothing = false;}    //Rechts blockieren
                else if(Field[x][y].Player == 1 && Field[x-1][y].Player == 1 && Field[x-2][y].Player == 1 && Field[x-3][y].Player == 0 &&
                    Field[x-3][y+1].Player != 0)
                {SetPCCoin(x-3); x=8; y=7; Nothing = false;}    //Links blockieren
                else if(Field[x][y].Player == 1 && Field[x][y-1].Player == 1 && Field[x][y-2].Player == 1 && Field[x][y-3].Player == 0)
                {SetPCCoin(x); x=8; y=7; Nothing = false;}      //Oben blockieren
                            .
                            .
                            .


Fals ihr noch etwas wissen wollt einfach fragen^^
Danke fürs Lesen, einen schönen Abend noch und vielleicht könnt ihr mir ja weiterhelfen...

MfG Geheim!

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

06.05.2012, 23:46

Ohne den Code jetzt genauer gesehen zu haben. Du könntest mal mit dem Debugger Schritt für Schritt durchgehen und gucken warum er wann wo was macht. Ansonsten der Tipp, solche Probleme löst man oft mit der Bewertung verschiedener Felder. Du gehst jedes Feld durch und bestimmst einen Wert für dieses Feld. Zum Beispiel guckst du was passiert wenn du ganz Links rein wirfst. Dann addierst oder subtrahierst du Punkte für dieses Feld. Dann legst du dir verschiedene Regeln an, die verschiedene Punkte bekommen. Wenn du zum Beispiel einen 3er bildest gibt es +1 Punkt. Wenn du dem Gegner einen 4er verhinderst 10 Punkte und wenn du selbst einen 4er bauen kannst 100Punkte. Dann kannst du dir immer mehr Regeln ausdenken die du einbaust. Für jede Regel lässt du alle Möglichen aktuellen Züge durchlaufen und bewertest. Das könntest du dann noch kombinieren mit dem Prinzip vom Min-Max Algorithmus. Am Ende wird dann der Zug mit der höchsten Bewertung genommen. So spielt Reihenfolge von Regeln absolut keine Rolle und du hast so Sachen mit drin wie, wenn du zwei 3er bauen kannst und gleichzeitig noch den 3er des Gegners verhinderst, dann ist das besser als nur einen 3er zu machen. Einfach aus dem Grund, dass die Bewertung besser wäre.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

3

06.05.2012, 23:53

Sowas mit den Punkten werde ich dann mal machen ;)
Hab vergessen zu erwähnen, dass ich eine Art Wettbewerb mit einem Freund von mir mache: Jeder bastelt seine eigene KI und spielt dann seinen Spieler mit der KI des anderen und wir schauen wer gewinnt ;) (Kann man natürlich später auf das Punktesystem ausbauen)

Ja ich werds morgen mal mit dem Debugger genauer anschauen ;) Wundert mich aber, dass er eben zuerst blockt anstatt zu gewinnen (weil er nachdem er blockt wieder normal versucht zu gewinnen, also das funktioniert schon)

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

07.05.2012, 00:11

Mich gruselt deine Signatur "If-Schleifen-Power! " ...
If Anweisungen sind _keine_ Schleifen.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

5

07.05.2012, 14:14

So habe das Problem gelöst!
Sehr ärgerlich...

Weil ja jedes Feld durchlaufen wird, kommt er vielleicht zuerst zu dem Feld wo ich gewinnen könnte und weiß noch nicht mal dass er gewinnen kann und blockiert dann natürlich mein Feld und die Schleife ist zuende!
Einfach 2 Schleifen machen, zuerst schauen ob er gewinnt und dann blockieren ;)

@Architekt:
Ja darum hab ich sie, damit ich es mir merke :D Ist die neue jetz besser?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

07.05.2012, 15:21

Sag mal, statt der 1000 IFs da oben, die scheinbar jede einzelne Situation austesten, warum nimmst Du keinen generischen Ansatz?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

7

07.05.2012, 15:38

Damit kenne ich mich (noch) nicht aus und soviele if´s sind es ja auch nicht, ich glaube für ein 4Gewinnt reicht das?
Ist auch das erste mal, dass ich mich mit so etwas auseinandersetze, ich finde es aber ein sehr interessantes Thema und ich werde mir auch im Laufe der Zeit einige Arten ansehen, um so etwas zu lösen, aber erst mal klein und umständlich anfangen, dafür funktionierts und ich kenn mich aus ;)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

07.05.2012, 16:23

Ich habe dir ja den Tipp mit dem Bewerten der Felder gegeben. Du benötigst bei dir theoretisch mehr als deine 2 Schleifen, da es ja viel mehr Regeln gibt. Wenn du alle Regeln für alle Felder durchläufst und jedes mal den Score hinzuaddierst kannst du am Ende einfach gucken welches Feld die beste Bewertung hat und musst dich mit diesen Problemen nicht rumschlagen. Abhängigkeiten durch bestimmte Reihenfolgen von Befehlen sind meistens große Fehlerquellen. Damit wirst du noch mehrfach Probleme bekommen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

9

07.05.2012, 16:35

Die Tipps werd ich mir zu Herzen nehmen, danke euch!
Jap ich merks grad immer mehr, dass das nicht der beste Weg sein kann und man viel aufpassen muss ;)

babelfish

Alter Hase

Beiträge: 1 222

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

10

07.05.2012, 16:50

Es gibt immer mehrere Lösungsansätze für ein Problem. Wichtig ist es dass du dir selbst Gedanken dazu machst und dabei gute Tipps wie den von Schorsch mit einbeziehst. Die Lösung mit den If-Abfragen ist nicht grundsätzlich falsch, sondern nur etwas unübersichtlich und "fehleranfällig".

Werbeanzeige