Hoppa till innehållet

Programmera spel i C++ för nybörjare/Slumptalsgeneratorn

Från Wikibooks


Slumptalsgeneratorn

[redigera]

Baserat på VC++ 2010 express, Win 7 och SFML 1.6, du bör ha gjort installationerna för ett fungerande SFML fönster i ditt projekt innan du börjar.

När man skapar ett spel har man ofta behov av någon form av slumptalsgenerator. I Yatzy har du fem tärningar. Man skulle kunna kalla dem

Int taerning1, taerning2, taerning3, taerning4, taerning5 =1;

Därefter skapa en loop som slår dessa fem tärningar genom att tilldela dem ett värde mellan 1-6.

Du måste inkludera ctime i projektet ( skriv #include <ctime> längst upp), du måste ange seed

srand((unsigned)time(0));  eller srand(time(NULL));

annars får du samma siffra hela tiden. Sedan är det bara att ange tärningarna:

taerning1 = (rand()%5) +1; //0-5 +1  eftersom tärningar inte har 0.
taerning2 = (rand()%5) +1;

Ett stort problem i sammanhanget är att slumptalsgeneratorn är långsam, baserad på programspråket C och en rest från forna tider. Den duger till att skapa slumptal för en lottorad eller något liknande, men skall du använda den i ett spel där saker händer på hundradelar av en sekund kommer du att få problem. Vi skall göra två olika exempel för att demonstrera skillnaderna.

Ta först och skriv in följande rader i programmet för en standard, långsam C++ slumpgenerator:


#include <iostream>
#include <SFML\System.hpp>
#include <SFML\Graphics.hpp>
#include <SFML\Window.hpp>
#include <ctime> //MÅSTE VARA MED FÖR RANDOMISERING!

int rand_0toN1(int n); //funktionsdeklaration för RANDOMISERING, n skall alltid vara 255 i exemplet

 int main() 
    { //Början av programkörningen

		 int n = 255; //För randomisering, skapar en färg
	           int r1 = 0; //För randomisering, det randomiserade värdet 0 till 255, röd färg
	   	       int r2 = 0; //För randomisering, det randomiserade värdet 0 till 255, grön färg
		   	   int r3 = 0; //För randomisering, det randomiserade värdet 0 till 255, blå färg

      sf::RenderWindow App(sf::VideoMode(800, 600, 32), "SFML Färgat fönster"); // Skapa fönstret vi skall visa färgerna i
    
	  while (App.IsOpened())  // Start spel-loopen
         { 
            sf::Event Event; 
               while (App.GetEvent(Event)) // Ta hand om händelser 
               { 

                 if (Event.Type == sf::Event::Closed) //kryssat på [x] symbolen? stäng programmet
                 App.Close(); 

                        if (Event.Type == sf::Event::KeyPressed) // En tangent har tryckts ner

                             { 

                                  if (Event.Key.Code == sf::Key::Escape) // ESC tangenten = stäng programmet

                                  App.Close(); 
 


                                       }
			           } 


			   
				   srand(time(NULL)); // Ange "seed" för randomisering, annars blir
							//allt en enda siffra.
				          r1 = rand_0toN1(n); //röd
				   	  r2 = rand_0toN1(n); //grön
					  r3 = rand_0toN1(n); //blå

                      App.Clear(sf::Color(r1, r2, r3)); //rensa allt i fönstret och ersätt med randomiserad färg  

                  App.Display(); //visa upp ändringarna för användaren
}  
 
 return 0;
}  //slut på programkörningen

 /*FUNKTIONER*/
     int rand_0toN1(int n)  //funktion för att ge ett randomiserat värde mellan 0 till n
              {
               return rand() % n;
              }

Förklaring

[redigera]

Som du ser har vi tre olika värden r1, r2 och r3. De får varsitt framslumpat tal mellan 0-255. I koden finns också:

  App.Clear(sf::Color(r1, r2, r3));

Ett värde på 0 ger minimalt med färg, ett värde på 255 ger max. Skulle värdena bli 0,0,0 får vi ett kolsvart fönster och med 255, 255, 255 får vi ett helvitt. Allt däremellan ger någon form av färgnyans. Värdena står som standard i RGB ordning Rött, Grönt, Blått. 0,0,255 ger således en mörkblå färg.

Det programmet gör är att rensa bort allt på skärmen i spelet och täcker sedan ytan med en framslumpad färg. Skulle det här fungera skulle färgen ändras drygt 60 gånger i sekunden, men du kan testa själv och se hur det ser ut.

SFML:s egen slumptalsgenerator

[redigera]

I versionerna t.o.m. 1.6 av SFML följer det med en inbyggd slumptalsgenerator som är oändligt mycket snabbare än den som följer med i C++ som standard. Funktionen för slumptalsgeneratorn är också mycket enklare:

int EttSlumptal = sf::Randomizer::Random(0, 255);

Det behövs ingen ”seed” för att ändra slumptalsvärdena eftersom SFML skapar en ”seed” som standard. I parentesen finns minimivärdet och maxvärdet. Hade det gällt en tärning i yatzy hade vi kunnat skriva

int taerning1 = sf::Randomizer::Random(1, 6);

Radera den tidigare koden och fyll i den här ändrade koden istället:

#include <iostream>
#include <SFML\System.hpp>
#include <SFML\Graphics.hpp>
#include <SFML\Window.hpp>


  int main() 
     { //Början av programkörningen


	           int r1 = 0; //För randomisering, det randomiserade värdet 0 till 255, röd färg
	   	       int r2 = 0; //För randomisering, det randomiserade värdet 0 till 255, grön färg
		   	   int r3 = 0; //För randomisering, det randomiserade värdet 0 till 255, blå färg

     sf::RenderWindow App(sf::VideoMode(800, 600, 32), "SFML Färgat fönster"); // Skapa fönstret vi skall visa färgerna i
   
	  while (App.IsOpened())  // Start spel-loopen
        { 
           sf::Event Event; 
              while (App.GetEvent(Event)) // Ta hand om händelser 
              { 

                if (Event.Type == sf::Event::Closed) //kryssat på [x] symbolen? stäng programmet
                App.Close(); 

                       if (Event.Type == sf::Event::KeyPressed) // En tangent har tryckts ner

                            { 

                                 if (Event.Key.Code == sf::Key::Escape) // ESC tangenten = stäng programmet

                                 App.Close(); 

                                         }
			             } 

			   //Ta fram värdet för rött, grönt och blått. 0=inget och 255=maximalt med färg

			        r1 = sf::Randomizer::Random(0, 255);
				r2 = sf::Randomizer::Random(0, 255); 
				r3 = sf::Randomizer::Random(0, 255);

                     App.Clear(sf::Color(r1, r2, r3)); //rensa allt i fönstret och ersätt med randomiserad RGB färg  

                 App.Display(); //visa upp ändringarna för användaren
  } 

 return 0;
} //slut på programkörningen

Kör programmet och se skillnaden på hur ofta skärmen byter färg. Ha inte igång programmet för länge, det är inte alldeles nyttigt för grafikkortet...