Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class drawField { private: char field_[5][10]; char control_field_[5][10]; public: drawField(); ~drawField(); void showField(); void setShips(); void setField(int row, int column); }; |
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 |
void drawField::setShips() { int row = 0; int column = 0; for(int ships = 0; ships < 5; ships++) { // Zufallszahl erstellen srand(time(NULL)); row = rand() % 5 + 1; column = rand() % 10 + 1; //Überprüfung ob die das Feld bereits belegt ist if (control_field_[row][column] == 'X') { --ships; } else { control_field_[row][column] = 'X'; } }; |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Jaymz« (11.09.2010, 01:26)
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
unsigned int ships = 0; while (ships < 5) { // Zufallszahl erstellen srand(time(NULL)); row = rand() % 5 + 1; column = rand() % 10 + 1; //Überprüfung ob die das Feld bereits belegt ist if (control_field_[row][column] != 'X') { control_field_[row][column] = 'X'; ++ships; } |
danke schonmal für diese info. ich hab den befehl schnell "zusammengegoogled" und dabei wohl was wichtiges übersehen.Zitat
1. srand(time(NULL)); ruft man eigentlich nur ein einziges Mal auf, das reiht, um den Zufallszahlengenerator zu initialisieren. Am besten du setzt den Aufruf in eine Init()-Funktion, falls du sowas hast, sonst eben an den Anfang von main().
hmm. ich vermute mal das ich bei der rand() nummer bis 5/10 geh aber der compiler mit 0 beginnt. also ist das array bei 4/9 zu ende? wäre das einzige was mir im mom einfallen würde.Zitat
2. In deinem Code haben sich 2 weitere sehr widerliche Fehler versteckt: Du schreibst an 2 Stellen über das Ende deines Arrays heraus, wenn rand() den entsprechenden Wert liefert. Überdenke noch mal, wie Arrays inidziert sind. Wenn du nicht auf die Lösung kommst, dann sag ich dir auch woran es genau liegt
ups. ich dachte wenn ich in der for schleife mittels ships-- zähl hab ich auch den effekt das die schleife solange läuft bis alle felder belegt sind. aber ich werds mal anpassen.Zitat
Ich hab's nur eben überflogen, allerdings sehe ich soweit, dass deine set Methode eventuell besser ausgelegt wäre, wenn es nicht 5 mal statisch durchlaufen wird, sondern stattdessen solange, bis 5 Schiffe gesetzt sind (Stichwort while Schleife).
Also würde ich unsigned int ships = 0; anlegen und die while Schleife solange durchlaufen lassen, bis diese Variable 5, oder je nachdem welche Anzahl du möchtest, erreicht hat.
Innerhalb der Schleife kannst du dann kontrollieren, ob das Feld bereits besetzt ist und es noch einmal probieren.
Das mit der Schleife kannst du so lassen, es solte funktionieren, die Schiffe wurden nur nicht alle angezeigt, weil manche außerhalb der Arraygrenzen lagen.
Community-Fossil
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 |
class Field { // private: brauchst du nicht, ist bei class so gegeben ;) sonst nimm struct char m_field[5][10]; char m_control_field[5][10]; public: Field(); // ~drawField(); brauchst du den wirklich? public: void draw() const; // nja bist in class Field und const, da du beim zeichnen wohl nix änderst ;) void setRandomShips(); // wer soll sonst wissen was da für schiffe gesetzt werden ;) void setField(const unsigned int, const unsigned int); // const da du nix dran ändern wirst/sollst, unsigned weil dein array von 0 bis ... geht ;) }; void Field::setRandomShips() { unsigned int row(0); unsigned int column(0); for (unsigned int ships(0); ships < 5;) { row = std::rand() % 5; column = std::rand() % 10; // Überprüfung ob die das Feld bereits belegt ist if (m_control_field[row][column] != 'X') { m_control_field[row][column] = 'X'; ++ships; } } } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
#include <iostream> #include <windows.h> #include <time.h> using std::cout; using std::cin; using std::endl; |
Werbeanzeige