Notice: Undefined index: treeid in /home/blinkenlights/public_html/commands/TreeDetailsCommand.php on line 50
Blinkenlights.se - C++ Nybörjarguide - Programmering & spelutveckling

BETA


Notice: Undefined index: treeid in /home/blinkenlights/public_html/view/TreeDetailsView.php on line 60

C++ Nybörjarguide

Tillbaka till artikelarkivet

Filer

Verktyg

Kommentarer (100)
Utskriftsvänligt format

Betyg

markedunmaked 7.6

Detta är en grundläggande guide i C++. Den förklarar hur man kommer igång med kompilatorn samt grundläggande användning av C++. Guiden är ett bra ställe att börja på om du aldrig programmerat förut.
Guiden gick igenom en större uppdatering i Oktobker 2006, nästan all text är uppdaterad och förbättrad!

Navigation:

< Föregående del |

Text - 18 - Gör ett litet spel

Introduktion

I den här delen hade jag alltså tänkt att sammanfatta våra kunskaper och göra ett enkelt litet spel, jag kommer också visa en del nya saker. I spelet är man en figur som spriger runt och dödar (elaka) monster, vissa metoder att döda monster ska vara speciellt effektiva på vissa sorters fiender för att få lite fin känsla i spelet <img src="/styles/emoticons/smile.gif" alt="Smiley"/>

I det här spelet kommer det troligen att finnas ganska många variabler och funktioner så det blir mycket runtskickande av variabler mellan funktioner <img src="/styles/emoticons/smile.gif" alt="Smiley"/>
Här kommer koden, den är lite lång men vi ska allt ta oss igenom den, hoppas att jag har kommenterat tillräckligt och att förklaringen är bra!

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



Vi börjar med att inkludera iostream samt ctime (för random).

Vi säger sedan till vilka funktioner vi ska använda. Här kan man även skriva bara "using std;" så slipper man skriva en rad per funktion!

Efter det deklarerar vi två funktioner, vi gör dem alltså tillgängliga från hela programmet. Om vi inte hade gjort detta hade bara de funktionerna som ligger under i koden kunnat komma åt dem.

I början av Level1-funktionen så deklarerar vi några variabler, en är av datatypen bool. Bool är en datatyp som kan ha två värden, true eller false, det betyder alltså sant eller falskt.

I while-loopen så skriver vi bara namnet på en bool varabel. Det får samma effekt som att skriva variabelns_namn == true. Om man vill göra tvärt om (variabelns_namn != true) så skriver man !variabelns_namn, såhär: while (!bGoLevel1).

system("cls"); rensar bort all text från skärmen, detta kan användas lite när som helst när man vill att allt skräp ska försvinna. Detta fungerar dock bara i DOS/Windows. På UNIX-system kan man använda "clear" istället.

Sedan kör vi en if-sats som kollar om användaren skrev h i menyn, isåfall så slumpar den fram ett tal. If-satserna nedan kolla viken fiende det vart och sätter variablernas värde till det som motsvarar den fiendens karaktär, du kanske fattar om du kollar lite.

Sedan kommer en while-loop som ser ut såhär: while(true), det gör att while-loopen körs ända tills det att koden "break;" körs, då hoppar den ut ur while-loopen. Detta knep kan användas vid andra while-loopar också.

Sedan får man välja vart man vill slå fienden, i foten, i magen eller på huvudet (gillar du inte spelet redan?). Sedan kommer ytterligare en if-sats med 3 olika alternativ, om man står i magen så får vissa kreatur fördel och andra nackdel. Det är t ex extra gynnsamt att slå en huggorm i magen osv.

Sedan subtraheras skadan från kreaturets liv och "break;" körs om kreaturets liv är 0 eller mindre, då får man alltså inte slå längre. Om fienden inte dog så tar spelaren skada och programmet kolla ifall spelaren dog, i så fall körs "break;", variabeln bGoLevel1 sätts till false så att man inte får köra Level 1 igen och så får man börja om från början.

Sedan kommer det andra alternativet från slåss-menyn, nämligen avsluta. Sedan är Level1-funktionen slut!

Nästa fukntion frågar efter spelarens namn och skickar tillbaka det till funktionsanropet (i main-funktionen).
I main-funktionen skapas ytterligare ett par variabler och några av dem får genast ett värde genom att jag skriver = 5 osv efter namnet på variabeln.
Nu kommer ytterligare en while-loop som körs så länge som bGo variabeln är = true.

Sedan kommer huvudmenyn med två alternativ, avsluta och starta ett nytt spel.
Om nytt spel-alternativet väljs så anropas NyttSpel-funktionen där man får välja namn, returvärdet av NyttSpel-funktionen sparas i sNamn variabeln.
Sedan sparas returvärdet av Level1-funktionen i en variabel som heter iTmp. Returvärdet varierar lite beroende på hur den funktionen avslutades, om man dog så returneras en 2:a, om man frivilligt avslutade spelet så returneras en 3:a.

Om man har valt avsluta alternativet körs en "break;"-rad igen och så avslutas hela programmet. Hoppas att ni har lärt er en massa nya saker och att ni känner att ni kan använda språket nu! Om du vill bli en programmerare så måste du ju programmera, så du kan ju börja med att försöka göra ett par banor till, en funktion så man kan köpa vapen eller något annat som låter lagom svårt och intressant. Ställ gärna frågor i forumet, vi svarar så gärna!


Vart ska man gå nu när alla delarna är slut?


Du kan försöka med att lära dig Win32_API eller någon sorts grafikprogrammering som OpenGL, SDL eller DirectX, risken är dock att du inte förstår så mycket. Det jag rekommenderar är att du köper en bok, t.ex. C++ Programmering av Stephen Prata. Fråga i forumen om du inte riktigt vet vart du ska ta vägen! Guiden om SDL är annars ett hett tips, där lär du dig att göra enklare grafik. Guiden hittar du i artikelarkivet!

Lycka till med programmeringen!

// Johan Marcusson, aka Independence

Slut

Navigation:

< Föregående del |

Till toppen

MySQL Error

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'groups ON users.group = groups.groupId WHERE users.id = '0' LIMIT 1' at line 2
Querystring
SELECT groups.doMod FROM users
	INNER JOIN groups ON users.group = groups.groupId
	WHERE users.id = '0'
    LIMIT 1