fdai7726
11 months ago
4 changed files with 427 additions and 28 deletions
-
256src/main/c/VierGewinnt.c
-
20src/main/c/VierGewinnt.h
-
151src/test/c/test_VierGewinnt.c
-
28src/test/c/test_test.c
@ -0,0 +1,256 @@ |
|||
//Importiere wichtige Bibliotheken |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
|
|||
//Definiere Feldgröße |
|||
#define ROWS 6 |
|||
#define COLS 7 |
|||
|
|||
// Definiere Farben |
|||
#define RESET_COLOR "\033[0m" |
|||
#define BLACK "\033[0;30m" |
|||
#define RED "\033[0;31m" |
|||
#define GREEN "\033[0;32m" |
|||
#define YELLOW "\033[0;33m" |
|||
#define BLUE "\033[0;34m" |
|||
#define MAGENTA "\033[0;35m" |
|||
#define CYAN "\033[0;36m" |
|||
#define WHITE "\033[0;37m" |
|||
|
|||
|
|||
//Funktionsprototyp für initializeBoard |
|||
void initializeBoard(char board[ROWS][COLS]); |
|||
|
|||
//Funktionsprototyp für printBoard |
|||
void printBoard(char board[ROWS][COLS]); |
|||
|
|||
// Funktionsprototyp für clearScreen |
|||
void clearScreen(); |
|||
|
|||
//Funktionsprototyp für isColumnFull |
|||
int isColumnFull(char board[ROWS][COLS], int col); |
|||
|
|||
//Funktionsprototyp für dropPiece |
|||
int dropPiece(char board[ROWS][COLS], int col, char player); |
|||
//Funktionsprototyp für checkWin |
|||
int checkWin(char board[ROWS][COLS], char player); |
|||
// Funktionsprototyp für checkHorizontal |
|||
int checkHorizontal(char board[ROWS][COLS], char player); |
|||
|
|||
// Funktionsprototyp für checkVertical |
|||
int checkVertical(char board[ROWS][COLS], char player); |
|||
|
|||
// Funktionsprototyp für checkDiagonalLR |
|||
int checkDiagonalLR(char board[ROWS][COLS], char player); |
|||
|
|||
// Funktionsprototyp für checkDiagonalRL |
|||
int checkDiagonalRL(char board[ROWS][COLS], char player); |
|||
|
|||
// Funktionsprototyp für showMessage |
|||
void showMessage(const char* messageColor, const char* message); |
|||
//Funktionsprototyp für showInvalidInputMessage |
|||
void showInvalidInputMessage(); |
|||
|
|||
//Funktionsprototyp für showColumnFullMessage |
|||
void showColumnFullMessage(); |
|||
|
|||
//Funktionsprototyp für showWinMessage |
|||
void showWinMessage(int player); |
|||
|
|||
|
|||
//Write starter function |
|||
int main_function() { |
|||
char board[ROWS][COLS]; |
|||
int currentPlayer = 1; // Spieler 1 beginnt |
|||
|
|||
initializeBoard(board); |
|||
printBoard(board); |
|||
|
|||
int column; |
|||
while (1) { |
|||
printf(YELLOW"Spieler %d, wähle eine Spalte (1-7): "RESET_COLOR, currentPlayer); |
|||
|
|||
scanf("%d", &column); |
|||
if (column < 1 || column > 7) { |
|||
showInvalidInputMessage(); |
|||
continue; |
|||
} |
|||
|
|||
column--; |
|||
|
|||
if (isColumnFull(board, column)) { |
|||
showColumnFullMessage(); |
|||
continue; |
|||
} |
|||
|
|||
if (dropPiece(board, column, (currentPlayer == 1) ? 'X' : 'O')) { |
|||
printBoard(board); |
|||
if (checkWin(board, (currentPlayer == 1) ? 'X' : 'O')) { |
|||
showWinMessage(currentPlayer); |
|||
break; |
|||
} |
|||
|
|||
currentPlayer = (currentPlayer == 1) ? 2 : 1; |
|||
} |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
// Write initializeBoard function |
|||
void initializeBoard(char board[ROWS][COLS]) { |
|||
for (int i = 0; i < ROWS; i++) { |
|||
for (int j = 0; j < COLS; j++) { |
|||
board[i][j] = ' '; |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
// Write printBoard function |
|||
void printBoard(char board[ROWS][COLS]) { |
|||
clearScreen(); |
|||
printf("\n"); |
|||
|
|||
for (int i = 0; i < ROWS; i++) { |
|||
for (int j = 0; j < COLS; j++) { |
|||
printf("| %c ", board[i][j]); |
|||
} |
|||
printf("|\n"); |
|||
|
|||
for (int j = 0; j < COLS; j++) { |
|||
printf("----"); |
|||
} |
|||
printf("-\n"); |
|||
} |
|||
|
|||
printf(" 1 2 3 4 5 6 7\n\n"); |
|||
} |
|||
// Write clearScreen function |
|||
void clearScreen() { |
|||
#ifdef _WIN32 |
|||
system("cls"); |
|||
#else |
|||
system("clear"); |
|||
#endif |
|||
} |
|||
|
|||
// Write isColumnFull function |
|||
int isColumnFull(char board[ROWS][COLS], int col) { |
|||
return (board[0][col] != ' '); |
|||
} |
|||
|
|||
//Write dropPiece function |
|||
int dropPiece(char board[ROWS][COLS], int col, char player) { |
|||
for (int i = ROWS - 1; i >= 0; i--) { |
|||
if (board[i][col] == ' ') { |
|||
board[i][col] = player; |
|||
return 1; |
|||
} |
|||
} |
|||
|
|||
return 0; // Column is full |
|||
} |
|||
|
|||
|
|||
// Write checkHorizontal function |
|||
int checkHorizontal(char board[ROWS][COLS], char player) { |
|||
for (int row = 0; row < ROWS; row++) { |
|||
for (int col = 0; col <= COLS - 4; col++) { |
|||
if (board[row][col] == player && |
|||
board[row][col + 1] == player && |
|||
board[row][col + 2] == player && |
|||
board[row][col + 3] == player) { |
|||
return 1; // Gewonnen |
|||
} |
|||
} |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
//Write checkVertical function |
|||
int checkVertical(char board[ROWS][COLS], char player) { |
|||
for (int col = 0; col < COLS; col++) { |
|||
for (int row = 0; row <= ROWS - 4; row++) { |
|||
if (board[row][col] == player && |
|||
board[row + 1][col] == player && |
|||
board[row + 2][col] == player && |
|||
board[row + 3][col] == player) { |
|||
return 1; // Gewonnen |
|||
} |
|||
} |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
|
|||
|
|||
// Write checkDiagonalLR function |
|||
int checkDiagonalLR(char board[ROWS][COLS], char player) { |
|||
for (int row = 0; row <= ROWS - 4; row++) { |
|||
for (int col = 0; col <= COLS - 4; col++) { |
|||
if (board[row][col] == player && |
|||
board[row + 1][col + 1] == player && |
|||
board[row + 2][col + 2] == player && |
|||
board[row + 3][col + 3] == player) { |
|||
return 1; // Gewonnen |
|||
} |
|||
} |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
// Write checkDiagonalRL function |
|||
int checkDiagonalRL(char board[ROWS][COLS], char player) { |
|||
for (int row = 0; row <= ROWS - 4; row++) { |
|||
for (int col = 3; col < COLS; col++) { |
|||
if (board[row][col] == player && |
|||
board[row + 1][col - 1] == player && |
|||
board[row + 2][col - 2] == player && |
|||
board[row + 3][col - 3] == player) { |
|||
return 1; // Gewonnen |
|||
} |
|||
} |
|||
} |
|||
return 0; |
|||
|
|||
} |
|||
|
|||
// Write checkWin function |
|||
int checkWin(char board[ROWS][COLS], char player) { |
|||
return checkHorizontal(board, player) || |
|||
checkVertical(board, player) || |
|||
checkDiagonalLR(board, player) || |
|||
checkDiagonalRL(board, player); |
|||
} |
|||
|
|||
|
|||
// Write showMessage function |
|||
void showMessage(const char* messageColor, const char* message) { |
|||
printf("%s%s"RESET_COLOR, messageColor, message); |
|||
} |
|||
|
|||
// Write showInvalidInputMessage function |
|||
void showInvalidInputMessage() { |
|||
showMessage(RED, "Ungültige Eingabe. Bitte wähle eine Spalte zwischen 1 und 7.\n"); |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
// Write showColumnFullMessage function |
|||
void showColumnFullMessage() { |
|||
showMessage(RED, "Die Spalte ist voll. Bitte wähle eine andere.\n"); |
|||
} |
|||
|
|||
|
|||
|
|||
// Write showWinMessage function |
|||
void showWinMessage(int player) { |
|||
printf("Spieler %d hat gewonnen!\n", player); |
|||
} |
|||
|
|||
|
|||
|
@ -0,0 +1,20 @@ |
|||
#ifndef VIERGEWINNT_H |
|||
#define VIERGEWINNT_H |
|||
|
|||
#define ROWS 6 |
|||
#define COLS 7 |
|||
|
|||
void initializeBoard(char board[ROWS][COLS]); |
|||
void printBoard(char board[ROWS][COLS]); |
|||
int isColumnFull(char board[ROWS][COLS], int col); |
|||
int dropPiece(char board[ROWS][COLS], int col, char player); |
|||
int checkWin(char board[ROWS][COLS], char player); |
|||
int checkHorizontal(char board[ROWS][COLS], char player); |
|||
int checkVertical(char board[ROWS][COLS], char player); |
|||
int checkDiagonalLR(char board[ROWS][COLS], char player); |
|||
int checkDiagonalRL(char board[ROWS][COLS], char player); |
|||
void showMessage(const char* messageColor, const char* message); |
|||
void showInvalidInputMessage(); |
|||
void showColumnFullMessage(); |
|||
void showWinMessage(int player); |
|||
#endif |
@ -0,0 +1,151 @@ |
|||
#include "unity.h" |
|||
#include "VierGewinnt.h" |
|||
|
|||
void setUp(void) { |
|||
} |
|||
|
|||
void tearDown(void) { |
|||
} |
|||
|
|||
|
|||
void test_dropPiece_ValidMove(void) { |
|||
char board[6][7]; |
|||
initializeBoard(board); |
|||
|
|||
TEST_ASSERT_EQUAL_INT(1, dropPiece(board, 3, 'X')); |
|||
} |
|||
|
|||
|
|||
void test_dropPiece_FullColumn(void) { |
|||
char board[6][7] = { |
|||
{'X', 'O', 'X', 'O', 'X', 'O', 'X'}, |
|||
{'O', 'X', 'O', 'X', 'O', 'X', 'O'}, |
|||
{'X', 'O', 'X', 'O', 'X', 'O', 'X'}, |
|||
{'O', 'X', 'O', 'X', 'O', 'X', 'O'}, |
|||
{'X', 'O', 'X', 'O', 'X', 'O', 'X'}, |
|||
{'O', 'X', 'O', 'X', 'O', 'X', 'O'} |
|||
}; |
|||
|
|||
TEST_ASSERT_EQUAL_INT(0, dropPiece(board, 3, 'X')); // Spalte ist voll, sollte 0 zurückgeben |
|||
} |
|||
|
|||
|
|||
void test_checkWin_Horizontal_X(void) { |
|||
char board[6][7] = { |
|||
{'X', 'X', ' ', ' ', ' ', ' ', ' '}, |
|||
{'O', 'O', 'O', ' ', ' ', ' ', ' '}, |
|||
{' ', ' ', ' ', ' ', ' ', ' ', ' '}, |
|||
{' ', 'X', 'X', 'X', 'X', ' ', ' '}, |
|||
{' ', ' ', ' ', ' ', ' ', ' ', ' '}, |
|||
{' ', ' ', ' ', ' ', ' ', ' ', ' '} |
|||
}; |
|||
|
|||
TEST_ASSERT_EQUAL_INT(1, checkWin(board, 'X')); // Horizontale Gewinnsituation für 'X' |
|||
} |
|||
|
|||
void test_checkWin_Horizontal_O(void) { |
|||
char board[6][7] = { |
|||
{'X', 'X', ' ', ' ', ' ', ' ', ' '}, |
|||
{'O', 'O', 'O', 'O', ' ', ' ', ' '}, |
|||
{' ', ' ', ' ', ' ', ' ', ' ', ' '}, |
|||
{' ', 'X', 'X', ' ', 'X', ' ', ' '}, |
|||
{' ', ' ', ' ', ' ', ' ', ' ', ' '}, |
|||
{' ', ' ', ' ', ' ', ' ', ' ', ' '} |
|||
}; |
|||
|
|||
TEST_ASSERT_EQUAL_INT(1, checkWin(board, 'O')); // Horizontale Gewinnsituation für 'X' |
|||
} |
|||
|
|||
void test_checkWin_Diagonal_X(void) { |
|||
char board[6][7] = { |
|||
{'X', 'X', ' ', ' ', ' ', ' ', ' '}, |
|||
{'O', 'O', 'O', 'X', ' ', ' ', ' '}, |
|||
{' ', 'X', ' ', ' ', ' ', ' ', ' '}, |
|||
{' ', 'X', 'X', 'X', 'X', ' ', ' '}, |
|||
{' ', ' ', ' ','X', ' ', ' ', ' '}, |
|||
{' ', ' ', ' ', ' ', ' ', 'X', ' '} |
|||
}; |
|||
|
|||
TEST_ASSERT_EQUAL_INT(1, checkWin(board, 'X')); // Horizontale Gewinnsituation für 'X' |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
void test_checkWin_Diagonal_O(void) { |
|||
char board[6][7] = { |
|||
{'X', 'X', ' ', ' ', ' ', ' ', ' '}, |
|||
{'O', 'O', 'O', 'X', ' ', ' ', ' '}, |
|||
{' ', 'O', ' ', ' ', ' ', ' ', ' '}, |
|||
{' ', 'X', 'O', 'X', 'X', ' ', ' '}, |
|||
{' ', ' ', ' ','O', ' ', ' ', ' '}, |
|||
{' ', ' ', ' ', ' ', ' ', 'X', ' '} |
|||
}; |
|||
|
|||
TEST_ASSERT_EQUAL_INT(1, checkWin(board, 'O')); // Horizontale Gewinnsituation für 'X' |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
void test_checkWin_Vertical_X(void) { |
|||
char board[6][7] = { |
|||
{'X', 'O', ' ', ' ', ' ', ' ', ' '}, |
|||
{'X', 'O', ' ', ' ', ' ', ' ', ' '}, |
|||
{'X', 'O', ' ', ' ', ' ', ' ', ' '}, |
|||
{'X', ' ', ' ', ' ', ' ', ' ', ' '}, |
|||
{' ', ' ', ' ', ' ', ' ', ' ', ' '}, |
|||
{' ', ' ', ' ', ' ', ' ', ' ', ' '} |
|||
}; |
|||
|
|||
TEST_ASSERT_EQUAL_INT(1, checkWin(board, 'X')); // Vertikale Gewinnsituation für 'X' |
|||
} |
|||
|
|||
|
|||
|
|||
void test_checkWin_Vertical_O(void) { |
|||
char board[6][7] = { |
|||
{'X', 'O', ' ', ' ', ' ', ' ', ' '}, |
|||
{'X', 'O', ' ', ' ', ' ', ' ', ' '}, |
|||
{'X', 'O', ' ', ' ', ' ', ' ', ' '}, |
|||
{' ', 'O', ' ', ' ', ' ', ' ', ' '}, |
|||
{' ', ' ', ' ', ' ', ' ', ' ', ' '}, |
|||
{' ', ' ', ' ', ' ', ' ', ' ', ' '} |
|||
}; |
|||
|
|||
TEST_ASSERT_EQUAL_INT(1, checkWin(board, 'O')); // Vertikale Gewinnsituation für 'X' |
|||
} |
|||
void test_checkWin_NoWinner(void) { |
|||
char board[6][7] = { |
|||
{'X', 'O', 'X', 'O', 'X', 'O', 'X'}, |
|||
{'O', 'X', 'O', 'X', 'O', 'X', 'O'}, |
|||
{'O', 'X', 'O', 'X', 'O', 'X', 'O'}, |
|||
{'O', 'X', 'O', 'X', 'O', 'X', 'O'}, |
|||
{'X', 'O', 'X', 'O', 'X', 'O', 'X'}, |
|||
{'O', 'X', 'O', 'X', 'O', 'X', 'O'} |
|||
}; |
|||
|
|||
|
|||
|
|||
|
|||
TEST_ASSERT_EQUAL_INT(0, checkWin(board, 'X')); // Kein Gewinner, horizontale Reihe ist voll |
|||
TEST_ASSERT_EQUAL_INT(0, checkWin(board, 'O')); // Kein Gewinner, horizontale Reihe ist voll |
|||
} |
|||
|
|||
void test_isColumnFull(void) { |
|||
char board[6][7] = { |
|||
{'X', 'O', 'X', 'O', 'X', 'O', 'X'}, |
|||
{'O', 'X', 'O', 'X', 'O', 'X', 'O'}, |
|||
{'X', 'O', 'X', 'O', 'X', 'O', 'X'}, |
|||
{'O', 'X', 'O', 'X', 'O', 'X', 'O'}, |
|||
{'X', 'O', 'X', 'O', 'X', 'O', 'X'}, |
|||
{'O', 'X', 'O', 'X', 'O', 'X', 'O'} |
|||
}; |
|||
|
|||
TEST_ASSERT_EQUAL_INT(1, isColumnFull(board, 3)); // Column 3 is full |
|||
} |
|||
|
@ -1,28 +0,0 @@ |
|||
#ifdef TEST |
|||
|
|||
#include "unity.h" |
|||
|
|||
#include "test.h" |
|||
|
|||
void setUp(void) |
|||
{ |
|||
} |
|||
|
|||
void tearDown(void) |
|||
{ |
|||
} |
|||
|
|||
void test_test__return_5(void) |
|||
{ |
|||
/* arrange */ |
|||
int expected = 5; |
|||
int actual; |
|||
|
|||
/* act */ |
|||
actual = return_5(); |
|||
|
|||
/* assert */ |
|||
TEST_ASSERT_EQUAL_INT(expected, actual); |
|||
} |
|||
|
|||
#endif // TEST |
Write
Preview
Loading…
Cancel
Save
Reference in new issue