C :: Aufgabe #30
1 Lösung

4 Gewinnt für die Konsole
Anfänger - C
von Gustl
- 05.01.2013 um 16:57 Uhr
Es soll 4 Gewinnt für die Konsole programmiert werden.
2 Spieler spielen gegeneinander, ohne Computergegner (ohne künstliche Intelligenz), spielen können.
Optional mit Computergegner, aber bitte in der Beschreibung dann angeben.
2 Spieler spielen gegeneinander, ohne Computergegner (ohne künstliche Intelligenz), spielen können.
Optional mit Computergegner, aber bitte in der Beschreibung dann angeben.
Lösungen:
Konsolenausgabe:
Spieler 2 setzt Spalte (1-7): 3
1 2 3 4 5 6 7
1
2
3 X x
4 o X o x
5 x o X o
6 o o o x o X
Gewinner ist Spieler 2.
**GAME OVER**

/****************************** * vier.c "4 gewinnt" Spiel ******************************/ #include <stdio.h> #include <string.h> #define ROWS 6 #define COLS 7 #define INDENT " " #define PRLF printf("\n") /* Symbole: 'o' = Stein Spieler 1 * 'x' = Stein Spieler 2 * 'O' = Vierer-Reihe Spieler 1 * 'X' = Vierer-Reihe Spieler 2 */ char Dots[] = {' ', 'o', 'x', 'O', 'X'}; /* Spielmatrix: 0 = freies Feld * (Grid) 1 = Stein Spieler 1 * 2 = Stein Spieler 2 * 3 = Vierer-Reihe Spieler 1 * 4 = Vierer-Reihe Spieler 2 */ int Grid[ROWS][COLS]; /*** functions ***/ // Spielbrett anzeigen void show_grid(void) { int i,j; PRLF; printf("%s ", INDENT); for (j=1; j<=COLS; j++) printf("%d ", j); PRLF; for (i=0; i<ROWS; i++) { printf("%s%d ", INDENT, i+1); for (j=0; j<COLS; j++) printf("%c ", Dots[Grid[i][j]]); PRLF; } PRLF; } // Spielstein in Spalte versenken int drop_disc(int gamer, int column) { int row; for (row=0; row<ROWS; row++) if (Grid[row][column-1] > 0) break; if (row == 0) return 0; Grid[row-1][column-1] = gamer; return 1; } // Vierer-Reihe markieren void mark_four(int rs, int cs, int dr, int dc) { int i; for (i=0; i<4; i++) Grid[rs+i*dr][cs+i*dc] += 2; } // Vierer-Reihe suchen int search_four(int gamer) { int i, j; // Suche waagrecht for (i=0; i<ROWS; i++) for (j=0; j<COLS-3; j++) if (Grid[i][j] == gamer && Grid[i][j+1] == gamer && \ Grid[i][j+2] == gamer && Grid[i][j+3] == gamer ) { mark_four(i, j, 0, +1); return gamer; } // Suche senkrecht for (j=0; j<COLS; j++) for (i=0; i<ROWS-3; i++) if (Grid[i][j] == gamer && Grid[i+1][j] == gamer && \ Grid[i+2][j] == gamer && Grid[i+3][j] == gamer ) { mark_four(i, j, +1, 0); return gamer; } // Suche diagonal '\' for (i=0; i<ROWS-3; i++) for (j=0; j<COLS-3; j++) if (Grid[i][j] == gamer && Grid[i+1][j+1] == gamer && \ Grid[i+2][j+2] == gamer && Grid[i+3][j+3] == gamer ) { mark_four(i, j, +1, +1); return gamer; } // Suche diagonal '/' for (i=0; i<ROWS-3; i++) for (j=COLS-4; j<COLS; j++) if (Grid[i][j] == gamer && Grid[i+1][j-1] == gamer && \ Grid[i+2][j-2] == gamer && Grid[i+3][j-3] == gamer ) { mark_four(i, j, +1, -1); return gamer; } return 0; } // Spaltennummer vom Spieler abfragen int get_column(int gamer) { int column; int input_valid = 0; while (!input_valid) { printf("Spieler %d setzt Spalte (1-%d): ", gamer, COLS); scanf("%d", &column); if (column < 1 || column > COLS) printf("Ungültige Spaltennummer.\n"); else input_valid = 1; } return column; } /*** main ***/ int main(void) { int discs = (ROWS * COLS); int column, gamer, winner; printf("%sSpieler 1: '%c'\n", INDENT, Dots[1]); printf("%sSpieler 2: '%c'\n", INDENT, Dots[2]); memset(Grid, 0, sizeof(Grid)); show_grid(); gamer = 1; while (1) { column = get_column(gamer); if (drop_disc(gamer, column)) discs--; else { printf("Kein freier Platz in Spalte %d.\n", column); continue; } winner = search_four(gamer); show_grid(); if (winner > 0) { printf("Gewinner ist Spieler %d.\n", winner); break; } if (discs == 0) { printf("Alle Steine sind gesetzt.\n"); break; } gamer = gamer%2+1; } printf("%s**GAME OVER**\n", INDENT); return 0; }