Difference between revisions of "Java - I/O und Exceptions"

From Coders.Bay Wiki
Jump to navigation Jump to search
Line 21: Line 21:
Das Programm soll nur durch die Eingabe von ":q!" terminierbar sein.
Das Programm soll nur durch die Eingabe von ":q!" terminierbar sein.


==FileI/O==
==File I/O==
====Aufgabe: Pokemon====
====Aufgabe: Pokemon====
Der Spieler kann zu Beginn des Spiels ein Pokémon durch Angabe der
Der Spieler kann zu Beginn des Spiels ein Pokémon durch Angabe der

Revision as of 10:39, 31 January 2023

Exceptions

Aufgabe: Erweitere die Personenverwaltung um Exceptions

Die, in der früheren Aufgabe erstellte, Personenverwaltung, soll nun etwas sicherer für Fehler gemacht werden.
Erweitere den Code so, dass auf ungültige Inputs vernünftig reagiert wird, ohne dass das Programm abstürzt

Requirements

1. InvaldName-Exception

Wenn ein Nutzer eine Person anlegt, die eine Zahl im Namen hat, soll eine "InvalidName-Exception" geworfen werden.
Die Anlegung des Objektes soll abgebrochen werden und der Nutzer informiert, dass dieser Name ungültig ist.
Das Programm soll nicht terminieren, sondern den Nutzer erneut bitten einen Namen einzugeben.

2. NullpointerException

Der Nutzer soll Personen durch ihren Namen finden können.
Wird ein Name eingegeben, der nicht existiert, soll eine NullpointerException in der Personalverwaltung geworfen werden.
Der Stacktrace dieser Exception soll in der Main ausgegeben werden.
Das Programm soll nicht terminieren und weitere Inputs erhalten.

3. Terminierung

Das Programm soll nur durch die Eingabe von ":q!" terminierbar sein.

File I/O

Aufgabe: Pokemon

Der Spieler kann zu Beginn des Spiels ein Pokémon durch Angabe der Index-Nummer oder dem Namen des Pokémons wählen, dieses wird für den Kampf ausgewählt.

Gib auf der Konsole aus, um welches Pokemon es sich handelt und seine ASCII-Art Repräsentierung - falls es keine gibt, kannst du ein Fallback ASCII art einfügen ;) Das gegnerische Pokemon wählt der Computer zufällig.

Die Pokémon sollen aus einer CSV Datei importiert werden (händisches Erfassen ist nicht notwendig). Mögliche Quelle: https://docs.google.com/spreadsheets/d/1c9NgO5WBtgEhcG4fSl8PZqmAkCIf-uVY/edit?usp=sharing&ouid=117011915166077517693&rtpof=true&sd=true https://gist.github.com/armgilles/194bcff35001e7eb53a2a8b441e8b2c6 (Andere Versionen sind natürlich auch möglich.)

Kampf

Zu Beginn des Kampfs, werden dem Spieler die Stats seines Pokémons ausgegeben. Das könnte z.B so aussehen:

Bulbasaur (80/100 ♥) Squirtle (100/100 ♥)
(1) Overgrow Torrent
(2) Chlorophyll Rain Dish

Bulbasaur ist dabei der Name des Pokémons. 80 seine aktuelle Gesundheit, 100 ist die maximale Gesundheit (HP google sheet) Overgrow und Chlorophyll sind dabei die beiden möglichen Attacken (abilities).

Der Benutzer kann dann durch Angabe einer Zahl spezifizieren welche Attacke ausgewählt werden soll (1 oder 2 in unserem Fall). Bei einer fehlerhaften Angabe, solltest du den Benuter auffordern eine existierende Attacke zu wählen.

Auf der Konsole solltest du dann ausgeben welche Attacke gewählt wurde:

Bulbasur attacks with Overgrow. Bulbasur deals X damage.


Dann sollte Squirtles health um X verringert werden.

Schadensberechnung

Der Schaden den das Pokemon anrichtet errechnet sich aus dem `attack` Wert des angreifendes Pokemons multipliziert mit einem zufälligen Modifikator (zwischen 0 und 1). Natürlich verteidigt sich das gegnerische Pokemon aus - der Verteidigungswert errechnet sich aus dem `defense` Wert des verteidigendes Pokemons multipliziert mit einem zufälligen Modifikator (zwischen 0 und 0.5).

Wenn nun der Angriffswert - Verteidigungswert positiv ist, wird dieser Wert von den HP jenes Pokemons abgezogen, dass angegriffen wird.

Beispiel: Bulbasurs hat einen Angriffswert von 48. Squirtle eine verteidigung von 65. Der zufällige Angriffsmodifikator ist 0.7, der Verteidigungsmodifikator 0.1.

0.7*48 - 0.1*65 = 27.1

Also wird bei dieser Attacke Squirtle 27 HP verlieren.

Das gegnerische Pokemon wählt seine Attacke zufällig.

Das Pokemon dass zu erst 0 oder weniger HP erreicht verliert.

Zusatzaufgabe (sehr empfohlen 😜)

Ein Pokemon ist 1 - bis 2 Typen zugehörig -- siehe git. Persistiere diese zusätzlich in unserem Datenmodell. Ein Pokemon hat zusätzliche Modifikatoren für den Angriff/die Verteidigung gegen Pokemons von bestimmten Typen - Spalten against_bug, against_grass, .. (siehe git).

Bulbasur ist ein grass und poison Pokemon. Squirtle ist ein water Pokemon. Bulbasur hat einen Wert von 0.5 für against_water. Dieser Modifikator muss auf die base attack angewandt werden d.h. bei unserem vorigen Beispiel würde sich der Angriffswert folgendermaßen ändern:

0.7*0.5*48 - 0.1*65 = 10.3

Das heißt Squirtle würde nur 10 HP verlieren.