Programmera spel i C++ för nybörjare/Kapplöpning

Från Wikibooks
Hoppa till navigering Hoppa till sök


// kapplopning.cpp : Defines the entry point for the console application.
// Donerat av Didirk Olsson John Bauergymnasiet i Uddevalla 2011

#include "stdafx.h"
#include <iostream>
#include "stdlib.h" 
#include "time.h" 
using namespace std;

// Detta är ett spel som först och främst ställer några frågor men leder sedan till 
// att man måste spela på kapplöpning, Man har 500 kronor från början och sen när dom tar slut 
// dör programmet, jag ger odds till varje häst och sen beroende på om hästen vinner eller inte 
// så kommer oddsen påverkas till nästa gång, om du väljer att fortsätta spela. 
// Du kan både vinna och förlora pengar! Lycka till =) */


double hastodds[8]={1.9,2.4,2.1,2.0,2.1,2.3,2.2,1.9}; // skapar en array med 8 olika "häst odds"
double lagring[8]; // skapar en array som jag senare i programmet kommer använda till att 
                   // lagra dom  talen varje häst får under loppet och som jag sen kommer 
                   // sortera tillsammans med vinnar array nedanför
char *hastnamn[]= {"Mongo","Etertomten", "Floyd","Bountey","Bamse","Lilleskutt","Pollux","Svartablixten"}; 
 // skapar en array med 8 hästnamn i och även med en 
 //pekare för att senare i programmet kunna peka ut och slumpa hästarna
char hastval;
int vinnare[8]; // skapar en array som jag senare i programmet kommer använda till att 
// sortera om samtidigt som lagring för att jag ska kunna se vilken häst som är vilken
int hastval1;


int slumpa() // skapar en funktion som retunerar ett slumptal 
{
int slumpa1=rand()%(7); // slumpar ett tal mellan 0 och 7
return slumpa1; // retunerar slumptalet
}

int slumpadodds() // skapar en funktion som retunerar ett slumptal
{ 
int slumpa2=rand()%(100)+1; // slumpar ett tal mellan 1 och 101
return slumpa2; // retunerar slumptalet
}


void hastar(double *hastodds, char *hastnamn[], char hastval) // Skapar en funktion som inte 
// ska retunera något, jag tar med mig några arrayerna hastodds, hastnamn och variabeln hastval.
{
int i;
bool felval=true; // använder mig av en bool true/false

printf("\nVilken h\x84st vill du satsa p\x86?\n"); // skriver ut text med hjälp av printf

for (i=0; i<8; i++) // Gör en for snurra som ökar med 1 och som skriver ut texten neranför 
                    // så länge som i är mindre än 8
{
printf("H\x84st nummer %d, Namn: %s, Odds: %2.2f \n",i+1, hastnamn[i], hastodds[i]); 
 // använder mig av en printf och skriver även ut några värden från hastnamn och hastodds
}

cout << "Ditt val, h\x84st nummer(1-8):"; 
while (felval) // gör en while slinga, som snurrar så länge som felval är lika med true, 
               // när felval är lika med false så börjar den inte om
{
cin >> hastval; 
switch (hastval) // använder mig av en switch för att välja häst 
{
case '1': // Om användaren skriver 1
felval=false; // ställer om till false och while snurran stoppas eftersom att felval 
              // inte är lika med true längre
break;
case '2': // Om användaren skriver 2
felval=false; // ställer om till false och while snurran stoppas eftersom att felval 
              // inte är lika med true  längre
break;
case '3': // Om användaren skriver 3
felval=false; // ställer om till false och while snurran stoppas eftersom att felval 
              // inte är lika med true längre
break;
case '4': // Om användaren skriver 4
felval=false; // ställer om till false och while snurran stoppas eftersom att felval 
              // inte är lika med true längre
break;
case '5': // Om användaren skriver 5
felval=false; // ställer om till false och while snurran stoppas eftersom att felval 
              // inte är lika med true längre
break;
case '6': // Om användaren skriver 6
felval=false; // ställer om till false och while snurran stoppas eftersom att felval 
              // inte är lika med true längre
break; 
case '7': // Om användaren skriver 7
felval=false; // ställer om till false och while snurran stoppas eftersom att felval 
              // inte är lika med true längre
break; 
case '8': // Om användaren skriver 8
felval=false; // ställer om till false och while snurran stoppas eftersom att felval 
              // inte är lika med true längre
break; 
default: // skriver du inte något av numren ovanstående så skriv denna texten ut 
         // som är nedanför och  switchen börjar om igen
cout << "Fel val, F\x94rs\x94k igen (1-8):\n";
break; 
}
}


hastval1=atoi(&hastval); // Gör om char hastval1 till en int hastval1 
                         // för att senare i programmet kunna använda hastvalet

 
}

void tavling(double *hastodds, double *lagring) // Gör en funktion som inte ska retunera något värde,
                                            // jag tar också med mig in arrayerna hastodds och lagring
{
int i;
double x;
int z;




for (i=0; i<8; i++) // Gör en for snurra som ökar med 1 så länge som i är mindre än 8
{
x=slumpadodds()/hastodds[i]; // Tar in ett slumptal från funktionen slumpadodds 
                             // och delar de med  hastodds och lägger det i variabeln x
cout << i+1;
for (z=1; z<=x; z++) // skriver ut "-" så länge som z är mindre eller lika med x
{
cout << "-";
}

lagring[i]=x; // flyttar över värdet i x till en array
cout << "\n";
}

}

void vinst(double *lagring, int *vinnare) // Gör en funktion som inte retunerar något värde, 
// tar även med mig in i funktionen dom globala arrayerna lagring och vinnare
{

int y=0; 
int z=1; 
double lokallagring;
int lokallagring1;
bool change=true; 


while (change) // Skapar en while slinga som endast snurrar så länge som change är lika med true
{
change=false; // Ändrar till false för att när jag är klar med nästa while slinga 
              // så vill jag inte att allt ska börja om igen

while (z<8) // så länge som z är mindre än 8
{ 

if (lagring[y]>lagring[z]) // Om lagring[y] är större än lagring[z]
{ 
change=true; //jag ändrar till true för att jag vill att första while slingan 
             // ska börja om, eftersom att inte sorteringen är färdig
lokallagring=lagring[y]; // talet i första platsen lagras i variabeln "lokallagring"
lagring[y]=lagring[z]; // jag anger att andra talet kopierar över första talet/platsen
lagring[z]=lokallagring; // jag tar talet från lokallagring som från början kom från första platsen 
                         // och anger det talet till andra platsen
// jag byter alltså plats på första med andra
lokallagring1=vinnare[y]; // talet i första platsen lagras i variabeln "lokallagring1"
vinnare[y]=vinnare[z]; // jag anger att andra talet kopierar över första talet/platsen
vinnare[z]=lokallagring1; // jag tar talet från lokallagring1 som från början kom från första platsen
                          // och anger det talet till andra platsen

}
z++; // ökar med 1
y++; // ökar med 1
}

y=0; // nollställer y
z=1; // nollställer z
}
 
}






int _tmain(int argc, _TCHAR* argv[])
{

double vinnandepengar;
double nyapengar=500; // han har 500 kronor från början
double pengar;
bool ejklarpengar=true;
bool ejklar=true;
bool inteklar=true;
bool omstart=true;
char val1;
char val2;
char spela_igen;
char name[100];
int dinhast;
int i;
int x;
int q;
int z;

srand((unsigned int)time(NULL)); // startar slump generatorn


cout << "Hej vad \x84r ditt namn?";
cin >> name;

printf("Hej %s, Du har pengar som du vill sl\x94sa vad ska du g\x94ra med dem? \n1. K\x94pa en bil \n2.  Satsa p\x86 kappl\x94pning \n(1-2):", name); 
 // skriver ut text med hjälp av printf och tar in variabeln name

while (ejklar) // gör en while slinga som snurrar så länge som ejklar är lika med true
{
cin >> val1;
switch (val1) // gör en switch med två case
{
case '1': // om användaren skriver 1
cout << "Bil aff\x84ren var st\x84ngd idag s\x86 du best\x84mmer dig f\x94r att \x84nd\x86 ta dig till  kappl\x94pningen!\n";
ejklar=false; // ställer om till false och while snurran stoppas eftersom att 
              // ejklar är inte lika med true längre
break;
case '2': // om användaren skriver 2
ejklar=false; // ställer om till false och while snurran stoppas eftersom att 
              // ejklar är inte lika med  true längre
break; 
default: // användaren har inte skrivit de ovan, därför skrivs denna texten ut 
         // och switchen börjar om igen
cout << "Fel val f\x94rs\x94k igen!(1-2):\n";
break; 
}
}



cout << "Hur tar du dig till t\x84vlingen? \n1.Bil \n2.G\x86 \n(1-2):";

ejklar=true; // ställer om ejklar till true för att jag ska använda den igen
while (ejklar) // gör en while slinga som snurrar så länge som ejklar är lika med true
{
cin >> val2;
switch (val2) // gör en switch med två case
{
case '1': // om användaren skriver 1
cout << "\nDin bil startar inte och blir tvungen att g\x86! \n";
ejklar=false; // ställer om till false och while snurran stoppas eftersom att ejklar 
              // är inte lika med  true längre
break; 
case '2': // om användaren skriver 1
ejklar=false; // ställer om till false och while snurran stoppas eftersom att ejklar 
              // är inte lika med  true längre
break; 
default: // användaren har inte skrivit de ovan, därför skrivs denna texten ut 
         // och switchen börjar om igen
cout << "Fel val, f\x94rs\x94k igen!(1-2):\n";
break; 
}
}



dinhast=slumpa(); // Läger ett slumptal från funktionen slumpa i variabeln dinhast

printf ("\nDu tr\x84\x66\x66\x61r en kompis som tipsar om %s \n\n", hastnamn[dinhast]); 
// skriver ut text med hjälp av printf och lägger även in en slumpad häst från variabeln hastnamn

while (omstart) // så länge som omstart är lika med true så snurrar slingan om igen
{
for (z=0; z<8; z++) // gör en for snurra som ökar med 1 så länge som z är mindre än 8
{
lagring[z]=z; // tilldelar arrayen lagring med värden, börjar med 0 
              // och ökar upp till 7 med hjälp av for snurran
vinnare[z]=z; // tilldelar arrayen vinnare med värden, börjar med 0 
              // och ökar upp till 7 med hjälp av for snurran
// nollställer alla värdena i vinnare och lagring
}

pengar=0; // nollställer pengar


hastar(hastodds, hastnamn, hastval); // anropar funktionen hastar som skriver ut dom olika häst valen

printf("Du har valt h\x84sten: %s, Du har %g kronor. Hur mycket pengar vill du satsa? ", hastnamn[hastval1-1], nyapengar); 
 // skriver ut text med hjälp av printf och tar med hästen som användaren valde förut,
 // jag tar hastval1 minus 1 och med hjälp av de kan jag få fram platsen i arrayen hastnamn
cin >> pengar;

ejklarpengar=true; // nollställer ejklarpengar till true
while(ejklarpengar) // gör en slinga som snurrar så länge som ejklar är lika med true
{
if (nyapengar<pengar) // Om nyapengar/dom 500 kronorna användaren hade från början är mindre än pengar
{
cout << "Du har inte s\x86 mycket pengar, F\x94rs\x94k igen:";
cin >> pengar;
}
if(nyapengar>=pengar) // om nyapengar/dom 500 kronorna användaren hade från början 
                      // är lika med eller mindre än de han valt
{
ejklarpengar=false; // för att komma ur while snurran så ändrar jag till false 
}
}


tavling(hastodds, lagring); // anropar funktionen tavling, här skrivs tävlingen ut på skärmen

vinst(lagring, vinnare); // andropar funktionen vinst sorterar vinnare

// jag har sorterat vinnaren så den ligger sist i arrayen


printf("\nF\x94rsta plats: %s \nAndra plats: %s \nTredje plats: %s\n\n", hastnamn[vinnare[7]], hastnamn[vinnare[6]], hastnamn[vinnare[5]]); 
 // skriver ut text med hjälp av printf, jag tar även in första,
 // andra och tredje vinnaren med hjälp av hastnamn och placeringen i arrayen vinnare


if (hastval1-1==vinnare[7]) // om hastval1 minus 1 är lika med vinnare[7] med andra ord om valet användaren gjorde är lika med hästen som kom först
{

vinnandepengar=pengar*hastodds[vinnare[7]]; // jag gångrar hastodds[7] med pengarna som användaren 
 // tidigare angav att han skulle satsa och lägger dom i en variabel som heter vinnandepengar
nyapengar=nyapengar+vinnandepengar; 
 // tar vinnande pengar gånger nyapengar och lägger pengarna i  nyapengar
printf("Grattis din h\x84st kom p\x86 f\x94rsta plats, du har nu: %gkr\n", nyapengar); 
 // skriver ut text med hjälp av printf, och tar in variabeln nyapengar
}

if (hastval1-1==vinnare[6]) // om hastval1 minus 1 är lika med vinnare [6] med andra ord 
                           // om valet användaren gjorde är lika med hästen som kom på andra plats 
{

vinnandepengar=pengar*hastodds[vinnare[6]]; // jag gångrar hastodds[6] med pengarna som användaren
 // tidigare angav att han skulle satsa och lägger dom i en variabel som heter vinnandepengar
nyapengar=nyapengar+vinnandepengar; // tar vinnande pengar gånger nyapengar och lägger pengarna 
// i nyapengar
printf("Grattis din h\x84st kom p\x86 andra plats, du har nu: %gkr\n", nyapengar); // skriver ut text 
// med hjälp av printf och tar med variabeln nyapengar 
}

if (hastval1-1==vinnare[5]) // om hastval1 minus 1 är lika med vinnare [5] 
// med andra ord om valet användaren gjorde är lika med hästen som kom på tredje plats
{

vinnandepengar=pengar*hastodds[vinnare[5]]; // jag gångrar hastodds[5] med pengarna som 
// användaren tidigare angav att han skulle satsa och lägger dem i en variabel som heter vinnandepengar
nyapengar=nyapengar+vinnandepengar; // tar vinnande pengar gånger nyapengar och lägger pengarna
                                    //  i nyapengar
printf("Grattis din h\x84st kom p\x86 tredje plats, du har nu: %gkr\n", nyapengar); 
// skriver ut text med hjälp av printf och tar med variabeln nyapengar
}




for (x=0; x<5; x++) // gör en for snurra som ökar med 1 så länge som x är mindre än 5
{
if (hastval1-1==vinnare[x]) // om hastval1 minus 1 är lika med vinnare x så skrivs texten nedanför 
                            // ut på skärmen, med hjälp av for snurran så får jag ut alla hästar som 
                            // kom på 4 till 8 plats och slipper skriva massa kod
{
nyapengar=nyapengar-pengar; // tar nyapengar dom som från början var 500 kronor och tar de 
                            // minus de han satsade/pengar och lägger det i nyapengar
printf("\nDu f\x94rlorade och har d\x84rmed bara: %g kr kvar.\n\n", nyapengar); 
 // skriver ut text med hjälp av printf och tar med in variabeln nyapengar
}
}


hastodds[vinnare[7]]=hastodds[vinnare[7]]-0.3; // Hästen som kom på första plats, 
                                               // hans odds minskas med 0.3
hastodds[vinnare[6]]=hastodds[vinnare[6]]-0.2; // Hästen som kom på andra plats, 
                                               // hans odds minskas med 0.2
hastodds[vinnare[5]]=hastodds[vinnare[5]]-0.1; // Hästen som kom på tredje plats, 
                                               // hans odds minskas med 0.1

for (q=0; q<5; q++) //gör en for snurra som ökar med 1 så länge som q är mindre än 5
{
hastodds[vinnare[q]]=hastodds[vinnare[q]]+0.1; // Hästarna som kom på 4 till 8 plats 
                                               // ökar sin odds med  0.1
}


for (i=0; i<8; i++) // gör en for snurra som ökar med 1 så länge som i är mindre än 8
{
if (hastodds[i]<1) // om hastodds är mindre än 1 
{
hastodds[i]=hastodds[i]+0.4; // så ökar jag hästens odds med 0.4
printf("\n%s vinner f\x94r mycket, h\x84stens odds kommer \x94ka", hastnamn[i]); 
 // skriver ut texten med hjälp av printf och tar även med hästnamnet med in

}
}


if (nyapengar<=0) // om nyapengar är mindre än eller lika med 0 
{
cout << "Du har inga pengar kvar, du kommer sv\x84lta ihj\x84l och d\x94!\n\n";
omstart=false; // avslutar while snurran för att programmet inte ska startas börja om
}


if (nyapengar>0) // Om nyapengar är större än 0 så får användaren en chans 
                 // att köra om programmet igen
{

cout << "\nVill du spela p\x86 kappl\x94pning igen?(J/N):";

ejklar=true; // ställer om ejklar till true för att jag ska använda den igen
while (ejklar) // gör en while slinga som snurrar så länge som ejklar är lika med true
{
cin >> spela_igen;
switch (spela_igen) // gör en switch med 4 case
{
case 'J': // om användaren skriver J
case 'j': // om användaren skriver j
ejklar=false; // ställer om till false och while snurran stoppas eftersom 
              // att ejklar är inte lika med  true längre
break; 
case 'N': // om användaren skriver N
case 'n': // om användaren skriver n
omstart=false; // ställer om omstart till false eftersom att jag inte längre 
               // vill börja om med while slingan, och där med avslutas programmet

ejklar=false; // ställer om till false och while snurran stoppas eftersom att 
              // ejklar är inte lika med true längre
break; 
default: // användaren har inte skrivit de ovan, därför skrivs denna texten ut 
         // och switchen börjar om igen
cout << "Fel val, f\x94rs\x94k igen!(J/N):"; 
break; 
}
}
}



}


return 0;
}