Formatierungshilfe C |
| 02.06.2024, 15:45 | Auf diesen Beitrag antworten » |
| DerTyper | Formatierungshilfe C Meine Frage: Ich habe folgendes C Programm geschrieben. Es handelt sich um Schiffe verrsenken. Das Programm funktioniert auch wie gewollt. Mein Problem besteht in der Formattierung der Ausgabe ( Im BIld seht ihr den Unterschied gelb markiert). Mein Code: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #define SIZE 10 void initGameField(char field[SIZE][SIZE]) { for (int i = 0; i < SIZE; i++) for (int j = 0; j < SIZE; j++) field[i][j] = '.'; } void placeShipOnField(char field[SIZE][SIZE], char columnStart, int rowStart, char columnEnd, int rowEnd) { int startColumn = columnStart - 'A'; int endColumn = columnEnd - 'A'; for (int row = rowStart - 1; row <= rowEnd - 1; row++) { for (int column = startColumn; column <= endColumn; column++) { field[row][column] = '#'; } } } void readShipPositions(char field[SIZE][SIZE]) { char columnStart = 0, columnEnd = 0; int rowStart = 0, rowEnd = 0; while (1) { (void)scanf(" %c", &columnStart); if (columnStart == 'e') { break; } (void)scanf("%i-%c%i", &rowStart, &columnEnd, &rowEnd); placeShipOnField(field, columnStart, rowStart, columnEnd, rowEnd); } } void printField(char field[SIZE][SIZE]) { printf(" ABCDEFGHIJ\n"); for (int row = 0; row < SIZE; row++) { printf("%2i", row + 1); for (int column = 0; column < SIZE; column++) { printf("%c", field[row][column]); } printf("\n"); } } const char* shipTypeName(int length) { switch (length) { case 5: return "Schlachtschiff"; case 4: return "Kreuzer"; case 3: return "Zerstörer"; case 2: return "U-Boot"; default: return "Unbekanntes Schiff"; } } int shipLength(char field[SIZE][SIZE], int row, int column) { int length = 1; // Horizontal check int startColumn = column, endColumn = column; while (startColumn > 0 && field[row][startColumn - 1] == 'X') startColumn--; while (endColumn < SIZE - 1 && field[row][endColumn + 1] == 'X') endColumn++; length = endColumn - startColumn + 1; if (length > 1) return length; // Vertical check int startRow = row, endRow = row; while (startRow > 0 && field[startRow - 1][column] == 'X') startRow--; while (endRow < SIZE - 1 && field[endRow + 1][column] == 'X') endRow++; return endRow - startRow + 1; } int shipSunk(char field[SIZE][SIZE], int row, int column) { // Horizontal check int startColumn = column, endColumn = column; while (startColumn > 0 && (field[row][startColumn - 1] == '#' || field[row][startColumn - 1] == 'X')) startColumn--; while (endColumn < SIZE - 1 && (field[row][endColumn + 1] == '#' || field[row][endColumn + 1] == 'X')) endColumn++; for (int col = startColumn; col <= endColumn; col++) { if (field[row][col] == '#') return 0; } // Vertical check int startRow = row, endRow = row; while (startRow > 0 && (field[startRow - 1][column] == '#' || field[startRow - 1][column] == 'X')) startRow--; while (endRow < SIZE - 1 && (field[endRow + 1][column] == '#' || field[endRow + 1][column] == 'X')) endRow++; for (int r = startRow; r <= endRow; r++) { if (field[r][column] == '#') return 0; } return 1; } int allShipsSunk(char field[SIZE][SIZE]) { for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { if (field[i][j] == '#') { return 0; } } } return 1; } void gameIteration(char field[SIZE][SIZE], int *totalShots, int *totalHits) { char column; int row; while (1) { scanf(" %c", &column); if (column == 'x') { printf("\nDas Spiel wurde beendet.\n"); break; } scanf("%i", &row); int colIndex = column - 'A'; int rowIndex = row - 1; (*totalShots)++; if (field[rowIndex][colIndex] == '#') { field[rowIndex][colIndex] = 'X'; (*totalHits)++; if (shipSunk(field, rowIndex, colIndex)) { int length = shipLength(field, rowIndex, colIndex); printf("%c%i Getroffen! %s wurde versenkt!\n", column, row, shipTypeName(length)); } else { printf("%c%i Getroffen!\n", column, row); } } else if (field[rowIndex][colIndex] == '.') { field[rowIndex][colIndex] = 'O'; printf("%c%i Fehlschuss!\n", column, row); } else { printf("%c%i Bereits geschossen!\n", column, row); } if (allShipsSunk(field)) { printf("\nAlle Schiffe wurden versenkt.\n"); break; } } } int main(int argc, char* argv[]) { char field[SIZE][SIZE]; int totalShots = 0; int totalHits = 0; // Initialisieren initGameField(field); // Schiffspositionen einlesen (mit 'e' wird beendet) readShipPositions(field); // Spielfeld mit den Schiffen ausgeben printField(field); // Spieliterationen (Schusskoordinaten + Trefferanzeige) gameIteration(field, &totalShots, &totalHits); // Spielfeld mit den Schiffen ausgeben printField(field); // Trefferquote ausgeben int hitRate = 0; if (totalShots > 0) { hitRate = (totalHits * 100) / totalShots; } printf("Trefferquote: %d%%\n", hitRate); return 0; } Meine Ideen: Ich hab an verschiedenen stellen Zeilenumbrüche gesetzt um die Formattierung anzugleichen. Hat aber bis jetzt nicht zum gewünschten Ergebnis geführt. |
|
|
|
|
|
