Permalänk
Medlem

Behöver lite hjälp i c++.

Hej!

Håller på att skapa ett program som går ut på att man först skall komma till 21, och man får bara säga 1 eller 2.

Nu är det så att jag har lite problem, när jag använder en array och cin.getline så hoppar den helt enkelt över den raden och tar inte in namnet. Har testat med cin.ignore(15,'\n'); och då så har den inte hoppat över raden men fortfarande inte tagit in namnet så jag kan skriva ut det senare.

Jag försöker även komma på ett sätt att se vilken spelare som gjorde sista draget för att skriva ut vem som vann, då har jag använder "vilken++;" i while-satsen som jag tänkte skulle ge ett jämnt eller ojämnt tal och därmed se vem som gjorde det. Hursomhelst så fungerar varken eller, och jag skulle behöva lite hjälp!

#include <iostream> #include <iomanip> #include <cstring> using namespace std; void skrivmeny(); int main() { ////// mata in data ################################################### int spelaretal, dator, summa=0, vilken; char namn1[20], namn2[20]; char spela, svar; //##################################################################### cout << "Vill du spela spelet21?(j/n) "; cin >> spela; //########## inledning OM svar = j, annars avsluta if (spela!='n' || spela!='N') { skrivmeny(); cout << endl << "Välj ett svarsalternativ! "; cin >> svar; if(svar!='0') ///// om svar = 0 kommer programmet avslutas { ///// utför valt menyalternativ if(svar=='1') { cout << "Ange namnet på spelare1: "; // namn på spelare 1 //cin.getline(namn1, 20); //cin.ignore(15,'\n'); cout << endl << endl << "Du kommer nu att spela spelet 21 själv!" << endl; // starta spelet mot sig själv" cout << endl << endl << "============================================" << endl << endl; // snygghet while(summa<21) { cout << "Summan är lika med " << summa << ". Mata nu in nästa tal!"; // körs tills något kommit till svar cin >> spelaretal; if(spelaretal == 1 || spelaretal == 2) // testar likhet för 1 & 2 { summa=summa+spelaretal; } else { cout << "Talet du matade in är inte = 1 eller = 2, mata in ett nytt tal!" << endl; // felinmatning } } if(summa==21) { cout << "Summan är nu 21!! " << namn1 << " har vunnit!" <<endl; // skriver ut vinnaren } } if(svar=='2') { //cout << "Ange namnet på spelare1: "; // namn på spelare 1 //cin.getline(namn1, 20); //cin.ignore(15,'\n'); //cout << "Ange namnet på spelare2: "; // namn på spelare 2 //cin.getline(namn2, 20); //cin.ignore(15,'\n'); cout << "Skall spelare 1 eller 2 börja? (ange 1 för spelare 1 och 2 för spelare 2): "; cin >> vilken; cout << endl << endl << namn1 << " kommer nu att möta " << namn2 << " i spelet 21, var beredda!" << endl; // två spelare cout << endl << endl << "============================================" << endl << endl; // snygghet while(summa<21) { cout << "Summan är lika med " << summa << ". Mata nu in nästa tal!"; // körs tills något kommit till svar cin >> spelaretal; if(spelaretal == 1 || spelaretal == 2) // testar likhet för 1 & 2 { summa=summa+spelaretal; vilken++; // avgör vem som vunnit i slutet } else { cout << "Talet du matade in är inte = 1 eller = 2, mata in ett nytt tal!" << endl; // felinmatning } } if(summa==21) { cout << "Summan är nu 21!! " << vilken << " har vunnit!" <<endl; // skriver ut vinnaren } } } } } void skrivmeny() { cout << endl; cout << "1. Spela själv!" << endl; cout << "2. Spela mot en kompis" << endl; cout << "3. Spela mot datorn!" << endl; cout << "4. Spela mot datorn med vinnaralgoritm!" << endl; cout << "5. Förklara regler." << endl; cout << "0. Avsluta." << endl; }

Permalänk
Medlem

Kan du utveckla lite angående vad som inte fungerar? Får du felmeddelanden, vad är det som händer som du inte förväntar dig, etc.?

Permalänk
Medlem
Skrivet av You:

Kan du utveckla lite angående vad som inte fungerar? Får du felmeddelanden, vad är det som händer som du inte förväntar dig, etc.?

Löste problemet med cin.getline och ändrade till cin.

Får inga felmeddelanden alls, utan nu är snarare problemet det här med att programmet skall veta vem som gjorde det sista draget och därmed vann.

#include <iostream> #include <iomanip> #include <ctime> #include <cstdlib> #include <stdlib.h> #include <cstring> using namespace std; void skrivmeny(); int main() { ////// mata in data ################################################### int spelaretal, datortal, summa=0, vilken; char namn1[20], namn2[20]; char spela, svar; //##################################################################### cout << "Vill du spela spelet21?(j/n) "; cin >> spela; srand((unsigned)time(0)); //Seedar rand() med systemtiden //########## inledning OM svar = j, annars avsluta if (spela!='n' || spela!='N') { skrivmeny(); cout << endl << "Välj ett svarsalternativ! "; cin >> svar; if(svar!='0') ///// om svar = 0 kommer programmet avslutas { ///// utför valt menyalternativ if(svar=='1') { cout << "Ange namnet på spelare1: "; // namn på spelare 1 //cin.getline(namn1, 20); //cin.ignore(15,'\n'); cout << endl << endl << "Du kommer nu att spela spelet 21 själv!" << endl; // starta spelet mot sig själv" cout << endl << endl << "============================================" << endl << endl; // snygghet while(summa<21) { cout << "Summan är lika med " << summa << ". Mata nu in nästa tal!"; // körs tills något kommit till svar cin >> spelaretal; if(spelaretal == 1 || spelaretal == 2) // testar likhet för 1 & 2 { summa=summa+spelaretal; } else { cout << "Talet du matade in är inte = 1 eller = 2, mata in ett nytt tal!" << endl; // felinmatning } } if(summa==21) { cout << "Summan är nu 21!! " << namn1 << " har vunnit!" <<endl; // skriver ut vinnaren } } if(svar=='2') { cout << "Ange namnet på spelare1: "; // namn på spelare 1 cin >> namn1; cout << "Ange namnet på spelare2: "; // namn på spelare 2 cin >> namn2; cout << "Skall spelare 1 eller 2 börja? (ange 1 för spelare 1 och 2 för spelare 2): "; cin >> vilken; cout << endl << endl << namn1 << " kommer nu att möta " << namn2 << " i spelet 21, var beredda!" << endl; // två spelare cout << endl << endl << "============================================" << endl << endl; // snygghet while(summa<21) { cout << "Summan är lika med " << summa << ". Mata nu in nästa tal!"; // körs tills något kommit till svar cin >> spelaretal; if(spelaretal == 1 || spelaretal == 2) // testar likhet för 1 & 2 { summa=summa+spelaretal; vilken++; // avgör vem som vunnit i slutet } else { cout << "Talet du matade in är inte = 1 eller = 2, mata in ett nytt tal!" << endl; // felinmatning } } if(summa==21) { cout << "Summan är nu 21!! " << vilken << " har vunnit!" <<endl; // skriver ut vinnaren } } if(svar=='3') { cout << "Ange namnet på spelare1: "; // namn på spelare 1 cin >> namn1; cout << "Skall spelare 1 eller datorn börja? (ange 1 för spelare 1 och 2 för datorn): "; cin >> vilken; cout << endl << endl << namn1 << " kommer nu att möta datorn i spelet 21, var beredda!" << endl; // två spelare cout << endl << endl << "============================================" << endl << endl; // snygghet while(summa<21) { cout << "Summan är lika med " << summa << ". Mata nu in nästa tal!"; // körs tills något kommit till svar cin >> spelaretal; if(spelaretal == 1 || spelaretal == 2) // testar likhet för 1 & 2 { summa=summa+spelaretal; vilken++; // avgör vem som vunnit i slutet } else { cout << "Talet du matade in är inte = 1 eller = 2, mata in ett nytt tal!" << endl; // felinmatning } cout << "Datorn matade in: "; datortal=(rand()%2)+1; //Slumpar ett nummer mellan 1 och 14 cout << datortal << endl; if(datortal == 1 || datortal == 2) // testar likhet för 1 & 2 { summa=summa+datortal; vilken++; // avgör vem som vunnit i slutet } else { cout << "Talet du matade in är inte = 1 eller = 2, mata in ett nytt tal!" << endl; // felinmatning } } if(summa==21) { cout << "Summan är nu 21!! " << vilken << " har vunnit!" <<endl; // skriver ut vinnaren } } } } } void skrivmeny() { cout << endl; cout << "1. Spela själv!" << endl; cout << "2. Spela mot en kompis" << endl; cout << "3. Spela mot datorn!" << endl; cout << "4. Spela mot datorn med vinnaralgoritm!" << endl; cout << "5. Förklara regler." << endl; cout << "0. Avsluta." << endl; }

Permalänk
Medlem

Brukar själv köra med en boolean för att hålla reda på 2 spelare.

Ex:

bool player = true; // true = spelare 1 ........... // loop som läser in / byter spelare while(summa<21) { ... player = !player; // byter spelare } ... if(player) { cout << "spelare 1 vann." << endl; } else { cout << "spelare 2 vann." << endl; }

något dylikt

Permalänk
Medlem
Skrivet av Xergon:

Brukar själv köra med en boolean för att hålla reda på 2 spelare.

Ex:

bool player = true; // true = spelare 1 ........... // loop som läser in / byter spelare while(summa<21) { ... player = !player; // byter spelare } ... if(player) { cout << "spelare 1 vann." << endl; } else { cout << "spelare 2 vann." << endl; }

något dylikt

Tack för svar!

Dock så har jag inte kommit så långt i programmeringskursen än, utan jobbar endast med funktioner, strängar, if/for och while.. :/

Permalänk
Medlem
Skrivet av AIIN:

Tack för svar!

Dock så har jag inte kommit så långt i programmeringskursen än, utan jobbar endast med funktioner, strängar, if/for och while.. :/

Sätt en sträng som ändras från den ena till den andra spelaren varje gång man väljer en siffra.

string spelare1, spelare2, senaste; while(/* villkor */){ if(senaste = spelare1){ cout << "Nu är det "<< spelare2 << "s tur att välja"; senaste = spelare2; }else{ cout << "Nu är det "<< spelare1 << "s tur att välja"; senaste = spelare1; } // kod för att välja siffra if(/* om det är 21 */){ cout << "grattis " << senaste; } }

Visa signatur

I'm Winston Wolfe. I solve problems.

Permalänk
Medlem
Skrivet av matti4s:

Sätt en sträng som ändras från den ena till den andra spelaren varje gång man väljer en siffra.

string spelare1, spelare2, senaste; while(/* villkor */){ if(senaste = spelare1){ cout << "Nu är det "<< spelare2 << "s tur att välja"; senaste = spelare2; }else{ cout << "Nu är det "<< spelare1 << "s tur att välja"; senaste = spelare1; } // kod för att välja siffra if(/* om det är 21 */){ cout << "grattis " << senaste; } }

Tack som fan! Skall se till att få det här att fungera nu.

Permalänk
Medlem

Bearbetat och gjort det hela i funktioner, nu ser main satsen ut som följande.

#include <iostream> #include <iomanip> #include <ctime> #include <cstdlib> #include <stdlib.h> #include <cstring> using namespace std; void skrivmeny(); void spelasjalv(); void tvospelare(); void speladator(); void datorvinnar(); void regler(); int main() { ////// mata in data ################################################### char spela, svar; srand((unsigned)time(0)); //Seedar rand() med systemtiden //##################################################################### cout << "Vill du spela spelet21?(j/n) "; cin >> spela; //########## inledning OM svar = j, annars avsluta if (spela!='n' || spela!='N') { skrivmeny(); cout << endl << "Välj ett svarsalternativ! "; cin >> svar; if(svar=='1') { spelasjalv(); } else if(svar=='2') { tvospelare(); } else if(svar=='3') { speladator(); } else if(svar=='4') { datorvinnar(); } else if(svar=='5') { regler(); } else if(svar=='0') { cout << "Ha det bra!"; } } }

Problemet ligger nu i den här void satsen.

void tvospelare() { int summa=0, spelaretal, vilken; char namn1[20], namn2[20], senaste[20]; { cout << "Ange namnet på spelare1: "; // namn på spelare 1 cin >> namn1; cout << "Ange namnet på spelare2: "; // namn på spelare 2 cin >> namn2; cout << "Skall " << namn1 << " eller " << namn2 << " börja? (ange 1 för " << namn1 << " och 2 för " << namn2 <<"): "; cin >> vilken; if(vilken==1) { senaste[20]=namn1[20]; } else if(vilken==2) { senaste[20]=namn2[20]; } cout << endl << endl << namn1 << " kommer nu att möta " << namn2 << " i spelet 21, var beredda!" << endl; // två spelare cout << endl << endl << "============================================" << endl << endl; // snygghet while(summa<21) { if(senaste[20]==namn1[20]) { cout << "Nu är det din tur " << namn1 << ". Vad väljer du? "; cin >> spelaretal; summa=summa+spelaretal; senaste[20]=namn2[20]; } if(senaste[20]==namn2[20]) { cout << "Nu är det din tur " << namn1 << ". Vad väljer du? "; cin >> spelaretal; summa=summa+spelaretal; senaste[20]=namn1[20]; } } if(summa==21) { cout << "Summan är nu 21!! " << senaste << " har vunnit!" <<endl; // skriver ut vinnaren } } }

Där den hoppar av cin >> spelartal och endast skriver ut Nu är det din tur " << namn1 << ". Vad väljer du? "; ett flertal gånger. Vad kan det bero på ?

Permalänk
Medlem
Skrivet av AIIN:

Där den hoppar av cin >> spelartal och endast skriver ut Nu är det din tur " << namn1 << ". Vad väljer du? "; ett flertal gånger. Vad kan det bero på ?

C++ FAQ har svaret. Det ligger helt enkelt icke-siffror kvar i input-buffern från tidigare text-inmatning från användaren, så du måste rensa den för att användaren ska kunna skriva in ett tal korrekt.

Permalänk
Medlem
Skrivet av perost:

C++ FAQ har svaret. Det ligger helt enkelt icke-siffror kvar i input-buffern från tidigare text-inmatning från användaren, så du måste rensa den för att användaren ska kunna skriva in ett tal korrekt.

Tack det löste det. Dock så verkar det inte som att senaste[20]=namn2[20];, då den inte byter till den andra if satsen.

Permalänk
Medlem

Länge sen jag höll på med c++

Men kanske kan hjälpa om jag kommer ihåg rätt..
När du tilldelar char array värde:

chararray[20]=chararray2[20]

detta betyder "char på position 20 i chararray" = "char på position 20 i chararray2"

så om du vill att hela arrayen ska bli lika med den andra skippa [] och innan kan man behöva tömma arrayen så det inte ligger skräp kvar om arrayerna är olika långa.

på samma sätt när du gör jämförelser.

if(chararray1[20]==chararray2[20])

så jämför du bara om det är samma char på denna position i resp. arary

Och sen behöver inte summan vara 21 vid sista if-satsen kan vara 22 också.

hoppas du kan få någon hjälp av detta.

Permalänk
Medlem
Skrivet av hellhell:

Länge sen jag höll på med c++

Men kanske kan hjälpa om jag kommer ihåg rätt..
När du tilldelar char array värde:

chararray[20]=chararray2[20]

detta betyder "char på position 20 i chararray" = "char på position 20 i chararray2"

så om du vill att hela arrayen ska bli lika med den andra skippa [] och innan kan man behöva tömma arrayen så det inte ligger skräp kvar om arrayerna är olika långa.

på samma sätt när du gör jämförelser.

if(chararray1[20]==chararray2[20])

så jämför du bara om det är samma char på denna position i resp. arary

Och sen behöver inte summan vara 21 vid sista if-satsen kan vara 22 också.

hoppas du kan få någon hjälp av detta.

Jo har också tänkt att det blir bokstaven då jag använder [20] men när jag tar bort det, så får jag;

error C2106: '=' : left operand must be l-value

Permalänk
Medlem

Eftersom du använder C++ så borde du använda string-klassen istället för arrayer av chars (även kallat C-strängar). Här har du en kort genomgång av hur string fungerar, och här kan du se vilka metoder klassen har. Kortfattat så fungerar string som du tror att strängar fungerar, medan C-strängar inte gör det.

Du kan nämligen inte bara kopiera C-strängar genom att göra c_string1 = c_string2, eftersom de är arrayer. Du kan inte heller bara jämföra dem rakt av heller. Istället så får du använda t.ex. funktionerna strcpy och strcmp i cstring-headers, eller ännu hellre strncpy och strncmp för att undvika buffer overflows och liknande hemska saker.

Men som sagt, använd string istället. Du borde fortfarande lära dig hur arrayer fungerar då det är bra att kunna (fast istället för arrayer så bör du i C++ använda t.ex. vector eller list), men som nybörjare så är det betydligt enklare att använda string som redan löst alla problem du annars kommer råka ut för.

Edit: Förresten, du behöver inte inkludera både stdlib.h och cstdlib. stdlib.h är en standard C-header som i C++ istället heter cstdlib för att markera att det är en C-header. Här har du en bra överblick över alla standard-headers i C++. När det gäller standard headers i C++ så slutar de aldrig med .h, fast det gäller givetvis inte icke-standard headers.

Permalänk
Medlem

Verkar lite onödigt att kopiera en char array fram och tillbaka, bättre att köra en int eller dylikt för att hålla koll på spelare, sen köra en if sats för att skriva ut spelare 1 eller 2. Vilket påminner om vad jag skrev innan om att använda en bool.

int senaste = 0; // 0 = spelare 1 ... if(senaste == 0) { // gör grejer för spelare 1 ... senaste = 1; // byt spelare } if(senaste == 1) { // gör grejer för spelare 2 ... senaste = 0; // byt spelare }

Personligen tycker jag det verkar bökigt på nuvarande sätt, dock så krävs det nån extra ifsats på det här sättet. Annars som tidigare skrev, strängar är trevliga, speciellt om du kör en array med dem.

typ:
string spelare[x];
spelare[x1] = "blalblalblablabla";
spelare[x2] = "bababa2";
då kan du köra typ:
cout << spelare[senaste] << " vann";

rätta mig om jag har fel, var år sen jag satt med c++. ^^