Probleem met while lus en tijd

Status
Niet open voor verdere reacties.

hanonymouss

Gebruiker
Lid geworden
7 sep 2011
Berichten
283
Hallo iedereen

Ik heb een tijd klasse aangemaakt waarbij de gebruiker de tijd moet ingeven in seconden.

Klasse Tijd:

[CPP]/**
* Created with IntelliJ IDEA.
* User: Hanonymouss
* Date: 8/02/13
* Time: 16:39
* To change this template use File | Settings | File Templates.
*/
public class Tijd {

private boolean isSpelGedaan;
private int begintijd;

public Tijd(int begintijd){
this.begintijd = begintijd;
}

public void spelGedaan(){
long start = System.currentTimeMillis();
if(System.currentTimeMillis() - start >= this.begintijd *1000)
this.isSpelGedaan = true;

}

public boolean isSpelGedaan() {

return this.isSpelGedaan;
}
}
[/CPP]

en gebruik hem zo:

[CPP]import java.util.ArrayList;
import java.util.Scanner;

/**
* Created with IntelliJ IDEA.
* User: Hanonymouss
* Date: 7/02/13
* Time: 23:22
* To change this template use File | Settings | File Templates.
*/
public class test {
private static ArrayList<String> list = new ArrayList<String>();
public static void main(String[] args) {

Tijd spel = new Tijd(10);

Scanner scan = new Scanner(System.in);

while (spel.isSpelGedaan() == false) {// werkt ook ni als ik ! voor spel.isSpelGedaan voorzett dus while (!spel.isSpelGedaan() == false)


System.out.println("geef een woord");
String w = scan.nextLine();
list.add(w);

spel.spelGedaan();

// Stop loop

}
for(String w: list){
System.out.println(w);
}
System.out.println("gedaan");

}
}[/CPP]
Ik geraak er nier uit. en met een do while is het probleem tegenovergestelde
dus na 1 gegeven woord sluit hij ineens de appliactie

[CPP] do {


System.out.println("geef een woord");
String w = scan.nextLine();
list.add(w);

spel.spelGedaan();



} while (!spel.isSpelGedaan() == false);
for(String w: list){
System.out.println(w);
}
System.out.println("gedaan");
[/CPP]
graag jullie hulp, mag ook een andere oplosiing zijn
 
In het onderstaande stukje zit de fout:

[cpp]
long start = System.currentTimeMillis();
if(System.currentTimeMillis() - start >= this.begintijd *1000)
[/cpp]

System.currentTimeMillis() - System.currentTimeMillis() (de tijd die de aanroep zelf kost is te verwaarlozen) zal uiteraard nooit boven begintijd * 1000 komen in je voorbeeld.
 
@CoD_NL: bedankt voor je reactie.

Het rare is wanneer ik dat allemaal in een main methode zet dat de code wel correct werkt. dus:

[CPP] private static ArrayList<String> list = new ArrayList<String>();
public static void main(String[] args) {
final int seconden = 10;
final long start = System.currentTimeMillis();


Scanner scan = new Scanner(System.in);

while (scan.hasNext()) {


System.out.println("geef een woord");
String w = scan.nextLine();
list.add(w);


if (System.currentTimeMillis()-start >= seconden*1000) break;


}
for(String w: list){
System.out.println(w);
}
System.out.println("gedaan");

}[/CPP]
 
Zie je het subtiele verschil dan werkelijk niet? In het eerste voorbeeld wordt de start variabele bij iedere aanroep van spelGedaan opnieuw ingesteld, waardoor je in principe dus telkens dezelfde waarde krijgt. In het tweede voorbeeld wordt de start variable maar één keer ingesteld, waardoor je een "echte" starttijd hebt. Het eerste voorbeeld zou je dus kunnen oplossen door de start variabele een andere scope te geven. Iets als:

[cpp]
public class Tijd {

private boolean isSpelGedaan;
private int begintijd;
private long start;

public Tijd(int begintijd){
this.begintijd = begintijd;
this.start = System.currentTimeMillis();
}

public void spelGedaan(){
if(System.currentTimeMillis() - start >= this.begintijd *1000)
this.isSpelGedaan = true;
}

public boolean isSpelGedaan() {

return this.isSpelGedaan;
}
}
[/cpp]
 
Aah ok ik begrijp het, zo stom van mij. In de main wordt de start variable 1 keer gebruikt terwijl in de klasse tijd de methode spelgedaan constant zichzelf oproept waarbij de variable start altijd hetzelfde blijft.

Ik heb nu mijn maincode aangepast

While(scan.hasnext){
If(!spel.ispelgedaan()==false){
Break;
}
}

Bij while(!spel.ispelgedaan==false(
Werkt da niet

Mijn vraag is nu opgelost bedank voor uw hulp codNL

Sorry voor de plaincode zit op mijn gsm
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan