Forum: Funktioner - Varför?!

Forum huvudsida -> Programmering -> Funktioner - Varför?!

Sidor: 1

Till botten

zippo88 01:05 - 21:a Mars 2009 | Post #1
Medlem
Inlägg: 13


Skicka PM
Hej jag har lite(mycket) problem med varför funktioner används, det enda jag vet är varför man gör void funktioner utan några parametrar. För att kunna återanvända delar av koden flera gånger.

Men sen kommer det här med värden till parametrar o grejer. Varför har man dom, vilken funktion fyller det i till exempel ett spel. Jag tycker att det verkar helt meningslöst, förstår inte varför man inte bara beräknar sakerna i funktionen.

Kan någon förklara varför man använder detta? Alla guider jag har läst förklarar bara hur man använder det. aldrig varför. ,,r helt förvirrad Smiley.

En bra nybörjarvänlig förklaring uppskattasSmiley




HärJ 03:02 - 21:a Mars 2009 | Post #2
Moderator
Inlägg: 1198


Skicka PM
Du svarar egentligen på din egen fråga. Man vill slippa skriva samma sak många gånger.
Alternativet är att du vill göra din kod mer läslig.

I ett spel finns det uppenbara funktioner som tex flytta spelpjäser, kolla om någon vunnit osv.
För att funktionen ska kunna genomföra dessa beräkningar krävs att den får rätt indata, parametrar.

Ex:
  1. (define (spel)
  2. (display "hej! gissa vilket tal jag tänker på.")
  3. (kolla-gissning (ta-in-gissning)))
  4.  
  5. (define (kolla-gissning gissning)
  6. (let ((svar (slump-mellan 1 100)))
  7. (cond ((= gissning svar) (display "Grattis! du gissade rätt!"))
  8. ((> gissning svar) (display "Tyvärr, du gissade för högt."))
  9. ((< gissning svar) (display "Tyvärr, du gissade för lågt.")))))
  10.  
  11. (define (ta-in-gissning)
  12. (let ((gissning (read)))
  13. (if (number? gissning)
  14. gissning
  15. (ta-in-gissning))))
  16.  
  17. (define (slump-mellan min max)
  18. (+ (random (- max min)) min))

Som du ser så använder jag funktioner, för att strukturera upp programmet och göra det mer läsligt. Varje funktion har en specifik uppgift. Vissa, tex slump-mellan, tar prametrar för att kunna utföra en beräkning och retunera ett lämpligt värde.

Hoppas att jag förstod din fråga rätt och inte bara fransat ut i kantenSmiley

-------------------------
Tänk om jag vore en skalärprodukt!



zippo88 23:58 - 21:a Mars 2009 | Post #3
Medlem
Inlägg: 13


Skicka PM
jag förstod faktiskt ingenting av din kod, och jag fattar fortfarande inte parametrar i funktioner och varför man returnerar värden till funktioner och vad dom värdena gör eller hur man får det o fungera i olika sammanhang. Kan visa lite kod när jag har försökt få nåt o funka med parametrar som jag mycket enklare kunde ha skrivit utan dom, och funkade det gjorde det inte såklart. Kan inte ens starta programmet :/.

  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. float areafunktion(float sida1, float sida2);
  7. float areafunktion(float sida1, float sida2)
  8. {
  9. cout << "Skriv in rektangelns 2 sidor, om arean blir över 50 så avslutas programmet" << endl;
  10. cin >> sida1 >> sida2;
  11. float area = sida1 * sida2;
  12. return area;
  13. }
  14.  
  15. int main()
  16. {
  17. while (areafunktion<50)
  18. {
  19. areafunktion(float sida1, float sida2);
  20. cout << areafunktion;
  21. }
  22.  
  23. return 0;
  24. }

någon som har tid och lust att rätta till vad jag har gjort fel? Samt en förklaring på varför man lägger in variablerna i funktionens parametrar istället för att låta dem vara tomma och lägga till variablerna längst upp i programmet skulle vara bra. När ska man använda parametrar till funktionen och hur och varifrån kommer jag åt dom?

Som ni ser så fattar jag verkligen inte parametrarna i funktioner alls. är väl dum helt enkelt, men tack för att du tog dej tid att försöka Härj.

här är ett till test där jag har gjort på ett lite annorlunda sätt för att försöka få det o fungera.

  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. bool level1(bool lvl1, int i);
  7. bool level1(bool lvl1, int i)
  8. {
  9. lvl1==true;
  10. while (lvl1==true)
  11. {
  12. cout << "Level1, i = " << i << endl;
  13. i++;
  14. if (i>100)
  15. {
  16. lvl1==false;
  17. break;
  18. }
  19. }
  20. }
  21.  
  22. int main()
  23. {
  24. bool loop;
  25. loop=true;
  26. while(loop==true);
  27. {
  28. level1(bool lvl1, int i);
  29. }
  30.  
  31. cin.get()
  32. cin.ignore()
  33. return 0;
  34. }

fungerade inte hellerSmiley. expected primary expression before bool och int i main funktionen.
Det här är antagligen inte ens ett bra sätt att använda funktionsparametrar på och jag har inget return värde.
Jag skulle uppskatta om någon tog sej tid att försöka förklara när man ska använda funktionsparametrar (och return värden). Har försökt en hel del i böcker och söka på google men det blir bara mer o mer oklart :/. Har kört fast här.

srsly, lär dig använda source-taggar //herj


Senast redigerad 21:35 - 22:a Mars 2009


zippo88 02:13 - 22:a Mars 2009 | Post #4
Medlem
Inlägg: 13


Skicka PM
Jag börjar äntligen fatta det här med funktioner nuSmiley.

Det används när man vill ta med sej en variabel från en funktion till en annan funktion och ändra den på något sätt och sedan skicka tillbaks den ändrade variablen.

till exempel så här:

  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5. int berakning(int tal1, int tal2);
  6. int berakning(int tal1, int tal2)
  7. {
  8. int summa;
  9. summa = tal1 + tal2;
  10. return summa;
  11. }
  12.  
  13. int main()
  14. {
  15. int tal1;
  16. int tal2;
  17. int summa;
  18. cin >> tal1 >> tal2;
  19. berakning(tal1, tal2);
  20. summa = berakning(tal1, tal2);
  21. cout << summa;
  22.  
  23.  
  24.  
  25. cin.get();
  26. cin.ignore();
  27. return 0;
  28. }


men en fråga bara. Funkar det lika bra om man gör på detta sättet?:

  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. int tal1;
  5. int tal2;
  6. int summa;
  7.  
  8. using namespace std;
  9. void berakning();
  10. void berakning()
  11. {
  12. summa = tal1 + tal2;
  13. }
  14.  
  15. int main()
  16. {
  17. cin >> tal1 >> tal2;
  18. berakning();
  19. cout << summa;
  20.  
  21.  
  22.  
  23. cin.get();
  24. cin.ignore();
  25. return 0;
  26. }

Nu har jag deklarerat variablerna utanför alla funktioner, precis i början. ,,r det ok att göra så eller fungerar inte det om man vill göra en mer avancerad funktion?

no srsly! lär dig använda source-taggar //herj


Senast redigerad 21:39 - 22:a Mars 2009


Vitdom 10:15 - 22:a Mars 2009 | Post #5
Medlem
Inlägg: 71


Skicka PM
Det fungerar utmärkt.

Men din beskrivning av en funktion är lite fel, en lite bättre vore:
"En kod som hoppas till när den anropas i koden. Faktiska argument kopieras till nya variabler som kallas formella argument, sedan utförs en kod, efter körningen returnerar funktionen en variabel av funktionens returtyp(void=inget).

Eftersom att programmering är i grunden sekventiellt vill man ha kod som kan återanvändas, måste man hoppa till en kod som sedan exekveras, sedan hoppar man tillbaka till den plats i koden där man anropade funktionen. Funktioner används mycket med kod som ska kunna återanvändas."

-------------------------



Senast redigerad 10:22 - 22:a Mars 2009


zippo88 16:24 - 22:a Mars 2009 | Post #6
Medlem
Inlägg: 13


Skicka PM
aa jag vet att man använder funktioner för att återanvända kod. det är bara det att jag blir lite förvirrad när man tar med sej variabler från andra delar i koden och ändrar om dom. När är det en bra ide att använda dom etc? Igår försökte jag göra samma textspel som jag har gjort innan fast mer organiserat med mindre kod. det gick inte så braSmiley. Det svåra är väl att jag inte vet från början hur jag ska ha det.
Testade strukturer för mina monster och så, och jag kan ju få koden att funka men isåfall tror jag att jag lägger till många onödiga nya variabler utanför main och sånt. Syftet var ju att testa att använda variablerna i parametrar men jag blir bara förvirradSmiley.

Har ni några tips på en bra regel att följa när man ska koda ett spel. Hur man ska strukturera upp det hela och när man använder variabler i parametrarna på funktioner. Jag antar att det är när man vill ändra en variabel på ett ställe men inte i till exempel en annan del där du hämtar nya "monster".

Det jag har läst hittills visar delvis hur man gör när man gör funktions parametrar, men aldrig några bra exempel hur man ska använda dom i ett litet spel eller så. Det skulle va kul att se något litet exempel. tror det blir lättare att förstå dåSmiley


Senast redigerad 16:28 - 22:a Mars 2009


HärJ 21:43 - 22:a Mars 2009 | Post #7
Moderator
Inlägg: 1198


Skicka PM
Vitdom: din beskrivning låter som hämtad ur en lärobokSmiley

varför kan ingen scheme? borde jag valt lisp istället?

-------------------------
Tänk om jag vore en skalärprodukt!



agge89 02:58 - 23:e Mars 2009 | Post #8
Medlem
Inlägg: 13


Skicka PM
Jag är rädd för att du i princip bara förstår hälften av poängen med funktioner. Men var inte orolig, funktioner är svårt för nästan alla i början.
Låt mig förklara:

Låt säga att du gör ett spel med en massa monster o så. Någonstans i din kod så vill du flytta ett specifikt monster. Det är då du kan anropa din funktion moveMonster(int typ, int vilken);
Så flyttas monstret.
Om du vill flytta monstret 5, av typen 2 (som exempel) så skriver du:
moveMonster(2, 5);
så flyttas monstret, om du har skrivit koden i funktionen rätt.

Det fina med funktionen är nu att du inte behöver tänka på vad som händer när mostret flyttas, den flyttas i och med att funktionen anropas. Så du kan koncentrera dig på 1 sak i taget. Först att koda funktionen, och sen huvudprogrammet, där funktionen anropas. Det blir alltså MYCKET mera läsförståeligt!

Om du inte hade några argument till funktionen och bara skapade en funktion moveMonster();
Så vilket monster skulle då ha flyttats när du anropade funktionen? Det kan du inte bestämma utan parametrarna. Du måste alltså skicka in informationen som funktionen ska behandla.

Nu tänker du kanske på globala variabler... Men glöm dem genast!! De bryter mot reglerna för objektorienterad programmering och är inte alls bra att använda (om de inte är konstanter, eller några andra ovanliga fall).


När jag ser ditt program som ska beräkna addition så ser jag att du inte förstått en annan grej också.

I den övre av koderna så anropar du funktionen på både rad 19 och 20. Det är så att när du anropar en funktion så hoppar programmet upp till funktionen och gör allt där, och sen returnerar något. Sen hoppar den tillbaka. Du kan alltså ta bort rad 19.

-------------------------
Augustismen



zippo88 05:45 - 23:e Mars 2009 | Post #9
Medlem
Inlägg: 13


Skicka PM
ok tack för hjälpenSmiley. Btw agge jag kallade på funktionen där med meningen ^^, den skulle ju användas och göra beräkningen där tänkte jag. Jag har iallafall lyckats använda en struktur funktion nu. Visst jag skulle kunna gjort det med en funktion utan parametrar också genom att ändra värdet på monstrena efter koden har körts och jag har rätt mycket onödigheter för o göra detta simpla spelet, men syftet var att testa funktionerSmiley.

Jag har gjort en struktur med monster som jag ändrar inom 1 funktion (mvalf), och använder i den andra(dmg) utan att returnera ett värde. detta gör jag eftersom jag inte vill ändra på själva strukturens värden, så jag kan kalla på olika monster och alltid få start värdena.

Använder jag en tom funktion och skriver monster strukturen utanför main så kommer värdena ändras för själva strukturen och när jag hämtar ett nytt monster så kommer det ha fel värden. På sättet jag gör nu så går värdena tillbaks så fort jag går ur funktionen.

Detta skulle jag såklart också kunna skriva utan parametrarna men det verkar ju vara en viktig del av nån anledning så jag vill iallafall kunna använda dem vid olika tillfällen ifall man nån gång skulle behöva dem.
Här har ni min test av funktioner i ett litet test spel ifall nån är intresserad av att kolla på den och hacka lite på mina felSmiley. Varning: Mycket kod.


  1. #include <cstdlib>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. struct Monster
  6. {
  7. char name[20];
  8. int hp;
  9. int dmg;
  10. };
  11.  
  12.  
  13.  
  14. int playerhp =100;
  15. int playerdmg =20;
  16. int monsterhp;
  17. int monsterdmg;
  18. string mval;
  19.  
  20.  
  21.  
  22. void mvalf(Monster mygga, Monster tiger, Monster krokodil
  23. , Monster bjorn, Monster gorilla);
  24. void dmg(Monster mygga, Monster tiger, Monster krokodil
  25. , Monster bjorn, Monster gorilla);
  26.  
  27. int main()
  28. {
  29. Monster mygga =
  30. {
  31. "Mygga", //Name
  32. 25, //HP
  33. 20 //Dmg
  34. };
  35. Monster tiger =
  36. {
  37. "Tiger", //Name
  38. 40, //HP
  39. 50 //Dmg
  40. };
  41. Monster krokodil =
  42. {
  43. "Krokodil", //Name
  44. 50, //HP
  45. 60 //Dmg
  46. };
  47. Monster bjorn =
  48. {
  49. "Bjorn", //Name
  50. 80, //HP
  51. 30 //Dmg
  52. };
  53. Monster gorilla =
  54. {
  55. "Gorilla", //Name
  56. 70, //HP
  57. 45 //Dmg
  58. };
  59. string playername;
  60.  
  61. for ( ; ; )
  62. {
  63. mvalf(mygga, tiger, krokodil, bjorn, gorilla);
  64. dmg(mygga, tiger, krokodil , bjorn, gorilla);
  65. }
  66.  
  67. cin.get();
  68. cin.ignore();
  69. return 0;
  70. }
  71.  
  72. void mvalf(Monster mygga, Monster tiger, Monster krokodil
  73. , Monster bjorn, Monster gorilla)
  74. {
  75. system("cls");
  76.  
  77. cout << "Vilket monster vill du möta?" << endl;
  78. cout << "[M]ygga, [T]iger, [K]rokodil, [B]jorn, [G]orilla" << endl;
  79. cin >> mval;
  80. system("cls");
  81. cout << "Du valde:" << endl << endl;
  82. if (mval=="M" || mval=="m")
  83. {
  84. cout << mygga.name << endl;
  85. cout << "HP: " << mygga.hp << endl;
  86. cout << "Dmg: " << mygga.dmg << endl << endl;
  87. }
  88. else if (mval=="T" || mval=="t")
  89. {
  90. cout << tiger.name << endl;
  91. cout << "HP: " << tiger.hp << endl;
  92. cout << "Dmg: " << tiger.dmg << endl << endl;
  93. }
  94. else if (mval=="K" || mval=="k")
  95. {
  96. cout << krokodil.name << endl;
  97. cout << "HP: " << krokodil.hp << endl;
  98. cout << "Dmg: " << krokodil.dmg << endl << endl;
  99. }
  100. else if (mval=="B" || mval=="b")
  101. {
  102. cout << bjorn.name << endl;
  103. cout << "HP: " << bjorn.hp << endl;
  104. cout << "Dmg: " << bjorn.dmg << endl << endl;
  105. }
  106. else if (mval=="G" || mval=="g")
  107. {
  108. cout << gorilla.name << endl;
  109. cout << "HP: " << gorilla.hp << endl;
  110. cout << "Dmg: " << gorilla.dmg << endl << endl;
  111. }
  112. else
  113. {
  114. cout << "Invalid KeyHit";
  115. mvalf(mygga, tiger, krokodil , bjorn, gorilla);
  116. }
  117. cout << "Press enter to continue...";
  118. cin.get();
  119. cin.ignore();
  120. }
  121.  
  122. void dmg(Monster mygga, Monster tiger, Monster krokodil
  123. , Monster bjorn, Monster gorilla)
  124. {
  125. int hit;
  126.  
  127. cout << "Write 1 to hit it!" << endl << endl;
  128. cin >> hit;
  129. if (hit==1)
  130. {
  131. if (mval=="M" || mval=="m")
  132. {
  133. playerhp-=mygga.dmg;
  134. mygga.hp-=playerdmg;
  135. system("cls");
  136. cout << "Myggan har nu " << mygga.hp << " HP" << endl;
  137. cin.get();
  138. cin.ignore();
  139. }
  140. else if (mval=="T" || mval=="t")
  141. {
  142. playerhp-=tiger.dmg;
  143. tiger.hp-=playerdmg;
  144. system("cls");
  145. cout << "Tigern har nu " << tiger.hp << " HP" << endl;
  146. cin.get();
  147. cin.ignore();
  148. }
  149. else if (mval=="K" || mval=="k")
  150. {
  151. playerhp-=krokodil.dmg;
  152. krokodil.hp-=playerdmg;
  153. system("cls");
  154. cout << "Krokodilen har nu " << krokodil.hp << " HP" << endl;
  155. cin.get();
  156. cin.ignore();
  157. }
  158. else if (mval=="B" || mval=="b")
  159. {
  160. playerhp-=bjorn.dmg;
  161. bjorn.hp-=playerdmg;
  162. system("cls");
  163. cout << "Bjornen har nu " << bjorn.hp << " HP" << endl;
  164. cin.get();
  165. cin.ignore();
  166. }
  167. else if (mval=="G" || mval=="g")
  168. {
  169. playerhp-=gorilla.dmg;
  170. gorilla.hp-=playerdmg;
  171. system("cls");
  172. cout << "Gorillan har nu " << gorilla.hp << " HP" << endl;
  173. cin.get();
  174. cin.ignore();
  175. }
  176. }
  177. }


btw herj kolla jag använde source tagSmiley


Senast redigerad 05:47 - 23:e Mars 2009


agge89 13:08 - 23:e Mars 2009 | Post #10
Medlem
Inlägg: 13


Skicka PM
haha, du ska inte känna att du är tvingad att använda parametrarSmiley. Anledningen till att du inte behöver använda parametrarna i ditt program är för att alla dina variabler är globala. De är alltså utanför main och någon annan funktion. Gör dem lokala, så ska du se att du behöver dina parametrar.

Ett tips till din kod är också att använda structen på ett smartare sätt. Skapa inte 5 st sånna från början, utan skapa en sån, som får sina värden när spelaren har tryckt in vem ha vill möta.

-------------------------
Augustismen



agge89 14:02 - 23:e Mars 2009 | Post #11
Medlem
Inlägg: 13


Skicka PM
Jag tog mig friheten att skriva om din kod lite. Kolla noga igenom den, och fråga mig om precis vad som helst. Jag hoppas att du ser att min kod är betydligt enklare och lättförståeligare:P
  1. #include <iostream>
  2. #include <ctime>
  3. #include <conio.h>
  4.  
  5. using namespace std;
  6.  
  7. struct Monster{
  8. string name;
  9. int hp;
  10. int dmg;
  11. };
  12. Monster initMonster(Monster enemy, string mval){
  13. while(true) {
  14. if(mval=="M" || mval=="m") {
  15. enemy.name="Mygga";
  16. enemy.hp=25;
  17. enemy.dmg=20;
  18. }
  19. else if(mval=="T" || mval=="t") {
  20. enemy.name="Tiger";
  21. enemy.hp=40;
  22. enemy.dmg=50;
  23. }
  24. else if(mval=="B" || mval=="b") {
  25. enemy.name="Bjorn";
  26. enemy.hp=80;
  27. enemy.dmg=30;
  28. }
  29. else if(mval=="K" || mval=="k") {
  30. enemy.name="Krokodil";
  31. enemy.hp=50;
  32. enemy.dmg=60;
  33. }
  34. else if(mval=="G" || mval=="g") {
  35. enemy.name="Gorilla";
  36. enemy.hp=70;
  37. enemy.dmg=45;
  38. }
  39. else{
  40. cout << "Invalid KeyHit"<<endl;
  41. continue;
  42. }
  43. break;
  44. }
  45. return enemy;
  46. }
  47. void dmg(Monster enemy, int playerHp, int playerDmg) {
  48. playerHp-=enemy.dmg;
  49. enemy.hp-=playerDmg;
  50. system("cls");
  51. cout <<"Din fiende (en " <<enemy.name<<") har nu " <<enemy.hp<<" HP kvar"<<endl;
  52. cin.ignore();
  53. cin.get();
  54. }
  55.  
  56. Monster mvalf(Monster enemy) {
  57. string mval;
  58. system("cls");
  59. cout << "Vilket monster vill du möta?" << endl;
  60. cout << "[M]ygga, [T]iger, [K]rokodil, [B]jorn, [G]orilla" << endl;
  61. cin >> mval;
  62.  
  63. system("cls");
  64. cout << "Du valde:" << endl << endl;
  65.  
  66. enemy=initMonster(enemy, mval);
  67. return enemy;
  68. }
  69.  
  70. int main(){
  71. Monster enemy;
  72. int playerhp =100;
  73. int playerdmg =20;
  74. while(true){ //eller for( ;; )
  75. enemy=mvalf(enemy);
  76. dmg(enemy, playerhp, playerdmg);
  77. }
  78. return 0;
  79. }

Edit: Fattar inte hur man får texten grå.
Sen lägg märke till att jag inte använder några globala variabler, samt en extra funktion. Den extra funktionen gör det mycket enklare att läsa koden.

Fixa source-taggar //herj

-------------------------
Augustismen

Senast redigerad 17:58 - 23:e Mars 2009


zippo88 16:44 - 23:e Mars 2009 | Post #12
Medlem
Inlägg: 13


Skicka PM
mm det ser mycket bättre ut, och en mycket smartare lösning att använda strukturen på. I min kod behövde jag skriva samma if sats 2 gånger i de 2 olika funktionerna vilket gjorde den ena funktionen rätt meningslös.

En fråga bara. Kör den funktionen när du skriver enemy=initMonster(enemy, mval);? för jag ser ingen annanstans som initMonster skulle kunna köras.

Och en fråga tillSmiley, Vad är det för mening att använda icke globala variabler? Körs koden snabbare eller är det bara så att det behövs i vissa program och att det är bäst att försöka lära sej skriva på det sättet?

Tack för att du tar dej tid att hjälpa mej, jag fattar funktioner mycket bättre nu.




agge89 18:15 - 23:e Mars 2009 | Post #13
Medlem
Inlägg: 13


Skicka PM
Ja den körs! Det var därför jag sa att du kunde ta bort rad 19 ur din källkod åvan. Den körs direkt, så fort jag kallar på den.
enemy=initMonster(enemy, mval);
betyder alltså att först så körs funktionen initMonster(enemy, mval); Sen så får enemy det returnerade värdet.

Ja som du ser så måste jag använda parametrar om jag inte använder globala variabler. Men skulle alla mina variabler ha varit globala, så skulle inte jag ha behövt använda parametrar.
Så frågan på denna tråd är med andra ord varför man INTE ska använda globala variabler. Detta kan du lätt hitta på google. För det är väldigt många som har denna fråga.

Jag kan sammanfatta till det här.
Om du använder globala variabler, så kommer det att ta mer minne från datorn, eftersom de hela tiden finns i RAM. Lokala variabler finns bara temporärt.

Det blir dessutom lättare o förstå koden med mindre variabler åt gången att tänka på.

Inom programmering så använder man Murphys lag. Om något kan gå fel, så kommer det troligen att gå fel. Du ger dig möjligheten att ända på dina variabler vart som helst och hur som helst. Detta kan leda till att hela din kod blir som spaghetti. Du kommer till slut inte hitta vart du har gjort fel, eftersom det kan ha skett vart som helst där du ändrar på den variabel som är fel, vilket kan vara vart som helst i ditt program.

Om du inte förstår vad jag menar, så nöj dig med att det bryter mot reglerna för objektorienterad programmering. Alltså den form av programmering du håller på med nu. Och det är inte bra;)

-------------------------
Augustismen



zippo88 19:06 - 23:e Mars 2009 | Post #14
Medlem
Inlägg: 13


Skicka PM
Tack så mycket. Jag ska försöka göra några program med parametrar. Jag fattar rätt bra hur dom funkar nu men det är ändå lite svårt så här i början att använda dom på rätt sättSmiley

Vet inte om jag e lite trög men vad är det för mening med din "while(true) {" i initMonster?


Senast redigerad 19:10 - 23:e Mars 2009


zippo88 22:57 - 23:e Mars 2009 | Post #15
Medlem
Inlägg: 13


Skicka PM
sådär ja. Då har man gjort ett nytt testspel från grunden.
Ja det är inte mycket att hänga i julgranen för det är bara en början till ett litet spel, har byggt upp grunden nu iallfall, och gjorde det med hjälp av parametrar nu istället. Tog mej nån timme att komma upp med detta men nu tycker jag att jag har tänkt igenom det ordentligt och fått fram nåt mer lättläsligt och bättre programmerat.

Har inte kollat på min egen kod som du ändrade eller nåt utan skrev detta från grunden eftersom jag fattar funktioner mycket bättre nu tack vare dej. jaja här är den och om du ser nåt konstigt säg bara till.

  1. #include <cstdlib>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. struct Monster{
  7. string name;
  8. int hp;
  9. int dmg;
  10. };
  11.  
  12. Monster mvalfunktion(Monster enemy){
  13. string monsterval;
  14.  
  15. cout << "Choose monster to fight" << endl << endl;
  16. cout << "[M]osquito / [D]ragon:" << endl;
  17. cin >> monsterval;
  18.  
  19. if (monsterval=="M" || monsterval=="m"){
  20. enemy.name="Mosquito";
  21. enemy.hp=40;
  22. enemy.dmg=100;
  23. }
  24. else if (monsterval=="D" || monsterval=="d"){
  25. enemy.name="Dragon";
  26. enemy.hp=100;
  27. enemy.dmg=40;
  28. }
  29. else{
  30. cout << "No such answer";
  31. cin.get();
  32. cin.ignore();
  33. mvalfunktion(enemy);
  34. }
  35. return enemy;
  36. }
  37.  
  38. int dmgtomonster(Monster enemy, int playerdmg){
  39. enemy.hp-=playerdmg;
  40. return enemy.hp;
  41. }
  42.  
  43. int dmgtoplayer(Monster enemy, int playerhp){
  44. playerhp-=enemy.dmg;
  45. return playerhp;
  46. }
  47.  
  48.  
  49.  
  50.  
  51. int main()
  52. {
  53. Monster enemy;
  54. int playerhp = 500;
  55. int playerdmg = 30;
  56.  
  57. for ( ; ; ){
  58. enemy = mvalfunktion(enemy);
  59. enemy.hp = dmgtomonster(enemy, playerdmg);
  60. playerhp = dmgtoplayer(enemy, playerhp);
  61. cout << endl << "player hp: " << playerhp << endl;
  62. cout << endl << "monster hp: " << enemy.hp << endl;
  63. }
  64. }





agge89 01:20 - 24:e Mars 2009 | Post #16
Medlem
Inlägg: 13


Skicka PM
Att jag använder while(true) är för att jag ska komma upp längst upp till funktionen med continue;
Men det hade varit smartare att kalla på funktionen igen, som du gör. Tänkte bara inte på att man kunde göra det.

Det nya spel btw är enligt mig perfekt:) Kan inte hitta något som borde förbättras. Möjligen om du använde klasser till monstrerna istället för structs. Men det är nog bara en smaksak;)

-------------------------
Augustismen



zippo88 03:48 - 25:e Mars 2009 | Post #17
Medlem
Inlägg: 13


Skicka PM
skickade ett PM till dej




Sidor: 1

Forum huvudsida -> Programmering -> Funktioner - Varför?!
Atom feed

Du får inte posta i den här tråden | Till toppen