2011-11-17, 20:34
  #1
Medlem
Jag har en uppgift som jag skulle behöva ha lite hjälp med.

Det går ut på följande:

En meny ska anropas som ger 3 olika alternativ.

1. Nytt spel
2. Statistik
3. Avsluta spel

Varje val ska därefter anropa en metod som gör det alternativ man har valt.

Mitt problem är att jag inte får mainmetoden att fungera på ett riktigt sätt.

Det spelar ingen roll vad jag anger som val för val "Nytt spel" körs oberoende på vad man skriver.

Skulle helt enkelt behöva lite hjälp från nån som kan lite mer än mig så jag får det att fungera.


Mainmetoden ser ut på följande sätt:
Kod:
public class Uppgift4 {
public static int randomtal;
public static int menyVal;
public static int gissning;
public static int val;


public static int getNextRandom(int randomtal) 
   { return new java.util.Random().nextInt(100); }

   
public static void main(String[] args) {
      
newGame mynewGame = new newGame();
 
 
val = newGame.showMainMenu(menyVal); 

newGame.showMainMenu(menyVal);

System.out.println(val);


do {    

    if ( val == 1)
    
    randomtal = getNextRandom(randomtal);
    newGame.playGame(gissning);
    newGame.calculateGame(gissning,randomtal);  
    newGame.showMainMenu(menyVal);
      
    if ( val == 2)
    
    newGame.showStatistics(); 
   
}
while ( val != 3);
 


}

}


Och klassen som jag anropar metoder ifrån ser ut såhär:
Kod:
import java.util.Scanner;

public class newGame {    
    
public static int antalGissningar;
public static int högstAntalGissningar;
public static int lägstAntalGissningar = 100;
public static int antalGångerSpelat;    
public static int totaltAntalGissningar;    
public static int antalGissningar1;  
    
public static int playGame(int gissning) 
{
   Scanner input = new Scanner (System.in);
   
   System.out.print("Chansa på ett tal mellan 1 och 100:");
   gissning = input.nextInt();
  
   antalGångerSpelat = antalGångerSpelat +1;
  
   return gissning;
}
public static int showMainMenu(int menyVal)
    {   
    Scanner input = new Scanner (System.in); 
      System.out.print( "Välj mellan följande alternativ:\n1. Nytt spel\n2. Statistik\n3. Avsluta\nAnge ditt val:" );
      menyVal = input.nextInt();
            
     
    return menyVal;
     }

public static void calculateGame(int gissning, int randomtal)
{ 

do 
 {       
 if (gissning > randomtal)
 { System.out.println("Lägre!");
         
 Scanner input = new Scanner (System.in);
   
   System.out.print("Försök igen:");
   gissning = input.nextInt(); 
 antalGissningar = antalGissningar +1;}
 
 if (gissning < randomtal)
 { System.out.println("Högre!");
 Scanner input = new Scanner (System.in);
   
   System.out.print("Försök igen:");
   gissning = input.nextInt(); 
 antalGissningar = antalGissningar +1;}
 
 if (gissning == randomtal)
  { System.out.println("Grattis du gissade rätt!"); 
  antalGissningar1 = antalGissningar;
  }
  
 
 totaltAntalGissningar = antalGissningar + antalGissningar;
 
while(antalGissningar1 > högstAntalGissningar)

högstAntalGissningar = antalGissningar1 ;

while (antalGissningar < lägstAntalGissningar)

lägstAntalGissningar = antalGissningar1;
        
 
 }

while(gissning != randomtal);


}



public static void showStatistics()
{  
 int genomsnitt;
 
 genomsnitt = totaltAntalGissningar / antalGångerSpelat ;
 
 System.out.printf( "Antal gissningar:%d\n " ,antalGissningar );
 System.out.printf( "Antal gissningar i genomsnitt:%d\n ", genomsnitt); 
 System.out.printf( "Högst antal gissningar:%d\n ",högstAntalGissningar );
 System.out.printf( "Lägst antal gissningar:%d\n ",lägstAntalGissningar );
 System.out.printf( "Antal gånger spelat:%d\n ",antalGångerSpelat);
}


}

Tackar på förhand
Big-O
Citera
2011-11-17, 21:12
  #2
Medlem
Voldemort2s avatar
Du har inga måsvingar i if-satsen, när val == 1. Sätt måsvingar, så ska du se att det fungerar.
Citera
2011-11-17, 21:21
  #3
Medlem
Citat:
Ursprungligen postat av Voldemort2
Du har inga måsvingar i if-satsen, när val == 1. Sätt måsvingar, så ska du se att det fungerar.

Tyvärr hjälper det inte heller, Voldemort2.. Tack ändå.

Någon annan med några idéer?
Citera
2011-11-17, 21:28
  #4
Medlem
I din do-while-sats där du anropar metoden showMainMenu så fångar du inte upp det värde som metoden returnerar.
Citera
2011-11-17, 21:48
  #5
Medlem
main metoden ungefär så här:


newGame mynewGame = new newGame();
do {
// Show menu and get return value
val = newGame.showMainMenu(menyVal);
// For debug : show the return value
System.out.println(val);

// Test value
if ( val == 1)
{
// If 1 play a game
randomtal = getNextRandom(randomtal);
newGame.playGame(gissning);
// Compute statistic
newGame.calculateGame(gissning,randomtal);
}
if ( val == 2)
{
// if 2 show statistic
newGame.showStatistics();
}
}
while ( val != 3); // if 3 exit

Kommentera din kod och alt blir mycket enklare i framtiden
Citera
2011-11-18, 16:47
  #6
Medlem
När man jobbar med programmering så vill man bara strypa alla lab-assistenter som tvingade en att skriva "//" och totalt irrelevanta kommentarer stup i ett. Det skapar små latenta cancersvulster som ligger kvar och förpestar kodbasen . Om du måste skriva kommentarer mitt i koden för att beskriva vad du gör, så skall du tänka både en och två gånger om du istället kan skapa tydligare variabelnamn, metodanrop eller bryta ut det du gör till en metod med ett tydligt namn.

Kommentarer bör, i den mån det är möjligt, begränsas till java-doc för metoder och klasser .

Vad tillför nedan kommentar:
Citat:
if ( val == 2)
{
// if 2 show statistic
newGame.showStatistics();
}
Citera
2011-11-18, 18:20
  #7
Medlem
gadzooxs avatar
Citat:
Ursprungligen postat av jagrcarl
newGame mynewGame = new newGame();
Inte något svar på din fråga, men det väcker X antal dito hos mig

Varför skapar du en instans av klassen newGame (som för övrigt borde heta NewGame), när allt i klassen ändå är statiskt? Du använder aldrig variabeln mynewGame i koden.

Ett tips är att använda static så lite som det bara är möjligt, så slipper du en hel del problem i framtiden. Börja med att fimpa alla static i hela klassen newGame (NewGame), och ändra alla rader i stil med newGame.playGame(gissning); till mynewGame.playGame(gissning);

Passa samtidigt på att fimpa dessa:
Citat:
Ursprungligen postat av jagrcarl
public class Uppgift4 {
public static int randomtal;
public static int menyVal;
public static int gissning;
public static int val;

Variabeln randomtal används t.ex. bara i main-metoden. Då bör den vara deklarerad där. Samma sak med val och menyVal.

Sedan förstår jag inte varför de variablerna ens finns och varför du skickar med dem i anropen till metoderna getNextRandom, playGame, och showMainMenu. De metoderna returnerar integers, de har ingen nytta av att ta emot några värden. Som sagt, deklarera variabler så nära och lokalt som möjligt det ställe där de används. Globala variabler (i den mån det är möjligt i java, men statiska klassvariabler är väl så nära man kommer) är enbart av ondo.
Citera
2011-11-18, 21:49
  #8
Medlem
Citat:
Ursprungligen postat av Drubas
När man jobbar med programmering så vill man bara strypa alla lab-assistenter som tvingade en att skriva "//" och totalt irrelevanta kommentarer stup i ett. Det skapar små latenta cancersvulster som ligger kvar och förpestar kodbasen . Om du måste skriva kommentarer mitt i koden för att beskriva vad du gör, så skall du tänka både en och två gånger om du istället kan skapa tydligare variabelnamn, metodanrop eller bryta ut det du gör till en metod med ett tydligt namn.

Kommentarer bör, i den mån det är möjligt, begränsas till java-doc för metoder och klasser .

Vad tillför nedan kommentar:

Detta var en exempel och kommentaren i sig tillför inget, ok.

Men efter 30 år programmering med de flesta språk : kommentarer är mer viktigt än du påstar.
- När du lär dig: det tvingar dig tänka vad algorithm gör. istället för att koda och se om det fungerar.
typ det som finns i tråden.
- När man kommer till 'störe' kod eller komplexa algorythm kan du använda de namner du vill det hjälper inte.
- Det hjäpler den som kommer efter att förstå hur man tänker
- Det hjälper att se vad man gjorde för 1 år sen
- Det hjälper att se vad man gjorde för 2 år sen. etc..
- Har du applikation som är 25år gammal med flera hundra tals rader kod blir det svårt utan kommentarer. Java är inte där än, men det blir det en dag kanske. Och det behövs inte 25 år för att kunskap, dokumentation, historik i koden försvinner eller annat försvinner.
Jag ser inte det varje dag men varje år: ny från skolan tröt på kommentarer som ett år efter ska ändra något de gjorde och kämpar för att göra det.

I det här fallet: att tvinga sig skriva "vad gör koden" ger lösningen till problemet:
loop
Visa menu
tar del av svaret
beroende på val gör xxx
until valet är exit
Citera
2011-11-19, 12:01
  #9
Medlem
Citat:
Ursprungligen postat av casimiro
Detta var en exempel och kommentaren i sig tillför inget, ok.

Men efter 30 år programmering med de flesta språk : kommentarer är mer viktigt än du påstar.
- När du lär dig: det tvingar dig tänka vad algorithm gör. istället för att koda och se om det fungerar.
typ det som finns i tråden.
- När man kommer till 'störe' kod eller komplexa algorythm kan du använda de namner du vill det hjälper inte.
- Det hjäpler den som kommer efter att förstå hur man tänker
- Det hjälper att se vad man gjorde för 1 år sen
- Det hjälper att se vad man gjorde för 2 år sen. etc..
- Har du applikation som är 25år gammal med flera hundra tals rader kod blir det svårt utan kommentarer. Java är inte där än, men det blir det en dag kanske. Och det behövs inte 25 år för att kunskap, dokumentation, historik i koden försvinner eller annat försvinner.
Jag ser inte det varje dag men varje år: ny från skolan tröt på kommentarer som ett år efter ska ändra något de gjorde och kämpar för att göra det.

I det här fallet: att tvinga sig skriva "vad gör koden" ger lösningen till problemet:
loop
Visa menu
tar del av svaret
beroende på val gör xxx
until valet är exit

Om du syftar till att kommentarerna skall fylla något sorts pedagogiskt syfte, att kommentarerna är en del av ett arbetssätt som skall hjälpa till att skapa förståelse för problemlösningen - så finns det bättre sätt. Min röst ligger i så fall på TDD, framför att spamma ut kommentarer.

Jag ser ingen anledning över huvud taget till den typen av kommentarer som finns i denna tråd. Det är klart att det finns personliga preferenser, men jag anser inte att den här typen av kommentarer bidrar med någonting.

Beskrivning av hur en algoritm fungerar skall i mina ögon ligga i java-doc:en för den metod där algoritmen finns. I vissa fall hamnar man i en jobbig legacy-kod och blir då tvungen att slänga in kommentarer mitt i koden, men jag tycker att man bör sträva efter att i den mån det är möjligt lyfta ut kommentarer till den dokumentation/kommentar som beskriver metoden.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in