Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Suche » Suchergebnis » Hallo Gast [Anmelden|Registrieren]
Zeige Beiträge 1 bis 1 von 1 Treffern
Autor Beitrag
Thema: Formatierungshilfe C
DerTyper

Antworten: 0
Hits: 324
Formatierungshilfe C 02.06.2024 15:45 Forum: Algorithmen


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.
Zeige Beiträge 1 bis 1 von 1 Treffern