Du bist nicht angemeldet.

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

1

17.03.2019, 21:52

Schiffeversenken mit Randbedingungen

Hallo Leute, ich hab da ein kleines Problem. In der Schule programmieren wir gerade das Spiel Schiffeversenken in C. Ich bin ziemlicher Anfänger was das angeht, aber das Spiel funktioniert soweit bis auf eine Sache. Die Randbedingungen sind ein 2 Dimensionales 5x5 Feld, 1er Schiffe und maximal 9 Schiffe die zufällig vom Computer gesetzt werden. So das Problem ist, die Schiffe dürfen nicht aneinander liegen, auch nicht diagonal. Bis 6 Schiffe ist alles kein Problem aber ab 7 Schiffen hängt er einfach fest. Ich hänge mal den Auschnitt des Codes an. Ich hoffe jemand kann mir helfen, zumindest ein Tip geben.

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
//Verteilung der Schiffe durch Zufallszahlen mit den Randbedingungen
    //{
        do
            {
                if (nichtfrei<25-anzahl)
                    {
                        x=rand()%5;
                        y=rand()%5;
                        if(feld1[y][x]!=1&&feld1[y+1][x]!=1&&feld1[y+1][x+1]!=1&&feld1[y][x+1]!=1&&feld1[y-1][x]!=1&&feld1[y-1][x-1]!=1&&feld1[y][x-1]!=1&&feld1[y+1][x-1]!=1&&feld1[y-1][x+1]!=1&&feld1[y][x]==0)
                            {
                                feld1[y][x]=1;
                                zufall++;
                                vergeben++;
                            }
                        else
                            nichtfrei++;
                    }
                else
                    {
                        for (y=0;y<5;y++)
                            for(x=0;x<5;x++)
                                feld1[x][y]=0;
                        zufall=0;
                        vergeben=0;
                        nichtfrei=0;
                    }
            }
        while (vergeben!=anzahl);

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

17.03.2019, 22:04

Mit welcher Entwicklungsumgebung arbeitet ihr denn? Am besten schaut man sich sowas immer mit einem Debugger an. Wenn er festhängt, kann man in der Regel einfach im Debugger das Programm pausieren und sich dann anschauen, was genau abgeht…

3

17.03.2019, 22:05

Mit CodeBlocks. Danke für den Tip, daran habe ich gar nicht gedacht, ich schaue mir das eben mal an.

So ich hab mir das mal mit dem Debugger angeschaut, die schleifen funktionieren soweit, aber er findet ab 7 schiffen einfach keine passenden spots. Ich kann mir das nur dadurch erklären das die zufallszahlen sich ständig wiederholen obwohl die an der systemzeit geknüpft sind. Wird die systemzeit ständig abgefragt oder nur einmal bei Programmstart?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Paradox« (17.03.2019, 23:29)


4

18.03.2019, 03:46

Versuch doch mal, mehr als 6 Schiffe in einem 5x5 Feld zu platzieren, vielleicht fällt dir dann etwas auf...

Abgesehen davon ist es toll, dass du über den Tellerrand schaust und dir z.B. auch das Feld (-1,-1) anguckst, hab gehört da sind ganz viele Schiffe :)
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Magogan« (18.03.2019, 03:52)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

18.03.2019, 06:34

Das Feld [5, 5] schaut er sich auch an, selbst wenn [4, 4] die größte Koordinate darstellt.

Für 9 1er Schiffe in einem 5x5 Feld fällt mir unter den Bedingungen übrigens nur eine einzige Lösung zur Verteilung der Schiffe ein. Meine KI gewinnt. :D
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »BlueCobold« (18.03.2019, 06:39)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

18.03.2019, 11:07

Es wurde ja schon angedeutet. Es gibt nur eine Möglichkeit 9 Schiffe auf einem 5x5 Feld unterzubringen. In deinem Fall setzt du ein Schiff sobald du eine aktuell mögliche Position gefunden hast. Die aktuell gefundene Position stellt sich aber nachträglich vielleicht als schlecht heraus.
[0, 0] ist die Zelle ganz oben links in deinem Feld und [4, 4] die ganz unten rechts. Jetzt stell dir vor dein Algorithmus wählt Zelle [1, 1] für das erste Schiff aus. Jetzt verteilt er munter Schiffe bis er an den Punkt kommt dass er kein freies Feld mehr findet. Das Problem ist, dass Zelle [1, 1] in der einzig möglichen Lösung 9 Schiffe auf dem Feld zu verteilen nicht belegt sein kann.
Was du jetzt machen kannst um das Problem zu lösen nennt sich Backtracking. Dabei nimmst du gesetzte Schiffe wieder zurück wenn du keine neue Position finden kannst. Da du in deinem Fall nicht alle möglichen Positionen testest, sondern diese zufällig bestimmst, musst du irgendwie anders entscheiden wann du deinen backtrack-Schritt machst. Eine Möglichkeit wäre vorab alle Positionen in einer Liste zu speichern. Jetzt wählst du immer zufällig ein Element der Liste und guckst ob es als nächste Position für ein Schiff taugt. Gibt es keine möglichen Positionen mehr, so machst du eben deinen backtrack-Schritt.
Hilft dir das weiter?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige