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

07.01.2011, 22:53

Raster mit 2D Array versehen?

Hallo liebes Board:)

ich bin gerade dran ein Klon von Schiffe versenken zu programmieren.
Ich hab jetzt mein Raster erzeugt, das aus linien mit 2 For-Schleifen für die vertikalen und horizontalen Linien besteht. (Kein Konsolenprogramm)
Info: muss ich für Schule machen


Wie soll ich am besten mein 2D Array "draufklatschen"?
Also ich dachte ich zieh einfach über das Raster einen 2D Array, um jedem Feld eine Struktur zu geben die einen Char hat ob das Feld
ein Treffer ist, Wasser oder ein Schiff. (T, W, S)

2. Möglichkeit:

Ich hole einfach die MousePosition rein wo geklickt wurde und schaue welches Feld das ist.

ein Beispiel:

Mouseclick auf x = 245, y=436 dann schaue ich welches Feld in x und y Richtung das ist.

Das alles ist ja die Vorarbeit damit man dann die Schiffe setzen kann.
Für das Schiffe setzen hab ich mir überlegt man gibt einfach die Kordinaten an z.b. 4/7 (ist ein 10*10 Feld) und drückt dann entweder horizontal oder vertikal (2 buttons) doch wie speichere ich dies in meinem Array?

Nach meiner Überlegung muss ich dann den Feldern wo das Schiff hinsoll, der Struktur sagen dass dort eben ein Schiff ist. Irgendwie char=S (für Schiff).
Dann beim Abschiessen kann ich das einfach mit einer IF abfragen ob dort ein S drinnsteht.


Ich hoffe ihr habt alles verstanden und hoffe ihr könnt mir bei meinem Problem helfen:)

Grüsse timi19

2

07.01.2011, 23:14

Am besten machst du dir, wie du schon gesagt hast ein 2D Array, welches mit Strukturen gefüllt sein könnte. In deiner Struktur könnte z.B. stehen, welchem Spieler (bzw. KI) das Feld gehört (falls es besetzt ist) und natürlich, von welchem Schifftyp, bzw. ob es Wasser ist etc, was du halt brauchst. Wenn dann die Maustaste gedrückt wurde, dann kannst du ganz einfach berechnen, welchem feld das entspricht.

Bsp: ein feld ist 50x50pixel groß. Wenn dann die maus an position 356|567 gedrückt wurde, dann rechnest du einfach

C-/C++-Quelltext

1
int xPosArray = MausPosX / 50;
bzw.

C-/C++-Quelltext

1
int yPosArray = MausPosY / 50;
In diesem Fall also 356/50 = 7 und 567/50 = 11. Also wurde das Feld [7][11] im Array gedrückt.

Beim Schiffe setzen könntest du es so machen: Du fragst die StartPosition des Schiffes ab (also praktisch einfach Anfang/Ende des Schiffes) und ob es vertikal oder horizontal angelegt werden soll. Dann setzt du eben je nach Schiff die entsprechenden Array Felder auf den entsprechenden Wert.

Bsp: StarPos = 3|4; Anordnung: horizontal; Schiff belegt 3 Felder; Dann setzt du einfach die ArrayFelder [3][4] + [4][4] + [5][4] auf den entsprechenden Wert.

Allerdings solltest du dabei immer erst prüfen ob es an dieser Stelle überhaupt möglich ist, ein Schiff zu platzieren.
Bsp: Dein Spielfeld ist nur 10 Felder breit, aber der Spieler will sein Schiff horizontal an Position 8/irgendwas setzen. Wenn das Schiff jetzt aber zu breit ist, würdest du die Array Grenzen nicht einhalten und darüber hinaus schreiben -> Absturz

Wenn ein Spieler bzw. die KI einen Schuss abgegeben hat, prüfst du einfach an der entsprechenden Stelle, ob denn dort ein Schiff des Gegners ist oder nicht.

So, ich hoffe du kannst damit was anfangen^^

PS: Was benutzt du eigentlich für die Grafikausgabe?

lg chaia

3

08.01.2011, 12:34

Am besten machst du dir, wie du schon gesagt hast ein 2D Array, welches mit Strukturen gefüllt sein könnte. In deiner Struktur könnte z.B. stehen, welchem Spieler (bzw. KI) das Feld gehört (falls es besetzt ist) und natürlich, von welchem Schifftyp, bzw. ob es Wasser ist etc, was du halt brauchst. Wenn dann die Maustaste gedrückt wurde, dann kannst du ganz einfach berechnen, welchem feld das entspricht.

Bsp: ein feld ist 50x50pixel groß. Wenn dann die maus an position 356|567 gedrückt wurde, dann rechnest du einfach

C-/C++-Quelltext

1
int xPosArray = MausPosX / 50;
bzw.

C-/C++-Quelltext

1
int yPosArray = MausPosY / 50;
In diesem Fall also 356/50 = 7 und 567/50 = 11. Also wurde das Feld [7][11] im Array gedrückt.

Beim Schiffe setzen könntest du es so machen: Du fragst die StartPosition des Schiffes ab (also praktisch einfach Anfang/Ende des Schiffes) und ob es vertikal oder horizontal angelegt werden soll. Dann setzt du eben je nach Schiff die entsprechenden Array Felder auf den entsprechenden Wert.

Bsp: StarPos = 3|4; Anordnung: horizontal; Schiff belegt 3 Felder; Dann setzt du einfach die ArrayFelder [3][4] + [4][4] + [5][4] auf den entsprechenden Wert.

Allerdings solltest du dabei immer erst prüfen ob es an dieser Stelle überhaupt möglich ist, ein Schiff zu platzieren.
Bsp: Dein Spielfeld ist nur 10 Felder breit, aber der Spieler will sein Schiff horizontal an Position 8/irgendwas setzen. Wenn das Schiff jetzt aber zu breit ist, würdest du die Array Grenzen nicht einhalten und darüber hinaus schreiben -> Absturz

Wenn ein Spieler bzw. die KI einen Schuss abgegeben hat, prüfst du einfach an der entsprechenden Stelle, ob denn dort ein Schiff des Gegners ist oder nicht.

So, ich hoffe du kannst damit was anfangen^^

PS: Was benutzt du eigentlich für die Grafikausgabe?

lg chaia

WoW! 8o Danke dir für deine Antwort.

Ich benutze QT von Trolltech bzw. Nokia.
http://qt.nokia.com/products/


mfg timi19

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

08.01.2011, 19:50

Sollt ihr Qt benutzen oder könnt ihr euch das aussuchen? Ansonsten könntest du dir auch mal Allegro angucken. Ist meiner Meinung nach einfach zu benutzen und schnell zu lernen. Vielleicht hilft dir das weiter. Habe Qt bis jetzt nur für Gui-Anwendungen benutzt, aber finds für den Anfang nicht ganz unumständlich zu lernen.
„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.“

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

08.01.2011, 19:57

Also mit Qt könnte man auch OpenGL benutzen. Wird ja auch unterstützt.

Aber für einfache Sachen würden ja auch Standard GUI Elemente reichen. Schiffe versenken ist ja grafisch nicht so anspruchsvoll. ;)

6

08.01.2011, 21:20

Sollt ihr Qt benutzen oder könnt ihr euch das aussuchen?
Naja, wir sollten aber können auch alles andere benutzen. Nur hilft uns dann der Lehrer nicht bei anderem Zeug:)

7

15.01.2011, 20:42

Hallo, ich bins wieder
ich wollte nicht extra einen neuen Thread eröffnen, darum schreibe ich hier hinein:)
Und zwar geht es um folgendes:

Ich habe jetzt mein Spiel so weit programmiert, dass ich jetzt zum eigentlichen Spiel komme.
Und zwar kann ich meine Schiffe setzen und speicheres es sauber in meinem Array ab.
Nachdem alle Schiffe gesetzt wurden, kann man den Button drücken zum Spiel starten.
Ich muss das Spiel so programmieren, dass es über das Netzwerk lauffähig ist. Ich weiss auch wie man Pakete sendet oder kriegt.
Doch mein Problem ist der Algorithmus.

Das Empfangen und bearbeiten sprich überprüfen obs jetzt dort ein Schiff hat oder nicht ist ja nicht schwer.
Viel mehr Schwierigkeit hab ich wie ich das verpacken soll.
Und zwar ist ja Schiffeversenken ein Rundenbasiertes Spiel d.h. ich brauche sichermal eine ganz grosse Schleife, in der ich alles schreibe und die dann rausfällt wenn der bool spielfertig auf true springt.
Um es auf den Punkt zu bringen:

Wie soll bestimmt werden wer anfängt?
Und wie ungäfähr soll ich das mit den Runden erstellen?
Beide fangen ja mit der selben Schleife an:s
Oder ich könnte eig. auch zwei Schleifen machen oder einfach Methoden?
Wenn der eine dran ist, dann die Methode und umgekehrt die andere.


Ich hoffe ihr könnt mir helfen, wäre sehr nett:)

mfg timi19

8

15.01.2011, 21:08

Du könntest durch Zufall bestimmen wer anfängt oder einfach durch Zufall jeden bestimmen, der wählen darf, wer anfängt.
Wenn der eine praktisch mit seiner Runde fertig ist (der andere muss ja solange warten), kannst du ja einen Button einfügen Zug beenden und dann die Spiele synchronisieren oder auch einfach nachdem er seinen Schuss gesetzt hat.

Kenne mich mit Netzwerk nicht wirklich aus, ich hoffe du kannst trotzdem was damit anfangen^^^

lg chaia

Werbeanzeige