Gå til innhold

[Løst] Få while loop til å starte igjenn når bruker vil det.


Anbefalte innlegg

Jeg vil at etter at jeg har kommet ned til

{
JOptionPane.showMessageDialog(null, "Du har gjettet rett!"
+ " Du brukte " + counter++ + " forsøk.");
}
Å spørr brukeren om å spille det igjenn. Hvis ja, så starter den loopen på nytt hvis ikke går den bare ut av programmet.
EDIT: Prøvde meg på en continue; men, den ville ikke starte på nytt.
import java.util.Random;
import javax.swing.JOptionPane;
 
public class Main {
 
public static void main(String[] args) {
JOptionPane.showMessageDialog(null,
"Velkommen til det gøyeste gjettespillet i verden!");
String ans = JOptionPane.showInputDialog(null,
"Skriv inn et tall mellon 0 og 10");
 
int ans_som_tall = Integer.parseInt(ans);
Random rg = new Random();
int tilfeldigtall = rg.nextInt(10);
int counter = 0;
counter++;
 
while (ans_som_tall != tilfeldigtall) {
if (tilfeldigtall < ans_som_tall) {
JOptionPane.showMessageDialog(null, "Tallet er lavere");
counter++;
}
if (tilfeldigtall > ans_som_tall) {
JOptionPane.showMessageDialog(null, "Tallet er høyere");
counter++;
}
ans = JOptionPane.showInputDialog(null, "Skriv inn et tall");
ans_som_tall = Integer.parseInt(ans);
}
{
JOptionPane.showMessageDialog(null, "Du har gjettet rett!"
+ " Du brukte " + counter++ + " forsøk.");
}
 
}
// Starte spillet på nytt hvis spiller ønsker det.
 
}
Endret av Emsal
Lenke til kommentar
Videoannonse
Annonse

Du kan også bruke en do-while f.eks.

 

Ha en variabel som holder orden på tallet personen skal gjette, en på hva brukeren gjettet, og en om brukeren ønsker å starte på nytt eller ikke.

 

 

int answer; // Hvilket tall brukeren gjettet
int correctAnswer; // Det riktige tallet
String continue; // Hva brukeren svarte på om du ønsker å fortsette
 
.
.
.
 
do {
 ...
} while (answer != correctAnswer && !continue.equalsIgnoreCase("ja"));

 

Husk å oppdatere variabler underveis (som answer), og continue etter at brukeren har klart det.

Lenke til kommentar

Jeg brukte heller en for-løkke, så spørr jeg brukeren hvor mange ganger han vil spille det. Så kan han bestemme selv.

Her er koden

 

EDIT: Skjønner ikke hvorfor ikke dette kom opp. Får skrve det på nytt.

Vil kunne lagre lavest mulig tall som vises i en liten highscore. Så hvis han spiller 5 runder skal highscoren vise lavest fosøk. Men får ikke lagra tallet, blir ny highscore hver gang det er ny "runde"

import java.awt.Frame;
import java.io.*;
import java.util.Random;
 
import javax.swing.JOptionPane;
 
public class Main {
 
public static void main(String[] args) {
String runder = JOptionPane.showInputDialog(null, "Hvor mange ganger vil du spille?");
int runder_i_tall = Integer.parseInt(runder);
 
for (int i=1;i<=runder_i_tall;i++){
Random rg = new Random();
int tilfeldigtall = rg.nextInt(10);
int counter = 0;
counter++;
 
JOptionPane.showMessageDialog(null,
"Velkommen til det gøyeste gjettespillet i verden!");
String ans = JOptionPane.showInputDialog(null,
"Skriv inn et tall mellon 0 og 10");
int ans_som_tall = Integer.parseInt(ans);
 
while (ans_som_tall != tilfeldigtall) {
if (tilfeldigtall < ans_som_tall) {
JOptionPane.showMessageDialog(null, "Tallet er lavere");
counter++;
}
if (tilfeldigtall > ans_som_tall) {
JOptionPane.showMessageDialog(null, "Tallet er høyere");
counter++;
} 
ans = JOptionPane.showInputDialog(null, "Skriv inn et tall");
ans_som_tall = Integer.parseInt(ans);
}
{
JOptionPane.showMessageDialog(null, "Du har gjettet rett!"
+ " Du brukte " + counter++ + " forsøk.");
}
 
}
}
 
// fortsett med å kunne lagre highscoren
}
Endret av Emsal
Lenke til kommentar

Her er et forslag til hvordan det kan gjøres.

import java.util.Random;
import javax.swing.JOptionPane;
 
public class Test {
 
  public static void main(String[] args) {
    JOptionPane.showMessageDialog(null,
            "Velkommen til det gøyeste gjettespillet i verden!");
    Random rg = new Random();
    int besteForsok = -1;
    do {
      int tilfeldigtall = rg.nextInt(10);
      int counter = 0;
      int ans_som_tall;
      do {
        String ans = JOptionPane.showInputDialog(
                null, "Skriv inn et tall mellon 0 og 10");
        ans_som_tall = Integer.parseInt(ans);
        counter++;
        if (tilfeldigtall < ans_som_tall) {
          JOptionPane.showMessageDialog(null, "Tallet er lavere");
        }
        else if (tilfeldigtall > ans_som_tall) {
          JOptionPane.showMessageDialog(null, "Tallet er høyere");
        } 
      } while (ans_som_tall != tilfeldigtall);
      JOptionPane.showMessageDialog(null, "Du har gjettet rett!"
              + " Du brukte " + counter + " forsøk.");
      if (besteForsok == -1 || counter < besteForsok) {
    	  besteForsok = counter;
      }
    } while (JOptionPane.showConfirmDialog(null,
             "Vil du spille en gang til?", "Spill igjen?",
             JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION);
    JOptionPane.showMessageDialog(null, "Ditt beste resultat er "
             + besteForsok + " gjetninger!");
  }
 
}
Endret av jonny
  • Liker 2
Lenke til kommentar

 

import java.util.Random;
import javax.swing.JOptionPane;
 
public class Test {
 
    private static final Random rg = new Random();
    
    private static int userGuess() {
        String ans = JOptionPane.showInputDialog(null, "Skriv inn et tall mellon 0 og 10");
        return Integer.parseInt(ans);
    }
    
    private static boolean userRetryQuery() {
        return JOptionPane.showConfirmDialog(null, "Vil du spille en gang til?", "Spill igjen?", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION;
    }
    
    private static void showMessage(String message) {
        JOptionPane.showMessageDialog(null, message);
    }
    
    private static int performGuesses(int answer) {
        int counter = 0;
        int guess = 0;
        do {
            counter++;
            guess = userGuess();
        } while (!compareNumbers(tilfeldigtall, guess));
        showMessage(String.format("Du har gjettet rett! Du brukte %d forsøk.", counter));
        return counter;
    }
    
    private static boolean compareNumbers(answer, guess) {
        if (answer < guess)
            showMessage("Tallet er lavere");
        else if (answer > guess)
            showMessage("Tallet er høyere");
        
        return answer == guess;
    }
    
    public static void main(String[] args) {
        showMessage("Velkommen til det gøyeste gjettespillet i verden!");
        int best = Integer.MAX_VALUE;
        do {
            int numberOfTries = PerformGuesses(rg.nextInt(11));
            
            if (numberOfTries < best) {
                 best = counter;
            }
        } while (UserRetryQuery());
        showMessage(String.format("Ditt beste resultat er %d gjetninger!", best);
    }
}
Lenke til kommentar

Det tar litt tid å lære seg å programmere, om en stund kan du gjøre det like bra eller bedre selv. Hvis det er noe du vil ha en nærmere forklaring på, må du ikke nøle med å spørre, det er helt sikkert mange her som kan prøve å svare!

Lenke til kommentar

Jeg har fått det slik at highscoren blir skrevet ned til en fil. Men hver gang jeg starter programmet om på nytt igjenn så kommer det en ny, ny highscore. Tenkte jeg kunne fikse dette med å bruke variabelen jeg får fra text filen. Men jeg vet ikke hvordan jeg skal lage en variabel for et tall fra en text fil. Klarer bare å lese linjen og presentere det for brukeren. her er koden jeg bruker til å lese text filen.

 

Når jeg klarer å hente ut tallet kan jeg bestemme når når programmet skal skrive inn en ny highscore i fila.

 

 

// Lese highscoren fra "HighscoreFile.txt"
try{
            InputStream ips = new FileInputStream("HighscoreFile.txt"); 
            InputStreamReader ipsr=new InputStreamReader(ips);
            BufferedReader br=new BufferedReader(ipsr);
            String line;
            while ((line=br.readLine())!=null) {
                JOptionPane.showMessageDialog(null, line);
                // get the number variable
               
            }
            br.close(); 
        }       
        catch (Exception e){
            System.out.println(e.toString());
        }
Lenke til kommentar

Hvordan du bruker variabelen kommer an på hvordan datastrukturen er i highscore.

 

Men for å lese inn et tall fra en fil kan du gjøre noe lignende slik:

 

public void readFile(String filePath) {
   Scanner sc = null;
   try {
      sc = new Scanner(new File(filePath));
      while (sc.hasNextInt())
         <lagre tallet/tallene i filen>
  } catch (IOException e) {
         e.printStackTrace();
  } finally {
      sc.close();
   }
}

 

Som sagt hvordan du lagrer highscoren bestemmer hva du gjør med tallet.

Du kan sende met et array i metoden for å lagre det der, et object av en highscore-klasse el.

Lenke til kommentar

 

Jeg har fått det slik at highscoren blir skrevet ned til en fil. Men hver gang jeg starter programmet om på nytt igjenn så kommer det en ny, ny highscore. Tenkte jeg kunne fikse dette med å bruke variabelen jeg får fra text filen. Men jeg vet ikke hvordan jeg skal lage en variabel for et tall fra en text fil. Klarer bare å lese linjen og presentere det for brukeren. her er koden jeg bruker til å lese text filen.

 

Når jeg klarer å hente ut tallet kan jeg bestemme når når programmet skal skrive inn en ny highscore i fila.

// Lese highscoren fra "HighscoreFile.txt"
try{
            InputStream ips = new FileInputStream("HighscoreFile.txt"); 
            InputStreamReader ipsr=new InputStreamReader(ips);
            BufferedReader br=new BufferedReader(ipsr);
            String line;
            while ((line=br.readLine())!=null) {
                JOptionPane.showMessageDialog(null, line);
                // get the number variable
               
            }
            br.close(); 
        }       
        catch (Exception e){
            System.out.println(e.toString());
        }

"line" peker jo på et String-objekt, akkurat som "ans" gjør det i den forrige koden du postet. Hvis fila kun inneholder tall (et tall per linje), kan du bruke Integer.parseInt() som du har gjort tidligere, slik:

 

int highscore = Integer.parseInt(line);

Lenke til kommentar

Den inneholder ikke bare tall. Burde kanskje ha skrevet denne også med en gang. Men jeg kan jo kanskje få tallet på en ny linje "\n"(?) Men ser ikke hvordan jeg får den til å lese en linje med bokstaver og en med tall.

 

btw hva betyr '||'?

 

 

if (besteForsok == -1 || counter < besteForsok)
besteForsok = counter; try {
FileOutputStream fout = new FileOutputStream("HighscoreFile.txt");
String s = "Din highscore er: "+ besteForsok;
 
byte b[]=s.getBytes();
fout.write(b);
 
fout.close();
 
System.out.println("success");
} catch(Exception e) {System.out.println(e);}
Lenke til kommentar

Hvis du har et spesielt tegn på linjen som skiller teksten og tallet (kolon, mellomrom, tab eller hva som helst egentlig), kan du f.eks. bruke String-metodene 'indexOf' og 'substring' for å plukke ut tallet. Prøv deg frem!

 

'||' betyr 'eller', hvis minst et av de to uttrykkene på hver side av '||' gir 'true' vil hele uttrykket gi verdien 'true' også.

Lenke til kommentar

Ja, tenkte det ikke var noe stort poeng å peke på dette enda. Det gjelder forøvrig '&&' også (som er 'og'-operasjonen), hvis det på venstre side er usant vil ikke høyre side evalueres.

 

OT: Synes Ada har gjort dette greit, der bruker man 'and' og 'or' hvis begge sider skal evalueres, og 'and then' og 'or else' hvis det er greit at bare venstresiden evalueres.

Lenke til kommentar

Jeg har bare gjort det sånn at brukeren skriver manuelt inn hva han får presentert som highscoren, som gjør det lett å jukse da, men det kan være som så.

 

Uansett så blir den variablen lagret i "dinHighscore_tall". Og på slutten så lagres jo tallet i en fil. Men bare hvis den highscore han har skrevet ikke er bedre enn den nye han har fått. Altså hvis tidligere highscore er 5 og han får 4 så blir det skrevet i fila. Men hvis brukeren aldri har spilt spillet før så har han jo ikke noe highscore (da'ah). Derfor tenker jeg at brukeren kan skrive 0. Problemet er hvis brukeren skriver 0 vil ikke en annen highscore lagres. Jeg vet hvorfor. Derfor jeg lurer:

 

Går det ann å få if (besteForsok < dinHighscore_tall) utenom tallet 0?

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