Preview: Mein Tutorial::TicTacToe
-
?: mag ich net.
Ich schon.
Allerdings bevorzuge ich, die einzelnen Teile nochmal mit Klammern zu trennen:// Übrigens, ohne '?' könntest du hier kein const verwenden. const int x = (bla == blubb) ? (17) : (23);
-
Optimizer schrieb:
?: mag ich net.
Ich schon.
Allerdings bevorzuge ich, die einzelnen Teile nochmal mit Klammern zu trennen:// Übrigens, ohne '?' könntest du hier kein const verwenden. const int x = (bla == blubb) ? (17) : (23);
const int x = (bla==blubb)["\21\27"];
-
Hö? Kenn ich gar nicht. Wo ist der Vorteil gegenüber dem '?' ?
-
Irgendwie scheint mir das ganze Projekt - nach dem ersten Überfliegen - reichlich knapp dokumentiert?
-junix
-
volkard schrieb:
const int x = (bla==blubb)["\21\27"];
-
Optimizer schrieb:
Hö? Kenn ich gar nicht.
der arrayzugriff auf ein stringliteral ist ja auch mit der weisheit
a[b]==*(a+b) und a+b==b+a folglich a[b]==b[a] obfuscated.Optimizer schrieb:
Wo ist der Vorteil gegenüber dem '?' ?
beides schlecht, ich hab nur "Übrigens, ohne '?' könntest du hier kein const verwenden" widerlegt.
-
junix schrieb:
Irgendwie scheint mir das ganze Projekt - nach dem ersten Überfliegen - reichlich knapp dokumentiert?
-junixmacht gar nix. guter code braucht keine kommentare.
-
volkard schrieb:
const int x = (bla==blubb)["\21\27"];
Warum so kompliziert? Wie wärs mit
const int x = "\21\27"[bla==blubb];
Für viele dürfte das noch eher verständlich sein...
-
volkard schrieb:
als der erste bildschirm voll ist schonmal kommentar...
Jo - aber was soll ich sonst mit der LGPL Lizenz machen?
kann dein filesystem keine groß-kleinschreibung?
Was verwendest du denn?
Stimmt - Name der Header == Name des Typen - klingt vernünftigWie sieht es mit Dateien ohne Klassendefinition aus, zB main.cpp?
void invalidPosition() { do_invalidPosition(); }
kann darin keinen sinn ergründen. warum die do_-sachen?
Ich dachte ich Overengineere mit dem Template Method Pattern um uU noch ein Logging oder ähnliches.
Ich dachte mir eigentlich - kann ja nix Schaden... Oder schadet es doch?
while(1)
gibts auch nicht. heißt while(true) wenn du pascaller bist oder als c++-er for(;;). while(1) könnte ein basic-hase machen, der zu lange c machte.
ich mach immer while(1)
?: mag ich net.
Type enemy=search^(PLAYER_1^PLAYER_2);
Was spricht gegen ?: in diesem Fall?
einType enemy; if(search==PLAYER_1) enemy=PLAYER_2; ...
Kann ja nicht die Lösung sein, oder?
Optimizer schrieb:
Übrigens, die KI ist lausig.
Hast du Interresse daran, dass ich mich an einer AIPlayer-Klasse versuche?Natürlich. Darauf ist das Design ja ausgelegt.
Allerdings muss man dann das Menü noch etwas anpassen...@junix:
Ich habe überlegt ob ich es sehr ausführlich dokumentieren sollte, damit es Anfänger leichter verstehen. Allerdings bin ich zu dem Schluss gekommen: sie sollen es lieber selber 'rausfinden' und sehen wie gut lesbarer Code keine unnötigen Kommentare braucht.Deshalb will ich ja auch, dass ihr mir alle meine Fehler aufzeigt
-
Shade Of Mine schrieb:
volkard schrieb:
als der erste bildschirm voll ist schonmal kommentar...
Jo - aber was soll ich sonst mit der LGPL Lizenz machen?
hast doch eh nicht die ganze lizenz drin im header.
aus
* AUTHOR: Toni Schornboeck toni@schornboeck.net
* PROJECT: TicTacToe
* (c) 2004 by Toni Schornboeck
würde ich machen
(c) 2004 by Toni Schornboeck toni@schornboeck.netist dieser passus notwendig?
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
wenns doch eh in der LGPL nochmal steht, daß da keine garantie drauf ist?ich mach meine files einfach mit (c) zu. wenn die dann in falsche hände gerät,
isse halt unverwertbar. dann reicht doch im projet eine datei, die das
projekt mit allen files in die LGPL stellt, oder?ein copyleft-vermerk würde es beim tic-tac-toe aber auch tun.
kann dein filesystem keine groß-kleinschreibung?
Was verwendest du denn?
WinXP, das kann groß-kleinschreibung. ich mach dateinamen wie die klassennamen, seit es geht, also bei mir seit dem umstieg von dos auf win95.
Stimmt - Name der Header == Name des Typen - klingt vernünftig
Wie sieht es mit Dateien ohne Klassendefinition aus, zB main.cpp?die bleiben klein. klassen schreib ich groß und funktionen klein. so sehe ich, daß in der datei BitField.cpp die implemetierung einer klassse steht, und in der bitwise.h nur funktionen stehen.
Ich dachte ich Overengineere mit dem Template Method Pattern um uU noch ein Logging oder ähnliches.
Ich dachte mir eigentlich - kann ja nix Schaden... Oder schadet es doch?macht mehr tipparbeit und die ausführbare langsamer und größer. wenn ich recht sah, hat das pattern hier gar keinen nutzen, dann isses störend. wenns ne stelle gibt, wo es was feines macht, isses ein lehrreiches beispiel.
?: mag ich net.
Type enemy=search^(PLAYER_1^PLAYER_2);
Was spricht gegen ?: in diesem Fall?
einType enemy; if(search==PLAYER_1) enemy=PLAYER_2; ...
Kann ja nicht die Lösung sein, oder?
nein? aber doch! in ne funktion namens Type gegenspieler(Type spieler) rein und es ist gut.
steht im schwierigen code rstmal das einfache
Type enemy=gegenspieler(search);
, dann kannste dir immernoch überlegen, ob du innerhalb von gegenspieler sündigst. ich rate dort aber streng von ?: ab, wegen nutzlosigkeit. kann es sein, daß iht ?:-verfechter einfach zu faul seid, auch einzeiler in ne funktion mit sprechendem namen auszulagern?
bei meinem vorschlagType enemy=search^(PLAYER_1^PLAYER_2);
waren die klammern absicht. es war nicht gedacht als magischen hack, der viel fachwissen um interne bitsetzungen weiß, sondern um ein programmiermuster, wo man ein paar allgemeine eigenschaften von ^ ausnutzt.
man kanns auch lesen alsconst int UMSCHALTER_ZWISCHEN_PLAYER_1_UND_PLAYER_2=PLAYER_1^PLAYER_2; Type enemy=search^UMSCHALTER_ZWISCHEN_PLAYER_1_UND_PLAYER_2;
-
Kannst du mir mal kurz deine Namensgebungskonventionen erklären? Meine Theorie ist "Typen beginnen immer groß außer Montags". Quasi alles beginnt mit einem Großbuchstaben aber 'playerType' dann auf einmal nicht.
Und 'Type' finde ich irgendwie sehr fragwürdig.
-
ThAlb schrieb:
Warum so kompliziert? Wie wärs mit
...
Für viele dürfte das noch eher verständlich sein...als beitrag zum homor im c++-forum und damit ich ich ein
und ein "Hö? Kenn ich gar nicht" ernte.
-
Helium schrieb:
Quasi alles beginnt mit einem Großbuchstaben aber 'playerType' dann auf einmal nicht.
Stimmt, ist n Fehler.
Und 'Type' finde ich irgendwie sehr fragwürdig.
Ich auch. Ich suche noch nach einen vernünftigen Namen... Ich hatte schon 6 verschiedene - aber alle waren schlechter als Type.
-
Shade Of Mine schrieb:
Helium schrieb:
Quasi alles beginnt mit einem Großbuchstaben aber 'playerType' dann auf einmal nicht.
Stimmt, ist n Fehler.
Und 'Type' finde ich irgendwie sehr fragwürdig.
Ich auch. Ich suche noch nach einen vernünftigen Namen... Ich hatte schon 6 verschiedene - aber alle waren schlechter als Type.
gehts besser, deutsch namen zu finden?
das spielfeld nenne ich Feld.
jedes feld hat eine Farbe.
das spiel an sich ist nicht aktiv, aktiv ist der Spielleiter. er erzeugt zwei Spieler, das Feld und führt ein spiel durch.
der SpielerMensch und der SpielerComputer sind Spieler.
der Spielleiter fragt jeweils einen Spieler nach dem Zug, den er machen möchte, checkt, ob der Zug gültig ist, und sagt dann dem Feld, daß der Zug gemacht wurde.playerType ist reingerutsch, damit
menu->addEntry(menu::makeMenuEntry(this, &Application::startGame, PLAYER_HUMAN, PLAYER_AI, "Start Game (Player VS Computer)"));
klappt, und gipfelt in
Player* makePlayer(playerType type, Type element) { switch(type) { case PLAYER_HUMAN: return new HumanPlayer(element); case PLAYER_AI: return new AIPlayer(element); } return 0; }
ach, nee. ich würde lieber eine globale map machen, die strings wie "SpielerMensch" nem zeiger auf ein Konstruktorobjekt zuordnet, das nen SpielerMensch konstruieren kann. und in der SpielerMensch.cpp lege der SpielerMensch halt sein Konstruktorobjekt static global an, welches sich in seinem Konstruktor in der map registirert und im destruktor deregistriert. dann können andere leute neue AIs beisteiern, ohne auch nur eine headerdatei verändern zu müssen.
-
Also ich bin gerade dabei, für die AI relativ viel Müll zu coden, weil das Field so wenig Methoden hat.
z.B.:int getCount(Type);
würde fehlen. Und das am besten noch jeweils für Spalten, Zeilen und die beiden Diagonalen.
Ich bin schon wieder bei 150 Zeilen.
btw. diese Methoden könnte man dann auch gleich verwenden, um den Sieger zu bestimmen. Wär also nicht ganz für die Katz.
-
volkard schrieb:
WinXP, das kann groß-kleinschreibung. ich mach dateinamen wie die klassennamen, seit es geht, also bei mir seit dem umstieg von dos auf win95.
Win9x unterscheidet nicht zw. Groß- und Kleinschreibung, aber dass weißt du sicher. Wegen sowas musste ich mich schon ein paar mal durch Quelltexte wühlen um die include-Zeilen zu korrigieren.
Wenn von vornerein alles klein ist, kann man wenistens rename 'y/A-Z/a-z/' machen.
-
DrGreenthumb schrieb:
volkard schrieb:
WinXP, das kann groß-kleinschreibung. ich mach dateinamen wie die klassennamen, seit es geht, also bei mir seit dem umstieg von dos auf win95.
Win9x unterscheidet nicht zw. Groß- und Kleinschreibung, aber dass weißt du sicher. Wegen sowas musste ich mich schon ein paar mal durch Quelltexte wühlen um die include-Zeilen zu korrigieren.
Wenn von vornerein alles klein ist, kann man wenistens rename 'y/A-Z/a-z/' machen.es "kann" groß-kleinschreibung. daß es dann nichtmal pingelig beim datei-öffnen ist, ist doch ein nettes feature.
aber keine bange, ich versuche nicht, mit #include "VecTOr.H" die "Vector.h" zu includieren. auf keinen fall darf es ein argument sein, daß du kleinschreibung benutzt, weil andere leute die shift-taste nicht bedienen können.
-
Weiß nicht, vielleicht geht es auch beim zippen kaputt. Es reicht ja, wenn man irgendwann mal die Datei im "falschen" Programm öffnet und wieder speichert. Wenn man bei Windows das entsprechende Häckchen nicht gesetzt hat, bekommt man gar nicht mit wie die Datei jetzt wirklich heißt.
Wenn du also empfiehlst Groß- und Kleinschreibung zu verwenden (was ich auch schöner finde), dann bitte mit dem Zusatz, "nur wenn's euer BS unterstützt oder ihr wisst was ihr da tut".
-
Ich denke mal, in naher Zukunft wird kein System mehr rauskommen, was keine Groß-/Kleinschreibung unterstützt.
Die Nachfrage danach ist nämlich gesättigt.
-
DrGreenthumb schrieb:
Weiß nicht, vielleicht geht es auch beim zippen kaputt. Es reicht ja, wenn man irgendwann mal die Datei im "falschen" Programm öffnet und wieder speichert. Wenn man bei Windows das entsprechende Häckchen nicht gesetzt hat, bekommt man gar nicht mit wie die Datei jetzt wirklich heißt.
kann mich an keinen zipper (außer mal einem für linux) erinnern, der defaultmäßig die dateinamen zerschießt.
DrGreenthumb schrieb:
Wenn du also empfiehlst Groß- und Kleinschreibung zu verwenden (was ich auch schöner finde), dann bitte mit dem Zusatz, "nur wenn's euer BS unterstützt oder ihr wisst was ihr da tut".
c++-programmier. ich erwarte einfach, daß die ihren rechner ein wenig bedienen können.