Forum: Mikrocontroller und Digitale Elektronik ZUFALLS ZAHLEN im 2 dem. ARRAY


von Cmn (Gast)


Lesenswert?

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
von Ralf (Gast)


Lesenswert?

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

von Cmn (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Blinky (Gast)


Lesenswert?

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.

von Ralf (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.