001
06.05.2009, 15:58 Uhr
0xdeadbeef
Gott (Operator)
|
Den Code lesbar einzurücken wäre eine gute Angewohnheit...
Wie dem auch sei, ich hab sowas vor Jahren auch mal gemacht, allerdings für die UNIX-Konsole. Der Trick bei der Gewinnprüfung ist, nicht zu überprüfen, ob auf dem Brett eine Gewinnerkombination ist, sondern ob der letzte Zug es ist. Bei mir sah das so aus:
C++: |
static int spiel_t_gewonnen(spiel_t const *this, size_t x, size_t y) { int farbe = this->spielfeld[x][y]; int i, j, tmp;
/* senkrecht */ tmp = 1; for(j = y + 1; j < HOEHE && this->spielfeld[x][j] == farbe; ++j, ++tmp); if(tmp >= GEWINNT) return 1;
/* waagerecht */ tmp = 1; for(i = x - 1; i >= 0 && this->spielfeld[i][y] == farbe; --i, ++tmp); for(i = x + 1; i < BREITE && this->spielfeld[i][y] == farbe; ++i, ++tmp); if(tmp >= GEWINNT) return 1;
/* diagonal \ */ tmp = 1; for(i = x - 1, j = y - 1; i >= 0 && j >= 0 && this->spielfeld[i][j] == farbe; --i, --j, ++tmp); for(i = x + 1, j = y + 1; i < BREITE && j < HOEHE && this->spielfeld[i][j] == farbe; ++i, ++j, ++tmp); if(tmp >= GEWINNT) return 1;
/* diagonal / */ tmp = 1; for(i = x - 1, j = y + 1; i >= 0 && j < HOEHE && this->spielfeld[i][j] == farbe; --i, ++j, ++tmp); for(i = x + 1, j = y - 1; i < BREITE && j >= 0 && this->spielfeld[i][j] == farbe; ++i, --j, ++tmp); if(tmp >= GEWINNT) return 1;
return 0; }
|
...wobei HOEHE == 5, BREITE == 7 und GEWINNT == 4 als Makros definiert waren, für den Fall, dass jemand das ganze als fünf-gewinnt kompilieren wollte oder so. spiel_t ist ein
C++: |
typedef struct { int spielfeld[BREITE][HOEHE]; int tops[BREITE]; } spiel_t;
|
this bezeichnet also den Spielstand, x und y sind die Koordinaten des letzten Zuges. Entschuldige die merkwürdige Einrückung, das Code-Feld hier im Forum ist leider nicht breit genug. Kopier's dir am besten in einen Editor deiner Wahl, es ist dann sehr viel lesbarer.
Was Verbesserungsvorschläge angeht, auf Anhieb sehe ich, dass du main falsch deklariert hast.
ist schlicht falsch, main muss immer int zurückgeben. Vom Standard garantierte Signaturen für main sind
C++: |
int main(void); int main(int argc, char *argv[]);
|
Im Erfolgsfall sollte main am Ende dann
zurückgeben. Das ist dann von Bedeutung, wenn du einen hinreichend strengen Compiler benutzt (die meisten neueren hauen dir void main um die Ohren) oder das Programm in Skripten benutzt werden soll. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 06.05.2009 um 15:59 Uhr von 0xdeadbeef editiert. |