2013-11-18, 18:24
  #1
Medlem
Hallå!
Jag har fått till uppgift att göra ett "kasta träning" kodspel. Uppgiften lyder:
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 slår den högst enskilda tärningen vinner omgången. Bäst av tre omgångar gäller, dvs. om någon vinner två omgångar i rad behöver inte den tredje omgången spelas. 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.
Följande krav måste uppfyllas i ditt program:
• 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.

Vissa saker har jag koll på, vissa har jag inte koll på. Ett exempel jag inte har koll på är hur jag ska kunna loopa spelet tills någon har antingen vunnit 2 gånger i rad, eller bara 2 gånger (3 omgångar har spelats) Spelet ska isåfall avslutats när detta händer. Har ni lust att hjälpa mig hade det varit toppen!
Citera
2013-11-18, 18:57
  #2
Medlem
rAppmeisters avatar
Sätt spelet i en evig loop,
Kod:
while(true)
. Inom loopen kan du enkelt göra en check som jämför antalet rundor spelade jämfört med antalet vinster båda spelarna har. (Har det bara spelats två matcher och spelaren har vunnit två så betyder det att han vunnit två i rad. Skulle det varit tre rundor spelade så betyder det att han vunnit två av tre.)
Citera
2013-11-18, 19:05
  #3
Medlem
Dela upp i tre delar: en för pengahanteringen, en för spelet och en main() som knyter ihop säcken, t.ex. loopar och anropar spelet tills användaren är pank. Skriv main() först.

Isolera delarna och hitta på ett bra gränssnitt mellan dem. Vad ska man t.ex. kunna göra med pengar - kolla saldo, sätta saldo, skriva ut en summa osv, där har du tre funktioner att börja med. Använd funktioner för gränssnittet, inte globala variabler. Låt t.ex. inte andra delar av programmet läsa en spelares saldo direkt, utan gör det tillgängligt bara via en funktion.

Om flera källkodsfiler och headerfiler är för krångligt, stoppa allt i samma fil. Det blir ändå inget jätteprogram.
__________________
Senast redigerad av alef-noll 2013-11-18 kl. 19:16.
Citera
2013-11-18, 22:42
  #4
Medlem
christerys avatar
Tja, som tidigare sagts (även om jag inte riktigt håller med) så är en do-while rätt men jag skulle inte breaka ur den utan använda ett logiskt villkor som du sätter när du vill avsluta.

Men grunden är att rita upp hur du tänkt göra ifall du skulle göra det själv (utan datorn). Dvs skapa din algoritm.

Identifiera delar som kan hanteras separat, eller som återfinns på flera ställen och lägg dessa i funktioner. Pilla med det ett tag tills du identifierat alla funktioner, fundera nu på datat som måste följa med funktionerna (kallas ett DFD) och fundera åxå kring hur du skall göra med felhantering.

Dvs om spelaren skall mata in "100" och denne skriver "etthundra" istället så bör det inte stoppa programmet.

Programmeringen gör man sist, börja med att klura ut vad programmet skall göra (i detalj) och vilka dataflöden du har. Dela upp problemet och sen är det ju bara att koda.

Enklaste sättet att äta en elefant är att dela upp den i mindre bitar, samma gäller för detta.
Citera
2013-11-19, 01:53
  #5
Medlem
Det finns en inte så gammal tråd som behandlar just detta problem.
Citera
2013-11-19, 04:14
  #6
Medlem
Kod:
#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((unsigned)time(NULL));
	// 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, jsut 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 << "Conputer have no money left. You won!" << endl;
			cout << "Computers mobfriends added some more money!" << endl;
			cmpAcc += CRED;
		}
		else if (usrAcc < 0)
		{
			if ((rand() % 10 + 1) == (rand() % 10 + 1))
			{
				cout << endl << "YOU JUST GOT SHOT IN THE HEAD FROM BEHIND. THE MOB FOUND YOU!" << endl;
				cin.get();
				vector<int> death;
				cout << death[666]; // program crash hihi
			}
		}
		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 << "AND...You are now in debt, the mob will hunt you down, there is a risk of dying every round now." << endl;
			cout << 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;
}

Det skulle se mycket bättre ut objektorienterat i klasser. Programmet innehåller en liten twist + möjlighet till fusk, bara för att höja spänningen

* ps detta program håller inte din kravspec på t.ex utskrifter etc.
__________________
Senast redigerad av PG-k 2013-11-19 kl. 04:23.
Citera
2013-11-19, 06:26
  #7
Medlem

Version 2. Du måste försöka låna pengar av kompisar om du går back, annars finns det en risk att maffian hittar dig och...

Ja jag har tråkigt....
__________________
Senast redigerad av PG-k 2013-11-19 kl. 06:43.
Citera
2013-11-19, 19:50
  #8
Medlem
Citat:
Ursprungligen postat av tiviala93
Ett exempel jag inte har koll på är hur jag ska kunna loopa spelet tills någon har antingen vunnit 2 gånger i rad, eller bara 2 gånger (3 omgångar har spelats) Spelet ska isåfall avslutats när detta händer.

Du behöver inte räkna antal vinster i rad. Avsluta när en spelare når 2 vinster bara. Med två spelare är "först till 2" samma sak som "bäst av 3".

Antingen kontrollerar du alla spelares antal vinster innan varje omgång, och får ett väldigt generellt spel som du kan ändra till "först till 0" om du av någon anledning skulle vilja det. Då måste du också koda stöd för delade vinster (fler än en spelare med samma antal vinster).

Eller så kontrollerar du bara när en spelare vinner en omgång, direkt efter att du har ökat hans antal vinster.

Kod:
för alla spelare:
    sätt antal vinster till 0
loopa:
    spela en omgång
    öka vinnarens antal vinster
    jämför det med 2
    break:a om lika

Gör "spela en omgång" till en funktion. En funktion som inte behöver veta saker som antal tidigare vinster eller saldon. Den skulle kunna ta en array med spelarobjekt som argument om den behöver veta något om spelarna (t.ex. deras namn), annars inga argument alls, och returnera ett index till vilken av spelarna som vann.
Citera
2013-11-23, 11:41
  #9
Medlem
#include <iostream>
#include <ctime>
#include <string>
#include <ctime>;
using namespace std;
using std::cin;
using std::cout;
using std::endl;
using std::string;
int main ()
{
int balance=0;
if(balance<100)
cout << "You need to put in more money" << "\n" << endl;
if(balance>5000)
cout << "You can not put in that amount of money. It is too high!" << "\n" << endl;

cout << "Welcome to this dice game! To start the game you need to put in from 100-5000 kr into the bank. Type in your choose" <<"\n" << endl;
bool loop=true;
 
while(loop)
{
int val1;
cin >> val1;
if(val1<100)
{
cout << "You need to put in more money" << "\n" << endl;
}
else if(val1>5000)
{
cout << "You can not put in that amount of money. It is too high!" << "\n" << endl;
}
else {
balance = balance + val1;
loop=false;
cout << "You have now " << balance << "on the bank and you can start to play" << "\n" << endl;
}
}
string player1;
string computer ="computer";
cout << " player1, please enter your name:";
cin >>player1;
cout<< "Welcome "<<player1<<"."<<endl<< endl;
cout << "Let the game begin!"<<endl<<endl;
int val1;
bool loop2=true;
while(loop2)
{
cout<<"How much do you want to bet? 100 , 300 or 500 kr?";

cin >>val1;
if(val1==100||val1==300||val1==500)
{
loop2=false;
}
else
{
cout << "Try again" << "\n" << endl;
}
}
cout<< "You bet "<<val1<<"."<<endl<<endl;
cout<<computer<<"calls your bet with" <<val1<<"."<<endl<<endl;
 
srand(time(0));// Använd endast en gång
int slumptal = rand() % 6 + 1;
int slumptal2 = rand() % 6 + 1;
int slumptal3 = rand() % 6 + 1;
int slumptal4 = rand() % 6 + 1;
int highestScorePlayer;
int highestScoreComputer;
 
 
 
 
 
cout << "You throw your dices!"<<"\n"<<endl;
cout << "Dice1: " << slumptal << endl;
cout << "Dice2: " << slumptal2 << endl;
cout <<player1 << "Your highest dice is:" <<highestScorePlayer <<endl;
cout <<computer<<" throws the dices!"<<"\n"<<endl;
cout << "Dice1: " << slumptal3 << endl;
cout << "Dice2: " << slumptal4 << endl;
cout <<computer << "Your highest dice is:" <<highestScoreComputer <<endl;
 
 
}

Så långt har jag kommit. Förslag på hur jag ska fortsätta enligt instruktionerna ovan? (Första inlägget)
Citera
2013-11-23, 12:14
  #10
Medlem
har du ens kollat mitt tidigare inlägg? gav det ingen hjälp alls?
Citera
2013-11-23, 12:45
  #11
Medlem
Citat:
Ursprungligen postat av PG-k
har du ens kollat mitt tidigare inlägg? gav det ingen hjälp alls?

Jo jag har kollat det men tyvärr har jag svårt och läsa vad som är vad (är inte så kunnig inom programmering). Har du lust och berätta hur jag ska gå tillväga efter de jag har skrivit? Det jag nu behöver få fram en vinnare, + eller - till min bank samt en lopp som gör att spelet startar om och om någon vinner 2 gånger så avslutas spelet.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in