Permalänk

Tärning c++

jena, behöver lite hjälp här. 2 st tärningar skall kastas 2 gånger, dock om det blir lika skall ett tredje och avgörande kast göras, sedan skall det skrivas ut vem som vann.

så här ser koden hittils, kanske inte den smidigaste men

#include <iostream> #include <ctime> using namespace std; int main(void){ int insattning; int kast1, kast2, kast3, kast4, kast5, kast6; int kast11, kast12, kast13, kast14, kast15, kast16; int saldo; int satsning; bool loop_satsning=true; bool loop_redo1=true; bool loop_redo2=true; bool loop_redo3=true; bool loop_omstart=true; char redo1; char redo2; char redo3; char omstart; while (insattning>5000) { cout<<"Välj hur mycket pengar du vill sätta in på ditt spelkonto (max 5000kr)"<<endl; //insättning cin>>insattning; int saldo=+insattning; if (insattning>5000){ cout<<"Du skrev in ett felaktigt belopp, skriv in igen"<<endl; } do{ cout<<"Ditt nuvarande saldo att spela för är "<<saldo<<" kr"<<endl; //SALDO do{ cout<<"Välj hur mycket du vill satsa (100kr, 300kr eller 500kr)"<<endl; //SATSA cin>>satsning; if ((satsning==100)||(satsning==300)||(satsning==500) ) { loop_satsning=true; cout<<"Du kommer nu att satsa "<<satsning<<" kr"<<endl; } else { loop_satsning=false; cout<<"Du har angivit ett ogiltigt värde, försök igen"<<endl; } } while (loop_satsning==false); do{ //OMGÅNG 1 cout<<"Är du redo för första omgången? j/n"<<endl; cin>>redo1; if (redo1=='j') { loop_redo1=true; cout<<"Första omgången kommer nu att spelas"<<endl; } else { loop_redo1=false; } }while (loop_redo1==false); { srand(time(0)); kast1 = rand() % 6 + 1; kast2 = rand() % 6 + 1; cout<<"Du fick totalt "<<kast1+kast2<<endl; kast11 = rand() % 6 + 1; kast12 = rand() % 6 + 1; cout<<"Datorn fick totalt "<<kast11+kast12<<endl; } if (kast1+kast2>kast11+kast12){ cout<<"Grattis du vann omgång 1"<<endl<<endl; ; } else if (kast1+kast2==kast11+kast12){ cout<<"Omgång 1 blev oavgjord"<<endl<<endl; } else{ cout<<"Tyvärr du förlorade omgång 1"<<endl<<endl; } do{ //OMGÅNG 2 cout<<"Är du redo för andra omgången? j/n"<<endl; cin>>redo2; if (redo2=='j') { loop_redo2=true; cout<<"Andra omgången kommer nu att spelas"<<endl; } else { loop_redo2=false; } }while (loop_redo2==false); { srand(time(0)); kast3 = rand() % 6 + 1; kast4 = rand() % 6 + 1; cout<<"Du fick totalt "<<kast3+kast4<<endl; kast13 = rand() % 6 + 1; kast14 = rand() % 6 + 1; cout<<"Datorn fick totalt "<<kast13+kast14<<endl; } if (kast3+kast4>kast13+kast14){ cout<<"Grattis du vann omgång 1"<<endl<<endl; ; } else if (kast3+kast4==kast13+kast14){ cout<<"Omgång 1 blev oavgjord"<<endl<<endl; } else{ cout<<"Tyvärr du förlorade omgång 1"<<endl<<endl; } do{ //OMGÅNG 3 cout<<"Är du redo för tredje och sista omgången? j/n"<<endl; cin>>redo3; if (redo3=='j') { loop_redo3=true; cout<<"Tredje omgången kommer nu att spelas"<<endl; } else { loop_redo3=false; } }while (loop_redo3==false); { srand(time(0)); kast5 = rand() % 6 + 1; kast6 = rand() % 6 + 1; cout<<"Du fick totalt "<<kast5+kast6<<endl; kast15 = rand() % 6 + 1; kast16 = rand() % 6 + 1; cout<<"Datorn fick totalt "<<kast15+kast16<<endl; } if (kast5+kast6>kast15+kast16){ cout<<"Grattis du vann omgång 1"<<endl<<endl; } else if (kast5+kast6==kast15+kast16){ cout<<"Omgång 1 blev oavgjord"<<endl<<endl; } else{ cout<<"Tyvärr du förlorade omgång 1"<<endl<<endl; } cout<<"Vill du spela igen tryck på j, tryck på valfri tangent för att skänka alla pengar till välgörenhet"<<endl; //avslutning cin>>omstart; if (omstart=='j'){ loop_omstart=true; } else{ loop_omstart=false; return 0; } }while (loop_omstart=true); } }

Permalänk
Medlem

Fullkomligt oläslig kod.

Indentering, här får du hjälp på traven:

#include <iostream> #include <ctime> using namespace std; int main(void) { int insattning; int kast1, kast2, kast3, kast4, kast5, kast6; int kast11, kast12, kast13, kast14, kast15, kast16; int saldo; int satsning; bool loop_satsning = true; bool loop_redo1 = true; bool loop_redo2 = true; bool loop_redo3 = true; bool loop_omstart = true; char redo1; char redo2; char redo3; char omstart; while (insattning > 5000) { cout << "Välj hur mycket pengar du vill sätta in på ditt spelkonto (max 5000kr)" << endl; //insättning cin >> insattning; int saldo = +insattning; if (insattning > 5000) { cout << "Du skrev in ett felaktigt belopp, skriv in igen" << endl; } do { cout << "Ditt nuvarande saldo att spela för är " << saldo << " kr" << endl; //SALDO do { cout << "Välj hur mycket du vill satsa (100kr, 300kr eller 500kr)" << endl; //SATSA cin >> satsning; if ((satsning == 100) || (satsning == 300) || (satsning == 500)) { loop_satsning = true; cout << "Du kommer nu att satsa " << satsning << " kr" << endl; } else { loop_satsning = false; cout << "Du har angivit ett ogiltigt värde, försök igen" << endl; } } while (loop_satsning == false); do { //OMGÅNG 1 cout << "Är du redo för första omgången? j/n" << endl; cin >> redo1; if (redo1 == 'j') { loop_redo1 = true; cout << "Första omgången kommer nu att spelas" << endl; } else { loop_redo1 = false; } } while (loop_redo1 == false); { srand(time(0)); kast1 = rand() % 6 + 1; kast2 = rand() % 6 + 1; cout << "Du fick totalt " << kast1 + kast2 << endl; kast11 = rand() % 6 + 1; kast12 = rand() % 6 + 1; cout << "Datorn fick totalt " << kast11 + kast12 << endl; } if (kast1 + kast2 > kast11 + kast12) { cout << "Grattis du vann omgång 1" << endl << endl;; } else if (kast1 + kast2 == kast11 + kast12) { cout << "Omgång 1 blev oavgjord" << endl << endl; } else { cout << "Tyvärr du förlorade omgång 1" << endl << endl; } do { //OMGÅNG 2 cout << "Är du redo för andra omgången? j/n" << endl; cin >> redo2; if (redo2 == 'j') { loop_redo2 = true; cout << "Andra omgången kommer nu att spelas" << endl; } else { loop_redo2 = false; } } while (loop_redo2 == false); { srand(time(0)); kast3 = rand() % 6 + 1; kast4 = rand() % 6 + 1; cout << "Du fick totalt " << kast3 + kast4 << endl; kast13 = rand() % 6 + 1; kast14 = rand() % 6 + 1; cout << "Datorn fick totalt " << kast13 + kast14 << endl; } if (kast3 + kast4 > kast13 + kast14) { cout << "Grattis du vann omgång 1" << endl << endl;; } else if (kast3 + kast4 == kast13 + kast14) { cout << "Omgång 1 blev oavgjord" << endl << endl; } else { cout << "Tyvärr du förlorade omgång 1" << endl << endl; } do { //OMGÅNG 3 cout << "Är du redo för tredje och sista omgången? j/n" << endl; cin >> redo3; if (redo3 == 'j') { loop_redo3 = true; cout << "Tredje omgången kommer nu att spelas" << endl; } else { loop_redo3 = false; } } while (loop_redo3 == false); { srand(time(0)); kast5 = rand() % 6 + 1; kast6 = rand() % 6 + 1; cout << "Du fick totalt " << kast5 + kast6 << endl; kast15 = rand() % 6 + 1; kast16 = rand() % 6 + 1; cout << "Datorn fick totalt " << kast15 + kast16 << endl; } if (kast5 + kast6 > kast15 + kast16) { cout << "Grattis du vann omgång 1" << endl << endl; } else if (kast5 + kast6 == kast15 + kast16) { cout << "Omgång 1 blev oavgjord" << endl << endl; } else { cout << "Tyvärr du förlorade omgång 1" << endl << endl; } cout << "Vill du spela igen tryck på j, tryck på valfri tangent för att skänka alla pengar till välgörenhet" << endl; //avslutning cin >> omstart; if (omstart == 'j') { loop_omstart = true; } else { loop_omstart = false; return 0; } } while (loop_omstart = true); } }

Berätta vad det är som inte fungerar och vad du behöver hjälp med.

Du använder do/while-loopar mycket men inte för att loopa omgångarna, varför?

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

Sedan bör du inte använda srand(...) mer än en gång längst upp i programmet.

Permalänk

Så ser koden ut nu, problemet som återstår är:
*onödiga omgångar skall inte spelas, tex om man vinner 2gånger skall inte en tredje spelas
*väljer man att spela igen skall den eventuella vinsten läggas på saldot eller dras bort vid förlust

Någon som har ngn ide för att lösa dessa två kraven?

#include <iostream> #include <ctime> using namespace std; int main(void){ int insattning; int kast1, kast2; int kast11, kast12; int saldo; int satsning; bool loop_satsning=true; bool loop_redo1=true; bool loop_omstart=true; char redo1; char omstart; int u, i; while (insattning>5000) { cout<<"Välj hur mycket pengar du vill sätta in på ditt spelkonto (max 5000kr)"<<endl; //insättning cin>>insattning; int saldo=+insattning; if (insattning>5000){ cout<<"Du skrev in ett felaktigt belopp, skriv in igen"<<endl; } do{ cout<<"Ditt nuvarande saldo att spela för är "<<saldo<<" kr"<<endl; //SALDO do{ cout<<"Välj hur mycket du vill satsa (100kr, 300kr eller 500kr)"<<endl; //SATSA cin>>satsning; if ((satsning==100)||(satsning==300)||(satsning==500)) { loop_satsning=true; cout<<"Du kommer nu att satsa "<<satsning<<" kr"<<endl; } else { loop_satsning=false; cout<<"Du har angivit ett ogiltigt värde, försök igen"<<endl; } } while (loop_satsning==false); for ( i=0;i<2;i++){ for ( u=0;u<2;u++){ do{ //Tärning kastas cout<<"Är du redo för första omgången? j/n"<<endl; cin>>redo1; if (redo1=='j') { loop_redo1=true; cout<<"Första omgången kommer nu att spelas"<<endl; } else { loop_redo1=false; } }while (loop_redo1==false); { srand(time(0)); kast1 = rand() % 6 + 1; kast2 = rand() % 6 + 1; cout<<"Du fick totalt "<<kast1+kast2<<endl; kast11 = rand() % 6 + 1; kast12 = rand() % 6 + 1; cout<<"Datorn fick totalt "<<kast11+kast12<<endl; } if (kast1+kast2>kast11+kast12){ cout<<"Grattis du vann omgång 1"<<endl<<endl; i++; } else if (kast1+kast2==kast11+kast12){ cout<<"Omgång 1 blev oavgjord"<<endl<<endl; } else{ cout<<"Tyvärr du förlorade omgång 1"<<endl<<endl; u++; } } } if (i>2){ cout<<"Vill du spela igen tryck på j, tryck på valfri tangent för att skänka alla pengar till välgörenhet"<<endl; //avslutning cin>>omstart; if (omstart=='j'){ loop_omstart=true; } else{ loop_omstart=false; return 0; } } }while (loop_omstart=true); } }

Permalänk
Medlem

tycker du skall börja med att rensa upp lite mer, t.ex. att göra metoder för sådant som görs flera gånger så att du inte upprepar kod i onödan. En metod för att kasta en tärning, en metod för e spelomgång osv. Känns som om du har lite onödigt många loopar också, verkar onödigt med en loop som frågar om man är redo, å om man inte är redo så frågar den om man är redo igen.. ? Sen bör srand() köras en gång, t.ex. vid programmets start. antingen kör du med time(0) för att få 'riktig' slump, eller så matar du in ett värde medan du testar, så kommer varje spel ha samma "utfall"(om det är samma seed dvs).
En metod borde inte vara längre än "en sida" för att det skall vara lätt att läsa koden, detta gäller även main
Om du låter omgångsmetoden returnera 0, 1 eller 2 beroende på vem som vann/oavgjort så kan du ju lätt kontrollera efter de två omgångarna om det är "lika" å således köra en tredje omgång. Att plussa på vinsten borde inte vara några problem... -.-
lycka till!

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem

Ytterligare ett litet fel i din kod, antar att du inte vill tilldela utan jämföra i din while loop och då bör du ha == ist för = nedan som du har på de andra ställena:

while (loop_omstart = true)

till:

while (loop_omstart == true)

Permalänk

Börjar få koll på det nu, första gången man kör igenom går allt felfritt.
Dock när man väljer att spela igen och tärningarna skall slås så slår den antingen för få gånger eller visar fel svar.

några ideer om hur man åtgärdar så att även de andra omgångarna blir korrekta?

#include <iostream> #include <ctime> using namespace std; int main(){ srand(time(0)); int tarning1, tarning2, tarning3, tarning4; int spelare=0, dator=0; int insattning, satsning, saldo; bool loop_satsning=true; bool loop_omstart=true; char omstart; cout<<"Välj hur mycket pengar du vill sätta in"<<endl; cin>>insattning; saldo+=insattning; do{ if (insattning<=5000){ cout<<"Ditt nuvaranade saldo är "<<saldo<<"kr"<<endl; } else { cout<<"Felaktigt belopp, försök igen"<<endl; } //------------------------------------------------------------------------------------------------------------------- do{ cout<<"Välj hur mycket du vill satsa (100kr, 300kr eller 500kr)"<<endl; //SATSA KLART cin>>satsning; if (satsning>saldo){ cout<<"Inte nog med pengar, ditt saldo är "<<saldo<<"kr"<<endl; loop_satsning=false; } else if ((satsning==100)||(satsning==300)||(satsning==500)){ loop_satsning=true; cout<<"Du kommer nu att satsa "<<satsning<<" kr"<<endl; } else { loop_satsning=false; cout<<"Du har angivit ett ogiltigt värde, försök igen"<<endl; } }while (loop_satsning==false); //_____________________________________________________________________Tärning kastas__________________________________________________________________ while (true) { tarning1 = rand() % 6 + 1; tarning2 = rand() % 6 + 1; cout<<"Du fick "<<tarning1+tarning2<<endl; tarning3 = rand() % 6 + 1; tarning4 = rand() % 6 + 1; cout<<"Datorn fick "<<tarning3+tarning4<<endl; if (tarning1+tarning2 > tarning3+tarning4){ cout<<"Du vann"<<endl; spelare++; } else if (tarning1+tarning2 < tarning3+tarning4){ cout<<"Tyvär men datorn vann"<<endl; dator++; } else{ cout<<"Det blev lika, omslag"<<endl; } if ((spelare==2)||(dator==2)){ break; } } if (spelare==2){ cout<<"GRATTIS, du vann "<<(satsning*2)<<"kr"<<endl; saldo+= satsning*2; } else{ cout<<"Du förlora "<<satsning<<endl; saldo-=satsning; ; } //_____________________________________________________________________________omspel?__________________________________________________________________________ cout<<"Vill du spela igen tryck på j, tryck på valfri tangent för att skänka alla pengar till välgörenhet"<<endl; //avslutning cin>>omstart; if (omstart=='j'){ loop_omstart=true; } else{ return 0; } }while (loop_omstart=true); }

Permalänk
Medlem

hm det där var väldigt mycket kod känns det som.

Du behöver intarna: p1 och p2 (för spelare 1/2)
och sedan göra en roll() som retunerar en int mellan 2-12.

p1=+roll(); //0+ kast1
p2=+roll(); //0+ kast1
p1=+roll(); //kast1 + kast2
p2=+roll(); //kast1 + kast2
(båda spelare har nu kastat två gånger)

while(p1==p2){ //kasta vidare tills de inte längre har samma summa
p1=+roll();
p2=+roll();
}
if(p1>p2)
return "spelare 1 vann"
else
return "spelare 2 vann"

Visa signatur

Om du vill att jag ska se ditt svar så tryck på Citera.

Permalänk
Medlem

Zeagan, det går inte att tänka på det sättet som du skriver, då du endast jämför total antalet poäng(tärningsögon), det som skall jämföras är antalet vunna/förlorade/oavgjorda omgångar.(Som jag förstår det iaf)
I din kod så skulle omgång 1 med t.ex. 2 - 12 ,som betyder att spelare 2 vann.
Sedan omgång 2 med 3 - 2, som betyder att spelare 1 vann.
Resultatet blir då 5 - 14, dvs inte oavgjort enligt (p1 == p2 ), men det är oavgjort då det står 1 - 1 i omgångar.
Sen är ju frågan om programmet skall ta hänsyn till oavgjorda omgångar lr om datorn skall vinna då summan av tärningsögon är lika.

Hur som helst bör du (trådskaparen) läsa igenom min tidigare kommentar och få lite struktur på din kod så att den blir lättare att först samt lättare att ändra.
Om alla omgångar kör via samma metod så bör du inte få problemet med att omgångar hanteras olika. Så googla lite om metoder och fixa så du har ett bra definierat sätt att spela en omgång!:)
Lycka till!

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |