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

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

11

24.11.2013, 10:25

Vllt solltest xu dir ein wenig um deine notation kuemmern. Ich verwende zb fuer globale variablen _variablename damit man gleich erkennt das die variable gloabl ist. Es gibg extra notationen fuer variablennamen wie die hungarian notation zb.


Um Gottes Willen, bitte nicht. Das ist das erste Mal in 5 Jahren, dass ich in einem Forum sehe, wie jemand einem Neuling empfiehlt die HN zu nutzen.

@OP: Bitte nicht irgendwelche Notationen nutzen, lieber Variablen sinnvoll benennen.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

12

24.11.2013, 10:39

Stell dir für die Siegbedingung ein größeres Feld als TicTacToe vor. Vier-Gewinnt ist ein gutes Beispiel. Dort wäre es noch größerer Blödsinn jedes mal jede Reihe, Spalte und Diagonale zu prüfen. Stattdessen geht man vom letzten gesetzten Stein aus und prüft nur die Reihe, Spalte und Diagonale in der er tatsächlich gelandet ist. Dort würde man wahrscheinlich eine Schleife nutzen. In TicTacToe reichen vier Bedingungen. Jeweils eine für die Spalte und die Reihe und die beiden Diagonalen sollten immer geprüft werden, da dort eine Verzweigung keinen Vorteil bringen würde.
"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?

Renegade123

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

13

24.11.2013, 16:09

Als kleinen Denkanstoß für die Gewinnermittlung:


(Link)
Es wird zwar gern erwähnt, aber irgendwie macht es keinen Unterschied, ob man in einer Schleife ausrechnet, ob irgendeine Spalte/Zeile/Diagonale zusammenaddiert 15 ergibt oder ob die gesamte Spalte/Zeile/Diagonale einem Spieler gehört. Falls doch, ich bin neugierig. Letzteres klingt für mich irgendwie auch viel mehr gerade aus gedacht als zweimal um die Ecke.



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. Ich finde die Überlegung mit dem magischen Quadrat insofern gar nicht schlecht.
Im Allgemeinen finde ich, dass es immer besser ist einem mathematischen Ansatz zu verfolgen als ein Zusammengeschustere von Bedingungen.

PS: Ich stimme NachoMan zu. Man könnte das Feld ausgehend vom letzten Zug analysieren und sich viel Rechenzeit damit sparen.
Liebe Grüße,
René

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Renegade123« (24.11.2013, 16:19)


Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

14

24.11.2013, 16:33

Zitat

Vllt solltest xu dir ein wenig um deine notation kuemmern. Ich verwende zb fuer globale variablen _variablename damit man gleich erkennt das die variable gloabl ist. Es gibg extra notationen fuer variablennamen wie die hungarian notation zb.
Ich versuche so gut es geht, globale Variablen und Pseudo-Globale via Sinnlos-Singletons zu vermeiden. (Tatsächlich habe ich bisher keine einzige globale, wenn man statische Member wie Assert::DefaultAssertionLevel oder Math::PI nicht mitzählt. Und mein einziger Singleton bisher ist ein CPUID-Objekt für FatBinaries.) Ich verwende Notationen lieber wie folgt:
  • public_member_variable - Auch für kurze temporäre wie das berühmte "i" einer Schleife.
  • _temporäre_variable - Unterstrich, damit Zuweisungen wie x=_x, bzw. x_=_x funktionieren.
  • private_protected_member_ - Der Unterstrich unterscheidet es dann von Gettern/Settern, die den nicht haben, sofern es sie gibt.
  • funktion_oder_methode - Ich betrachte Methoden Lua-mäßig als Member und Methoden als besondere Funktionen.
  • KlassenOderStructName - Gibt seltene Ausnahmen in denen sie klein_mit_unterstrich sind.
  • KonstantenNameOderStatischeMember - Konstant im Sinne von immutable/constexpr. Ich habe momentan keine statischen Member.
  • PRÄFIX__ICH_BIN_EIN_MAKRO - Und bitte mit Unterstrichen, Microsoft...
Der Vorteil von konsequenten Notationen sollte klar sein. Aber ja, verwende bitte _nicht_ die Ungarische Notation, also z.B. usX für einen Member X des Typs uint16_t. Die Information über den Typ bekommst du zu Genüge vom Quell-Code (i.d.R. Header), von der IDE, oder aus der Dokumentation der jeweiligen Lib. Da muss man nicht jetzt noch zusätzlich an jeder Stelle diese dämlichen Präfixe rein klatschen, die aus einer Zeit sind, in der das Internetz noch ArpaNet hieß und IDEs weniger konnten als der Microsoft Editor.
Im Übrigen bin ich kein Fan des Präfixes m_ für Member-Variablen, wie z.B. m_position.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

15

24.11.2013, 17:23

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.
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]

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

16

24.11.2013, 18:16

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

Weil sich daraus die einfachste Lösung ergibt. Ich gehe davon aus, dass Mr.Lowbob nicht das Spielfeld vergrößern möchte, deswegen muss der Code mit dieser Möglichkeit nicht unbedingt umgehen können. Die Umsetzung der Siegbedingung eines 3x3 Feldes ist so schnell geschrieben, dass kein Bedarf für eine Wiederverwendung besteht. Der Aufwand für eine allgemeine Lösung ist zu groß (vor allem für einen Anfänger) und in dem Fall auch sehr ineffizient.
"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?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (24.11.2013, 18:33)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

17

24.11.2013, 18:21

War das jetzt eine Antwort auf meine Frage oder die Bestätigung meiner Ansicht? :hmm:
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]

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

18

24.11.2013, 18:34

Jetzt weiß ich was du meinst. Ich habe das größere Spielfeld nur vorgeschlagen um es besser erklären zu können.
Ein bisschen Pseudocode:

C-/C++-Quelltext

1
2
3
4
bool Gewonnen(letztePosition, letzterSpieler)
{
 return diagionale1 == letzterSpieler || diagionale2 == letzterSpieler || vertikale(letztePosition.x) == letzterSpieler || horizontale(letztePosition.y) == letzterSpieler;
}

Fertig!
"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

19

24.11.2013, 18:50

Ja aber das Spielfeld ist eben nicht größer und wird es auch nie ;) Es bleibt eine Sache von ein paar Schleifen bei Tic-Tac-Toe ;)
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]

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

20

24.11.2013, 18:53

Ja, über sowas denke ich auch oft nach.
Ich mag es eigentlich, mir eine allgemeine Lösung zu überlegen, die unter beliebigen Umständen funktioniert.
Es kann dann aber sein, dass die Umstände nie geändert werden.

Werbeanzeige