Gå til innhold

problemer i if delen i program


Anbefalte innlegg

Jeg har startet å programmere litt igjen, etter en liten pause. For å repetere litt så tenkte jeg at jeg skulle lage et spill.

 

Problemet jeg har her er å få noe if greier til å passe inn. Her er koden.

 

if(direction == 'w') {
                 
                 if(diff == 0) {
                           if(xAxis > 2) {
                                    lose();
                                    }  if(diff == 0) {
                                              if(xAxis > 1) {
                                                       std::cout << "\n\nWARNING! 1 step more in  the same direction"
                                                                 << " and you are\nout of bounds "
                                                                 << "and will loose!\n";
                                                       getche();
                                                       }
                                                       }
                                                       }
                          //Increase the X axis
                          xAxis++;
                          std::cout << "\n\nYour coordinates are now: " << xAxis << ", " <<yAxis
                                    << std::endl;
                          }

 

Jeg skal ha inn i det der, if(diff == 1) { blabla; }.

 

Har prøvd lenge for å få d til men står litt fast.

 

diff er da vansklighets graden i spillet, visst diff er 0, er det easy, og 1 er normal. Skal ha d slik at visst den er på easy så er "kartet" lite, eller når det er normal så er det litt større og da må jeg bruke andre tall.

 

( Ja vet at jeg ikke skal bruke getche() og system("pause"), men dette er bare et lite repeterings "prosjekt" så etter min mening er det ikke så nøye med.)

Endret av Kjeksen
Lenke til kommentar
Videoannonse
Annonse

if(direction == 'w') {
   if(diff == 0) { //<--------
       if(xAxis > 2) {
           lose();
       }  
       if(diff == 0) { //<-------
           if(xAxis > 1) {
               std::cout << "\n\nWARNING! 1 step more in  the same direction"
                                                                 << " and you are\nout of bounds "
                                                                 << "and will loose!\n";
               getche();
           }
       }
   }
    //Increase the X axis
   xAxis++;
   std::cout << "\n\nYour coordinates are now: " << xAxis << ", " <<yAxis
   << std::endl;
}

 

Hvorfor har du to if(diff == 0) tester? Og hvorfor står den siste inni den første? Den siste er meningsløs såframt funksjonen Lose() ikke endrer diff.

Endret av Orjanp
Lenke til kommentar

Restrukturer koden, så blir alt så meget lettere:

 

enum difficulty { easy, normal };

if (direction == 'w') {
    int loseOffset = 2; // Normal difficulty
    if (diff == easy) {
        loseOffset = 3;
    }
        
    if (xAxis > loseOffset) {
        lose();
    }

    if (xAxis > loseOffset - 1) {
        std::cout << "\n\nWARNING! 1 step more in  the same direction and you are\nout of bounds  and will loose!\n";
        getche();
    }

    // Increase the X axis
    ++xAxis;
    std::cout << "\n\nYour coordinates are now: " << xAxis << "," <<yAxis << std::endl;
}

 

 

(Jeg synes forresten kodestilen din gjør koden svært uleselig.)

 

Edit: La til mellomrom mellom if og ( for leselighetens skyld.

Endret av Myubi
Lenke til kommentar
Jeg har startet å programmere litt igjen, etter en liten pause. For å repetere litt så tenkte jeg at jeg skulle lage et spill.

 

Problemet jeg har her er å få noe if greier til å passe inn. Her er koden.

 

if(direction == 'w') {
                 
                 if(diff == 0) {
                           if(xAxis > 2) {
                                    lose();
                                    }  if(diff == 0) {
                                              if(xAxis > 1) {
                                                       std::cout << "\n\nWARNING! 1 step more in  the same direction"
                                                                 << " and you are\nout of bounds "
                                                                 << "and will loose!\n";
                                                       getche();
                                                       }
                                                       }
                                                       }
                          //Increase the X axis
                          xAxis++;
                          std::cout << "\n\nYour coordinates are now: " << xAxis << ", " <<yAxis
                                    << std::endl;
                          }

 

Jeg skal ha inn i det der, if(diff == 1) { blabla; }.

 

Har prøvd lenge for å få d til men står litt fast.

 

diff er da vansklighets graden i spillet, visst diff er 0, er det easy, og 1 er normal. Skal ha d slik at visst den er på easy så er "kartet" lite, eller når det er normal så er det litt større og da må jeg bruke andre tall.

 

( Ja vet at jeg ikke skal bruke getche() og system("pause"), men dette er bare et lite repeterings "prosjekt" så etter min mening er det ikke så nøye med.)

Skjønner ikke helt hva alt dette har inne i en if test å gjøre, men her er en omstrukturert utgave av koden din. Når du ikke skjønner noe av koden din selv lenger, bør du tenke deg litt om hvordan du har skrevet den:)

 

Søk litt på C coding guidelines for tips for å forbedre kodestilen din...

Lykke til med spillet;)

 

switch(direction) {
case 0: {
 if (xAxis > 2): {
 	lose();
 	break;
 }
 if (diff ==0 && xAxis > 1): {
 	std::cout << "\n\nWARNING! 1 step more in  the same direction"
                       	<< " and you are\nout of bounds "
   << "and will loose!\n";
 	getche();
 	break;
 }
}

default: {
 xAxis++;
 std::cout << "\n\nYour coordinates are now: " << xAxis << ", " <<yAxis
 	<< std::endl;
}
}

Lenke til kommentar

If test?? eh, les litt til du.

Jeg sa if PROBLEM.

 

Har heller ikke sagt at jeg ikke skjønner koden, ser at enkelte deler av koden som jeg har brukt i programmet er unødvendig rotete og lite system, ( rekna ikke med at d skulle så mye kode for og få til det jeg tenkte på, derfor lite system, og ja, derfor skriver jeg om hele greia ).

Lenke til kommentar
If test?? eh, les litt til du.

Jeg sa if PROBLEM.

 

Har heller ikke sagt at jeg ikke skjønner koden, ser at enkelte deler av koden som jeg har brukt i programmet er unødvendig rotete og lite system, ( rekna ikke med at d skulle så mye kode for og få til det jeg tenkte på, derfor lite system, og ja, derfor skriver jeg om hele greia ).

Jeg ser at du skrev if problem, men det jeg skrev var at jeg ikke skjønner hvorfor du har puttet all den koden du har skrevet inne i en if kontroll, da noe av den burde vært flyttet utenfor. Slikt kan lett skape et "if PROBLEM". Når man får for store if settninger, og disse skaper problemer bør de skrives om.

Lenke til kommentar
If test?? eh, les litt til du.

Jeg sa if PROBLEM.

 

Har heller ikke sagt at jeg ikke skjønner koden, ser at enkelte deler av koden som jeg har brukt i programmet er unødvendig rotete og lite system, ( rekna ikke med at d skulle så mye kode for og få til det jeg tenkte på, derfor lite system, og ja, derfor skriver jeg om hele greia ).

Jeg ser at du skrev if problem, men det jeg skrev var at jeg ikke skjønner hvorfor du har puttet all den koden du har skrevet inne i en if kontroll, da noe av den burde vært flyttet utenfor. Slikt kan lett skape et "if PROBLEM". Når man får for store if settninger, og disse skaper problemer bør de skrives om.

Joda, men det var mye som var avhengig av forskjellige ting, derfor mye if rot. Men har skreve om koden for lenge siden og komt frem til en bedre løsning enn den jeg hadde før.

Lenke til kommentar

Mens jeg har en post her så lurer jeg på om der er noen god erstatning til system("cls") ? siden system ikke er platformuavhengig kode.

 

stemmer det også at switch(var) er treigt, så det er bedre og bruke if?

Endret av Kjeksen
Lenke til kommentar

Generelt burde du vel bruke switch når der er flere mulige caser.. altså, når det blir if else else else else else ...osv så slenger du inne n switch istedenfor, og oppnår ryddigere kode.. farten på de forskjellige metodene vet jeg ingenting om...

Lenke til kommentar

Switch fungerer på en annen måte en if;

if(a == 1)
 noop;
else if(a == 2)
 noop;
else
 noop;

 

mot

 

switch(a)
{
 case 1:
   noop;
   break;
 case 2:
   noop;
   break;
 default:
   noop;
   break;
}

 

switch kan kun sjekke hvis den er lik, og kun på tallverdier, fordi den er enklere i oppbygning for prosessoren; hver case er som en goto, dermed kan du også ha break; der, eller la være hvis det er gunstig, det er ikke mulig med if.

 

en if ville sett slik ut med switch:

switch(a == true)
{
 case true:
   break;
 case false:
   break;
}

 

Altså If sjekker bare om verdien er sann, eller usann, switch sjekker etter mange andre verdier, det som står i if() må være true eller false, det finnes ikke noe annet, enten blir koden kalt, eller ikke.

Lenke til kommentar

Har valgt å teste å bruke switch kombinert med if`s. Her er koden:

 

switch(dir) {
                case 'w':
                     
                     
                     if(xAxis > looseOffsett +1) {
                              loose();
                              }
                     
                     if(xAxis > looseOffset {
                              std::cout << "\n\nWARNING!";
                              }
                     ++xAxis;
                     break;
                     
                     
                case 'e':
                     
                     
                     if(xAxis < looseOffsetMinus) {
                              std::cout << "\n\nWARNING!";
                              }
                              
                     if(xAxis < looseOffsetMinus -1) {
                              loose();
                              }
                     --xAxis;
                     break;
                     
                       
                       
                case 's':
                     

                     if(yAxis < looseOffsetMinus -1) {
                              loose();
                              }
                     
                     if(yAxis < looseOffsetMinus) {
                              std::cout << "\n\nWARNING!";
                              }
                     --yAxis;
                     break;
                    
                     
                case 'n':


                     if(yAxis > looseOffset +1) {
                              loose();
                              }
                
                     if(yAxis > looseOffset) {
                              std::cout << "\n\nWARNING!";
                              }
                     ++yAxis;
                     break;
                
                
                default:

                        std::cout << "\n\nERROR in input!\n\n";
                        break;
                        }

 

I tilleg til selve spillet vil jeg også ha en slags highscore funksjon som har styring på bestetider i forskjellige vansklighetsgrader.

 

Noen som har noen tips til dette? tenkte jeg kunne kanskje bruke time.h og funksjonen _strtime, eneste problemet med denne er at tiden blir lagret i et array av chars. I arrayet er det også kolon. :hmm:

Endret av Kjeksen
Lenke til kommentar

Ok, jeg har 2 tider som jeg har fått ved hjelp av dette.

 

#include <iostream>
#include <time.h>

int main() {
    char time1[9];
    char time2[9];
    

     //Lagrer klokkeslett 1 i array time1
     _strtime (time1);

     //bla bla bla kode kode


     //Lagrer klokkeslett 2 i array time2
    _strtime (time2);

    return 0;
}

 

 

Altså med denne koden har jeg 2 arrays som ser ut som dette: hr:min:sec

Jeg tenkte jeg skulle ta time2 minus time1 for å få tiden som har gått. Noen som har noe lurt på lager her? Det hele hadde vært enklere om jeg hadde hatt klokkesletta som int.

Lenke til kommentar
struct time
{
public:
 long hours;
 long minutes;
 long seconds;
public:
 time()
 {
   seconds = 0; minutes = 0; hours = 0;
 }
 time(int total_seconds)
 {
   // Henter klokkeslett fra en int
   int rest = total_seconds / 60;
   hours = total_seconds % 60;
   minutes = rest % 60;
   seconds = rest / 60;
 }
 time(char *src)
 {
   // Henter klokkeslett fra en string
   sscanf(str, "%d:%d:%d", &this->hours, &this->minutes, &this->seconds);
 }
 static time operator - (time a, time b)
 {
   // Trekker ett klokkelsett fra et annet
   time res;
   res.seconds = a.seconds - b.seconds;
   res.minutes = a.minutes - b.minutes;
   if(res.seconds < 0)
   {
     res.minutes -= 1
     res.seconds = -res.seconds;
   }
   res.hours = a.hours - b.hours;
   return res;
 }
 operator int()
 {
   // Returnerer antall sekunder
   return hours * 60 * 60 + minutes * 60 + seconds;
 }
 static time now()
 {
   char current_time[9];
   _strtime(current_time);
   return time(&current_time);
 }
};

Endret av GeirGrusom
Lenke til kommentar

har løst problemet ved å bruke sscanf(tid1, "%d: %d: %d:", &hours1, &minutes1, &seconds1); Og deretter bruke sscanf(tid2, "%d: %d: %d:", &hours2, &minutes2, &seconds2);

 

og så legge sammen til 3 totale verdier ved å ta h2 - h1, m2 - m1, s2 - s1. Så får jeg tiden som har gått fra tid1 til tid2.

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