Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi KI für Spiel (https://www.delphipraxis.net/2476-ki-fuer-spiel.html)

Yheeky 25. Jan 2003 13:02


KI für Spiel
 
Hi,

ich programmiere gerade ein Logikspiel. Das Design und sowas in der Art habe ich schon größtenteils fertiggestellt und bin jetzt seit gestern an der KI. Soweit klappt auch alles, nur habe ich da mal eine Frage:
Bei meinem Spiel werden Karten auf den Tisch gelegt. Jeder Spieler hat 5 Karten und - ich habe es ausgerechnet - es gibt 3^5 Möglichkeiten für den Computer, wie er die Karten legen kann bzw. soll. Nun die Frage: Muss ich diese 243 Möglichkeiten alle mit einer if-Abfrage abfragen oder wie kann ich das vielleicht besser machen. Ich weiss ja nicht, ob´s da noch ne andere Möglichkeit gibt, deswegen frage ich ja, aber so wie ich das überblicken kann, wird der KI-Code dann sehr sehr lang :) (was ich mir auch durchaus vorstellen kann, dass das normal ist). Einfach nur eine Frage aus Interesse...Hier kann mir bestimmt jemand was dazu sagen, oder?

Gruß Yheeky

chrys 25. Jan 2003 13:16

such mal im internet was ueber A* algorithmen oder auch ASTAR geschrieben.
Ansonsten kann ich dir nur empfehlen ueberhaupt mal was ueber KI oder wenn du englisch kannst halt AI zu suchen.
Es gibt auf jeden fall schon algorithmen die dein relativ einfaches problem loesen sollten.

ansonsten kannst auch noch mal heir vorbei gucken ist aber reht fortgeschrittenes AI.

http://www.gameai.com/ai.html

oder hier

http://www.gameai.com/software.html

hoffe du findest was.
kannst dich ja melden fuer fragen

PS: wenn das spiel fertig ist laesst du es mich wissen. :lol:

phlux 25. Jan 2003 14:15

Ich glaub nicht das der A* algo da was nützt, der dient doch nur zur Wegfindung, wenn ich mich nicht irre.

Yheeky 25. Jan 2003 14:17

K, danke für die Infos Chrys. Werde mich mal umsehen. Die englische Sprache sollte kein Problem darstellen 8)

Hier mal einen Auszug aus der Logik von dem Spiel. Vielleicht habt ihr ja auf Anhieb eine Idee, wie man das "besser" machen könnte:

Hier also die Tabelle mit den 3^3 Möglichkeiten. 14 Möglichkeiten fallen weg, weil sie doppelt vorkommen. Diese 13 bleiben übrig:

Code:
1.   000   a=b; a=c; b=c   1
2.   001   a=b; a<c; b<c   1
3.   010   a<b; a=c; b>c   1
4.   011   a<b; a<c; b=c   1
5.   012   a<b; a<c; b<c   1
6.   021   a<b; a<c; b>c   1
7.   100   a>b; a>c; b=c   2
8.   101   a>b; a=c; b<c   2
9.   102   a>b; a<c: b<c   2
10.   201   a>b; a>c; b<c   2
11.   110   a=b; a>c; b>c   3
12.   120   a<b; a>c; b>c   3
13.   210   a>b; a>c; b>c   3
Die 3 Zahlenkombinationen sind die Möglichkeiten. Danach kommt die Abfrage, die ich brauche, um sie in Delphi reinzubekommen und die letzte Zahl sagt mir, die wievielte Stelle ich auslesen muss.
So habe ich es in Delphi umgesetzt:

Code:
if ((StrToInt(KartenZurAuswahlSpieler2.Strings[0]) = StrToInt(KartenZurAuswahlSpieler2.Strings[1])) and
    (StrToInt(KartenZurAuswahlSpieler2.Strings[0]) = StrToInt(KartenZurAuswahlSpieler2.Strings[2])) and
    (StrToInt(KartenZurAuswahlSpieler2.Strings[1]) = StrToInt(KartenZurAuswahlSpieler2.Strings[2]))) or

   ((StrToInt(KartenZurAuswahlSpieler2.Strings[0]) = StrToInt(KartenZurAuswahlSpieler2.Strings[1])) and
    (StrToInt(KartenZurAuswahlSpieler2.Strings[0]) < StrToInt(KartenZurAuswahlSpieler2.Strings[2])) and
    (StrToInt(KartenZurAuswahlSpieler2.Strings[1]) < StrToInt(KartenZurAuswahlSpieler2.Strings[2]))) or

   ((StrToInt(KartenZurAuswahlSpieler2.Strings[0]) < StrToInt(KartenZurAuswahlSpieler2.Strings[1])) and
    (StrToInt(KartenZurAuswahlSpieler2.Strings[0]) = StrToInt(KartenZurAuswahlSpieler2.Strings[2])) and
    (StrToInt(KartenZurAuswahlSpieler2.Strings[1]) > StrToInt(KartenZurAuswahlSpieler2.Strings[2]))) or

   ((StrToInt(KartenZurAuswahlSpieler2.Strings[0]) < StrToInt(KartenZurAuswahlSpieler2.Strings[1])) and
    (StrToInt(KartenZurAuswahlSpieler2.Strings[0]) < StrToInt(KartenZurAuswahlSpieler2.Strings[2])) and
    (StrToInt(KartenZurAuswahlSpieler2.Strings[1]) = StrToInt(KartenZurAuswahlSpieler2.Strings[2]))) or

   ((StrToInt(KartenZurAuswahlSpieler2.Strings[0]) < StrToInt(KartenZurAuswahlSpieler2.Strings[1])) and
    (StrToInt(KartenZurAuswahlSpieler2.Strings[0]) < StrToInt(KartenZurAuswahlSpieler2.Strings[2])) and
    (StrToInt(KartenZurAuswahlSpieler2.Strings[1]) < StrToInt(KartenZurAuswahlSpieler2.Strings[2]))) or

   ((StrToInt(KartenZurAuswahlSpieler2.Strings[0]) < StrToInt(KartenZurAuswahlSpieler2.Strings[1])) and
    (StrToInt(KartenZurAuswahlSpieler2.Strings[0]) < StrToInt(KartenZurAuswahlSpieler2.Strings[2])) and
    (StrToInt(KartenZurAuswahlSpieler2.Strings[1]) > StrToInt(KartenZurAuswahlSpieler2.Strings[2]))) then
Vielleicht fällt euch ja was auf. Wenn ihr sonst Vorschläge oder etwas auszusetzen habt :twisted: , schreibt einfach... :lol:

Gruß Yheeky

nailor 25. Jan 2003 15:35

Mach drei lokale Variablen, in die du die Kartenwerte vorher einspeicherst, und dann mach die Abfragen!

Yheeky 25. Jan 2003 16:42

Warum? Wo liegt da der Unterschied?

Robert 25. Jan 2003 16:54

Übersicht.

Je übersichtlicher, desto einfacher zu lesen. Außerdem stimme ich zu - die StrToInt-s kosten mit jedem Vergleich kostbare Rechenzeit - vorher in ein paar kurzzeichen-Variablen (a,b,c) einlesen und DANN vergleichen...

Yheeky 25. Jan 2003 17:00

Okay, wenn ihr meint - habe ja gesagt, dass ich für jeden Hinweis dankbar bin :D. Werde das dann gleich mal einbauen, bin ja noch am Anfang...Hat sonst noch jemand Vorschläge, wie man das besser lösen könnte?

Gruß Yheeky


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz