Springen naar inhoud

[java] random ..


  • Log in om te kunnen reageren

#1

floRobi

    floRobi


  • >25 berichten
  • 37 berichten
  • Gebruiker

Geplaatst op 09 maart 2008 - 11:51

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!


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);
					}
			}
		}
}

Veranderd door floRobi, 09 maart 2008 - 11:53


Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Rogier

    Rogier


  • >5k berichten
  • 5679 berichten
  • VIP

Geplaatst op 09 maart 2008 - 13:05

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)
In theory, there's no difference between theory and practice. In practice, there is.

#3

floRobi

    floRobi


  • >25 berichten
  • 37 berichten
  • Gebruiker

Geplaatst op 09 maart 2008 - 14:26

Bedankt Rogier!

Het werkt.. nu een beetje uitbreiden met de 'switch' functie ;)
Ik typ wel iets neer als het niet lukt. :D

#4

Nvt

    Nvt


  • >25 berichten
  • 99 berichten
  • Ervaren gebruiker

Geplaatst op 09 maart 2008 - 19:19

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:
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

#5

EvilBro

    EvilBro


  • >5k berichten
  • 6703 berichten
  • VIP

Geplaatst op 09 maart 2008 - 20:32

Opsplitsen in methodes geeft meer overzicht en minder kans op fouten (al is het voor zo'n simpel voorbeeld een beetje overkill).

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");
  }
}

#6

floRobi

    floRobi


  • >25 berichten
  • 37 berichten
  • Gebruiker

Geplaatst op 10 maart 2008 - 10:26

Na de handige tips die ik gekregen heb :

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.

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.

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. ;) ]

Veranderd door floRobi, 10 maart 2008 - 10:31


#7

floRobi

    floRobi


  • >25 berichten
  • 37 berichten
  • Gebruiker

Geplaatst op 11 maart 2008 - 00:18

Ik heb het ondertussen al gevonden. :D

#8

Lathander

    Lathander


  • >1k berichten
  • 2501 berichten
  • Ervaren gebruiker

Geplaatst op 17 maart 2008 - 11:08

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[

"Invisible Pink Unicorns are beings of great spiritual power. We know this because they are capable of being invisible and pink at the same time. Like all religions, the Faith of the Invisible Pink Unicorns is based upon both logic and faith. We have faith that they are pink; we logically know that they are invisible because we can't see them."


#9

floRobi

    floRobi


  • >25 berichten
  • 37 berichten
  • Gebruiker

Geplaatst op 17 maart 2008 - 19:04

Yup, dat weet ik.

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

Een simpele playAgain lus:

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.

Veranderd door floRobi, 17 maart 2008 - 19:09


#10

Iwerke

    Iwerke


  • >250 berichten
  • 407 berichten
  • Ervaren gebruiker

Geplaatst op 18 maart 2008 - 00:12

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
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.
I know not with what weapons World War III will be fought, but World War IV will be fought with sticks and stones.
_-'-.Albert Einstein.-'-_

#11

floRobi

    floRobi


  • >25 berichten
  • 37 berichten
  • Gebruiker

Geplaatst op 19 maart 2008 - 17:31

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.


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");
			
			}

			}
	
		}
}

#12

Iwerke

    Iwerke


  • >250 berichten
  • 407 berichten
  • Ervaren gebruiker

Geplaatst op 19 maart 2008 - 18:00

een klein vraagje, Schrijf je alles in één klasse ? :P
I know not with what weapons World War III will be fought, but World War IV will be fought with sticks and stones.
_-'-.Albert Einstein.-'-_

#13

floRobi

    floRobi


  • >25 berichten
  • 37 berichten
  • Gebruiker

Geplaatst op 19 maart 2008 - 18:45

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

Veranderd door floRobi, 19 maart 2008 - 18:46


#14

Iwerke

    Iwerke


  • >250 berichten
  • 407 berichten
  • Ervaren gebruiker

Geplaatst op 19 maart 2008 - 19:05

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
I know not with what weapons World War III will be fought, but World War IV will be fought with sticks and stones.
_-'-.Albert Einstein.-'-_

#15

floRobi

    floRobi


  • >25 berichten
  • 37 berichten
  • Gebruiker

Geplaatst op 19 maart 2008 - 19:18

Nee hoor, doe het zoals je wil. Bij het opsplitsen in methodes/klassen kan het zijn dat deze fout misschien verdwijnt.





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures