Autor Beitrag
MartinPb
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 698



BeitragVerfasst: Do 08.07.04 13:15 
Vor ein paar Jahren hatte ich die Idee für ein Spiel. Dieses Spiel hab ich sogar umgesetzt, allerdings nur als Brettspiel. Dieses Spiel hat sogar einige Fans in meinem Bekanntenkreis. Nun wurde ich gefragt, weil ich nun programmieren kann, wieso ich das Spiel nicht für den Computer umsätze.

Das Spielfeld besteht aus eine bestimmten Anzahl Hexfelder. Hier das Brett

Bild

Ich könnte mir vorstellen, daß die Brettgröße bei der Computerversion variabel sein könnte.

Wie man sieht ist die Anzahl der wagerechten Felder nicht gleich. Oben und unten sind es wenige, zu mitte hin sind es mehr. Jetzt überlege ich wie ich die Felder ansprechen kann. Es geht hier um die KI. Wenn ich eine Computervariante des Spiels mache, dann wird man auch gegen den Computer spielen wollen. Wenn ich als in irgendeinem Feld bin, so muß ich wissen was um mich herum los ist. Bei einem Schachbrett habe ich mein zweidimensionales Aray mit Feldern von 1 bis 8 und A bis H. Nun überlege ich wie ich es bei meinem Spiel machen soll. Wie schon gesagt ist die Anzahl der Felder pro Reihe nicht gleich, so daß ich sie nicht zweidimensional zuordnen kann. Nur wie kann man ein Brettspiel in Hexfeldform umsätzen.

Das einzige was mir bisher einfällt ist ein einfaches eindimensionales Array Record. Jedes Feld hat seine Nummer und sechs weitere Variablen, in denen die Nummern der Nachbarfelder gespeichert ist. Das Feld 24 weiß z.B., daß sein Nachbar oben (Nord) das Feld 15 ist. Sonst weiß daß Feld nicht wo es sich innerhalb des Brettes befindet. Die KI würde also nicht die Position der Steine auf dem Brett analysieren, da es nicht wüßte in welcher Anordnung zueinander die Steine liegen, sondern würde die Steine in alle sechs Richtungen ziehen lassen (das ganze mal alle Steine) und würde den besten Zug nehmen.

Das ist das einzige was mir bisher eingefallen ist. Kein zweidimensionales Array, wo ich die Position der Steine zueinander analysieren kann, sondern ein eindimensionales Array, wo ich Probezüge mache.

Bevor ich aber loslege, will ich mich noch über andere Möglichkeiten informieren. Wer kennt sich mit der Art der Spiele aus und weiß wie sonst die bei dieser Art der Spiele verfahren wird?

Hinweis: Diese Frage, vorausgesetzt ich kriege keine Antworten, will ich nach und nach auch in anderen Foren stellen.

_________________
Gruß
Martin
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 08.07.04 16:57 
Zitat:
Wie schon gesagt ist die Anzahl der Felder pro Reihe nicht gleich, so daß ich sie nicht zweidimensional zuordnen kann.


Warum nicht? Schließlich könntest du die nicht vorhandenen Felder aussparen, die könnten ja in einer Liste stehen. Und die Zeilen könnten doch so sein, dass beispielsweise die untereinander stehenden Felder in zwei Zeilen stehen, zwischen denen eine Zeile Platz ist, und das seitlich "dahineinversetzte" Feld könnte in dieser Leerzeile stehen.

Bild: www.css-berlin.com/Dateien/hg.gif

Dann wärs auch einfach die benachbarten Felder zu finden...

Zitat:

Hinweis: Diese Frage, vorausgesetzt ich kriege keine Antworten, will ich nach und nach auch in anderen Foren stellen.


Das ist klar, du bist nur der einzige, der das bisher erwähnt hat :mrgreen:
(soweit ich weiß...)
sourcehunter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 482

Win XP | Suse 10.1
Delphi 2005 Pers.
BeitragVerfasst: Do 08.07.04 20:28 
Wenn jedes Feld weiß, was seine Nachbarn sind, dann ist doch alles in Ordnung, du lässt den Computer bis zu einer bestimmten Tiefe (Entfernung) suchen und dann nimmst du das beste Ergebnis. So wird das überall gemacht, das beste Beispiel ist Schach. Du musst die Suchtiefe sinnvoll festlegen, so, dass der Computer sich nicht totrechnet und so, dass er keinen taktischen nachteil hat.

_________________
Linux und OpenSource rulez!
MartinPb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 698



BeitragVerfasst: Fr 09.07.04 00:26 
jaenicke hat folgendes geschrieben:
Warum nicht? Schließlich könntest du die nicht vorhandenen Felder aussparen, die könnten ja in einer Liste stehen. Und die Zeilen könnten doch so sein, dass beispielsweise die untereinander stehenden Felder in zwei Zeilen stehen, zwischen denen eine Zeile Platz ist, und das seitlich "dahineinversetzte" Feld könnte in dieser Leerzeile stehen.


Mir ist schon klar, daß ich irgendwie ein zweidimensionales Feld erstellen könnte, aber eben nur irgendwie. Und irgendwie will ich das nicht machen. Die Felder sind nun mal sechseckig und die Reihen haben unterschiedliche Anzahl Felder. Ohne eine Umrechnung mit Sonderregeln wird das nicht klappen. Ich hab mir da schon meine Gedanken gemacht. Ich glaube auch nicht, daß andere Hexfeldspiele zweidimensional arbeiten.

Allerdings wollte ich weniger einen Vorschlag. Vielmehr war die Frage ob einer bereits Erfahrungen besitzt, d.h. wenn schon Vorschläge, dann solche die schon in der Praxis angewendet werden.

_________________
Gruß
Martin
thebe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

WinXP Home
D6 Enterprise
BeitragVerfasst: Fr 09.07.04 02:39 
Ich würd ma stark tippen das man pro Feld ne eigene Klasse erstellt. In der Klasse is dann nen Array[1..6] of ^TFeldKlasse. In der Klasse wird dann auch abgespeichert wo der erste Eckpunkt des Sechseckes ist und dann von dort aus gezeichnet wird bzw. dort dann eine Grafik auf den Canvas hinkopiert wird. Weiter kannst Du in dieser Klasse dann auch abspeicher was da an Figuren draufstehen und falls diese Figuren sich dann auch noch bewegen sollen, kannst Du mit dieser Variante sogar recht einfach den A*-Pathfinging Algorithmus anwenden.

Bei dieser Variante musst Du dann nur aufpassen das beim Erstellen des Spielfeldes die Felder die Nachbarn zugewiesen kriegen und auch die richtigen X/Y Werte.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 12.07.04 11:59 
Zitat:
Vielmehr war die Frage ob einer bereits Erfahrungen besitzt, d.h. wenn schon Vorschläge, dann solche die schon in der Praxis angewendet werden.


Das hab ich nur nicht erwähnt :roll: , aber ich hab diese Methode bei einem polygonalen MineSweeper angewendet... :wink:

Und obwohl das mit weiteren Berechnungen verbunden war, war das einfacher und schneller, weil man dann die Nachbarn direkt ansprechen kann, anstatt diese irgendwie zu speichern...

Zumal in deinem Fall die Ausnahmen relativ einfach zu definieren sind.
sourcehunter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 482

Win XP | Suse 10.1
Delphi 2005 Pers.
BeitragVerfasst: So 18.07.04 21:04 
@jaenicke

Hast du dein Minesweeper irgendwo zum download?

_________________
Linux und OpenSource rulez!
thebe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

WinXP Home
D6 Enterprise
BeitragVerfasst: Mo 19.07.04 13:04 
Hab mich mal bisserl hingesetzt.
Mein Ansatz:

user defined image

Vorteile:

- Zugriff über 2D Array der Felder
- X/Y Koordinaten der Felder sind durch Algorithmus berechenbar anhand der Indizes
- Nachbarn sind auch durch Algorithmus berechenbar anhand der Indizes
- Beide Berechnungen sind dynamisch, sprich es ist egal wie viele Reihen / Spalten Du an Feldern hast, die Formeln bleiben immer die gleichen

Nachteile:

- Du musst abspeichern welche Felder inaktiv sind (grau unterlegt) und welche nicht und je nachdem die Felder zeichnen, was aber denke ich kein soooo großes Problem darstellen sollte.

MfG

- Thebe

PS: Poste doch einfach mal die Brettspiel Idee hier rein, die interessiert mich doch schon.