Programmera spel i C++ för nybörjare/Kapplöpning
// 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; }