C :: Aufgabe #30

1 Lösung Lösung öffentlich

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.

Lösungen:

vote_ok
von devnull (8870 Punkte) - 31.12.2014 um 09:54 Uhr

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**


Quellcode ausblenden C-Code
/******************************
 * 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;
}
2091875

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.