GeneralMap Integration & Erweiterung

- Integration des Kampfsystems und des "Einheiten verschieben"-Systems
- Vorbereitung des Spielerwechsels
- Utils.StringToInt(String) hinzugefügt
master
Felix Stupp 9 years ago committed by GitHub
parent 7e7491c541
commit b65d0ffa43

@ -1,134 +1,311 @@
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.lang.Math; import java.lang.Math;
import java.util.Arrays;
import greenfoot.MouseInfo.*;
import javax.swing.JOptionPane;
/** /**
Oberklasse für verschiedene Maps; Oberklasse für verschiedene Maps;
neue Maps werden als Unterklasse dieser Klasse eingefügt. neue Maps werden als Unterklasse dieser Klasse eingefügt.
@author GruenerWal, MaxiJohl, Felix Stupp @author GruenerWal, MaxiJohl, Felix Stupp
@version 0.3.0 @version 0.3.0
*/ */
public abstract class GeneralMap extends World public abstract class GeneralMap extends World implements ButtonEvent
{ {
/* /*
Felder, im Moment nur Anzahl der Provinzen Felder, im Moment nur Anzahl der Provinzen
Später evtl. weitere Werte wie Schwierigkeit denkbar Später evtl. weitere Werte wie Schwierigkeit denkbar
*/ */
private final int X_OFFSET = 0; // Verschiebt die Provinzen nach rechts private final int X_OFFSET = 0; // Verschiebt die Provinzen nach rechts
private final int Y_OFFSET = 0; // Verschiebt die Provinzen nach unten private final int Y_OFFSET = 0; // Verschiebt die Provinzen nach unten
/* /*
Die einzelnen Positionen der Provinzen wird mit SCALE_VALUE/10000 multipliziert. Die einzelnen Positionen der Provinzen wird mit SCALE_VALUE/10000 multipliziert.
Dies ist nützlich, wenn die Karte beispielsweise nur noch 80% der Originalgröße bei ihrer Darstellung groß ist. Dies ist nützlich, wenn die Karte beispielsweise nur noch 80% der Originalgröße bei ihrer Darstellung groß ist.
Bei diesem Beispiel wäre hier, neben dem Offset oben, der Wert 0.8 einzutragen. Bei diesem Beispiel wäre hier, neben dem Offset oben, der Wert 0.8 einzutragen.
*/ */
private final double SCALE_VALUE = 1; private final double SCALE_VALUE = 1;
protected Province[] provinces; protected enum GameStates {
protected Player[] players; KAMPF,
VERSCHIEBEN
protected int currentPlayer = 0; }
/** protected Province[] provinces;
Erstellt eine GeneralMap mit allen Eigenschaften und initialisiert die Arrays für Provinzen und Spieler. protected Player[] players;
@param backImage Das Hintergrundbild, welches von dieser Klasse geladen und dargestellt wird.
@param playerList Die Liste mit den Namen der Spieler protected int currentPlayer = 0;
@param colorList Die Liste mit den Farben der Spieler protected GameStates status = GameStates.VERSCHIEBEN;
*/
public GeneralMap(String backImage, String[] playerList, int[] colorList) Province offenderProvince;
{ Province defenderProvince;
Province savedProvince = null;
/**
Erstellt eine GeneralMap mit allen Eigenschaften und initialisiert die Arrays für Provinzen und Spieler.
@param backImage Das Hintergrundbild, welches von dieser Klasse geladen und dargestellt wird.
@param playerList Die Liste mit den Namen der Spieler
@param colorList Die Liste mit den Farben der Spieler
*/
public GeneralMap(String backImage, String[] playerList, int[] colorList)
{
super(1600,900,1); super(1600,900,1);
players = new Player[playerList.length]; players = new Player[playerList.length];
for (int i = 0; i < playerList.length; i++) { for (int i = 0; i < playerList.length; i++) {
players[i] = new Player(i,playerList[i],colorList[i]); players[i] = new Player(i,playerList[i],colorList[i]);
} }
} }
/** /**
Fügt alle Provinzen aus dem Array der Welt an der entsprechden Stelle zu. Fügt alle Provinzen aus dem Array der Welt an der entsprechden Stelle zu.
*/ */
protected void initProvinces() { protected void initProvinces() {
for(int i = 1; i < provinces.length; i++) { for(int i = 1; i < provinces.length; i++) {
addObject(provinces[i],((int) Math.floor(provinces[i].getXPos() * SCALE_VALUE)) + X_OFFSET,((int) Math.floor(provinces[i].getYPos() * SCALE_VALUE)) + Y_OFFSET); addObject(provinces[i],((int) Math.floor(provinces[i].getXPos() * SCALE_VALUE)) + X_OFFSET,((int) Math.floor(provinces[i].getYPos() * SCALE_VALUE)) + Y_OFFSET);
} }
} }
/** public void act() {
Gibt die Anzahl der vorhandenen Spieler aus. if(status == GameStates.KAMPF) {
*/ if(offenderProvince == null)
public int getPlayerCount() {
{ OffenderProvince();
return players.length; }
} else
{
/** defenderProvince();
Gibt den Namen des aktuellen Spielers aus. }
@return Der Name des aktuellen Spielers } else if(status == GameStates.VERSCHIEBEN) {
*/ Province clickedProvince;
public String getPlayerName()
{ for ( int i = 1; i <= (provinces.length - 1); i++)
return players[currentPlayer].getDisplayName(); {
} if (provinces[i].hasClicked() == true)
{
/** clickedProvince = provinces[i];
Gibt den Namen des Spielers aus, dem dessen ID gehört. useProvincesToMove(clickedProvince);
@param plID Die ID des zu findenden Spielers break;
@return Der Name des Spielers }
*/ }
public String getPlayerName(int plID) }
{ }
return players[plID].getDisplayName();
} /**
Gibt die Anzahl der vorhandenen Spieler aus.
/** */
Gibt die Anzahl der Sterne des aktuellen Spielers zurück. public int getPlayerCount()
@return Die Anzahl der Sterne des aktuellen Spielers {
*/ return players.length;
public int getPlayerStars() }
{
return players[currentPlayer].getStars(); /**
} Gibt den Namen des aktuellen Spielers aus.
@return Der Name des aktuellen Spielers
/** */
Gibt die ID des Spielers zurück, dem die gefragte Provinz gehört. public String getPlayerName()
@param prID Die gefragte Provinz {
*/ return players[currentPlayer].getDisplayName();
public int getProvinceOwner(int prID) }
{
if(prID < 1 || prID > provinces.length) { /**
return -1; Gibt den Namen des Spielers aus, dem dessen ID gehört.
} @param plID Die ID des zu findenden Spielers
return provinces[prID].getOwner(); @return Der Name des Spielers
} */
public String getPlayerName(int plID)
/** {
Gibt eine Liste mit allen Provinzen und deren Besitzern zurück. return players[plID].getDisplayName();
@return Array mit der Provinz-ID als Index und dem Besitzer als Wert }
*/
public int[] getProvinceOwners() /**
{ Gibt die Anzahl der Sterne des aktuellen Spielers zurück.
int[] prOwners = new int[provinces.length]; @return Die Anzahl der Sterne des aktuellen Spielers
for (int i = 1; i > provinces.length; i++) { */
prOwners[i] = provinces[i].getOwner(); public int getPlayerStars()
} {
return prOwners; return players[currentPlayer].getStars();
} }
/** /**
Zählt die Anzahl der Einheiten von allen Provinzen zusammen, die einem bestimmten Spieler gehört. Gibt die ID des Spielers zurück, dem die gefragte Provinz gehört.
@param playerID Die ID des Spielers, für den die Einheiten gezählt werden sollen. @param prID Die gefragte Provinz
@return Die Anzahl der Einheiten, die dem Spieler gehören. */
*/ public int getProvinceOwner(int prID)
public int getProvinceEntityCount(int playerID) {
{ if(prID < 1 || prID > provinces.length) {
int c = 0; return -1;
for (int i = 1; i > provinces.length; i++) { }
if(provinces[i].getOwner() == playerID) { return provinces[prID].getOwner();
c = c + provinces[i].getEntityCount(); }
}
} /**
return c; Gibt eine Liste mit allen Provinzen und deren Besitzern zurück.
} @return Array mit der Provinz-ID als Index und dem Besitzer als Wert
*/
public int[] getProvinceOwners()
{
int[] prOwners = new int[provinces.length];
for (int i = 1; i > provinces.length; i++) {
prOwners[i] = provinces[i].getOwner();
}
return prOwners;
}
/**
Zählt die Anzahl der Einheiten von allen Provinzen zusammen, die einem bestimmten Spieler gehört.
@param playerID Die ID des Spielers, für den die Einheiten gezählt werden sollen.
@return Die Anzahl der Einheiten, die dem Spieler gehören.
*/
public int getProvinceEntityCount(int playerID)
{
int c = 0;
for (int i = 1; i > provinces.length; i++) {
if(provinces[i].getOwner() == playerID) {
c = c + provinces[i].getEntityCount();
}
}
return c;
}
public void buttonClicked(Button b) {
if(status == GameStates.KAMPF) {
status = GameStates.VERSCHIEBEN;
} else if(status == GameStates.VERSCHIEBEN) {
status = GameStates.KAMPF;
currentPlayer++;
if(currentPlayer >= players.length) {
currentPlayer = 0;
}
}
}
// Kampfsystem
private void OffenderProvince()
{
for ( int i = 1; i <= (provinces.length - 1); i++)
{
if (provinces[i].hasClicked() == true)
{
offenderProvince = provinces[i];
System.out.println("1");
}
}
}
private void defenderProvince()
{
{
for (int i = 1; i <= (provinces.length - 1); i++)
{
if (provinces[i].hasClicked() == true)//&& defenderProvince != offenderProvince)
{
defenderProvince = provinces[i];
System.out.println("2");
chooser();
break;
}
}
}
}
private void chooser()
{
Dice_Offender diceOffender = new Dice_Offender();
int[] maxDiceOffender = diceOffender.max_offender(offenderProvince.getEntityCount());
Dice_Defender diceDefender = new Dice_Defender();
int[] maxDiceDefender = diceDefender.max_defender(defenderProvince.getEntityCount());
Arrays.sort(maxDiceOffender);
Arrays.sort(maxDiceDefender);
decider(maxDiceOffender, maxDiceDefender);
}
private void decider(int[] maxDiceOffender, int [] maxDiceDefender)
{
int maxDefender = maxDiceDefender[1];
int maxOffender = maxDiceOffender[2];
if (maxOffender>maxDefender && defenderProvince.getEntityCount()>1)
{
int EntitiesOffender = offenderProvince.getEntityCount();
int EntitiesDefender = defenderProvince.getEntityCount();
defenderProvince.setEntityCount(EntitiesDefender - 1);
}
if (maxOffender<maxDefender && offenderProvince.getEntityCount()>1)
{
int EntitiesOffender = offenderProvince.getEntityCount();
int EntitiesDefender = defenderProvince.getEntityCount();
offenderProvince.setEntityCount(EntitiesOffender - 1);
}
if (maxOffender>maxDefender && defenderProvince.getEntityCount()==1)
{
defenderProvince.setOwner(offenderProvince.getOwner());
defenderProvince.setEntityCount(0);
}
if (maxOffender>maxDefender && offenderProvince.getEntityCount()==1)
{
offenderProvince.setOwner(defenderProvince.getOwner());
offenderProvince.setEntityCount(0);
}
System.out.println("3");
offenderProvince = null;
defenderProvince = null;
}
// Einheiten verschieben
/**
* Nimmt zwei Provinzen entgegen, und fragt, wieviele Einheiten vom ersten zum zweiten Eintrag verschoben werden sollen.
* Überprüft, ob eine Verschiebung möglich ist und führt sie bei Erfolg aus.
*/
private void moveEntities(Province sourceProvince, Province destinationProvince)
{
String toMoveString = JOptionPane.showInputDialog(null, "Wieviele Einheiten willst du verschieben?");
int entitiesToMove = Utils.StringToInt(toMoveString);
if (entitiesToMove == 0) {
JOptionPane.showMessageDialog(null,"Bitte eine Zahl eingeben, Kommandant " + getPlayerName() + ".");
return;
}
if ( (sourceProvince.getEntityCount() - entitiesToMove) > 0)
{
sourceProvince.removeFromEntities(entitiesToMove);
destinationProvince.addToEntities(entitiesToMove);
JOptionPane.showMessageDialog(null,"Einheiten erfolgreich verschoben, Kommandant " + getPlayerName() + ".");
}
else if ( (sourceProvince.getEntityCount() - entitiesToMove) <= 0)
{
JOptionPane.showMessageDialog(null,"Du hast nicht genügend Einheiten, um die gewünschte Anzahl von " + sourceProvince.getDisplayName() + " nach " + destinationProvince.getDisplayName() + " zu verschieben, Köhler.");
}
}
/**
* Speichert ein gegebene Provinz als savedProvince ein, insofern dieser Platz nicht bereits belegt ist.
* Ist er das, so wird überprüft, ob eine neue, an savedProvince angrenzende Provinz angeklickt wurde.
* Ist dies der Fall, werden beide Provinzen an moveEntities übergeben.
*/
private void useProvincesToMove(Province givenProvince)
{
if (savedProvince == null)
{
savedProvince = givenProvince;
}
else if ((savedProvince != null) && (givenProvince != savedProvince) && (savedProvince.getOwner() == givenProvince.getOwner()) && (savedProvince.getOwner() == currentPlayer) )
{
if (givenProvince.isProvinceNear(savedProvince.getID()) == true)
{
moveEntities(savedProvince,givenProvince);
}
savedProvince = null;
}
}
} }

@ -3,73 +3,83 @@ import java.awt.Color;
import java.util.*; import java.util.*;
/** /**
Diese Klasse enthält nur statische Funktionen, welche für euch als Unterstützung gedacht sind. Damit könnt ihr dann hoffentlich viele Code-Zeilen sparen. :) Diese Klasse enthält nur statische Funktionen, welche für euch als Unterstützung gedacht sind. Damit könnt ihr dann hoffentlich viele Code-Zeilen sparen. :)
@author Zocker1999_NET @author Zocker1999_NET
@version 15.06.2016 @version 15.06.2016
*/ */
public final class Utils { public final class Utils {
/**
Kopiert ein boolean-Array und übergibt diese.
@param a Das zu kopierende Array
@return Die Kopie des Arrays
*/
public static boolean[] copyArray(boolean[] a) {
boolean[] b = new boolean[a.length];
for(int i = 0; i < a.length; i++) {
b[i] = a[i];
}
return b;
}
/**
Kopiert ein int-Array und übergibt diese.
@param a Das zu kopierende Array
@return Die Kopie des Arrays
*/
public static int[] copyArray(int[] a) {
int[] b = new int[a.length];
for(int i = 0; i < a.length; i++) {
b[i] = a[i];
}
return b;
}
/**
Kopiert ein String-Array und übergibt diese.
@param a Das zu kopierende Array
@return Die Kopie des Arrays
*/
public static String[] copyArray(String[] a) {
String[] b = new String[a.length];
for(int i = 0; i < a.length; i++) {
b[i] = a[i];
}
return b;
}
/**
Zeichnet innerhalb eines GreenfootImage ein gefülltes Rechteck in der gegebenen Farbe und mit dem gegebenen Abstand zum Rand.
@param i Das GreenfootImage, in dem gezeichnet werden soll.
@param c Die Farbe, in der das gefüllte Rechteck gezeichnet werden soll.
@param b Der Abstand zum Rand der Grafik.
*/
public static void drawInsideRectangle(GreenfootImage i, Color c, int b) {
int sx = i.getWidth();
int sy = i.getHeight();
i.setColor(c);
i.fillRect(b,b,sx-(2*b),sy-(2*b));
}
/**
Sortiert ein int[]-Array absteigend.
@param a Das zu sortierende Array
*/
public static void sortDesc(int[] a) {
Arrays.sort(a);
int[] b = copyArray(a);
for(int i = (a.length - 1); i >= 0; i--) {
a[i] = b[i];
}
}
/**
Kopiert ein boolean-Array und übergibt diese.
@param a Das zu kopierende Array
@return Die Kopie des Arrays
*/
public static boolean[] copyArray(boolean[] a) {
boolean[] b = new boolean[a.length];
for(int i = 0; i < a.length; i++) {
b[i] = a[i];
}
return b;
}
/**
Kopiert ein int-Array und übergibt diese.
@param a Das zu kopierende Array
@return Die Kopie des Arrays
*/
public static int[] copyArray(int[] a) {
int[] b = new int[a.length];
for(int i = 0; i < a.length; i++) {
b[i] = a[i];
}
return b;
}
/**
Kopiert ein String-Array und übergibt diese.
@param a Das zu kopierende Array
@return Die Kopie des Arrays
*/
public static String[] copyArray(String[] a) {
String[] b = new String[a.length];
for(int i = 0; i < a.length; i++) {
b[i] = a[i];
}
return b;
}
/**
Zeichnet innerhalb eines GreenfootImage ein gefülltes Rechteck in der gegebenen Farbe und mit dem gegebenen Abstand zum Rand.
@param i Das GreenfootImage, in dem gezeichnet werden soll.
@param c Die Farbe, in der das gefüllte Rechteck gezeichnet werden soll.
@param b Der Abstand zum Rand der Grafik.
*/
public static void drawInsideRectangle(GreenfootImage i, Color c, int b) {
int sx = i.getWidth();
int sy = i.getHeight();
i.setColor(c);
i.fillRect(b,b, sx-(2*b),sy-(2*b));
}
/**
Sortiert ein int[]-Array absteigend.
@param a Das zu sortierende Array
*/
public static void sortDesc(int[] a) {
Arrays.sort(a);
int[] b = copyArray(a);
for(int i = (a.length - 1); i >= 0; i--) {
a[i] = b[i];
}
}
public static int StringToInt(String s) {
int i = 0;
try {
Integer in = Integer.valueOf(s);
i = in;
} catch (java.lang.NumberFormatException e) {}
return i;
}
} }

Loading…
Cancel
Save