Übungen zu Softwareentwicklung 1, WS 2009/10 Übung 6 Name: Abzugeben bis: Mi, 2.12.2009 12:00 Matrikelnummer: Bearbeitungsdauer in Stunden: Nummer der Übungsgruppe: Name des Tutors: Name des Übungsleiters: Punkte: Beispiel 1: Schiffe versenken Punkte Implementieren Sie das Spiel Schiffe versenken. Dabei soll der Computer bei Programmstart die Schiffe am Spielfeld platzieren, diese sind dann vom Spieler (mit möglichst wenigen) Versuchen vollständig zu versenken. Das Spielende ist erreicht, wenn alle Schiffe des Computers versenkt wurden. Implementieren Sie die Schiffe und die Spielfelder in eigenen Klassen mit geeigneten Zugriffsmethoden (alle Variablen sind private zu deklarieren). Es existieren vier Arten von Schiffen (Länge 2 bis 5), die Schiffe dürfen am Spielfeld nur vertikal und horizontal liegen, sich nicht überlappen, und auch nicht aus dem Spielfeld ragen. Das Spielfeld selbst soll eine Größe von 20 x 20 Feldern haben. Die Platzierung der Schiffe (x-koordinate, y- Koordinate, Lage horizontal/vertikal) ist durch Zufallszahlen (java.util.random) zu realisieren. Schiffe der Länge 2: Schiffe der Länge : 2 Schiffe der Länge : 1 Schiff der Länge 5: Nach jedem Schuss des Spielers (Einlesen von x- und y-koordinate; für die Eingabe verwenden Sie wahlweise Zahlen, Buchstaben, oder eine Kombination) ist auszugeben, ob ein Schiff oder das Wasser getroffen wurde, ob das Schiff/Wasser an der Position bereits zuvor einmal getroffen worden ist, bzw. ob ein Schiff mit diesem Schuss gesunken ist; also zb. (wahlweise deutsch/englisch): Hit Water Already shot into the water at this place Hit Ship Ship with length <shiplen> sunk Weiters ist zu prüfen ob die eingegebenen Koordinaten gültig sind (innerhalb des Spielfelds liegen), andernfalls ist eine Fehlermeldung auszugeben, zb. Shot did not hit the battleground... Wurden alle Schiffe versenkt, so ist eine entsprechende Meldung sowie die Spielstatistik (=Anzahl der benötigten Versuche) auszugeben, zb. Fleet has sunk. The player needed <numshots> shots Hinweise: Definieren Sie Konstanten (final static ) für Werte die sich während des Spieles nicht verändern (zb. FIELD_WIDTH = 20). Sie können Ihr Spiel (während der Entwicklungsphase) mit kleineren Feldgrößen und/oder weniger Schiffen testen.
Verwenden Sie folgende Klassenstruktur, Felder und Methoden: public class Battleships { // declare global constants public static final int MAX_SHIPS = 10; public static final int MAX_HITS = *2 + * + 2* + 1*5; // 0 hits public static final int MIN_SHIP_LENGTH = 2; public static final int MAX_SHIP_LENGTH = 5; public static final int... // shot on ships; array of MAX_SHIPS ships, each ship has MIN_SHIP_LENGTH to MAX_ SHIP_LENGTH fields private static Ship[] ships = new Ship[MAX_SHIPS]; // playg round, two dimensional ar ray [x][y] private static Field[][] water = new Field[...][...]; // game statist ics private static int shots = 0; // random number generator private static Random rand = new Random(); // place a ship (random position and orientation) with length=<len> on the battlefield; use the method isplaceable(...) for finding a valid location public static void placeship(int len) // check if a ship can be placed on the battlefield using actual parameters for coordinates, length, and orientation public static boolean isplaceable (int x, int y, int len, boolean horiz) // additional methods public static... public class Field { // coordinates of this field private int x; private int y; // has this field been hit by a shot? private boolean hit = false; // the ship on this field; 'null' if there is no ship on this field private Ship ship = null; private... // 1 constructors // 2 setter methods // getter methods // additional methods public class Ship { // array of fields representing the ship (MIN_SHIP_LENGTH <= length <= MAX_SHIP_LENGTH fields) private Field[] deck; private... nstru // 1 co ctors public Ship(Field[] deck)
// 2 setter methods // getter methods // additional methods // returns the length of this ship public int getlength() // counts the number of hits of this ship (<= length of the ship!) public int counthits() // returns true if all fields of the ship have been hit public boolean isdestroyed() public... Mögliche Ausgabe (Beispiel 1): 2 2 1 Ship with length 2 sunk. 1 1 15 15 Already shot into the water at this place 9 1 Ship with length 2 sunk. 9 10 11 Ship with length sunk.
5 6 6 7 Ship with length 5 sunk. Fleet has sunk. The player needed 56 shots. Für Beispiel 1 sind folgende Abgaben gefordert: Lösungsidee Quelltext Testplan und Grenzen des Programms Ausgabe des Programms für die Testfälle aus dem Testplan Beispiel 2: Erweiterung zu Schiffe versenken Punkte Um dem Spieler eine bessere Übersicht über den aktuellen Spielstatus zu geben, erweitern Sie das Spiel aus Beispiel 1 um eine Funktionalität grafische Spielstatusausgabe. Spielfelder bzw. Schiffe sollen sich selber zeichnen (entsprechende Methoden/Variablen in den Klassen vorsehen). Überlegen Sie ob Sie zusätzliche Variablen und/oder Methoden in den Schiff- bzw. Spielfeld-Klassen benötigen, um eine möglichst effektive Ausgabe zu realisieren. Nach jedem Spielzug ist die Spielfläche inklusive Koordinatensystem in Textform auszugeben (siehe unten). Dabei soll folgende Symbolik verwendet werden: Alle noch nicht beschossenen Felder (und damit auch noch unsichtbare Schiffe) sind mit einem - darzustellen W für ein getroffenes Wasser-Feld S für ein getroffenes Schiff-Feld Bei vollständig getroffenen Schiffen sind alle S durch X zu ersetzen (nach dem letzten Treffer)
Weiters ist im Anschluss an die Spielfläche nach jedem Schuss ein aktueller Status der versenkten/verbleibenden Schiffe auszugeben. Implementieren Sie ihre Lösung so, dass die main()-methode nur um die folgenden beiden Methodenaufrufe ergänzt werden muss: public static void printplayground(); // displays the entire playground public static void printgamestat(); // displays game statistics Mögliche Ausgabe (Beispiel 2): A B C D E F G H I J K L M N O P Q R S T 1 - - - - - - - - - - - - - - - - - - - - 2 - W - - - - - - - - - - - - - - - - - - - - - W - - - - - - - - - - - - - - - - - - - - - - - - - - - - W - W W - - - - 5 - - - - - S S S S - - - - - - - - - - - 6 - - - - - - - - - - - - W - - - - - - - 7 - - - - - - - - - S - - - - - - - - - - - - - W - - - - - - - - - - - - - W - - 9 - - - - - - X X X X - - W - - - - - - - 10 - - - - - - - - - - - - - S - - - - - - 11 - - - - - - - - - - - - - S - - - - - - 12 - - - W - - - - - - - - - - - - - - - - 1 - - - - - W - - - X - - - S - - - - - - 1 - - - - - - - - - X - - - - - - - W - - 15 - - - - - - - - - X - - - - - - - - - - - - - - - - W - - - - - - - - W - - - - 17 - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - - - - - - - - - - - - - - 19 - - - - - - - - - - - - - - - - - - - - 20 - - - - - - - - - - - - - - - - - - - - Game Statistic: Ships with len 2 (): 2 sunk, 2 remaining Ships with len (): 0 sunk, remaining Ships with len (2): 2 sunk, 0 remaining Ships with len 5 (1): 0 sunk, 1 remaining Shots: 9 Für Beispiel 2 sind folgende Abgaben gefordert: Lösungsidee Quelltext Ausgabe des Programms für die Testfälle aus dem Testplan von Beispiel 1