Gå til innhold

Anbefalte innlegg

Jeg skal lage et program som skal "tenke" på et tall mellom 1 og 100. Deretter skal programmet spørre brukeren om å gjette et tall.

• Dersom tallet er det samme som programmet "tenker" på skal programmet avslutte med en gratulasjon og beskjed om hvor mange forsøk som ble brukt.

• Dersom tallet er mindre eller større enn det som programmet "tenker" på skal programmet bruker få en beskjed om dette.

• Dersom tallet som gjettes er mindre enn 1 eller større enn 100 skal det komme en feilmelding som sier på nytt hvilket intervall det skal gjettes innenfor. Et slikt forsøk skal IKKE telle med i antall forsøk som telles opp.

• Etter at brukeren har gjettet riktig og fått en gratulasjon skal han spørres om han vil prøve en gang til.

 

Her er det jeg har til nå:

 

class Gjett {

public static void main(String[] args) {

double tall = Math.random() * 100;

int resultat = (int) tall;

int tipp;

int sum = 0;

System.out.println("Jeg tenker på et tall mellom 1 og 100.");

 

for (int i = resultat; i == resultat;) {

System.out.println("Tipp et tall");

tipp = Terminal.lesInt();

if (tipp == resultat) break;

if (tipp >= 1 && tipp <= 100) {

if (tipp < resultat)

System.out.println("Beklager! Mitt tall er større.");

if (tipp > resultat)

System.out.println("Beklager! Mitt tall er mindre.");

}

else

System.out.println("Slå inn et tall mellom 1 og 100");

sum = sum + i;

}

System.out.println("Gratulerer! Du klarte det på " + sum + " forsøk");

}

}

 

Det jeg sliter med er å telle hvor mange forsøk som er brukt, og om en vil prøve en gang til etter å ha funne frem til tallet.

Lenke til kommentar
Videoannonse
Annonse

Det er en stund siden jeg har programmert Java, så jeg husker ikke syntaxen 100%...

 

Du bruker for-løkken på feil måte. En for-løkke gjentar en kodesnutt x antall ganger. Det som du burde bruke er en nestet while-løkke. Pseudokoden blir som følger:

 

while gjettemer {

while mitt_tall <> tall then{

...

Her skal telleren være

...

}

}

Lenke til kommentar

Her er en variant av gjett:

 


import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;



public class Gjett {



private static int resultat = -1;

private static int svar = -1;

private static int antallSvar = 0;



public static void main(String[] args) {

 

 boolean gjettigjen = true;

 while(gjettigjen) {

   System.out.println("Gjett et tall mellom 1 og 100");

   resultat = (int)(Math.random()*100);

   antallSvar = 0;

   gjett();

   gjettigjen = gjettMer();

 }

}



private static void gjett() {

 while(resultat != svar) {

 	svar = lesTall();

 	if(svar < resultat) System.out.println("Gjett høyere!");

 	if(svar > resultat) System.out.println("Gjett lavere!");

 	if(svar>100 || svar<1) {

   System.out.println("Bare svar mellom 1 og 100 takk!");

 	} else {

   antallSvar++;

 	}

 }

 System.out.println("Grattis, du gjettet tallet på " + antallSvar + " forsøk");

}



private static String lesInput() {

 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

 try {

 	return reader.readLine();

 } catch (IOException e) {

 	System.out.println("Kunne ikke lese input, avslutter programmet");

 	System.exit(0);

 }

 return "";

}



private static int lesTall() {

 //les inn et tall

 while(true) {

 	System.out.println("Tipp et tall: ");

 	try {

   return Integer.parseInt(lesInput());

 	}

 	catch(NumberFormatException e) {

 	}

 }

}



private static boolean gjettMer() {

 //spør brukeren om han vil spille mer

 while(true) {

 	System.out.println("Vil du spille en gang til? (J/N)");

 	String svar = lesInput();

 	if(svar.equalsIgnoreCase("J")) {

   return true;

 	} else if(svar.equalsIgnoreCase("N")) {

   return false;

 	}

 }

}

}

Lenke til kommentar

Sånn... nå er den ferdig:

Her er Gjett klassen din:

class Gjett { 

public static void main(String[] args) { 

 int tipp = 0;

 int j=0;

 

 TastaturLeser tastatur = new TastaturLeser();

 System.out.println("Jeg tenker på et tall mellom 1 og 100."); 

   	

 while (j==0){

 	int tall = (int)(Math.random()*100);

 	int sum = 0;

 	System.out.println("Tipp et tall");

 	while (tipp != tall) { 

   tipp = tastatur.lesHeltall();

   if (tipp >= 1 && tipp <= 100) { 

   	if (tipp < tall) 

   	System.out.println("Beklager! Mitt tall er større."); 

   	if (tipp > tall) 

   	System.out.println("Beklager! Mitt tall er mindre."); 

   } 

   

   else System.out.println("Slå inn et tall mellom 1 og 100"); 

   sum++; 

 	} 

 	System.out.println("Gratulerer! Du klarte det på " + sum + " forsøk"); 

 	System.out.println("Vil du spille igjen? Tast 0 for å spille igjen");

   j = tastatur.lesHeltall();

 }	

 

 

} 

}

 

Siden du ikke ga meg Terminalklassen så brukte jeg bare en Tasaturleser klasse som jeg hadde fra før av... antakeligvis en som gjør det samme som din Terminal klasse...

 

/** En klasse for å lese fra tastatur

*@version 20.02.03

*@author William Young

*/

import java.io.*;

public class TastaturLeser {



private BufferedReader input;

/**Standard Konstruktor.

*

*Oppretter et nytt Tasatur objekt.

*/  

public TastaturLeser() {

     input = new BufferedReader(new InputStreamReader(System.in));

}



/**Metode som et tall.

*@return tallet som blir lest.

*@exception kan få en IOException som vi kaller ex

*/	

public int lesHeltall() {

 try {

 	return Integer.parseInt(input.readLine());  

 }

 catch (Exception ex) {

 	System.out.println("Feil under lesing av heltall");

    return 0;

 }



}



}

 

Forandring som jeg har gjort... brukte to while løkker siden jeg syns de passer bedre ;)

 

En annen ting er at du kan deklarere og caste i samme linje, unødvendig å lage så mange midlertidige variabler... Eller har jeg gjort om koden din til en format som er leselig for andre også... mye lettere å lese koder som er i riktig format.

 

Hvis det er noe i koden min som du ikke forstår er det bare å spørre...

Lenke til kommentar
  • 2 uker senere...

her:

int tall = (int)(Math.random()*100);

 

dette fører til at du får et tall fra 0 til 99

 

riktig skal da være:

int tall = 1 + (int)(Math.random()*100);

 

som sagt bare en bitteliten feil, men hvis maskinen gir deg 0 og du skal prøve å finne ut dette, så får du jo aldri lov til å velge 0, og dermed en liten neverending story.....

Lenke til kommentar

Du burde kanske vurdere å endre programmet slik at det ikke "tenker på" et tall mellom 1 og 100, men kanskje 1 og 100000.. Ikke at det blir så mye enklere i prinsippet, men det virker i alle fall slik. Å finne tallet mellom 1 og 100 vil aldri ta mer enn 7 gjett (hvis du halverer hver gang). Sånn sett så vil du måtte bruke 18 gjett på å finne det ut tallet mellom 1 og 100000. :D

Lenke til kommentar
Du burde kanske vurdere å endre programmet slik at det ikke "tenker på" et tall mellom 1 og 100, men kanskje 1 og 100000.. Ikke at det blir så mye enklere i prinsippet, men det virker i alle fall slik. Å finne tallet mellom 1 og 100 vil aldri ta mer enn 7 gjett (hvis du halverer hver gang). Sånn sett så vil du måtte bruke 18 gjett på å finne det ut tallet mellom 1 og 100000. :D

 

Kunne jo forsåvidt brukt double istedenfor int :lol:

Da kan det være gøy å prøve 10.45434604830

Lenke til kommentar

Kunne jo forsåvidt brukt double istedenfor int  :lol:  

Da kan det være gøy å prøve 10.45434604830

 

Hehe. Hadde nok blitt endel vanskeligere ihvertfall. Det er jo umulig å gjette antall siffer etter komma, med mindre programmet sier f.eks "Du har 4 siffer feil etter komma" :)

 

En ting man kunne gjort var å la programmet si om du var nærmere eller lengre unna enn på forrige gjett.. Det hadde gjort det litt anderledes. :D

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...