Gå til innhold

Anbefalte innlegg

Skrevet

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.

Videoannonse
Annonse
Skrevet

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

...

}

}

Skrevet

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;

 	}

 }

}

}

Skrevet

Å telle hvor mange ganger personen er gjettet vil ikke bli vanskelig, bare å legge til en teller...

 

Som nevnt er forløkken din feil...

 

Burde brukt en while, men en for går også...

Skrevet

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

Skrevet

Takk for hjelpen, nå fikk jeg det til. Og det beste av alt, jeg forsto hva som var blitt gjort.

Skrevet

Bare hyggelig, fant en liten bug, det er at når man trykker et tall over 100 så blir det også regnet som et forsøk, du greier vel å fixe det selv? :)

  • 2 uker senere...
Skrevet

kanskje litt sent men ser dere som har kommenteret denne programsnutten den lille feilen, som gjør at programmet kan gå i en evig løkke??

 

en liten tue kan velte et stort lass som den gjorde her:-)

 

Grokster

Skrevet
kanskje litt sent men ser dere som har kommenteret denne  programsnutten den lille feilen, som gjør at programmet kan gå i en evig løkke??

 

en liten tue kan velte et stort lass som den gjorde her:-)

 

Grokster

 

Hvor? :shrug:

Skrevet

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

Skrevet

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

Skrevet
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

Skrevet

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

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