Hallo alle zusammen. Ich habe zurzeit ein Projekt,mit meinem Microcontroller (ATmega88),Schiffeversenken. Soweit ist es gar nicht so arg schwer habe anfangs gedacht ich setzte meine Schiffe manuell aber mein Prof. meinte es soll per Zufalls Prinzip gehen. Leider habe ich das noch nicht in einem 2 dimensionalen Array gemacht und wenn ich mein Schiffe setzen lasse habe ich auch die sorge das sie quer durch gesetzt werden (also auch schräg). Könnte mir jemand helfen wie man so etwas angeht oder wie man überhaupt per Zufallsprinzip ein Array füllt. Habe schon natürlich gegooglet aber ich will es ja richtig verstehen und bei meinem Projekt dürfen ja nur die schiffe gesetzt werden und der Rest muss leer bleiben. Ich danke euch für jede Hilfe die bekommen kann.
:
Verschoben durch Moderator
Hi Cmn, im ersten Ansatz würde ich mal vorschlagen, dass du dir dein Array erstmal bildlich skizzierst (im Beispiel 8x8): 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 Das Array ist mit 0x00 initialisiert. Was brauchst du nun, um eine Position zu haben? Zwei Zufallszahlen im Bereich von 0-7, um direkt die Koordinaten abbilden zu können, oder eine Zufallszahl im Bereich 0-63, aus der du die Koordinaten extrahierst (also durch Acht teilen, ergibt dann die Reihe, der verbleibende Rest ist die Spalte). Du siehst also, du kannst das zweidimensionale eindimensional abbilden (sofern dein Prof diesen Trick erlaubt, ansonsten eben zwei Werte). Schritt zwei ist die Ermittlung der Richtung, also eine Zufallszahl von 0-3 (nach oben, unten, links oder rechts). Schritt drei ist das prüfen, ob eines der Schiffe in die angegebene Richtung passt, ohne über den Rand zu schauen, das geht mit Addition/Subtraktion. Ebenfalls zu prüfen wäre der Marker: Für jedes infrage kommende Feld prüfst du, ob es den Wert 0x00 hat - wenn ja hat das Schiff Platz. Wenn ein Schiff passt, setzt du es ins Array mit einem Marker, z.B. 0x00 = frei, 0x01 = Zerstörer, 0x02 = Fregatte, 0x03 = FredFischersFischKutter, etc. natürlich in der entsprechenden Richtung und in der entsprechenden Länge. Passt ein Schiff nicht, startest du wieder bei Punkt zwei. Die Schritte zwei und drei wiederholst du, bis alle Schiffe gesetzt sind. Das wäre so ungefähr der Ablauf mit dem ich starten würde, wenn ich die Aufgabe hätte. Ralf
Hallo Ralf, ich habe für jedes Schiff eine Zählerschleifen zählen lassen da ja meine Schiffe nicht nur einmal sondern 2 oder 3 mal existieren. Ich habe ein frage, kennst du solche Funktionen ob man schauen kann das die Schleife an einen bestimmten Punkt aufhört und an einen anderen Punkt in der Schleife die arbeit wieder aufnimmt? (ich hoffe ich habe es richtig beschrieben so das du es verstehen kannst) Carmen
Cmn schrieb: > Hallo Ralf, > > ich habe für jedes Schiff eine Zählerschleifen zählen lassen da ja meine > Schiffe nicht nur einmal sondern 2 oder 3 mal existieren. Ich habe ein > frage, kennst du solche Funktionen ob man schauen kann das die Schleife > an einen bestimmten Punkt aufhört und an einen anderen Punkt in der > Schleife die arbeit wieder aufnimmt? Es gibt verschiedene Formen von Schleifen. Unter anderem zum Beispiel eine stink normale while-Schleife
1 | Anzahl_Schiffe = 5; // so viele sind zu positionieren |
2 | |
3 | while( Anzahl_Schiffe > 0 ) { // solange nicht alle untergebracht wurden |
4 | |
5 | generiere eine zufällige Position für ein Schiff |
6 | |
7 | untersuche ob die Position möglich ist |
8 | |
9 | if( Position ist möglich ) { |
10 | Trage das Schiff dort ein |
11 | Anzahl_Schiffe--; // wieder eines erfolgreich positioniert |
12 | }
|
13 | }
|
manchmal muss man auch einfach nur seinen Standpunkt ein wenig ändern und nicht zu sehr an bereits vorhandenem Code kleben.
Ich würde hingehen und für jeden Schifftyp eine Zählvariable definieren wie of dieser Schiffstyp vorkommen kann. Die erzeugte x/y Variable ist hier das Heck des Schiffs. Dann erzeuge ich eine zufällige x, y Koordinate und eine Richtung und prüfe wie viele Felder nach vorne noch frei sind. Mit dieser Anzahl schaue ich nach ob ich noch ein Schiff in der Größe (oder kleiner) unterbringen muß. Wenn ja, dann beschreibe ich die Felder im Array mit einem Wert, z.B: Bit 0-3: Position im Schiff, Bit 4-6: Schiffstyp, Bit 7: 0 (Markiert Treffer) und veringere den entsprechenden Zähler um 1. Wenn alle untergebracht sind (Alle Zähler auf 0) kann das Spiel beginnen.
Hi Cmn, ich würde die Schiffe nicht separat in einzelne Schleifen legen, wozu auch? Schließlich sind es alles Schiffe, nur eben mit unterschiedlichen Längen und unterschiedlicher Anzahl... Ich würde also eher Tabellen verwenden, welche die Anzahl der jeweiligen Schiffe und deren Typ beschreibt. Da man ja nach obigen Lösungsansätzen eh schon Feldwerte für den Typ hat, könnte man das in Tabellen verpacken (Tabellen sind Arrays mit festen Werten). Also eine Tabelle für die Anzahl des jeweiligen Schiffstyps, eine Tabelle für die Länge des jeweiligen Schiffes, etc. Das ergibt dann verschachtelte Schleifen, was aber kein Problem darstellt. Ralf
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.