1 van 2

[java] random ..

Geplaatst: zo 09 mar 2008, 11:51
door floRobi
Ik heb hier een code geschreven die van een voorgedefinieerd getal ( hier : 150) telkens een random getal ( tss 20-30) aftrekt tot het voorgedefinieerd getal negatief of 0 is.

Het probleem is dat ik niet weet hoe ik de gegeneerde random getal moet laten onthouden aan het programma.

De code hieronder zorgt ervoor dat ie constant een random getal genereert en die aftrekt van de '150' en vervolgens genereert die opnieuw een getal en trekt het weer af van die '150' ipv wat er overgebleven is.

Dus heb ik hier een oneindige lus.

Iemand die me opweg kan helpen, aub?

Alvast Bedankt!

Code: Selecteer alles

public class Hp 

{

public static void main (String[] args) 

{

int hpp = 150;

int b, c;

while (c > 0);

{

b = (int) (10*Math.random()+20);

c = hpp - b;

if (c <= 0)

{

System.out.println("De monster is verslagen! De hp is : "+c+" / "+ hpp);

}

else

{

b = (int) (10*Math.random()+20);

System.out.println("De hp van de monster is: " +c+" / "+ hpp);

}

}

}

}

Re: [java] random ..

Geplaatst: zo 09 mar 2008, 13:05
door Rogier
Je begint met hpp = 150. Wat je dan moet doen is vóór de while-lus eenmalig c = hpp, en in de while doe je:

b = random getal; (wat je nu ook al doet)

c = c - b;

Die tweede Math.random (in het else) gedeelte heeft trouwens geen enkele zin.

Je maakte overigens nog een andere fout: in het begin geef je c nog niet eens een waarde, maar daarna begin je wel een while (c>0) lus. Voor hetzelfde geld was c toevallig negatief en gebeurde er niets.

(oh en het is trouwens "het monster" :D )

Re: [java] random ..

Geplaatst: zo 09 mar 2008, 14:26
door floRobi
Bedankt Rogier!

Het werkt.. nu een beetje uitbreiden met de 'switch' functie ;)

Ik typ wel iets neer als het niet lukt. :D

Re: [java] random ..

Geplaatst: zo 09 mar 2008, 19:19
door Nvt
Er wordt wel eens geadviseerd om variabelen zo lokaal mogelijk te declareren of de variabele daar declareren waar deze ontstaat. Schijnt iets met premature..... te maken te hebben. :D Als je daar, bijvoorbeeld, van uit zou gaan dan zou dat voor de code betekenen dat de variabele b in de herhaling gedeclareerd wordt, daar waar de af te trekken hitpoint waarde bepaald wordt:

Code: Selecteer alles

int b = (int) (10*Math.random()+20);
Om de leesbaarheid/duidelijkheid te vergroten worden ook wel eens langere namen gebruikt:

hpp – startHealth

c – currentHealth

b – hitpoints

Re: [java] random ..

Geplaatst: zo 09 mar 2008, 20:32
door EvilBro
Opsplitsen in methodes geeft meer overzicht en minder kans op fouten (al is het voor zo'n simpel voorbeeld een beetje overkill).

Code: Selecteer alles

public class Monster {

  private int totalHP;

  private int currentHP;

  Monster() {

this.totalHP = 150;

this.currentHP = this.totalHP;

  }

  public boolean isAlive() {

return (this.currentHP > 0);

  }

  public void hit(int damage) {

this.currentHP -= damage;

  }

  public int getCurrentHP() {

return this.currentHP;

  }

  public int getTotalHP() {

return this.totalHP;

  }

  public static void main (String[] args) {

Monster Goldorn = new Monster();

while (Goldorn.isAlive()) {

   int damage = (int) (10*Math.random()+20);

   Goldorn.hit(damage);

   System.out.println("Goldorn's hitpoints: " + Goldorn.getCurrentHP() + "/" + Goldorn.getTotalHP());

}

System.out.println("You've defeated Goldorn the magnificent");

  }

}

Re: [java] random ..

Geplaatst: ma 10 mar 2008, 10:26
door floRobi
Na de handige tips die ik gekregen heb :

Code: Selecteer alles

import java.util.*;

import java.io.*;

public class Hp 

{

public static void main (String[] args) 

{

int totalHP = 1000;

int hitDamage;

int currentHP = totalHP;

Input keyboard = new Input();

System.out.println("Typ a or z to attack and e to use a lifepot!");

 

//		Een lijn ingeven!!

//		String c = keyboard.readLine();

//		System.out.println(c);

while (currentHP > 0)

   		{

   

 

char attackKeyPlayer = keyboard.readChar();

keyboard.readLine();

switch(attackKeyPlayer)

{

case 'a': hitDamage = (int) (75*Math.random()+75);currentHP = currentHP 

 - hitDamage; System.out.println("The hp of the monster is: " 

 	+currentHP+" / "+ totalHP); System.out.println(" "); break;

// 'a' for small attack	 

 

case 'z': hitDamage = (int) (75*Math.random()+150);currentHP = currentHP 

 - hitDamage; System.out.println("The hp of the monster is: " 

 	+currentHP+" / "+ totalHP); System.out.println(" "); break;

 

// 'z' for furious attack

case 'e': currentHP  = totalHP; System.out.println("The monster used lifepot! "

 + currentHP + " / " + totalHP); break;

// 'e' for full life pot  

 

default: System.out.println("Typ a or z to attack and e to use a lifepot!");

}

}

System.out.println("Het monster is verslagen!" );

System.out.println(" ");

}

}
Behalve de methode systeem. Het is wel zeer handig zoals je zegt, maar zover zitten we nog niet. :D

Nu heb ik wel een klein probleem.

Code: Selecteer alles

char attackKeyPlayer = keyboard.readChar();

keyboard.readLine();
Je kan een hele lijn ingeven en voor de switch kijkt ie naar de eerste letter/cijfer/.. die ingegeven is.

Als je bv. asdfsdf.. intikt, keurt ie het goed. Niet echt mijn bedoeling. Als er enkel en alleen 'a' ingetikt is, wil ik dat ie het goedkeurt.

Ik dacht meteen aan 'het omzetten naar unicode' en als die gelijk is aan het waarde van 'a' dus 97 dat ie dan het goedkeurt.

Code: Selecteer alles

int uniCode = (int) attackKeyPlayer;

switch(attackKeyPlayer)

{

case 'a': if  ( uniCode==97)

{

 hitDamage = (int) (75*Math.random()+75);currentHP = currentHP 

 - hitDamage; System.out.println("The hp of the monster is: " 

 	+currentHP+" / "+ totalHP); System.out.println(" ");

} else 

{

System.out.println("Typ a or z to attack and e to use a lifepot!");

} break;

...
Ik krijg geen fouten van de compiler maar het werkt niet.

Suggesties?

floRobi

[Edit: Ik zie nu dat het geen nut heeft om die if binnen de switch functie te zetten aangezien dat ie toch alleen maar naar de eerste letter kijkt. ;) ]

Re: [java] random ..

Geplaatst: di 11 mar 2008, 00:18
door floRobi
Ik heb het ondertussen al gevonden. :D

Re: [java] random ..

Geplaatst: ma 17 mar 2008, 11:08
door Lathander
Ik hoop dat je beseft dat Math.Random() voorrang heeft op andere bewerkingen.

Math.Random() genereert een double getal van de verzameling [0.0, 1.0[

20*Math.Random() genereert een double getal van de verzameling [0.0, 20.0[

20*Math.Random()+10 genereert een double getal van de verzameling [10.0, 30.0[

Re: [java] random ..

Geplaatst: ma 17 mar 2008, 19:04
door floRobi
Yup, dat weet ik.

Ik heb wel een vraagje. (heeft niets te maken met random tho..)

Een simpele playAgain lus:

Code: Selecteer alles

boolean play;

String playAgain;

play = true; 

do

{

 // hier gebeurt nog andere dingen..

System.out.println("Do you wanna play again?");

playAgain = keyboard.readLine();

if(playAgain.equals("yes"))

{

play = true;

// currentHP1 = totalHP1; 

// currentHP2 = totalHP2;

} else if(playAgain.equals("no"))

{

play=false;

} else 

   {

 System.out.println("Oops, please answer yes or no!\n");

   }

}while(play==true);
Bij iets anders typen dan 'yes' en 'no' krijg ik het 'Oops,..' bericht maar er worden ook alles wat in de do while lus zit herhaald.

Als ik bij het initialiseren play = false doe (3de lijn van code), dan stopt het prog ermee.

Ik wil dat ie alles overslaat tot de vraag van play again.

Dus de output moet worden:
"Do you wanna play again?"

we vullen "x" in

"Oops, please answer yes or no!"

dan doet ie alles wat in de do while zit <-- deze wil ik dus overslaan!

"Do you wanna play again?"
Ik hoop dat ik duidelijk ben.

Re: [java] random ..

Geplaatst: di 18 mar 2008, 00:12
door Iwerke
dat heb je juist met een do while lus, je voert alles in de do uit zolang je while statement true blijft.

een tip is je lussen altijd zo kort mogelijk te houden.

Het beste wat je kan doen is die andere code , de "hier gebeurt nog ander dingen", niet mee in je lus zetten,

zet die gewoon voor je lus, ik veronderstel dat deze toch maar één maal moet uitgevoerd worden.

zo krijg je dan

Code: Selecteer alles

boolean play;

String playAgain;

play = true; 

// hier gebeurt nog andere dingen..

do

{

System.out.println("Do you wanna play again?");

playAgain = keyboard.readLine();

if(playAgain.equals("yes"))

{

play = true;

// currentHP1 = totalHP1; 

// currentHP2 = totalHP2;

}

else if(playAgain.equals("no"))

{

play=false;

 }

 else 

{

System.out.println("Oops, please answer yes or no!\n");

}

}while(play==true);
Ik veronderstel hierbij natuurlijk wel dat hetgeen dat er nog gebeurde in je do while lus, maar een keer uitgevoerd moest worden.

Re: [java] random ..

Geplaatst: wo 19 mar 2008, 17:31
door floRobi
Nope, dat is het probleem dus.

Ik heb het volledige code neergezet.

Voer het uit en je zult wel zien wat ik bedoel.

Nu ben ik bezig met 'experience', 'level' en 'om de beurt aanvallen' toe te voegen. Nu kun je vals spelen. :P

Ondertussen zoek ik ook goede tutorials om die methode systeem te leren (op advies van EvilBro). Het begint onduidelijk te worden.

Code: Selecteer alles

import java.util.Random;

import java.util.*;

import java.io.*;

public class Hp 

{

public static void main (String[] args) 

{

int totalHP1 = 1000;

int totalHP2 = 1000;

int hitDamage1, hitDamage2;

int currentHP1 = totalHP1;

int currentHP2 = totalHP2;

int winsPlayer1 = 0;

int winsPlayer2 = 0;

boolean play;

String playAgain;

play = true;

Input keyboard = new Input();

System.out.println("Name of the 1st player: ");

String namePlayer1 = keyboard.readLine();

System.out.println("Name of the 2nd player: ");

String namePlayer2 = keyboard.readLine();

System.out.println("");

System.out.println("Controls:		  " + namePlayer1+ "		"+namePlayer2);

System.out.println("Small Attack ->	 a

 i");

System.out.println("Furious Attack ->   z

 o");

System.out.println("Full Lifepot ->	 e

 p");

System.out.println("");

//		Een lijn ingeven!!

//		String c = keyboard.readLine();

//		System.out.println(c);

while(play==true){

while ((currentHP1 > 0) && (currentHP2 > 0))

   

{

   

// unicode voor enter : "\u2386"

char attackKeyPlayer = keyboard.readChar();

String aantalLetters =  keyboard.readLine();

switch(attackKeyPlayer)

{

//---------------------Player1----------------------------------------

case 'a': 

if (aantalLetters.length() == 0)

{

hitDamage1 = (int) (75*Math.random()+75);currentHP2 = currentHP2 

 	- hitDamage1; System.out.println(namePlayer1 +" attacked "+ namePlayer2+"! " 

 		+currentHP2+" / "+ totalHP2+ " HP left."); System.out.println(" "); 

// 'a' for small attack

} 

else

{

System.out.println("Wrong! " + namePlayer1+": a, z & e! "+ namePlayer2+": i,o & p!" );

} break;

 

case 'z': 

if (aantalLetters.length() == 0)

{ 

hitDamage1 = (int) (75*Math.random()+150);currentHP2 = currentHP2 

 	- hitDamage1; System.out.println(namePlayer1 +" attacked "+ namePlayer2+"! " 

 		+currentHP2+" / "+ totalHP2+" HP left."); System.out.println(" "); 

 

// 'z' for furious attack

} 

else

{

System.out.println("Wrong! " + namePlayer1+": a, z & e! "+ namePlayer2+": i,o & p!" );

} break;

case 'e': 

if (aantalLetters.length() == 0)

{

currentHP1  = totalHP1; System.out.println(namePlayer1 +" used lifepot! "

 	+ currentHP1 + " / " + totalHP1); 

// 'e' for full life pot 

} 

else

{

System.out.println("Wrong! " + namePlayer1+": a, z & e! "+ namePlayer2+": i,o & p!" );

} break;

//---------------------------Player2-----------------------------------------

case 'i': 

if (aantalLetters.length() == 0)

{

hitDamage2 = (int) (75*Math.random()+75);currentHP1 = currentHP1 

 - hitDamage2; System.out.println(namePlayer2 +" attacked "+ namePlayer1+"! " 

 		+currentHP1+" / "+ totalHP1+ " HP left."); System.out.println(" "); 

// 'i' for small attack

} 

else

{

System.out.println("Wrong! " + namePlayer1+": a, z & e! "+ namePlayer2+": i,o & p!" );

} break;

 

case 'o': 

if (aantalLetters.length() == 0)

{ 

hitDamage2 = (int) (75*Math.random()+150);currentHP1 = currentHP1 

 - hitDamage2; System.out.println(namePlayer2 +" attacked "+ namePlayer1+"! " 

 		+currentHP1+" / "+ totalHP1+ " HP left."); System.out.println(" "); 

 

// 'o' for furious attack

} 

else

{

System.out.println("Wrong! " + namePlayer1+": a, z & e! "+ namePlayer2+": i,o & p!" );

} break;

case 'p': 

if (aantalLetters.length() == 0)

{

currentHP2  = totalHP2; System.out.println(namePlayer2 +" used lifepot! "

 + currentHP2 + " / " + totalHP2); 

// 'p' for full life pot 

} 

else

{

System.out.println("Wrong! " + namePlayer1+": a, z & e! "+ namePlayer2+": i,o & p!" );

} break;

}

}

if (currentHP2<=0)

{

System.out.println(namePlayer2 +" is defeated!" );

System.out.println(" ");

winsPlayer1++;

System.out.println(namePlayer1+": "+winsPlayer1+"		"+namePlayer2+": "+winsPlayer2);

System.out.println(" ");

}

else

{

System.out.println(namePlayer1 +" is defeated!" );

System.out.println(" ");

winsPlayer2++;

System.out.println(namePlayer1+": "+winsPlayer1+"		"+namePlayer2+": "+winsPlayer2);

System.out.println(" ");

}

System.out.println("Do you wanna take revenge?");

playAgain = keyboard.readLine();

if(playAgain.equals("yes"))

{

play = true;

currentHP1 = totalHP1;

currentHP2 = totalHP2;

} else if(playAgain.equals("no"))

{

play=false;

}

else {System.out.println("Oops, please answer yes or no!\n");

}

}

}

}

Re: [java] random ..

Geplaatst: wo 19 mar 2008, 18:00
door Iwerke
een klein vraagje, Schrijf je alles in één klasse ? :P

Re: [java] random ..

Geplaatst: wo 19 mar 2008, 18:45
door floRobi
een klein vraagje, Schrijf je alles in één klasse ? :P
Ja :P

Ik heb maar 12 weken (2 uur in de week) Java gezien op het KAHO Sint-Lieven van een docent die graag moppen vertelde.

Eigenlijk ken ik niets van Java behalve wat syntax, lussen en wat functies.

En ik probeer een stomme text-based game te maken om wat bij te leren eigenlijk.

Niet slecht voor een amatuerke, toch? :P

Re: [java] random ..

Geplaatst: wo 19 mar 2008, 19:05
door Iwerke
niet slecht nee. euhm je wil dus graag alles in één klasse behouden. k kzal nog is iets aandachtiger naar je code zien hierboven dan :P

Re: [java] random ..

Geplaatst: wo 19 mar 2008, 19:18
door floRobi
Nee hoor, doe het zoals je wil. Bij het opsplitsen in methodes/klassen kan het zijn dat deze fout misschien verdwijnt.