Emsal Skrevet 2. september 2013 Del Skrevet 2. september 2013 (endret) 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 2. september 2013 av Emsal Lenke til kommentar
SPRCO Skrevet 2. september 2013 Del Skrevet 2. september 2013 Dersom du bare starter while-loopen om igjen hvis brukeren vil spille på nytt, vil svaret være det samme som forrige runde. En løsning kan derfor være å legge selve koden for spillet i en egen metode og deretter kalle metoden dersom brukeren vil spille igjen. http://pastebin.com/YHu2Mypk Lenke til kommentar
Fred7555 Skrevet 2. september 2013 Del Skrevet 2. september 2013 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
Emsal Skrevet 2. september 2013 Forfatter Del Skrevet 2. september 2013 (endret) 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 2. september 2013 av Emsal Lenke til kommentar
Emsal Skrevet 2. september 2013 Forfatter Del Skrevet 2. september 2013 Dersom du bare starter while-loopen om igjen hvis brukeren vil spille på nytt, vil svaret være det samme som forrige runde. En løsning kan derfor være å legge selve koden for spillet i en egen metode og deretter kalle metoden dersom brukeren vil spille igjen. http://pastebin.com/YHu2Mypk Ja, men det virka litt komplisert for min del. Lenke til kommentar
jonny Skrevet 2. september 2013 Del Skrevet 2. september 2013 (endret) 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 2. september 2013 av jonny 2 Lenke til kommentar
Korporal Kranium Skrevet 2. september 2013 Del Skrevet 2. september 2013 Her er et forslag til hvordan det kan gjøres. -_- beat me to it. Lenke til kommentar
GeirGrusom Skrevet 4. september 2013 Del Skrevet 4. september 2013 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
Emsal Skrevet 4. september 2013 Forfatter Del Skrevet 4. september 2013 Jeg er så sjalu på dere !! Lenke til kommentar
jonny Skrevet 4. september 2013 Del Skrevet 4. september 2013 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
Emsal Skrevet 5. september 2013 Forfatter Del Skrevet 5. september 2013 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
Fred7555 Skrevet 6. september 2013 Del Skrevet 6. september 2013 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
jonny Skrevet 6. september 2013 Del Skrevet 6. september 2013 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
Emsal Skrevet 6. september 2013 Forfatter Del Skrevet 6. september 2013 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
jonny Skrevet 6. september 2013 Del Skrevet 6. september 2013 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
GeirGrusom Skrevet 6. september 2013 Del Skrevet 6. september 2013 Det er også en kortsluttende 'eller'.Dersom venstresiden er sann så vil ikke høyresiden engang sjekkes ettersom resultatet vil være likegyldig. Lenke til kommentar
jonny Skrevet 6. september 2013 Del Skrevet 6. september 2013 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
GeirGrusom Skrevet 7. september 2013 Del Skrevet 7. september 2013 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. Samme i Visual Basic, men relativt få utviklere er klar over det. Lenke til kommentar
Emsal Skrevet 7. september 2013 Forfatter Del Skrevet 7. september 2013 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
Fred7555 Skrevet 7. september 2013 Del Skrevet 7. september 2013 Om jeg forstod deg rett, så kan du bruke if (besteForsok < dinHighscore_tall && dinHighscore_tall != 0) Da vil innholdet i testen kun kjøre hvis besteForsok < dinHighscore_tall og dinHighscore_tall ikke er 0. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå