Einmal aufgeräumt:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
#include <iostream> // std::cout, std::cin, std::cerr, std::ostream
#include <string> // std::string
#include <utility> // std::pair, std::make_pair
#include <algorithm> // std::copy
#include <iterator> // std::ostream_iterator
// Typ für Dimension (Breite u. Höhe) definieren
typedef std::pair<std::size_t, std::size_t> dimension_t;
// Konstante für Dimension des Spielfeld angeben
const dimension_t field_dimension(std::make_pair(5, 5));
// Struktur für Punkt auf dem Spielfeld anlegen
struct FieldEntry
{
// Variablen
bool used;
std::string name;
// Konstruktor
FieldEntry()
: used(false)
{}
// operator<<
friend std::ostream& operator<<(std::ostream& out, FieldEntry const& data)
{ return out << used ? 'x' : '.'; }
};
// Array fürs Spielfeldes
FieldEntry field[field_dimension.first][field_dimension.second];
// Prototypen
void show_field();
int main()
{
// Menü ausgeben
std::cout << "(1) Spielfeld anzeigen\n"
<< "(2) Feld besetzen\n"
<< "(3) Felddaten anzeigen\n"
<< "(4) Spielfeld loeschen\n"
<< "(5) Progranmm beenden\n\n"
<< "Auswahl: ";
// Auswahl abfragen
unsigned short selection(0);
std::cin >> selection;
// Auf Auswahl reagieren
switch (selection)
{
case 1:
{
show_field();
} break;
case 2:
case 3:
case 4:
case 5:
break;
// Wenn ein ungültiger Wert ausgewählt wurde, Fehler melden.
default:
std::cerr << "FEHLER: Falsche Eingabe!" << std::endl;
}
}
// Funktion zum Ausgeben des Spielfeldes
void show_field()
{
// Jede Zeile durchgehen und ausgeben
for (std::size_t i(0); i < field_dimension.first; ++i)
std::copy(field[i], &field[i] + field_dimension.second, std::ostream_iterator<FieldEntry>(std::cout, ""));
}
|
Also nen Paar Anmerkungen zu deinem Code:
Zeile 6: Es ist nicht Festgelegt, welchen Ausgangswert Benutzt haben soll. Überlade einen Konstruktor für S_Feld.
(Anmerkung: Unter C++ sind class und struct nahezu identisch. Nur ist default-Zugriff bei class privat, bei struct public)
Zeile 7: Nimm hier lieber std::string, da er zum einen einfacher zu händeln ist und zum anderen auch eine beliebige Länge zulässt.
Zeile 13: Hier fehlt ein unsigned. Die Größe eines Arrays kann NIEMALS negativ sein, d.h. bietet sich hier ein unsigned an, um solche Fehler direkt zu vermeiden. Die beste Alternative wäre allerdings std::size_t, wobei dies meist einem unsigned int entspricht.
Zeile 16: Der Typ muss hier S_Feld sein.
Zeile 25: Warum legst du hier schon die Variable an? Generell gilt: Variable erst anlegen, wo sie gebraucht wird!
Zeile 33: Seine Eingabe sieht der Benutzer selbst, die musst du ihm nicht nochmal ausgeben!
Zeile 37: Hier muss ein "case 1:" stehen, denn du hast einen Integer eingelesen. std::cin wandelt dabei automatisch eine '1' in eine 1 um. Wenn du mit char einließt, wäre '1' korrekt.
Zeile 41: Du reagierst nicht auf falsche Eingaben.
Zeile 47: In main kann return 0 weggelassen, da der Standard festlegt, dass dies automatisch angenommen wird, wenn kein return gefunden wird. Dies gilt nur in main.
Zeile 52: Hier gilt auch: x kann und darf nicht negativ sein. D.h. unsigned int, noch besser std::size_t.
In dem Fall nicht wichtig ist der Unterscheid zwischen Post u. PreInkrementierung. Solltest du dir aber trotzdem mal angucken.
Zeile 54: Vgl. Zeile 52.
Zeile 56 - 63: Lassen sich durch den ternary operator vereinfachen:
|
C-/C++-Quelltext
|
1
|
std::cout << Feld[x][y].Besetzt ? 'x' : '.';
|
Du hast die von David genannten Fehler im Punkto 'x' und '.' drin.
Zeile 65: Hier fehlt ein std::cout << "\n"; um bei der Ausgabe auch eine neue Zeile zu beginnen!
Das war's soweit erstmal. Wenn du noch fragen hast, sag bescheid!