Hejsan
har börjat lite smått med java, men har en fundering.
om jag skapar en Klass låt oss säga GameCharacter(string race, int health)
och sedan skapar lite metoder osv.
om jag sedan gör en metod i stil med
public void fight(GameCharacter otherCharacter)
borde jag inte kunna mata in race och health direkt i otherCharacter ???
MVH // Fredrik
Du menar typ:
if (skadaGjord){
otherCharacter.health -= 10; // Minska med 10 poäng
}
Det ska funka.
ja, det är inte där problemet ligger (ursäkta min otydlighet)
det är när jag anropar fight-metoden som den vill ha nåt värde, och enligt mig så borde det vara tex ("Human", 15) men det blir nåt fel.
"Error <identifyer> expected" står det.
När du kompilerar alltså? Felet borde skicka med ett radnummer. Skicka gärna med den raden, eller hellre hela funktionen som raden finns i.
Den kompilerar utan fel.
men när jag sedan ska testa Fight metoden (i BlueJ som jag använder)
så får man ju upp ett fönster där man ska mata in paramterar.
alltså. först skapar jag objektet GameCharacter och fyller i race,health,skill.
men sen när jag försöker köra fight-metoden så ska man fylla i nån parameter. och det är här jag menar på att man ska kunna fylla i just race,health och skill.
jag har ju inte gjort någon system för sjävla spelet än utan bara några Klasser och metoder än så länge.
så här ser klassen ut just nu.
public class GameCharacter
{
/**
* Klassens variablar
*/
private String mRace;
private int mHealth;
private int mSkill;
private Dice mDice;
/\*\*
\* Initierar grundvärdena
\*/
public GameCharacter(String race, int skill, int health)
{
mSkill = skill;
mHealth = health;
mRace = race;
mDice = new Dice(20);
}
/\*\*
\* Returnerar rasen
\*/
public String getRace()
{
return mRace;
}
/\*\*
\* Returnerar Hälsan
\*/
public int getHealth()
{
return mHealth;
}
/**
* Returnerar skickligheten
*/
public int getSkill()
{
return mSkill;
}
/**
* Returnerar skillnaden mellan skicklighet och ett slumpmässigt tal mellan 1 och 20.
*/
public int getAttackValue()
{
return mSkill - mDice.rollDice();
}
/**
* Returnerar en sammanfattning av statusen
*/
public String toString()
{
return mRace + " med skicklighet " + mSkill + " och hälsa " + mHealth;
}
public void fight(GameCharacter otherCharacter)
{
while(getHealth() \> 0 && otherCharacter.getHealth() \> 0)
{
int Char1 = getAttackValue();
int Char2 = otherCharacter.getAttackValue();
if (Char1 \> Char2)
{
otherCharacter.wound(1);
System.out.println(getRace() + " träffar " + otherCharacter.getRace());
}
else if (Char1 \< Char2)
{
wound(1);
System.out.println(getRace() + " Träffas av " + otherCharacter.getRace());
}
else
{
System.out.println("Ingen Träffar");
}
}
if (getHealth() \< 1)
{
System.out.println(getRace() + " är död");
}
else
{
System.out.println(otherCharacter.getRace() + "är död");
}
}
/**
* Drar bort skadan(damage) från hälsan (mHealth)
*/
public void wound(int damage)
{
mHealth -= damage;
}
protected int specialAbilityDamage()
{
return 0;
}
}
LimeMedlem sedan sep. 2001961 inlägg Du anropar ju fight-metoden med en annan GameCharacter... Det är alltså denna som du skall skicka in till metoden.
T.ex.
GameCharacter troll = new GameCharacter("Troll",15, 15); // Fast jag skulle skapa en subklass Troll...
GameCharacter human = new GameCharacter("Human", 5, 30);
troll.fight(human);
Det går också att göra:
troll.fight(new GameCharacter("Human", 5, 30));
Metoden fight tar alltså en inparameter av typen GameCharacter.
Anta att man ville göra en metod som gör att du kan slåss mot något som du får ett värde på (vilket är fullständigt ologiskt i ett spel...) så skulle du kunna skapa en metod som såg ut något såhär:
public void fight(String race, int skill, int health)
{
fight(new GameCharacter(race,skill, health); // anropar den riktiga fight-metoden.
}
Sedan rent kodkonventionsmässigt så tycker jag att det är renare och mer läsbart om man när man accessar sina egna privata attribut använder dessa direkt och när man accessar andras använder get och set-metoderna.
Jag skulle alltså skriva såhär i fight-metoden istället:
public void fight(GameCharacter otherCharacter)
{
while(mHealth> 0 && otherCharacter.getHealth() > 0)
{
int Char1 = mAttackValue;
int Char2 = otherCharacter.getAttackValue();
if (Char1 > Char2)
{
otherCharacter.wound(1);
System.out.println(mRace+ " träffar " + otherCharacter.getRace());
}
else if (Char1 < Char2)
{
wound(1);
System.out.println(mRace+ " träffas av " + otherCharacter.getRace());
}
else
{
System.out.println("Ingen Träffar");
}
}
if (mHealth < 1)
{
System.out.println(mRace+ " är död");
}
else
{
System.out.println(otherCharacter.getRace() + "är död");
}
}
F.ö. säger du inte hela sanningen eftersom den klassen du visar inte är körbar... saknar main-metod.