Programmera spel i C++ för nybörjare/Slumptalsgeneratorn
Slumptalsgeneratorn
redigeraBaserat 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
redigeraSom 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
redigeraI 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...