Permalänk
Medlem

Hjälp med Yatzyspel i c++

Hej!
Jag försöker göra ett Yatzy spel i c++ och jag har stött på ett mycket irriterande problem.

Här är min kod hittils:

#include <iostream> #include <conio.h> #include <ctime> using namespace std; int tarningslag(int max=6) { int tarning; tarning=rand()%max+1; return(tarning); } void omslag(int *tarning) { int antal_omslag, *omslag=new int; cout << endl << endl << "Vilka tärningar vill du slå om?"; for(antal_omslag=0; antal_omslag<5 && cin >> *(omslag+antal_omslag); antal_omslag++) //Läser in vilka tärningar som ska slås om. Kan inte slå om fler tärningar än det finns ; //Tärningarna som angavs slås om for(int i=0; i<antal_omslag; i++) *(tarning+(*omslag+i-1))=tarningslag(); } int main() { srand((unsigned)time(0)); int *tarning=new int, antal_omslag; char omslag_val; //Tarningslag skapas for(int i=0; i<5; i++) *(tarning+i)=tarningslag(); //Skriver ut tärningsresultaten och frågar om omslag for(int j=0; j<3; j++) { for(int i=0; i<5; i++) //Skriver ut tärning cout << endl << *(tarning+i); cout << endl << "Vill du slå om tärningarna?"; cin >> omslag_val; if(omslag_val=='j' || omslag_val=='J') omslag(tarning); else { cout << endl << "Du valde att inte slå om"; break; } } cout << endl << "fortsättning..."; getch(); }

När jag använder ctrl + d för att avbryta loopen på rad 18 som läser in vilka tärningar som ska slås om så vägrar programmet att läsa in nya tecken från tangentbordet. Hur löser jag detta?

Visa signatur

3770k @4,5ghz, EK-Supremacy, 2x hd 7970 @1050/1500 , 4x 4 GB corsair vengeance LP 1600 mhz, Corsair RM1000x, z77a-gd65, Samsung 840 pro 256 GB, Crucial m4 128 GB, Nzxt switch 810

Permalänk
Hedersmedlem
Skrivet av Anders127:

När jag använder ctrl + d för att avbryta loopen på rad 18 som läser in vilka tärningar som ska slås om så vägrar programmet att läsa in nya tecken från tangentbordet. Hur löser jag detta?

ctrl+d gör att cin anses ha nått slutet, vilket förhindrar framtida inläsning. Kör

cin.clear()

för att nollställa.

Permalänk
Medlem
Skrivet av Elgot:

ctrl+d gör att cin anses ha nått slutet, vilket förhindrar framtida inläsning. Kör

cin.clear()

för att nollställa.

Jag får det inte till att fungera. Det blir ingen skillnad mot förut:(

Visa signatur

3770k @4,5ghz, EK-Supremacy, 2x hd 7970 @1050/1500 , 4x 4 GB corsair vengeance LP 1600 mhz, Corsair RM1000x, z77a-gd65, Samsung 840 pro 256 GB, Crucial m4 128 GB, Nzxt switch 810

Permalänk
Hedersmedlem
Skrivet av Anders127:

Jag får det inte till att fungera. Det blir ingen skillnad mot förut:(

Om det är windows du kör är det väl ctrl + z du bör använda för att avbryta inmatning? För övrigt bör du nog se över minneshanteringen:

int *tarning=new int

allokerar en int (och den frigörs heller aldrig). Om man dessutom vet hur många element man behöver kan man klara sig med till exempel

int tarning[6]

.

Permalänk
Medlem
Skrivet av Elgot:

Om det är windows du kör är det väl ctrl + z du bör använda för att avbryta inmatning? För övrigt bör du nog se över minneshanteringen:

int *tarning=new int

allokerar en int (och den frigörs heller aldrig). Om man dessutom vet hur många element man behöver kan man klara sig med till exempel

int tarning[6]

.

Funkade om man körde max ctrl +z istället. Angående minneshanteringen har jag nu bytt ut den mot följande:

int *tarning=new int[5]

Tack för hjälpen! Återkommer om jag får fler problem.

Visa signatur

3770k @4,5ghz, EK-Supremacy, 2x hd 7970 @1050/1500 , 4x 4 GB corsair vengeance LP 1600 mhz, Corsair RM1000x, z77a-gd65, Samsung 840 pro 256 GB, Crucial m4 128 GB, Nzxt switch 810

Permalänk
Hedersmedlem
Skrivet av Anders127:

Angående minneshanteringen har jag nu bytt ut den mot följande:

int *tarning=new int[5]

Det är bättre, men om man allokerar minne bör man också frigöra det när man är färdig; det är lika bra att lära sig göra rätt från början:

delete[] tarning;

.
Det är dock onödigt komplicerat (och ineffektivt) att använda dynamisk minnesallokering om man klarar sig med små datamängder av i förväg känd storlek.

int tarning[5];

är intuitivare, snabbare och mindre lätt att missbruka (till exempel genom att glömma delete[]).