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

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

21

24.11.2013, 19:17

Nicht allgemein für Brettspiele. Minimax ist für Nullsummenspiele zwischen 2 Parteien gedacht. Ein Brettspiel kann natürlich darunter fallen, muss aber nicht.
Was die Art der Lösung angeht, ich mag/mochte es lange Zeit mir sehr allgemeine Lösungen zu erarbeiten. Das ist ja auch das was man meist lernt. Arbeite so allgemeingültig wie möglich. Die Idee dahinter ist ja oft schönen wartbaren einfachen (wiederverwendbaren) Code zu produzieren. Die ersten Argumente zählen (dazu kommen auch noch ein paar mehr), aber das wiederverwendbar ist eigentlich unnötig. Die die schon etwas länger entwickeln können ja einfach mal zurück denken, wie oft Code nochmals an anderer Stelle für ein anderes Problem genutzt wurde. Oft ist es aufwendiger wenn ich versuche Code möglichst allgemein zu halten. Und wenn es auch nur ein paar unnötige Überlegungen vorab sind. Mit diesen muss ich mich teilweise ja einfach nicht stressen. Vor allem ist ein Code der genau auf ein Problem zugeschnitten ist vermutlich einfacher verständlich. Viele Paradigmen in der Softwareentwicklung haben ihre Vorteile, können aber auch Nachteile besitzen. Ein anderes Beispiel ist exzessiver Einsatz von Interfaces. Ich musste da schon Javaprojekte debuggen, wobei jede Klasse ein Interface implementiert hat. Das hat mit dem Debugger wirklich keinen Spaß gemacht und die Arbeit unglaublich aufgebläht. Interfaces haben natürlich ihre Berechtigung aber man soll es einfach nicht übertreiben. Einfachen und wartbaren Code kann ich ja auch anders Produzieren. Hier ist es wieder eine Geschmacksfrage, aber ich versuche mir immer mehr abzugewöhnen sehr allgemeinen Code zu schreiben und versuche mich immer mehr und mehr direkt auf mein eigentliches Problem zu konzentrieren. Wie gesagt, am Ende ist es eine Geschmacksfrage.
„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.“

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

22

24.11.2013, 19:29

Wenn es einem um effizientes Arbeiten geht ist die Kosten-/Nutzen-Analyse in diesem Fall eindeutig. Es sei denn, man plant das Spielfeld zu vergrößern. Aber selbst dann ist die einfache Lösung hier erstmal die bessere. So kann man prüfen ob das restliche Programm funktioniert, fehler Aufdecken, die die Fehleranalyse in der allgemeinen Lösung behindern könnten.

Die größten Feinde des Softwareentwicklers sind in meinen Augen zu große Schritte und der Versuch sofort alles perfekt zu machen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

23

24.11.2013, 19:42

Es geht hier aber schon noch um die Frage eines Anfängers bezüglich Tic-Tac-Toe, oder? Ihr werft hier mit Wörtern, die ihm höchstwahrscheinlich weder was sagen, noch irgendwie helfen.
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]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

24

24.11.2013, 19:48

Bambi du scheinst recht schlecht mit Kritik umzugehen. Ich habe dich lediglich korrigiert. Allgemein für Brettspiele gilt der Algorithmus nun mal nicht. Nimm das Spiel Monopoly, ist ein Brettspiel und mit Minimax kommste da nicht weiter. Wenn du dich bei Kritik angegriffen fühlst tut mir das leid, ich bin hier aber im Forum eben um zu helfen und wenn dann falsche Informationen gegeben werde und ich die Antwort kenne (oder sie meine zu kennen), dann teile ich sie mit. Wenn ich mich irre ist das möglich, ich bin ja kein Übermensch, aber wer keine Verbesserung möchte ist hier an der falschen Stelle. So denke ich zumindest. Alpha Beta Pruning ist eine Verbesserung zum Minimax Algorithmus. So wie es der Algorithmus vorsieht werden erst mal nicht mehr als 2 Parteien unterstützt. Mir geht es nicht darum, dass man irgendwelche Algorithmen umschreiben kann und so auch auf andere Probleme münzen kann. Das ist eine ganz andere Sache. Deine Information war aber nun mal falsch und dann ist es doch besser wenn es halt fix korrigiert wird, als wenn die Leute falsche Dinge lernen. Dabei brauchst du dich auch nicht bloßgestellt fühlen, ich mache ja auch Fehler.
Was die Sache mit der Allgemeinheit von Code anging, so war das einfach nur meine Persönliche Meinung zu dem Thema. Dabei ging es mir auch nicht speziell um das Problem hier bei welchem überprüft wird ob das Spiel beendet wurde. Das waren meine Gedanken dazu, wie man vorgehen kann. Du musst das nicht teilen und darfst gerne weiterhin möglichst allgemeingültig gehalten Entwickeln. Ich habe für mich gemerkt dass ich anders besser fahre und mache es halt anders. Ich zwing dir damit ja nichts auf. Meine Meinung darf ich hier allerdings trotzdem schreiben. Nur weil unter meinem Avatar Supermoderator steht bin ich hier kein Herrscher der anderen Leuten seine Meinung aufzwingen muss und vorgibt was zu tun ist. Wenn das so rüber kommt, tuts mir leid, so ist es nicht gemeint. Wenn du einen konkreten Fall sieht wo ich das mache weiß mich gern direkt darauf hin. Hier habe ich aber konkret von meiner Meinung gesprochen. So tust du das ja auch. Ich würde vorschlagen da das ganze schon wieder droht offtopic zu werden, schreib mich gern per PN an wenn dir meine Arbeit hier nicht gefällt. Können wir gern drüber sprechen.
Wenn ich in meinem Kommentaren hier Fehler mache die du selbst siehst, dann zögere nicht und weiß mich gern darauf hin. Zum Beispiel schreibst du Alpha Beta Pruning gilt für mehr als zwei Parteien. Ich sage du vertust dich, oder meinst grade nicht Alpha Beta Pruning sondern möglicherweise eine Weiterentwicklung davon. Belehr mich gern eines besseren.
„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.“

Renegade123

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

25

24.11.2013, 19:53

Stell dir für die Siegbedingung ein größeres Feld als TicTacToe vor.
Wieso sollte ich das bei einem Tic-Tac-Toe denn tun?

Gemäß dem Fall man möchte später die Größe des Spielfeldes ändern, könnte man damit den selben Algorithmus benutzen - lediglich mit anderen Parametern.
Daumenregel:
Entwickel für den Fall, den Du abdecken willst und nicht für tausend andere Fälle. Falls das mal so kommen soll, kann man es noch immer refactoren.

PS: Ich stimme NachoMan zu. Man könnte das Feld ausgehend vom letzten Zug analysieren und sich viel Rechenzeit damit sparen.
Klar. Und statt ein paar verschachtelte Schleifen kann ich dann den Code noch richtig mächtig aufblähen mit lauter Zustandsmatrizen und all dem. Totally overengineered. Speziell für einen Anfänger.


Ich gehe davon aus, dass der Threadersteller dieses Spiel zu Studienzwecke programmiert und nicht in einem Kundenauftrag. Was spricht also gegen einen mathematischen Ansatz in der Gewinnermittlung? :huh:
Liebe Grüße,
René

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

26

24.11.2013, 20:19

Es ist eine Sache mit den vorhandenen Kenntnissen irgendwie ein TicTacToe zu schreiben und eine andere ein solches Problem Mathematisch zu lösen. Ich denke die Prioritäten sollten in seinem Stadium beim Üben und Erlernen der Syntax liegen. Man muss erstmal Laufen lernen bevor man mit dem Tanzen beginnt ;(
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

27

24.11.2013, 20:33

Tut mir leid, ich verstehe den Zusammenhang nicht.
Ich sehe das aus didaktischer Sicht. Wenn es ihm Spass macht eine solche Lösung zu finden kann er das gerne tun, den meisten würde ich allerdings empfehlen sich das auf eine ToDo-Liste zu schreiben oder sich auf die zahlreichen Probleme zukünftiger Projekte zu freuen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

28

24.11.2013, 20:37

wow hier geht ja richtig was ab :D

n paar sachen hab ich jetzt erstmal geändert, zumindest schonmal kleinere sachen:
- es sollten jetzt alle while(true) schleifen durch schleifen mit brauchbaren bedingungen ersetzt sein.
- alle Variablen-bezeichnungen sind nu einheitlich auf englisch und vor globale variablen hab ich nu einfach mal n "_" vorgepackt, um diese leichter von lokalen variablen unterscheiden zu können.
- die ehemalige "Init()" methode einmal passender mit showMenu() benannt.
- die meisten kommentare gestrichen - da das meiste eben bisher zumindest in meinen augen doch selbsterklärend ist.
- das verzweigte Array durch ein mehrdimensionales ersetzt.

der code wird dann gleich wieder im ersten post von mir abgeändert :)

an eine elegantere lösung fürs drawboard und die Siegbedingungsüberprüfung wollt ich mich ransetzen wenn ich n bissl mehr zeit hab.

@ Renegade: richtig, ist für studien-/Lernzwecke. dementsprechend ist es auch ganz gut, dass mir allgemeinere Lösungen vorgeschlagen werden an denen ich mich versuchen kann, auch wenn ich mich nicht jetzt das nächste halbe jahr mit jeder möglichen allgemeinen lösung auseinander setzen will, aber immer mal so 1-2 um auch für allgemeinere lösungen n gefühl zu bekommen, ist denk ich nicht schlecht.
ansonsten sehe ichs aber auch so, wenn es mir einfach nur darum ginge das tictactoe fertig zu machen und wenns läuft läufts, ohne dabei auf irgendwas lernen bedacht zu sein würd ich es wohl so einfach halten und doch direkt die paar siegbedingungen abfragen anstatt ne allgemeine version zu finden. für tictactoe sind die 8 kombinationen noch echt schnell runtergeschrieben ohne viel aufwand.
--
hier sind n paar begriffe gefallen mit denen ich bisher noch nix anfangen kann, dann hab ich nu ja erstmal n bissl was nachzuschlagen - wenn ich mit den erklärungen die ich dazu jeweils finde nix anfangen kann, werd ich mich melden ! :D :)

bezüglich dem ansatz die Siegbedigungen immer nur in bezug auf den letzten zug zu überprüfen - liege ich da ggf in der annahme richtig dass es dann sinnvoller wäre das spielfeld in nen [3,3] array zu packen statt einfach nem [9]? und dann eben abfragen auf welcher x koordinate zuletzt gesetzt wurde und die reihe überprüfen und welche y koordinate und dazu dann eben die spalte prüfen und die diagonalen einfach bei jedem zug immer?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

29

24.11.2013, 20:53

Das kannst du im Prinzip machen wie du möchtest. Du kannst dir aus zwei Koordinaten X und Y den Index in einem eindimensionalen Array berechnen und genauso gut geht das auch anders herum. Wenn du also die Information hast, Feld 7 wurde im Array berechnet, dann kannst du dir daraus X und Y berechnen. Mal dir mal ein Tic Tac Toe Feld auf und tag die Indizes vom Array ein, also einfach 0 bis 8. Jetzt überleg dir mal wie du zwischen beiden Varianten umrechnen kannst. Wenn du nicht drauf kommst, kannst du noch mal hier schreiben, aber vielleicht siehst du es ja von alleine.
„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.“

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

30

24.11.2013, 20:57

bezüglich dem ansatz die Siegbedigungen immer nur in bezug auf den letzten zug zu überprüfen - liege ich da ggf in der annahme richtig dass es dann sinnvoller wäre das spielfeld in nen [3,3] array zu packen statt einfach nem [9]? und dann eben abfragen auf welcher x koordinate zuletzt gesetzt wurde und die reihe überprüfen und welche y koordinate und dazu dann eben die spalte prüfen und die diagonalen einfach bei jedem zug immer?

Ja und Genau!
Der Unterschied zwischen int[9] und int[3,3] besteht lediglich in der Bedienung. C# erspart es dir hier eine eigene Methode zu schreiben, die die zweidimensionale Position in eine eindimensionale umrechnet.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige