008
02.01.2008, 00:59 Uhr
0xdeadbeef
Gott (Operator)
|
Da hab ich doch mal...ah, hier:
C++: |
#include <stddef.h> #include <stdio.h> #include <string.h>
#ifndef HOEHE #define HOEHE 5 #endif
#ifndef BREITE #define BREITE 7 #endif
#ifndef GEWINNT #define GEWINNT 4 #endif
#define RED 31 #define YELLOW 33
#define COLOR_CHANGE_I(num) "\x1B[" #num "m" #define COLOR_CHANGE(num) COLOR_CHANGE_I(num)
#define COLOR_CHANGE_FMT COLOR_CHANGE(%d) #define COLOR_CHANGE_DEFAULT COLOR_CHANGE(0)
typedef struct { int spielfeld[BREITE][HOEHE]; int tops[BREITE]; } spiel_t;
static int const players[] = { RED, YELLOW };
static void spiel_t_init(spiel_t *this) { size_t i;
memset(this->spielfeld, 0, sizeof(this->spielfeld)); for(i = 0u; i < BREITE; ++i) { this->tops[i] = HOEHE; } }
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; }
static void spiel_t_print(spiel_t const *this) { int x, y;
for(y = 0; y < HOEHE; ++y) { for(x = 0; x < BREITE; ++x) { if(this->spielfeld[x][y] == 0) { printf("| "); } else { printf("|" COLOR_CHANGE_FMT "*" COLOR_CHANGE_DEFAULT, this->spielfeld[x][y]); } } puts("|"); }
for(x = 0; x < BREITE * 2 + 1; ++x) putchar('-'); putchar('\n'); for(x = 0; x < BREITE; ++x) printf("%2d", x + 1); putchar('\n'); }
static int spiel_t_eingabe(spiel_t const *this, int farbe) { char zeile[100]; int slot;
do { printf(COLOR_CHANGE_FMT "1-%d: " COLOR_CHANGE_DEFAULT, farbe, BREITE); fflush(stdout);
fgets(zeile, 100, stdin); } while(sscanf(zeile, "%d", &slot) != 1 || slot < 1 || slot > BREITE || this->tops[slot - 1] == 0);
return slot - 1; }
static int spiel_t_play(spiel_t *this) { int player_ix = 1, x, y;
spiel_t_init(this); spiel_t_print(this);
do { player_ix = (player_ix + 1) % 2;
x = spiel_t_eingabe(this, players[player_ix]);
y = --this->tops[x];
this->spielfeld[x][y] = players[player_ix]; spiel_t_print(this); } while(!spiel_t_gewonnen(this, x, y));
return player_ix; }
int main(void) { spiel_t spiel;
printf(COLOR_CHANGE_FMT "GEWONNEN!" COLOR_CHANGE_DEFAULT "\n", players[spiel_t_play(&spiel)]);
return 0; }
|
...das benutzt jetzt ANSI escape sequences für die Farben, die sind unter Windows von Haus aus, glaube ich, nicht aktiv. Unter DOS konnte man das mit der ansi.sys laden, unter Windows...ging das auch irgendwie. Wenn du das nicht rauskriegst, sollte es aber leicht genug anpassbar sein, halt überall, wo die COLOR_CHANGE-Makros benutzt werden, die Farbe mit den Borland-Funktionen ändern. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 02.01.2008 um 01:14 Uhr von 0xdeadbeef editiert. |