Emsal Skrevet 7. september 2013 Forfatter Del Skrevet 7. september 2013 Fungerer ikke for if (besteForsok < dinHighscore_tall) vil slå inn uansett. For den registrerer fortsatt 0 som det beste forsøket og vil ikke lagre når jeg får 3 i highscore. Derfor kan jeg ikke ha en "og" der, må ha en som sier "utenom". Hvis det går. Lenke til kommentar
jonny 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. Hvis man leser denne koden på god (?) norsk, blir det omtrent slik: "Hvis 'besteForsok' er mindre enn 'dinHighscore_tall' og 'dinHighscore_tall' er forskjellig fra 0" Jeg tolker det slik at TS ønsker seg noe ala "Hvis 'besteForsok' er mindre enn 'dinHighscore_tall' eller 'dinHighscore_tall' er lik 0" som gir følgende if-setning: if (besteForsok < dinHighscore_tall || dinHighscore_tall == 0) som forøvrig ligner veldig på den siste if-setningen i den innerste do-while-løkka i koden i post #6. Lenke til kommentar
Emsal Skrevet 8. september 2013 Forfatter Del Skrevet 8. september 2013 (endret) neeeeei, haha. dinHighscore_tall inneholder alle tall ikke sant? må det være minus eller pluss uendelig. Kanskje jeg kan forklare det gjennom matte. Jeg vil at dinHighscore_tall skal inneholde alle reelle tall utenom tallet 0. Hvis tallet er lik 0, skal den ignorere det og ikke gå inn i løkken. EDIT: kanskje en bedre forklaring. Skal ha tall fra 1-99..osv, ikke 0-99..osv. Endret 8. september 2013 av Emsal Lenke til kommentar
Fred7555 Skrevet 8. september 2013 Del Skrevet 8. september 2013 (endret) Så den skal gjelde for alle tall utenom 0? if (dinHighscore_tall != 0) Vil da utføre innholdet om kun om variabelen ikke er 0. Eventuelt if (dinHighscore_tall == 0) { return; // eller break; eller det du ønsker } Vil da returnere/gå ut av loopen om dinHighscore_tall er 0. Beklager om jeg enda misforstår Endret 8. september 2013 av Fred7555 Lenke til kommentar
Emsal Skrevet 8. september 2013 Forfatter Del Skrevet 8. september 2013 (endret) EDIT: NVM gutta fant ut av det. Jeg har gjort det slik. Litt enkel løsning, men med et lite problem. Når brukeren skriver 0. Skrives uansett ny highscore inn i fila, men den går ut av programmet fordi jeg har skrevet system.exit(0); Så da må brukeren starte programmet på nytt. Dette må han bare gjøre første ganga da. Lurte på om det gikk an å hoppe over denne koden i første omgang. Også fortsette med if (besteForsok < dinHighscore_tall) 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);} Hele denne koden. if (dinHighscore_tall == 0) 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);} System.exit(0); if (besteForsok < dinHighscore_tall) 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);} Endret 9. september 2013 av Emsal Lenke til kommentar
Emsal Skrevet 9. september 2013 Forfatter Del Skrevet 9. september 2013 (endret) Gjettespillet.zip her er spillet slå dere løs Syns dere jeg skal legge til flere tall egentlig? Eneste problemet mitt nå er å kunne hente tallet fra text fila automatisk, men tar det på sikt. Oppgaven skal ikke leveres før om en måne og står ikke spesifikt i oppgaven at vi må gjøre det heller. Endret 9. september 2013 av Emsal Lenke til kommentar
jonny Skrevet 9. september 2013 Del Skrevet 9. september 2013 Et par forslag til endringer: - fjerne den første boksen som dukker opp, bør lese highscore fra fil, hvis fila ikke finnes er det ingen gammel highscore. Ingen grunn til at bruker skal oppgi dette selv... - "Ditt beste resultat" vises hver gang man er ferdig med et spill. Hvis den skal gjøre det, bør det i allefall vises informasjon relatert til det siste spillet, altså en "gratulerer"-melding hvis man slo "rekorden", eller en "beklager"-meldiing hvis man ikke klarte det eller lignende - "Velkommen til det gøyeste spillet..."-meldingen vises hver gang man velger å spille en gang til, det virker litt rart. Bør etter min mening kun vises ved oppstart av spillet. Når det gjelder tallområdet man skal gjette i: gjetter man optimalt vil man aldri trenge mer enn 10 forsøk for å finne svaret hvis tallområdet er 0-1000. For 0-100 vil man aldri trenge mer enn 7 forsøk (igjen, hvis man gjetter optimalt). Lenke til kommentar
Fred7555 Skrevet 9. september 2013 Del Skrevet 9. september 2013 (endret) I tillegg til forslagene ovenfor, hadde jeg forandret noen ting. int besteForsok = -1; hadd jeg ikke deklarert som en lokal variabel, men heller som en klasse-variabel. try { InputStream ips = new FileInputStream("HighscoreFile.txt"); InputStreamReader ipsr = new InputStreamReader(ips); BufferedReader br = new BufferedReader(ipsr); String line; while ((line = br.readLine()) != null) { String line; JOptionPane.showMessageDialog(null, line); } br.close(); } catch (Exception e) { System.out.println(e.toString()); } hadde jeg skrevet litt annerledes, noe ala: Scanner input = null; try { input = new Scanner(new File("HighscoreFile.txt")); if (input.hasNextInt()) dinHighscore_tall = input.nextInt(); } catch (IOException e) { System.err.println("Something happened during the reading of highscore, error: " + e.getStackTrace()); } finally { input.close(); } Personlig synes jeg der ser ryddigere ut, og du får enkelt ut highscore-verdien av filen. Generelt sett hadde jeg også delt opp koden i flere metoder. Nå har du alt i main-metoden, noe som gjør det vanskeligere å forandre ting. Endret 9. september 2013 av Fred7555 Lenke til kommentar
GeirGrusom Skrevet 9. september 2013 Del Skrevet 9. september 2013 Pass på koden der. Hvis følgende linje feiler: input = new Scanner(new File("HighscoreFile.txt")); så havner den i finally, som også igjen vil feile med NullPointerException.Det er temmelig viktig at finally aldri kaster exception. Lenke til kommentar
Fred7555 Skrevet 9. september 2013 Del Skrevet 9. september 2013 (endret) Ah, sant det. Usikker hvordan jeg ikke tenkte på det. Denne koden burde funke bedre: try { Scanner input = new Scanner(new File("HighscoreFile.txt")); if (input.hasNextInt()) dinHighscore_tall = input.nextInt(); input.close(); } catch (FileNotFoundException e) { System.err.println("Something happened during the reading of highscore, error: " + e.getStackTrace()); } Endret 9. september 2013 av Fred7555 Lenke til kommentar
Emsal Skrevet 9. september 2013 Forfatter Del Skrevet 9. september 2013 Takk for tilbakemelding folkens! Jeg ser koden din, men skjønner den ikke helt. Kan du forklare hvordan den fungerer slik at jeg blir litt tryggere når jeg bruker den og føler at jeg kan gjøre det selv på en måte og ikke bare kopiere det andre skriver. Forstår jeg det slik at tallet blir tatt fra teksten og blir til variabelen dinHighscore_tall? Snakker om denne koden: try { Scanner input = new Scanner(new File("HighscoreFile.txt")); if (input.hasNextInt()) dinHighscore_tall = input.nextInt(); input.close(); } catch (FileNotFoundException e) { System.err.println("Something happened during the reading of highscore, error: " + e.getStackTrace()); } Lenke til kommentar
Fred7555 Skrevet 9. september 2013 Del Skrevet 9. september 2013 (endret) Bare hyggelig å hjelpe Ja, du forstår koden riktig. Kan prøve å forklare den litt mer i detalj under: Det første som skjer er at en try-catch blokk blir skrevet, da "new Scanner(new File("..."))" kan kaste en exception. Vi fanger den opp, og behandler den slik vi ønsker. Deretter deklareres og initialiseres variabelen input, som leser fra den oppgitte filen. I if-sjekken så sjekker vi om filen inneholder minst en int. I ditt tilfelle så vet vi at filen kun inneholder et tall, så det passer fint her. Om det er slik at filen har en int (som sjekkes via input.hasNextInt()), så lagrer vi verdien i dinHighScore_tall, via input.nextInt(), som returnerer første Integer den fant i filen. Om vi kun bruker nextInt(), uten å vite om filen faktisk inneholder en int, så er jeg 99% sikker på at en exception kastet om den ikke finner noen. Derfor sjekker vi først med hasNextInt(), slik at vi er sikre. Etter vi har lest filen, så lukker vi den via input.close(). Kort oppsummert: - Deklarerer try-catch for å fange opp exceptions. - Initialisere scanner-objektet med filen. - Sjekke om filen inneholder et heltall(int/integer) - Hvis ja, så lagrer vi den i variabelen dinHighscore_tall. - Siden vi vet at filen kun inneholder et tall(eventuelt ingen), så er vi ferdig med filen og lukker den med .close() Håper det var forståelig. Bare å si ifra om noe var uklart, eller om du lurer på noe mer. Endret 9. september 2013 av Fred7555 1 Lenke til kommentar
Emsal Skrevet 9. september 2013 Forfatter Del Skrevet 9. september 2013 (endret) Den ville ikke lese tallet. Manglet dinHighscore_tall. Så jeg laget en " int dinHighscore_tall = -1; " Men den leser bare -1 da og leser ikke fila? Tror det kan være fordi tallet i txt filen er en string? Endret 9. september 2013 av Emsal Lenke til kommentar
Fred7555 Skrevet 10. september 2013 Del Skrevet 10. september 2013 Hvor lagret du "int dinHighscore_tall = -1"? Skrev du det inni if-setningen ovenfor, eller et annet sted? Du må enter skrive "static int dinHighscore_tall = -1"; som en klasse-variabel, eller "int dinHighscore_tall = -1;" som første setning i main-metoden. Det input.nextInt() gjør er å sjekke om det finnes en int i textfilen. Så lenge den har er tall (for seg selv, altså ikke i midten av set setning el.), så skal det funke. Lenke til kommentar
Emsal Skrevet 10. september 2013 Forfatter Del Skrevet 10. september 2013 (endret) Lagret det på toppen av metoden for ellers kunne jeg ikke brukt det i do/while løkken. Er ikke det du sier jeg må gjøre? Fordi det fungerte ikke. altså EDIT: her er innholdet i text fila(uten hermetegn) "Din highscore er: 3" public static void main(String[] args) { int besteForsok = -1; int dinHighscore_tall= -1; ...resten av koden } Endret 10. september 2013 av Emsal Lenke til kommentar
Fred7555 Skrevet 10. september 2013 Del Skrevet 10. september 2013 (endret) Beklager, tenkte at highscoreFile.txt kun inneholdt ett enkelt tall, og ikke noe mer. Det input.hasNextInt() gjør, er å sjekke om neste string (til mellomrom) er en int eller ikke. Siden filen begynner med "Din highscore...", så vil den ikke slå ut, da kun "Din" blir sjekket. Om du ønsker å beholde tekstfilen som nå, så må du kjøre gjennom filen i en loop til du finner neste int, for å så lagre den. Denne koden funker på filen: public class Main { public static void main(String[] args) { int besteForsok = -1; int dinHighscore_tall = -1; try { Scanner input = new Scanner(new File("HighscoreFile.txt")); while (!input.hasNextInt()) input.next(); dinHighscore_tall = input.nextInt(); input.close(); } catch (FileNotFoundException e) { System.err.println("Something happened during the reading of highscore, error: " + e.getMessage()); } System.out.println(dinHighscore_tall); // Skriver ut tallet i filen, altså skriver ut 3 } } Denne kjører gjennom filen mens den ikke finner en int, for å så lagre tallet til slutt. Denne krever da et tall på slutten av filen, og vil kræsje om den ikke finner det. Eventuelt kan du beholde den originale koden, og kun ha ett enkelt tall i filen. Kan ikke love at slik jeg viser er den beste måten å løse det på (med hensyn til hastighet eller robusthet), men i henhold til oppgaver som disse, så skal det funke bra. Den kan også løses uten en loop, med da f.eks. å bruke indexOf for å finne ":" i filen, så bruke substring for å hente ut tallet, og til slutt bruke Integer.parseInt() for å omgjøre det til int. Andre måter finnes også, så det er opp til deg hvilken måte du foretrekker å løse det på. Endret 10. september 2013 av Fred7555 1 Lenke til kommentar
Emsal Skrevet 12. september 2013 Forfatter Del Skrevet 12. september 2013 (endret) - fjerne den første boksen som dukker opp, bør lese highscore fra fil, hvis fila ikke finnes er det ingen gammel highscore. Ingen grunn til at bruker skal oppgi dette selv... Fila finner nå selv tallet. Takket være @Fred7555 - "Ditt beste resultat" vises hver gang man er ferdig med et spill. Hvis den skal gjøre det, bør det i allefall vises informasjon relatert til det siste spillet, altså en "gratulerer"-melding hvis man slo "rekorden", eller en "beklager"-meldiing hvis man ikke klarte det eller lignende Ditt beste resultat vises ikke lenger. Istedenfor kommer det om du har slått ny rekord, og hvis ikke kommer det en beklager melding, og forsøkene dine med beste forsøket i en parantes ved siden av. - "Velkommen til det gøyeste spillet..."-meldingen vises hver gang man velger å spille en gang til, det virker litt rart. Bør etter min mening kun vises ved oppstart av spillet. Vises nå kun når man starter opp spillet. Takker og bukker. Tror jeg har gjort alt bra nå. Hvis det er flere invendinger si ifra! PS: Hadde postet sourcecode, men vil ikke at hele klassen bare kan kopiere koden. EDIT: Vurderer å oppdatere det med egendefinerte tallområder og skrive det ut på forskjellige filer. som f.eks egendefinert et område på 450 tall så kommer det opp også highscoren. En slags, easy, medium, hard versjon. Gjettespillet.zip Endret 12. september 2013 av Emsal 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å