009
13.04.2005, 22:11 Uhr
0xdeadbeef
Gott (Operator)
|
Ich habs mal eben aus Langeweile zusammengeschustert:
C++: |
#include <stdio.h>
#ifndef HOEHE #define HOEHE 5 #endif
#ifndef BREITE #define BREITE 7 #endif
#ifndef GEWINNT #define GEWINNT 4 #endif
#define RED 31 #define YELLOW 32
static int const players[] = { RED, YELLOW };
int gewonnen(int feld[BREITE][HOEHE], int x, int y) { int farbe = feld[x][y]; int i, j, tmp;
/* senkrecht */ tmp = 1; for(j = y + 1; j < HOEHE && feld[x][j] == farbe; ++j, ++tmp); if(tmp >= GEWINNT) return 1;
/* waagerecht */ tmp = 1; for(i = x - 1; i >= 0 && feld[i][y] == farbe; --i, ++tmp); for(i = x + 1; i < BREITE && feld[i][y] == farbe; ++i, ++tmp); if(tmp >= GEWINNT) return 1;
/* diagonal \ */ tmp = 1; for(i = x - 1, j = y - 1; i >= 0 && j >= 0 && feld[i][j] == farbe; --i, --j, ++tmp); for(i = x + 1, j = y + 1; i < BREITE && j < HOEHE && feld[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 && feld[i][j] == farbe; --i, ++j, ++tmp); for(i = x + 1, j = y - 1; i < BREITE && j >= 0 && feld[i][j] == farbe; ++i, --j, ++tmp); if(tmp >= GEWINNT) return 1;
return 0; }
static void print_feld(int feld[BREITE][HOEHE]) { int x, y;
for(y = 0; y < HOEHE; ++y) { for(x = 0; x < BREITE; ++x) { if(feld[x][y] == 0) { printf("| "); } else { printf("|\x1b[%dm*\x1b[0m", feld[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 eingabe(int farbe) { char zeile[100]; int slot;
do { printf("\x1B[%dm1-%d:\x1B[0m ", farbe, BREITE); fflush(stdout);
fgets(zeile, 100, stdin); } while(sscanf(zeile, "%d", &slot) != 1);
return slot; }
static int spiel(void) { int feld[BREITE][HOEHE] = { { 0 } }; int tops[BREITE] = { HOEHE, HOEHE, HOEHE, HOEHE, HOEHE, HOEHE, HOEHE }; int player_ix = 1, x, y;
print_feld(feld);
do { player_ix = (player_ix + 1) % 2;
do { x = eingabe(players[player_ix]) - 1; } while(x < 0 || x >= BREITE || tops[x] == 0);
y = --tops[x];
feld[x][y] = players[player_ix]; print_feld(feld); } while(!gewonnen(feld, x, y));
return player_ix; }
int main(void) { printf("\x1B[%dmGEWONNEN!\x1B[0m\n", players[spiel()]);
return 0; }
|
Der ganze \x1B-Kram ist halt für die Farben, der Rest ziemlich selbsterklärend. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |