Schiffe versenken

Status
Nicht offen für weitere Antworten.

tricky2

Mitglied
Hallo zusammen!

Hab mich in den letzten Wochen mal ein bisschen mit Java beschäftigt und würde nun gerne ein kleines Spiel (Schiffe versenken) programmieren

Ich habe ein 4x4 großes Spielfeld
Die Schiffgröße, Anzahl, etc. sind erst mal nicht relevant, also es wird nur ein Schiff in diesem Spielfeld gesetzt und man soll versuchen zu erraten, wo dieses Schiff liegt.
Das Schiff wird zufällig in das Array gesetzt.
Wenn man dann getroffen hat, soll ein Treffer ausgegeben werden.
Der Benutzer soll über die X- und Y-Koordinate eine Eingabe des Feldes eingeben

Code:
Random r = new Random();
		int x = Integer.parseInt(textfeld1.getText());
		int y = Integer.parseInt(textfeld2.getText());
		for(int i=0; i<=3; i++)
		{
		    z1 = Math.abs(r.nextInt())%3;
		    z2 = Math.abs(r.nextInt())%3;
		    A[z1][z2] = 1;              //Das Schiff wird zufällig gesetzt

		}

Bis hierhin hab ich´s jetzt ja schon ma hinbekommen.
Habe das Array global deklariert, ebenso wie z1 und z2.

Ich weiß jetzt nur irgendwie nicht weiter...:-(
Hatte zuerst an eine if-Abfrage gedacht sowie
Code:
if (x == A[z1][z2]&& y == A[z1][z2])
		{
		    SOP("Treffer!");
		}
		    else
		    {
		        SOP("Daneben!");
		    }

aber das war auch nur ein Ansatz, weil er dann bei Eingabe von X=1 und Y=1 immer einen Treffer ausgibt.

Habt ihr vielleicht einen Tip für mich??

Vielen Dank im Voraus für eure Bemühungen!
 

moormaster

Top Contributor
tricky2 hat gesagt.:
Code:
if (x == A[z1][z2]&& y == A[z1][z2])
		{
		    SOP("Treffer!");
		}
		    else
		    {
		        SOP("Daneben!");
		    }

aber das war auch nur ein Ansatz, weil er dann bei Eingabe von X=1 und Y=1 immer einen Treffer ausgibt.

Habt ihr vielleicht einen Tip für mich??

Vielen Dank im Voraus für eure Bemühungen!

Ich denke im Array A stehen nur 1en oder 0en?

Wenn du fragst, ob x == A[z1][z2] && y == A[z1][z2] gilt, dann fragst du nichts anderes, als:

steht im Array an der Stelle (z1,z2) der gleiche Wert wie in x und gleichzeitig wie in y... Das ergibt doch gar keinen Sinn ^^

Du willst doch nur wissen, ob es sich um einen Treffer handelt, also ob sich an der Stelle (x,y) ein Schiff befindet:

Also musst du einfach nur A[x][y] == 1 testen.
 
P

P

Gast
Hi!

Also, zu deinem Spielfeld: du wirst wohl ein zweidimensionales Array der Größe 4 erstellt haben, also int[][] A = new int[4][4] *

bei deiner Rechnung x % 3 wird nie die 3 rauskommen, d.h. die letzten Felder in deinem Array werden nie befüllt. Nur so als kleinen Tipp ;)

z1 und z2 hast du wahrscheinlich vor und außerhalb deiner for-schleife für die Verteilung der Schiffe definiert, d.h. die Variablen existieren mit ihrem zuletzt zugewiesenen Wert auch NACH der Verteilung. Wenn sie nicht geändert wurden, so sind die Werte von z1 und z2 die letzten Koordinaten, wo du ein Schiff in dieser einen For-Schleife gesetzt hast.

In deiner if-Abfrage vergleichst du also, ob der Wert in der Koordinate, wo du zuletzt ein Schiff (also 1) gesetzt hast, jeweils mit der Zahl 1.

moormaster hat also Recht, wie dein neuer Versuch aussehen sollte: der Spieler gibt Koordinaten an, wo er ein Schiff vermutet, d.h. du musst aus deinem Spielplan auslesen, was hinter diesen Koordinaten steckt:
if (A[x][y] == 1)
{
SOP("Treffer!");
}
else
{
SOP("Daneben!");
}


Sry, dass ich keinen Code-Style verwendet habe, aber für die Schnipsel ist mir das Tag-gesetze zu nervig.

Wenn du etwas nicht verstanden hast, frag ruhig nach :)



* kleine Anmerkung: wenn du Java lernst, dann gib den Variablen am besten sinnvolle Namen, die mit einem kleinen Buchstaben beginnen. In ein paar Wochen wirst du wissen, warum ;)
 

tricky2

Mitglied
Hey, vielen Dank an euch beide!
Jetzt funktionierts :)

Hab mir mal gedacht, anstatt der eingabe von x- und y-koordinate einfach 16 Buttons zu platzieren.

Könnte ich jetzt z.B. Button1 als A[0][0], Button2 als A[0][1], usw deklarieren und dann per Mausklick die Anzahl der Treffer auswerten ?

Ich weiß, es ist sicherlich möglich, aber ich bin ja noch am Anfang :)

Danke im Voraus
 
G

Guest

Gast
hmmm....
Bsp..: b1 =Button1
also wenn ich versuch b1 =A[2][0];
dann wirft er ne Fehlermeldung aus... :(
 

Leroy42

Top Contributor
Und was denkst du dir, sollte geschehen, wenn du einen
int einem Button zuweist? :shock:

Ich denke mal, du hast dich total damit übernommen
mit deinem Wissenshorizont ein Schiffe-Versenken-Spiel
implementieren zu wollen. :(

Du mußt dich erstmal mit den Grundlagen vertraut machen.
 

Marco13

Top Contributor
Mal nicht so entmutigen :meld: An sich ist Schiffe versenken IMHO für den Anfang ganz gut - ein paar schleifen, Arrays, if-Abfragen.... Ob dann gleich ein GUI dabei sein muss, darüber kann man sich streiten, aber ... wenn, dann gleich richtig: Schreib' ein sauberes, funktionierendes Schiffe-Versenken. Das KÖNNTE zum Beispiel (!) eine Klasse sein, die ETWA solche Methoden anbietet wie
Code:
class SchiffeVersenken 
{
    enum ShipType { NONE, SMALL, MEDIUM, LARGE }

    public SchiffeVersenken(int size) {...}

    public int getSize() {...}

    public void placeShip(ShipType type, boolean horizontal, int x, int y) {...}

    public ShipType hitShipAt(int x, int y) {...} oder
    public ShipType getShipTypeAt(int x, int y) {...}

    ... (und vielleicht noch ein paar mehr, z.B. sowas wie "boolean allShipsSunk()" oder so...)...
}
(nur ganz grob, nicht zu sehr dran festhalten!)
Also, entwirf das Modell eines Spieles, das man mit klar defnierten Methoden von außen "steuern" kann. Überleg's dir vorher genau eine (""minimale"") Menge von Methoden, die man braucht, um das Spielfeld anzeigen und ein Spiel darauf spielen zu können. Dann könntest du dieses Modell zum Testen von der main aus ansteuern:
Code:
public static void main(String args[])
{
    SchiffVersenken sv = new SchiffeVersenken(5);
    sv.placeShip(ShipType.SMALL, true, 3,1);
    sv.placeShip(ShipType.MEDIUM, true, 1,2);
    sv.placeShip(ShipType.LARGE, 1,4);
    sv.printBoard();
    System.out.println(sb.hitShipAt(2,2)); 
    ...
}
Wenn das funktioniert, kannst du dich ans GUI machen. Dort musst du dann (auch) dafür sorgen, dass du
1. Das aktuelle Spielfeld anzeigen kannst
2. Der Benutzer durch Mausklicks solche Methoden wie "hitShipAt(x,y)" ansteuern kann.
Wenn du das Spielfeld durch JButtons repräsentieren willst (was für den Anfang(!) recht naheligend ist) könntest du (vielleicht nicht sofort, aber im Lauf der Entwicklung) das vorletzte und das letzte Beispiel in diesem FAQ-Eintrag http://www.java-forum.org/de/viewtopic.php?p=310844 interessant finden.

Ansonsten: Genaue Fragen stellen, und die relevanten Code-Stellen (oder am besten ein compilierbares Stück code!) posten.
 
P

P

Gast
Hi!

Es stimmt, GUI ist ein Thema für sich. Jedoch macht es immer mehr Spaß, wenn irgendetwas da ist, was man sehen und auf das man klicken kann. In meinen Anfängen wollte ich auch immer so schnell wie möglich die GUI dabei haben, doch als ich gesehen habe, dass es nicht so leicht ist, was vernünftiges daraus zu basteln... naja, lassen wir das ;)

Auf jeden Fall ist eine Planung für ein Projekt immer sinnvoll, wenn es denn vernünftigt aufgezogen werden soll. Wenn man einfach irgendwas haben will, um es zu lernen, so kannst du in den ersten Schritten ruhig drauf los schreiben. Dabei wirst du erkennen, dass ein nicht geplantes Projekt Sackgassen mit sich bringt und du wirst aus diesen Fehlern lernen.

Um Java kennen zu lernen, kannst du auch in den ersten Schritten nur linear und ohne große Methodenauslagerung zu arbeiten. Später wirst du sehen, dass sich Befehle wiederholen, sodass sich dein Quelltext aufbläht und du hinterher nicht weißt, wo dir der Kopf steht. Auch hier: diese Erfahrung musst du machen, damit du weißt, warum man es so nicht machen sollte (getreu dem Motto: man muss auf die Schnauze fallen, um zu verstehen, dass es weh tut ;)).


Zu den JButtons:
Buttons sind einfach "Knöpfe" mit einer Aufschrift darauf, die der Benutzer drücken kann. Damit was beim Drücken passiert, musst du dem JButton sagen, was er dann machen soll. Dazu gibt es sogenannte "ActionListeners". Wofür und was das ist, wirst du am besten durch Lesen einiger FAQs und (Online-)Büchern herausfinden.
Falls du dazu Fragen hast: Bitte, wir sind ganz Ohr ;)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben