Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
faecher:informatik:oberstufe:java:algorithmen:arrays:mehrdimensional:start [26.10.2023 05:14] – Frank Schiebel | faecher:informatik:oberstufe:java:algorithmen:arrays:mehrdimensional:start [01.10.2024 06:01] (aktuell) – [Aufgaben] Svenja Müller | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Mehrdimensionale Arrays: Schiffe versenken ====== | ====== Mehrdimensionale Arrays: Schiffe versenken ====== | ||
- | + | ((Dieses Beispiel ist eng an die Vorlage aus dem ZUM Wiki unter https:// | |
- | Ein nettes | + | Ein Beispiel für den Einsatz eines zweidimensionales |
===== Das Spielfeld als zweidimensionales Array ===== | ===== Das Spielfeld als zweidimensionales Array ===== | ||
+ | |||
+ | Mehrdimensionale Arrays definiert man folgendermaßen: | ||
+ | |||
+ | <code java> | ||
+ | private int[][] zahlenquadrat = new int[10][10]; | ||
+ | </ | ||
+ | |||
+ | Die Modellierung für das Schiffe-Versenken-Spiel sieht so aus: | ||
+ | |||
+ | |||
+ | {{ : | ||
+ | |||
+ | Die Klassen Gebiet und Spielfeld sind dabei folgendermaßen angelegt: | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Das **Spielfeld** hat im Wesentlichen die Aufgabe, die Gebiete zu verwalten. Daher bekommt es nur eine Eigenschaft: | ||
+ | |||
+ | <code java> | ||
+ | public class Spielfeld { | ||
+ | // Eigenschaften | ||
+ | private Gebiet[][] feld; | ||
+ | // Konstruktor | ||
+ | public Spielfeld() { | ||
+ | feld = new Gebiet[10][10]; | ||
+ | // Anfangswerte setzen für alle 100 Felder | ||
+ | for (int i = 0; i < 10; i++) { | ||
+ | // senkrecht | ||
+ | for (int j = 0; j < 10; j++){ | ||
+ | // | ||
+ | feld[j][i]=new Gebiet(); | ||
+ | } | ||
+ | } | ||
+ | feld[1][2].setzeSchiff(); | ||
+ | feld[2][2].setzeSchiff(); | ||
+ | feld[3][2].setzeSchiff(); | ||
+ | } | ||
+ | (...) | ||
+ | </ | ||
+ | |||
+ | |||
+ | <callout title=" | ||
+ | |||
+ | Das Anlegen eines zweidimensionalen Arrays geschieht ähnlich wie das eines eindimensionalen. mit der Anweisung '' | ||
+ | |||
+ | Um das Array sinnvoll zu initialisieren müssen mit Hilfe einer verschachtelten Schleife alle Felder abgegangen werden: Erst Feld 0,0 dann 0,1 dann 0,2 .... 0,9 dann 1,0 dann 1,1 dann 1,2...dann 1,9 dann 2,0 usw. bis 9,9). | ||
+ | |||
+ | Dann wird wird beispielhaft ein 3er Schiff gesetzt. Dazu müssen 3 Felder einzeln angesprochen werden. | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Aufgaben ===== | ||
+ | |||
+ | |||
+ | * Analysiere auf Grundlage der beiden UML-Klassendiagramme und auf Grundlage deiner Kenntnisse über das Schiffeversenken-Spiel die Klassen '' | ||
+ | * Nenne weitere Beispiele aus dem Alltag, bei denen man Zwei- oder Mehrdimensionale Arrays benutzen könnte. | ||
+ | * Analysiere die Methoden '' | ||
+ | * Warum kann Spielfeld nicht direkt die Eigenschaften von Gebiet verwenden? | ||
+ | * Implementiere die Methoden '' | ||
+ | * Schreibe Methode '' | ||
+ | |||
+ | |||
+ | ===== Quelltexte ===== | ||
+ | |||
+ | <code java> | ||
+ | public class Gebiet | ||
+ | { | ||
+ | // Eigenschaften | ||
+ | | ||
+ | | ||
+ | |||
+ | // Konstruktor | ||
+ | | ||
+ | { | ||
+ | feldWurdeBeschossen=false; | ||
+ | schiffIstAufFeld=false; | ||
+ | } | ||
+ | |||
+ | // Methoden | ||
+ | | ||
+ | feldWurdeBeschossen=true; | ||
+ | if (schiffIstAufFeld) { | ||
+ | versenkeSchiff(); | ||
+ | return true; | ||
+ | } | ||
+ | else return false; | ||
+ | } | ||
+ | |||
+ | | ||
+ | schiffIstAufFeld=true; | ||
+ | } | ||
+ | |||
+ | | ||
+ | schiffIstAufFeld=false; | ||
+ | | ||
+ | |||
+ | | ||
+ | return feldWurdeBeschossen; | ||
+ | } | ||
+ | |||
+ | | ||
+ | return schiffIstAufFeld; | ||
+ | | ||
+ | } // Ende der Klasse | ||
+ | </ | ||
+ | |||
+ | <code java> | ||
+ | public class Spielfeld | ||
+ | { | ||
+ | // Eigenschaften | ||
+ | | ||
+ | |||
+ | // Konstruktor | ||
+ | public Spielfeld() | ||
+ | { | ||
+ | feld = new Gebiet[10][10]; | ||
+ | // Anfangswerte setzen fuer alle 100 Felder | ||
+ | for (int i=0; | ||
+ | for (int j=0; | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | // Methoden | ||
+ | public String schiesse(int x, int y){ | ||
+ | if (feld[x][y].beschiesseFeld()) return " | ||
+ | else return " | ||
+ | } | ||
+ | |||
+ | public void gibSpielfeldAufKonsoleAus(){ | ||
+ | | ||
+ | for (int i=0; | ||
+ | | ||
+ | for (int j=0; | ||
+ | if (feld[j][i].isFeldWurdeBeschossen()) System.out.print(" | ||
+ | else { | ||
+ | if (feld[j][i].isSchiff()) System.out.print(" | ||
+ | else System.out.print(" | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | } // Ende der Klasse | ||
+ | </ | ||
+ | |||
- | |