Forum: Fråga på c++ guide - gör ett litet spel

Forum huvudsida -> Programmering -> Fråga på c++ guide - gör ett litet spel

Sidor: 1

Till botten

gillisrofl 02:09 - 18:e Juni 2010 | Post #1
Medlem
Inlägg: 4


Skicka PM
Ja så... jag kopierade hela innehållet på guiden av spelet, och det är en del saker som inte funkar. Det kommer vara en hel del frågor i denna post på saker jag inte förstår och dessutom några fel av denna kopia.
I alla fall här är koden innan jag frågar:

  1. // Bibliotek
  2. #include<iostream>
  3. #include<ctime>
  4. #include<windows.h>
  5. #include<string>
  6.  
  7.  
  8. // Vilka funktioner som ska användas
  9. using std::cout;
  10. using std::cin;
  11. using std::string;
  12. using std::system;
  13. using std::srand;
  14. using std::rand; // För random funktionen
  15.  
  16. // Deklarera funktioner så de blir utkommliga från hela programmet
  17. string NyttSpel();
  18. int Level1(string &sName, int &iHp, int &iDmg_min, int &iDmg_max);
  19.  
  20. int Level1(string &sName, int &iHp, int &iDmg_min, int &iDmg_max)
  21. {
  22. bool bGoLevel1= true; // Den här ska vara true så länga man är i level 1
  23.  
  24. string sCmd; // För att läsa in kommandorn från menyer mm
  25. int iCurrentHp = iHp; // Spelarens nuvarande liv, man dör lite när man slåss mot fiender men man ska få tillbaka liven efter fighten
  26.  
  27. // Fiendevariabler
  28. int iEType; // Fiendens typ
  29. int iEHp; // Fiendens liv
  30. int iEDmg_min; // Fiendens minimum skada
  31. int iEDmg_max; // Fiendens maximum skada
  32. string sEName; // Fiendens namn
  33.  
  34. while (bGoLevel1) // Kör den här kodsnutten så länge bGoLevel1 är true
  35. {
  36. srand(time(0)); // Nytt frö för random-generatorn
  37.  
  38. system("cls"); // Rensa skärmen
  39.  
  40. cout << "Välkommen till bana 1!nMeny:n-----n[H]itta fiende att slåss medn[A]vsluta speletnVal:n";
  41.  
  42. cin >> sCmd;
  43.  
  44. if (sCmd == "h" || sCmd == "H")
  45. {
  46. iEType = rand() / (RAND_MAX / 3 + 1) + 1; // Slumpa ett tal från 1 till 3. Det ska finnas 3 olika typer av fiender på första banan.
  47. if (iEType == 1)
  48. {
  49. sEName = "Giftfluga";
  50. iEHp = 4;
  51. iEDmg_min = 2;
  52. iEDmg_max = 3;
  53. }
  54. else if (iEType == 2)
  55. {
  56. sEName = "Huggorm";
  57. iEHp = 5;
  58. iEDmg_min = 2;
  59. iEDmg_max = 5;
  60. }
  61. else if (iEType == 3)
  62. {
  63. sEName = "Råtta";
  64. iEHp = 3;
  65. iEDmg_min = 1;
  66. iEDmg_max = 2;
  67. }
  68.  
  69. while (true) // Kör oändligt (eller tills "break;" körs)
  70. {
  71. cout
  72. << "nSlåss mot fiende:n------------------nDu möter en " << sEName << "!n"
  73. << "Fiendens liv: " << iEHp << "n"
  74. << "Dina liv: " << iCurrentHp << "n"
  75. << "Meny:n-----nSlå i [m]agennSlå i [f]otennSlå i [h]uvudetnVal:n";
  76.  
  77. cin >> sCmd;
  78.  
  79. if (sCmd == "m" || sCmd == "M")
  80. {
  81. if (iEType == 3) // Om det är en råtta så får den extra liv, den är alltså svår att döda genom att slå i magen
  82. iEHp+=2;
  83. else if (iEType == 2) // Om det är en huggorm så får den minus ett liv, den är alltså extra lätt att döda genom att slå i magen
  84. iEHp-=2;
  85. }
  86. else if (sCmd == "f" || sCmd == "F")
  87. {
  88. if (iEType == 1) // Om det är en giftflyga så får den extra liv, den är alltså svår att döda genom att slå på foten
  89. iEHp+=1;
  90. else if (iEType == 3) // Om det är en råtta så får den minus ett liv, den är alltså extra lätt att döda genom att slå på foten
  91. iEHp-=1;
  92. }
  93. else if (sCmd == "h" || sCmd == "H")
  94. {
  95. if (iEType == 2) // Om det är en huggorm så får den extra liv, den är alltså svår att döda genom att slå på huvudet
  96. iEHp+=1;
  97. else if (iEType == 1) // Om det är en giftflyga så får den minus ett liv, den är alltså extra lätt att döda genom att slå på huvudet
  98. iEHp-=1;
  99. }
  100.  
  101. iEHp -= rand() / (RAND_MAX / iDmg_max + 1) + iDmg_min;
  102.  
  103. if (iEHp <= 0) // Om fienden dog
  104. {
  105. cout << "Du dödade monstret, bra gjort!n";
  106. iCurrentHp = iHp; // Återstället liven
  107. break; // Hoppa ur while-loopen
  108. }
  109. else
  110. {
  111. iCurrentHp -= rand() / (RAND_MAX / iEDmg_max + 1) + iEDmg_min;
  112.  
  113. if (iCurrentHp <= 0) // Om man dör
  114. {
  115. bGoLevel1 = false; // Slut på level 1, du dog
  116. break;
  117. }
  118. }
  119. } // Slut på slåss mot fiende-loop
  120. }
  121. else if (sCmd == "a" || sCmd == "A")
  122. {
  123. return 3; // Det här returneras om man inte vill spela mer i level 1
  124. }
  125. } // Slut på level1-loop
  126.  
  127. return 2; // Det här returneras om man dog av en fiende
  128. }
  129.  
  130.  
  131. string NyttSpel()
  132. {
  133. string sTmpName; // Variabel för att temporärt lagra spelarens namn. Variabeln finns bara i den här funktionen
  134. system("cls"); // Rensa skärmen
  135.  
  136. cout << "Välkommen till Skogen-med-de-elaka-monstrena-spelet!nSkriv in ditt namn så vi kan börja: ";
  137.  
  138. cin >> sTmpName;
  139.  
  140. return sTmpName;
  141. }
  142.  
  143. int main()
  144. {
  145. // Deklarera variabler
  146. string sCmd; // Används för att avläsa användarens val i menyer mm
  147. string sName; // För att lagra namet på spelaren
  148. bool bGo= true; // En variabel som är true så länge muvudmeny-loopen ska köras
  149. int iTmp; // Variabel för temorära saker
  150.  
  151. // Spelarens karaktärs variabler
  152. int iHp = 10; // Spelarens hälsoresurser
  153. int iDmg_min = 2; // Spelarens minimiskada
  154. int iDmg_max = 5; // Spelarens maximiskada
  155.  
  156. while (bGo) // Kör loopen så länge bGo är true
  157. {
  158. // Huvudmenyn
  159. cout
  160. << "#################################################n"
  161. << "# #n"
  162. << "# Skogen med de elaka monstrena spelet v1.0 #n"
  163. << "# #n"
  164. << "#################################################n"
  165. << "Huvud meny:n-----------n[N]ytt speln[A]vslutanVal:";
  166.  
  167. cin >> sCmd;
  168.  
  169. if (sCmd == "n" || sCmd == "N")
  170. {
  171. sName = NyttSpel(); // Skicka med namnvariabeln
  172. iTmp = Level1(sName, iHp, iDmg_min, iDmg_max);
  173.  
  174. if (iTmp == 3)
  175. bGo = false;
  176. if (iTmp == 2)
  177. cout << "Du dog!";
  178. }
  179. else if (sCmd == "a" || sCmd == "A")
  180. {
  181. break; // Bryt ut från huvudmeny-loopen
  182. }
  183. } // Slut på while-loopen
  184.  
  185. return 0;
  186. }


Ni kanske har lagt märke till det men jag lade till några extra biblotek bara för att det inte funkade först och det var dessa
  1. #include<windows.h>
  2. #include<string>


Här kommer min första fråga: Finns det någon anledning till att man inte bara använder alla biblotek? Vore det inte bara säkrare att använda alla som finns? Samma sak med "using std::cout" saker. Varför inte bara alla som går här?

Sen min andra fråga. Jag har nämligen problem med det här spelet. I början väljs en fiende helt slumpmäsigt, och detta verkar funka strålande. Men hur många gånger jag än kör om spelet (oavsett om jag dött eller fortsatt) så får jag alltid samma fiende om och om igen. Är det något fel i den slumpmässiga koden?

Faktiskt så är jag själv lite förvirrade (över huvudtaget) av hur denna del verkligen fungerar:

  1. iEType = rand() / (RAND_MAX / 3 + 1) + 1;


Så vad är det som gör att detta inte är slumpmässigt? Också det som förvirrar mig i denna del är "(RAND_MAX / 3 +1)+1". Jag testade lite här och... den börjar dra slumpmässiga tal när jag tar bort + 1 brevid 3an, men den tar alltid samma fiende hela spelet. så varför behöver man 3 + 1 och den extra + 1an utanför paranteserna? Helt förvirrad på detta. Om någon kan förklara EXAKT hur denna del fungerar (så även idioter förstårSmiley) skulle jag verkligen bli glad!

Också det här:
  1. int Level1(string &sName, int &iHp, int &iDmg_min, int &iDmg_max);
  2.  
  3. int Level1(string &sName, int &iHp, int &iDmg_min, int &iDmg_max)

Är det bara han som har skrivit guiden som har döpt dessa till iHp, iDmg_min, o.s.v? För annars tycker jag "i" framför "dmg" är ganska onödigt? eller gör den något specielt :s? Också vad menas / betyder det och vad gör det att man sätter & före variablerna?


btw
  1. iEType = rand() / (RAND_MAX / 3 + 1) + 1; // Slumpa ett tal från 1 till 3. Det ska finnas 3 olika typer av fiender på första banan.
  2. if (iEType == 1)
  3. {
  4. sEName = "Giftfluga";
  5. iEHp = 16;
  6. iEDmg_min = 2;
  7. iEDmg_max = 3;
  8. }
  9. else if (iEType == 2)
  10. {
martin310 09:54 - 18:e Juni 2010 | Post #2
Medlem
Inlägg: 132


Skicka PM
1. För att det finns miljoner och åter miljoner olika bibliotek till c++, speciellt om du utvecklar större 3D spel; ett för grafiken, ett för partiklarna, ett för världen, ett för att ladda in XML filer, ett för fysik, e.t.c. Detta skulle blivit en hel del funktioner och därför skulle det vara stor risk att man har två utav samma funktion, med kanske samma parametrar och då får man ett fel! Och ingen skulle orka skriva allt det! Om du vill importera en hel namnrymd, använd using namespace std;

2. Har inget bra svar på den, funkar bra med new Random().Next(1, 3); i C#Smiley

3. Jag har för mig att & är jätte viktigt när man håller på med pointers (*), det kan vara fel...
Och att man skriver i, s, b, e.t.c. framför en variabel är inte nödvändigt, det blir bara enklare att hålla reda på vilken sorts variabel det är.

//Har det hänt något med side designen eller bara jag som kör i kompabilitetsläge i IE8 för att kunna se hela posten ovan. (Meny baren och sökningen och sido informationen är ute på viftSmiley)

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

Hjälp jorden med Granola, det är gratis och funkar på både Windows och Linux, och försämrar inte datorns prestandad!



Senast redigerad 09:57 - 18:e Juni 2010


Kerp 10:37 - 18:e Juni 2010 | Post #3
Medlem
Inlägg: 2


Skicka PM
Jag kör google chrome och jag kan inte se hela posten + lite annat som ser rätt fel ut.




gillisrofl 02:27 - 19:e Juni 2010 | Post #4
Medlem
Inlägg: 4


Skicka PM
    Citat av Kerp:
Jag kör google chrome och jag kan inte se hela posten + lite annat som ser rätt fel ut.


Har också svårt att se allt ni har postat. Texten försvinner ut i hörnetSmiley. Någon lösning?

Nåja, tack så mycket för svaren hitills! Har dock fortfarande inte fått reda på vad felet i koden ärSmiley




Burglar 01:52 - 25:e Juni 2010 | Post #5
Medlem
Inlägg: 59


Skicka PM
Gillis, flytta srand(time(0));
samt deklareringen för srand så den ligger innan _tmain(). Så här:
  1. using std::srand;
  2. using std::rand;
  3.  
  4. int _tmain(int argc, _TCHAR* argv[])
  5. {
  6. srand(time(0));
  7. return 0;
  8. }


Då fungerar rand som det ska.

-------------------------
,,hh signatur! jag är skeptisk!



Sidor: 1

Forum huvudsida -> Programmering -> Fråga på c++ guide - gör ett litet spel
Atom feed

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