Hjälp med kod till tärningsspel (c++)

Permalänk
Medlem

Hjälp med kod till tärningsspel (c++)

Hej!

(Se koden nedanför)
Jag är väldigt ny på programmering och försöker förstå mig på hur man skapar ett tärningsspel där en användare ska utmana datorn.
Behöver hjälp med att kika på koden, något som ser konstigt ut och vad behöver jag ändra/lägga till för att få med vissa funktioner.

Spelet går ut på att användaren och datorn får kasta två tärningar åt gången i tre omgångar. Den som får högst vinner
omgången (bäst av tre). I början av programmet ska användaren ange hur mycket pengar som han/hon vill satsa, 100kr, 300kr eller 500kr. Om användaren vinner ett spel erhålls summan av användarens och datorns insats, men vid förlust så
förloras insatsen.

Det som jag ska få med är:
• För varje omgång måste användarens och datorns tärningskast redovisas.
• Tydligt framgå vem som vann spelet totalt och för respektive omgång.
• Onödiga omgångar ska inte spelas, dvs. om någon vinner två omgångar i rad.
• Användaren får spela hur många gånger som helst och väljer själv när den vill avsluta
programmet.
• Lyckas användaren vinna ett spel ska programmet skriva ut aktuell vinst samt den
totala vinstsumman (om användaren spelat flera gånger).
• Om datorn vinner ett spel ska programmet skriva ut ett tröstmeddelande och den
totala vinstsumma som finns kvar.
• Användaren får sätta in max 5.000 kr åt gången.
• Om det finns pengar innestående så behöver inte användaren sätta in mer pengar vid
nytt spel.
• Betalningsmomentet kan symboliseras med ex. information om att pengar dras från
användarens konto. Använd gärna ett heltal som minskas och ökas beroende på
aktuella vinster och förluster.
• Tärningarna kan symboliseras med hjälp av en fördefinierad randomfunktion, ex.
rand() som returnerar ett slumpmässigt heltal.

#include <iostream>
#include <string>
#include <ctime>
#include <algorithm>
#include <vector>
using namespace std;

// constants
const int CRED = 3000;
const string CURRENCY = "USD";
// prototypes
bool doRunAgain();
int betMoney(int &x);
string startGame();
void showInfo(int &x, int &y);

int main()
{
//using clock for randomgenerator
srand(time(0));
// Variabels
int pot = 0;
int usrR = 0;
int cmpR = 0;
// Money account
int usrAcc = CRED;
int cmpAcc = CRED;
// main program loop
do
{
cout << endl;
showInfo(usrAcc, cmpAcc);

pot = betMoney(usrAcc);
usrAcc -= pot;
cmpAcc -= pot;
pot += pot;
for (int i = 0; i < 3; i++)
{
string str = startGame();
if (str == "usr")
usrR++;
else if (str == "cmp")
cmpR++;
else
{} // nothing, just for demonstration

if (cmpR == 2 || usrR == 2)
i = 3;
}

if (cmpR == 2)
{
cout << endl << "Computer won. Pot goes to computer!" << endl;
cmpAcc += pot;
}
else if (usrR == 2)
{
cout << endl << "You won. You win the pot!" << endl;
usrAcc += pot;
}
else
{
cout << endl << "Game was a tie. Money transfered back to players." << endl;
usrAcc += pot/2;
cmpAcc += pot / 2;
}

cmpR = 0;
usrR = 0;

if (cmpAcc <= 0)
{
cout << "Computer have no money left. You won!" << endl;
cout << "Computers mobfriends added some more money!" << endl;
cmpAcc += CRED;
}
else if (usrAcc < 0)
{

}
cout << endl;
} while (doRunAgain());
return 0;
}

string startGame()
{
vector<int> usr;
vector<int> cmp;

usr.push_back(rand() % 6 + 1);
usr.push_back(rand() % 6 + 1);
cmp.push_back(rand() % 6 + 1);
cmp.push_back(rand() % 6 + 1);

sort(usr.begin(), usr.end(),
[](const int& left, const int& right)
{
return left < right;
});

sort(cmp.begin(), cmp.end(),
[](const int& left, const int& right)
{
return left < right;
});

if (cmp[1] == usr[1])
return "equal"; //not using this anyway
else if (cmp[1] > usr[1])
return "cmp";
else
return "usr";
}

int betMoney(int &x)
{
string bet;
while (true)
{
if (x < 100)
{
cout << "Your out of money. Please write 'ADD500' to add 500 " << CURRENCY << "." << endl;
}

cout << "Bet:\n1 = 100\n3 = 300\n5 = 500" << endl;
cout << "Your choice: ";
getline(cin, bet);

if (bet == "1")
return 100;
else if (bet == "3")
return 300;
else if (bet == "5")
return 500;
else if (bet == "ADD500")
x += 500;
else
cout << endl << "Wrong choice or out of money! Please try again.\n" << endl;
}
}

bool doRunAgain()
{
string ch;
cout << "Do you want to play again? (y/n): ";
while (true)
{
getline(cin, ch);
transform(ch.begin(), ch.end(), ch.begin(), ::toupper);
if (ch == "Y")
return true;
else if (ch == "N")
return false;
else
cout << "Please enter (y)es or (n)o: ";
}
}

void showInfo(int &x, int &y)
{
cout << "Stats: " << endl;
cout << "Player: " << x << CURRENCY << endl;
cout << "Computer: " << y << CURRENCY << endl;
cout << endl;
}

Permalänk
Medlem

Var snäll och lägg till code-taggar, annars blir det halvt omöjligt att läsa koden eftersom indenteringen försvinner. D.v.s.:
[code]
Kod här
[/code]

En sak jag såg är att du använder referenser på ställen där det inte behövs, t.ex. för argumenten till showInfo och i lambda-funktionerna som du använder när du sorterar vektorerna. När du deklarerar en funktion som voidInfo(int &x, int &y) så säger du: "den här funktionen kommer ändra på argumenten", men showInfo skriver ju bara ut dem.

I lambda-funktionerna så använder du istället const int &, vilket är onödigt eftersom det är billigare att bara kopiera en int istället för att skicka en referens. Lambda-funktionerna behövs för övrigt inte, du kan använda std::less istället:

sort(usr.begin(), usr.end(), std::less<int>{});

En annan sak är att srand()/rand() är en gammal kvarleva från C, C++ har mycket bättre slumpfunktionalitet nu. För att simulera en tärning så kan du använda en uniform_int_distribution, som genererar slumptal i ett visst intervall där alla värden är lika sannolika. T.ex.:

std::default_random_generator generator; // Slumptalsgenerator std::uniform_int_distribution<int> distribution(1, 6); // Slumptalsdistribution auto r = distribution(generator); // r tilldelas ett slumptal mellan 1 och 6.

Lägg till code-taggar så jag orkar läsa koden ordentligt så kan du få mer feedback

Permalänk
Medlem

Ett hett tips som du borde ta till dig för all framtid: döp alltid varibler till namn som alla förstår.

Vad är usrR och cmpR för något? Vad är ch?

Permalänk
Medlem

#include <iostream> #include <string> #include <ctime> #include <algorithm> #include <vector> using namespace std; // constants const int CRED = 3000; const string CURRENCY = "SEK"; // prototypes bool doRunAgain(); int betMoney(int &x); string startGame(); void showInfo(int &x, int &y); int main() { //using clock for randomgenerator srand(time(0)); // Variabels int pot = 0; int usrR = 0; int cmpR = 0; // Money account int usrAcc = CRED; int cmpAcc = CRED; // main program loop do { cout << endl; showInfo(usrAcc, cmpAcc); pot = betMoney(usrAcc); usrAcc -= pot; cmpAcc -= pot; pot += pot; for (int i = 0; i < 3; i++) { string str = startGame(); if (str == "usr") usrR++; else if (str == "cmp") cmpR++; else {} // nothing, just for demonstration if (cmpR == 2 || usrR == 2) i = 3; } if (cmpR == 2) { cout << endl << "Computer won. Pot goes to computer!" << endl; cmpAcc += pot; } else if (usrR == 2) { cout << endl << "You won. You win the pot!" << endl; usrAcc += pot; } else { cout << endl << "Game was a tie. Money transfered back to players." << endl; usrAcc += pot/2; cmpAcc += pot / 2; } cmpR = 0; usrR = 0; if (cmpAcc <= 0) { cout << "Computer have no money left. You won!" << endl; cmpAcc += CRED; } else if (usrAcc < 0) { } cout << endl; } while (doRunAgain()); return 0; } string startGame() { vector<int> usr; vector<int> cmp; usr.push_back(rand() % 6 + 1); usr.push_back(rand() % 6 + 1); cmp.push_back(rand() % 6 + 1); cmp.push_back(rand() % 6 + 1); sort(usr.begin(), usr.end(), [](const int& left, const int& right) { return left < right; }); sort(cmp.begin(), cmp.end(), [](const int& left, const int& right) { return left < right; }); if (cmp[1] == usr[1]) return "equal"; //not using this anyway else if (cmp[1] > usr[1]) return "cmp"; else return "usr"; } int betMoney(int &x) { string bet; while (true) { if (x < 100) { cout << "Your out of money. Please write 'ADD500' to add 500 " << CURRENCY << "." << endl; } cout << "Bet:\n1 = 100\n3 = 300\n5 = 500" << endl; cout << "Your choice: "; getline(cin, bet); if (bet == "1") return 100; else if (bet == "3") return 300; else if (bet == "5") return 500; else if (bet == "ADD500") x += 500; else cout << endl << "Wrong choice or out of money! Please try again.\n" << endl; } } bool doRunAgain() { string ch; cout << "Do you want to play again? (y/n): "; while (true) { getline(cin, ch); transform(ch.begin(), ch.end(), ch.begin(), ::toupper); if (ch == "Y") return true; else if (ch == "N") return false; else cout << "Please enter (y)es or (n)o: "; } } void showInfo(int &x, int &y) { cout << "Stats: " << endl; cout << "Player: " << x << CURRENCY << endl; cout << "Computer: " << y << CURRENCY << endl; cout << endl; }