Permalänk

Kortspel C++ (Array kortlek)

Hejsan forumet!!!

Ja jag sitter med C++. Håller på med en kortlek där EN array skall representera en kortlek. Kortleken går ut på att man skall blanda en kortlek och sedan skall max sex kort dras, tre till spelaren och tre till datorn. Bäst av tre gäller. Just nu sitter jag fast hur jag skall skapa en array just för kortleken. Koden nedan fungerar tills man kommer till card(); där kortleken skapas och skall föras in i arrayen som är tvådimensionell. När jag kör programmet "kraschar" själva programmeringsprogrammet. Varför gör den det och vad orsakar problemet? Testa så får ni se!
Kan inte se vad fel är i koden iallafall. Har ni bättre förslag hur det skall genomföras är det välkommet.

Spelet börjar med en huvudmeny där spelaren frågas om den vill börja spela sedan hoppar programmet vidare till funktionen card(); som skall skapa kortleken. Just nu har jag programmerat så att den skall skriva ut hela kortleken. Tanken är sedan att finna ett sätt att blanda kortleken via en rand funktion som skall kasta om arrayens positioner slumpmässigt.

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

// Globala Variabler
int deckofcards[4][13]; //Array kortlek
int suits[4]; // Array för färg på korten
int value[13]; // Array för kortens valörer
int computer[3]; // array för spelarens dragna kort
int player[3]; // array för datorns dragna kort
int computercard;
int playercard;
int cardplayer;
int cardcomputer;
char answer;

// Funktioner
void startmeny();
void cards();
void playagain();

int main(){

int playerpoints;
int computerpoints;
int won = 0;
int lost = 0;

startmeny();
cards();

cout<< " |---------- ROUND 1 ----------| " <<endl;

cout<< " Your card: " << player[1] <<endl;
cout<< " Computer card: " << computercard <<endl;

if(playercard > computercard){
cout << " You Won !!! " <<endl;
won++;
cout << " You have won: " << won << " times. " <<endl;
cout << " You have lost: " << lost << " times. " <<endl;
}

else if (playercard < computercard){
cout << " YOU LOST!!! " <<endl;
lost++;
cout << " You have won: " << won << " times. " <<endl;
cout << " You have lost: " << lost << " times. " <<endl;
}

else if (playerpoints == computerpoints){
cout << " It's a Draw " <<endl;
cout << " You have won: " << won << " times. " <<endl;
cout << " You have lost: " << lost << " times. " <<endl;
}

cout<< " |---------- RESULT ----------| " <<endl;
if(playerpoints > computerpoints){
cout << " YOU WON THE GAME!!! " <<endl;
won;
cout << " You have won: " << won << " times. " <<endl;
cout << " You have lost: " << lost << " times. " <<endl;
}

else if (playerpoints < computerpoints){
cout << " YOU LOST THE GAME !!! " <<endl;
lost;
cout << " Du har vunnit: " << won << " times. " <<endl;
cout << " You have lost: " << lost << " times. " <<endl;
}

else if (playerpoints == computerpoints){
cout << " THE GAME IS A DRAW !!! :S " <<endl;
cout << " You have won: " << won << " times. " <<endl;
cout << " You have lost: " << lost << " times. " <<endl;
}

playagain();

cin.get();
cin.ignore();

}//main

// FUNKTIONER
void cards(){ // Skapa kortleken
int x;
int y;

string suits[4];
string value[13];
string deckofcards[4][13]; // Arrayen "kortleken" skapas via suits och value

suits[1] = "Clubs";
suits[2] = "Diamonds";
suits[3] = "Hearts";
suits[4] = "Spades";

value[1] = "2";
value[2] = "3";
value[3] = "4";
value[4] = "5";
value[5] = "6";
value[6] = "7";
value[7] = "8";
value[8] = "9";
value[9] = "10";
value[10] = "Jack";
value[11] = "Queen";
value[12] = "King";
value[13] = "Aces";

for(x = 0 ; x < 4; x++){
for(y = 0; y < 13; y++){
deckofcards[x][y] = suits[x] + value[y]; // lägga in korten i ordning
}
}

for(x = 0; x < 4; x++){
for(y = 0; y < 13; y++){
cout<< deckofcards[x][y] + ' ' <<endl;//skriva ut kortleken
}
}

}

void startmeny(){
char answer;
do{
cout<< " THE CARDGAME! " <<endl;
cout<< " Turn the cards and see if you win, best of three! " <<endl;
cout<< " Do you want to play? (Y/N) " <<endl <<endl;
cin>> answer;
}while((answer != 'y') && (answer != 'Y'));
}

void playagain(){

char playagain; // variabeln for val for spela igen
cout<< " Want to play the game again? (Y/N) " <<endl;
cin>> playagain; // variabeln for val for spela igen
}

Permalänk
Avstängd

C++ är ett objektsorienterat språk, så du borde skapa ett antal klasser för att wrappa (slå in) diverse funktionalitet. Dessutom så borde du använda
[ CODE ][ /CODE ] taggar

Visa signatur
Permalänk
Skrivet av Ryuk00:

C++ är ett objektsorienterat språk, så du borde skapa ett antal klasser för att wrappa (slå in) diverse funktionalitet. Dessutom så borde du använda
[ CODE ][ /CODE ] taggar

Okej, vad innebär det i mitt fall?

Permalänk
Datavetare

Du har "off-by-one" fel i din kod, index börjar på 0 inte på 1 i de flesta C-style språk.

suits[0] = "Clubs"; suits[1] = "Diamonds"; suits[2] = "Hearts"; suits[3] = "Spades"; value[0] = "2"; value[1] = "3"; value[2] = "4"; value[3] = "5"; value[4] = "6"; value[5] = "7"; value[6] = "8"; value[7] = "9"; value[8] = "10"; value[9] = "Jack"; value[10] = "Queen"; value[11] = "King"; value[12] = "Aces";

Men detta går att skriva ännu enklare (antar att du använder Visual C++ eller en modern g++, detta är C++11 syntax)

string suits{"Clubs", "Diamonds", "Hearts", "Spades" }; string value{"2","3","4","5","6","7","8","9","10","Jack","Queen","King","Aces"};

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Cosmo pope:

Okej, vad innebär det i mitt fall?

Det innebär att du istället för att ha diverse arrayer av heltal hit och dit borde bryta ut ex. allt som representerar ett kort till en klass Card, så att du kan ha arrayer av Card:s istället. Samt skulle du kunna ha en klass Deck som lagrar denna array av Card:s för att sedan kunna ha funktionerna shuffle() resp. draw() (kuppera en kortlek resp. dra ett kort).
Anledningen till detta är att det blir mycket enklare för dig att sedan implementera din spellogik om du bryter ut dessa "logiska enheter" till separata klasser än om du ska försöka ha allt lagrat som primitiver direkt.

Ex. på hur en början på vad du håller på med skulle kunna se ut:

#include <iostream> #include <algorithm> #include <exception> #include <vector> #include <string> //names of suites and values const std::string CARD_SUITES[] = {"Clubs", "Diamonds", "Hearts", "Spades"}; const std::string CARD_VALUES[] = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"}; //Exceptions for invalid suites and values class InvalidSuite : public std::exception { virtual const char* what() const throw() { return "Invalid suite"; } }; class InvalidValue : public std::exception { virtual const char* what() const throw() { return "Invalid value"; } }; //A Card class Card { private: int suite;//0-3, CLUBS,DIAMODS,HEARTS,SPADES int value;//2-14 (two - ace) public: Card(int suite, int value); int compareTo(const Card &c) const; friend bool operator<(const Card& c, const Card& c2); friend bool operator>(const Card& c, const Card& c2); friend std::ostream& operator<<(std::ostream& os, const Card& c); }; Card::Card(int suite, int value) { if(suite<0 || suite>3) { throw InvalidSuite(); } if(value<2 || value>14) { throw InvalidValue(); } this->suite = suite; this->value = value; } int Card::compareTo(const Card &c) const { return this->value-c.value; } bool operator<(const Card& c, const Card& c2) { return c.compareTo(c2)<0; } bool operator>(const Card& c, const Card& c2) { return c.compareTo(c2)>0; } std::ostream& operator<<(std::ostream& os, const Card& c) { os << CARD_VALUES[c.value-2]<<" of "<< CARD_SUITES[c.suite]; return os; } class Deck { private: std::vector<Card> cards; unsigned int idx; public: Deck(); void shuffle(); void print(); Card draw(); }; Deck::Deck() { this->idx = 0; for(int suite=0; suite<=3; suite++) { for(int card=2; card<=14; card++) { this->cards.push_back(Card(suite,card)); } } } void Deck::shuffle() { std::random_shuffle ( this->cards.begin(), this->cards.end() ); } void Deck::print() { for(unsigned int i=0; i<this->cards.size(); i++) { std::cout<<cards.at(i)<<std::endl; } } Card Deck::draw() { if(idx >= this->cards.size()) { this->shuffle(); idx=0; } return this->cards.at(idx++); } int main(int argc,char* argv[]) { std::srand(time(NULL)); Deck deck; deck.shuffle(); //deck.print(); Card playerCard = deck.draw(); Card computerCard = deck.draw(); std::cout << "Your card: "<<playerCard<<std::endl; std::cout << "Computer card: "<<computerCard<<std::endl; if(playerCard<computerCard) { std::cout << "Loser"<<std::endl; } else if(playerCard>computerCard) { std::cout << "Winner"<<std::endl; } else { std::cout << "Draw"<<std::endl; } return 0; }

Dold text
Visa signatur

The difference between stupidity and genius - the latter has limits

Permalänk
Medlem
Skrivet av Ryuk00:

C++ är ett objektsorienterat språk, så du borde skapa ett antal klasser för att wrappa (slå in) diverse funktionalitet. Dessutom så borde du använda
[ CODE ][ /CODE ] taggar

Såvitt jag vet tvingar inte C++ till objektorientering, vilket kan göra det till överkurs beroende på TS mål med programmet.

Det skulle antagligen underlätta för TS att använda en endimensionell array där kort 0-12 representerar klöver, 13-25 ruter osv. Och som tidigare nämnt, antagligen är det Off-By-One-Error som triggar kraschen.

Du har också duplicerad kod i if-satsen för resultatet som går att undvika.

Visa signatur

Desktop: | Win10 | InWin 303 | ASUS TUF X570 | AMD Ryzen 5 3600 | Noctua NH-U12S (PP) | Intel 600p 256GB | Gigabyte GTX 670 | 32GB DDR4 2400Mhz | Corsair RM650x | 3x 1080 Screens |
Datacenter: | 1x Physical | 1x Virtual |
Laptop: | 2x |

Dell Certified Technician

Permalänk
Avstängd
Skrivet av JamesBanana:

Såvitt jag vet tvingar inte C++ till objektorientering, vilket kan göra det till överkurs beroende på TS mål med programmet.

Det skulle antagligen underlätta för TS att använda en endimensionell array där kort 0-12 representerar klöver, 13-25 ruter osv. Och som tidigare nämnt, antagligen är det Off-By-One-Error som triggar kraschen.

Du har också duplicerad kod i if-satsen för resultatet som går att undvika.

Självklart är det inte ett måste att använda objekt, men jag skulle vilja påstå det motsatta. Att det blir bra mycket lättare att utveckla hans lösning med hjälp av objektorientering - vilket är hela poängen. Men visst tar det tid att lära sig.

Visa signatur
Permalänk
Skrivet av JamesBanana:

Såvitt jag vet tvingar inte C++ till objektorientering, vilket kan göra det till överkurs beroende på TS mål med programmet.

Det skulle antagligen underlätta för TS att använda en endimensionell array där kort 0-12 representerar klöver, 13-25 ruter osv. Och som tidigare nämnt, antagligen är det Off-By-One-Error som triggar kraschen.

Du har också duplicerad kod i if-satsen för resultatet som går att undvika.

Off-By-One-Error var felet, självklart :P.
Men enligt kraven för uppgiften är att skapa en array som representerar kortleken och en annan för de kort som dragits.

Permalänk

Visst, det är kanske smidigare att lösa det med klasser, men tipset är dessvärre inte så hjälpsamt i detta fall. Det är lite som att tipsa någon som försöker lära sig att gå att istället ta cykeln för att det går snabbare. En sak i taget! Så mitt råd till TS är att inte börja blanda in klasser förrän du har koll på det du håller på med nu. Det är fullt möjligt att göra det du försöker göra utan klasser.

En annan sak som gör att programmet inte körs är att du använder variablerna playerpoints och computerpoints när du ska presentera resultatet, utan att de satts till något värde.

Permalänk
Medlem
Skrivet av Ryuk00:

Självklart är det inte ett måste att använda objekt, men jag skulle vilja påstå det motsatta. Att det blir bra mycket lättare att utveckla hans lösning med hjälp av objektorientering - vilket är hela poängen. Men visst tar det tid att lära sig.

Jag skulle ha hållt med i andra språk, men har personligen aldrig riktigt förstått C++ objektorientering. Den känns inte logisk på något vis. Jävligt störande när man snart ska vara examinerad systemutvecklare

Visa signatur

Desktop: | Win10 | InWin 303 | ASUS TUF X570 | AMD Ryzen 5 3600 | Noctua NH-U12S (PP) | Intel 600p 256GB | Gigabyte GTX 670 | 32GB DDR4 2400Mhz | Corsair RM650x | 3x 1080 Screens |
Datacenter: | 1x Physical | 1x Virtual |
Laptop: | 2x |

Dell Certified Technician

Permalänk
Avstängd
Skrivet av JamesBanana:

Jag skulle ha hållt med i andra språk, men har personligen aldrig riktigt förstått C++ objektorientering. Den känns inte logisk på något vis. Jävligt störande när man snart ska vara examinerad systemutvecklare

Låter oroväckande :S

Visa signatur
Permalänk

Okej programmet fungerar bra än så länge

Håller på med att försöka blanda kortleken nu men får ut samma värde tydligen talet 10. Hur kommer det sig?
Funktionen som skall blanda kortleken heter "void shufflethecards()"

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

// Globala Variabler
int deckofcards[4][13];
int suits[4];
int value[4];
int computer[3];
int player[3];
int computercard;
int playercard;
int cardplayer;
int cardcomputer;
char answer;

// Funktioner
void cards();
void shufflethecards();
void startmeny();
int playagain();

int main(){

int playerpoints;
int computerpoints;
int won = 0;
int lost = 0;

startmeny();
cards();
shufflethecards();

cout<< " |---------- ROUND 1 ----------| " <<endl;

cout<< " Your card: " << player[1] <<endl;
cout<< " Computer card: " << computercard <<endl;

if(playercard > computercard){
cout << " You Won !!! " <<endl;
won++;
cout << " You have won: " << won << " times. " <<endl;
cout << " You have lost: " << lost << " times. " <<endl;
}

else if (playercard < computercard){
cout << " YOU LOST!!! " <<endl;
lost++;
cout << " You have won: " << won << " times. " <<endl;
cout << " You have lost: " << lost << " times. " <<endl;
}

else if (playerpoints == computerpoints){
cout << " It's a Draw " <<endl;
cout << " You have won: " << won << " times. " <<endl;
cout << " You have lost: " << lost << " times. " <<endl;
}

cout<< " |---------- RESULT ----------| " <<endl;
if(playerpoints > computerpoints){
cout << " YOU WON THE GAME!!! " <<endl;
won;
cout << " You have won: " << won << " times. " <<endl;
cout << " You have lost: " << lost << " times. " <<endl;
}

else if (playerpoints < computerpoints){
cout << " YOU LOST THE GAME !!! " <<endl;
lost;
cout << " Du har vunnit: " << won << " times. " <<endl;
cout << " You have lost: " << lost << " times. " <<endl;
}

else if (playerpoints == computerpoints){
cout << " THE GAME IS A DRAW !!! :S " <<endl;
cout << " You have won: " << won << " times. " <<endl;
cout << " You have lost: " << lost << " times. " <<endl;
}

playagain();

cin.get();
cin.ignore();

}//main

// FUNKTIONER

void cards(){
int x;
int y;

string suits[] = {"Clubs", "Diamonds", "Hearts", "Spades"};
string value[] = {"2","3","4","5","6","7","8","9","10","Jack","Queen","King","Aces"};
string deckofcards[4][13];

for(x = 0 ; x < 4; x++){
for(y = 0; y < 13; y++){
deckofcards[x][y] = suits[x] + value[y]; // lägga in korten i ordning
}
}

/*for(x = 0; x < 4; x++){
for(y = 0; y < 13; y++){
cout<< deckofcards[x][y] + '\n' <<endl; //skriver ut kortleken
}
}*/

}

void shufflethecards(){ //blanda kortleken

srand(time(0));
int i;
int j;
int temp;
int x;
int y;

for (x = 0 ; x < 4 ; x++){

for (y = 0 ; y < 13 ; y++){

i = rand() % 4; // ex. slumptal 3 = "Hearts"
j = rand() % 13; // ex. slumtal 6 = "7"

temp = deckofcards[x][y]; // temp = 1,1
deckofcards[x][y] = deckofcards[i][j]; // 1,1 = 3,4 = "Hearts", "7"
deckofcards[i][j] = temp; // 3,4 = 1,1

cout<< deckofcards[i][j] + '\n' <<endl; //skriver ut den blandade kortleken
}

/*for(i = 0; i < 4; i++){
for(j = 0; j < 13; j++){
cout<< deckofcards[i][j] + '\n' <<endl; //skriver ut den blandade kortleken
}
}*/

}
}

void startmeny(){
char answer;
do{
cout<< " THE CARDGAME! " <<endl;
cout<< " Turn the cards and see if you win, best of three! " <<endl;
cout<< " Do you want to play? (Y/N) " <<endl <<endl;
cin>> answer;
}while((answer != 'y') && (answer != 'Y'));
}

int playagain(){

char playagain; // variabeln for val for spela igen
cout<< " Want to play the game again? (Y/N) " <<endl;
cin>> playagain; // variabeln for val for spela igen
}

Permalänk

Yater-fisher shuffle med array

Halloj Forumet,

Håller på med ett kortspel just nu har jag problem med att slumpa korten i arrayen. Använder en algoritm som kallar Yater-fisher shuffle. Men den verkar inte fungera och jag kan inte se vad strular i koden. När jag skriver ut den blandade kortleken får jag ut siffran 10 (52 st). Vad gör jag för fel?

#include <iostream> #include <ctime> #include <string> #include <cstring> #include <vector> using namespace std; // Globala Variabler int deckofcards[52]; int computer[3]; int player[3]; int computercard; int playercard; int cardplayer; int cardcomputer; char answer; // Funktioner void cards(); void shufflethecards(); void startmeny(); int playagain(); int main(){ int playerpoints; int computerpoints; int won = 0; int lost = 0; startmeny(); cards(); shufflethecards(); cout<< " |---------- ROUND 1 ----------| " <<endl; cout<< " Your card: " << player[1] <<endl; cout<< " Computer card: " << computercard <<endl; if(playercard > computercard){ cout << " You Won !!! " <<endl; won++; cout << " You have won: " << won << " times. " <<endl; cout << " You have lost: " << lost << " times. " <<endl; } else if (playercard < computercard){ cout << " YOU LOST!!! " <<endl; lost++; cout << " You have won: " << won << " times. " <<endl; cout << " You have lost: " << lost << " times. " <<endl; } else if (playerpoints == computerpoints){ cout << " It's a Draw " <<endl; cout << " You have won: " << won << " times. " <<endl; cout << " You have lost: " << lost << " times. " <<endl; } cout<< " |---------- RESULT ----------| " <<endl; if(playerpoints > computerpoints){ cout << " YOU WON THE GAME!!! :D " <<endl; won; cout << " You have won: " << won << " times. " <<endl; cout << " You have lost: " << lost << " times. " <<endl; } else if (playerpoints < computerpoints){ cout << " YOU LOST THE GAME !!! :( " <<endl; lost; cout << " Du har vunnit: " << won << " times. " <<endl; cout << " You have lost: " << lost << " times. " <<endl; } else if (playerpoints == computerpoints){ cout << " THE GAME IS A DRAW !!! :S " <<endl; cout << " You have won: " << won << " times. " <<endl; cout << " You have lost: " << lost << " times. " <<endl; } playagain(); cin.get(); cin.ignore(); }//main // FUNKTIONER void cards(){ string deckofcards[] = {"Clubs 2", "Clubs 3", "Clubs 4", "Clubs 5", "Clubs 6", "Clubs 7", "Clubs8", "Clubs9", "Clubs 10", "Clubs Jack", "Clubs Queen", "Clubs King", "Clubs Aces", "Diamonds 2", "Diamonds 3", "Diamonds 4", "Diamonds 5", "Diamonds 6", "Diamonds 7", "Diamonds 8", "Diamonds 9", "Diamonds 10", "Diamonds Jacks", "Diamonds Queen", "Diamonds King", "Diamonds Aces", "Hearts 2", "Hearts 3", "Hearts 4", "Hearts 5", "Hearts 6", "Hearts 7", "Hearts 8", "Hearts 9", "Hearts 10", "Hearts Jack", "Hearts Queen", "Hearts King", "Hearts Aces", "Spades 2", "Spades 3", "Spades 4", "Spades 5", "Spades 6", "Spades 7", "Spades 9", "Spades 10", "Spades Jack", "Spades Queen", "Spades King", "Spades Aces"}; //for(int x = 0; x < (52 - 1) ; x++){ //cout<< deckofcards[x] + '\n' <<endl; //skriver ut kortleken //} } void shufflethecards(){ //blanda kortleken srand(time(0)); int x; int i; int temp; for (x = 0 ; x < (52 - 1) ; x++){ i = x + rand() % (52 - 1); // ex. slumptal 3/ i = 1+3 =4 // Fisher–Yates shuffle temp = deckofcards[x]; // temp = 1 deckofcards[x] = deckofcards[i]; // 1 = 4 = "Club", "6" deckofcards[i] = temp; // 4 = temp } for(int i = 0; i < (52 - 1); i++){ cout<< deckofcards[i] + '\n' <<endl; //skriver ut den blandade kortleken } } void startmeny(){ char answer; do{ cout<< " THE CARDGAME! " <<endl; cout<< " Turn the cards and see if you win, best of three! " <<endl; cout<< " Do you want to play? (Y/N) " <<endl <<endl; cin>> answer; }while((answer != 'y') && (answer != 'Y')); } int playagain(){ char playagain; // variabeln for val for spela igen cout<< " Want to play the game again? (Y/N) " <<endl; cin>> playagain; // variabeln for val for spela igen }

Redigerar in [code]-taggar så att koden är läsbar.
Permalänk
Medlem

Du gör mer än ett fel, men sånt händer när man lär sig. Några små hintar utan att sabba allt det roliga:

Om du får utskrifter som du inte väntar dig, titta på kodraden som gör utskriften. Vad säger den att den ska skriva ut?

Om något inte fungerar, försök att lista ut hur långt programmet gör vad det ska. Är du verkligen säker på att det är i samband med “Yater-fisher shuffle” som det går fel?

Vad tror du att cards() gör?

Vad är deckofcards för variabel/variabler? Var finns den? Vilken typ innehåller den?

Permalänk
Skrivet av fourbyfour:

Du gör mer än ett fel, men sånt händer när man lär sig. Några små hintar utan att sabba allt det roliga:

Om du får utskrifter som du inte väntar dig, titta på kodraden som gör utskriften. Vad säger den att den ska skriva ut?

Om något inte fungerar, försök att lista ut hur långt programmet gör vad det ska. Är du verkligen säker på att det är i samband med “Yater-fisher shuffle” som det går fel?

Vad tror du att cards() gör?

Vad är deckofcards för variabel/variabler? Var finns den? Vilken typ innehåller den?

Okej... mer än ett fel är det säkert

Utskriften ville skriva ut sjätte platsen i arrayen som jag hade gjort för att felsöka. Om man i stället sätter in varibeln i där får man ut 52 stycken 10.

Koden fungerar fram till funktionen Shufflethecards() men inte längre iallafall.
cards() funktionen den "skapar" kortleken den kanske den inte behövs. Använde den funktionen tidigare för att skapa en 2D array tidigare.

Permalänk
Medlem
Skrivet av Cosmo pope:

Okej... mer än ett fel är det säkert

Ingen är expert från första början, så ta det steg för steg. Går inte att lösa hela världens problem på en och samma gång

Citat:

Utskriften ville skriva ut sjätte platsen i arrayen som jag hade gjort för att felsöka. Om man i stället sätter in varibeln i där får man ut 52 stycken 10.

Som koden såg ut när jag svarade skrev den ut 51 stycken exemplar av sjätte platsen i arrayen.

Citat:

Koden fungerar fram till funktionen Shufflethecards() men inte längre iallafall.
cards() funktionen den "skapar" kortleken den kanske den inte behövs. Använde den funktionen tidigare för att skapa en 2D array tidigare.

Tips: Skriv ut innehållet i deckofcards[] inuti funktionen shufflethecards() precis innan du blandar den arrayen. Skriv även ut innehållet i deckofcards[] raden innan anropet till shufflethecards(). Ser det ut som du väntat dig? Är allt tiptop så långt? Av utskrifterna att döma, var måste felet ha uppstått?

Angående cards()-funktionen - Den har ingen permanent effekt. Kan du lista ut varför?

Permalänk
Testpilot

Det räcker med en tråd om ditt kortspel, du kan inte skapa en ny tråd för varje nytt problem du stöter på. Jag har sammafogat dina trådar så håll dig till den här i framtiden.

Ett tips för felsökning är precis som fourbyfour är inne på att skriva ut dina variabler, lägg till massor av cout och skriv ut allt möjligt du kan tänka dig. Är man nyfiken på om en funktion över huvud taget anropas så lägg till en cout << "Funktion blabla anropad", skriv ut variabler innan funktionsanrop och efter. När du skrivit ut allt som går att skriva ut så kommer du i första hand kunna hitta var felet ligger, sen är det en fråga om att lösa det.

Visa signatur

Kolla gärna in min RGB-LED-ljusstake i galleriet
[Gigabyte GA-Z97MX-Gaming 5][Intel Core i5 4690K][Corsair XMS3 16GB][Asus GeForce RTX 2060 Super Dual Evo OC]

Permalänk
Medlem
Skrivet av hunden:

Ett tips för felsökning är precis som fourbyfour är inne på att skriva ut dina variabler, lägg till massor av cout och skriv ut allt möjligt du kan tänka dig. Är man nyfiken på om en funktion över huvud taget anropas så lägg till en cout << "Funktion blabla anropad", skriv ut variabler innan funktionsanrop och efter. När du skrivit ut allt som går att skriva ut så kommer du i första hand kunna hitta var felet ligger, sen är det en fråga om att lösa det.

Alternativt använda en debugger som tillåter dig att stega igenom programmet rad för rad. Då kan du även starta vid olika punkter i programmet snarare än att köra igenom hela om och om igen. Eftersom ditt program är förhållandevis litet så går det ju förstås bra med att printa ut vid selektiva ställen, som redan föreslagits, men om du ska fortsätta programmera i c++ kan det vara värt att lära sig använda en debugger.

Visa signatur

SLI Titan X - i7 5960x 8-kärnig - Asus Rampage V - 32 GB Corsair Dominator - Intel 750 2200 MB/s Pcie-disk.

Permalänk
Skrivet av fourbyfour:

Ingen är expert från första början, så ta det steg för steg. Går inte att lösa hela världens problem på en och samma gång

Som koden såg ut när jag svarade skrev den ut 51 stycken exemplar av sjätte platsen i arrayen.

Tips: Skriv ut innehållet i deckofcards[] inuti funktionen shufflethecards() precis innan du blandar den arrayen. Skriv även ut innehållet i deckofcards[] raden innan anropet till shufflethecards(). Ser det ut som du väntat dig? Är allt tiptop så långt? Av utskrifterna att döma, var måste felet ha uppstått?

Angående cards()-funktionen - Den har ingen permanent effekt. Kan du lista ut varför?

Okej prövat lite grejer som att byta datatyper osv för variabler för funktionerna och variabler och så vidare men inget som fungerar. Testat att lägga in arrayen innan blandning i shufflethecards() men det skrivs inte ut så cards() är inte permanent antagligen för att void används. Hur skall man få med sig arrayen till nästa funktion?

Permalänk
Hedersmedlem
Skrivet av Cosmo pope:

Hur skall man få med sig arrayen till nästa funktion?

Vanligast är att antingen deklarera den globalt (som du har gjort ovan) eller genom att skicka pekare till den som argument till funktionerna. Koncentrera dig dock på vad funktionen gör;
i = x + rand() % (52 - 1);
ser till exempel lite misstänkt ut. När x är 50 kommer i hamna i intervallet [50, 100]; är det verkligen meningen? Dessutom bör du bara anropa srand en gång (förslagsvis tidigt i main).

Permalänk
Medlem
Skrivet av Cosmo pope:

Okej prövat lite grejer som att byta datatyper osv för variabler för funktionerna och variabler och så vidare men inget som fungerar. Testat att lägga in arrayen innan blandning i shufflethecards() men det skrivs inte ut så cards() är inte permanent antagligen för att void används. Hur skall man få med sig arrayen till nästa funktion?

Sök på nätet och läs på om "C++ Variable Scope" till att börja med.

Sen skulle jag rekommendera en mer genomtänkt strategi än att ändra grejor på måfå utan att veta vad du gör. I värsta fall kommer du hamna med något som ser ut som att det funkar, men egentligen är fel och kommer tillbaka och biter dig senare. Grunderna är viktiga att lära sig rätt, det får ta den tid det tar.

Skrivet av Njure:

Alternativt använda en debugger som tillåter dig att stega igenom programmet rad för rad. Då kan du även starta vid olika punkter i programmet snarare än att köra igenom hela om och om igen. Eftersom ditt program är förhållandevis litet så går det ju förstås bra med att printa ut vid selektiva ställen, som redan föreslagits, men om du ska fortsätta programmera i c++ kan det vara värt att lära sig använda en debugger.

Visst skulle en debugger med fördel användas "på riktigt", men i mitt tycke bör man i alla fall ha någon form av grundförståelse för vad man sysslar med innan man ger sig på en sådan. Utskrifter är enkla att förstå, och kan hjälpa en att tänka mer på vad som händer i programmet även utan att exekvera det.

Permalänk
Skrivet av Elgot:

Vanligast är att antingen deklarera den globalt (som du har gjort ovan) eller genom att skicka pekare till den som argument till funktionerna. Koncentrera dig dock på vad funktionen gör;
i = x + rand() % (52 - 1);
ser till exempel lite misstänkt ut. När x är 50 kommer i hamna i intervallet [50, 100]; är det verkligen meningen? Dessutom bör du bara anropa srand en gång (förslagsvis tidigt i main).

Det är sant!
Har ändrat det till
x = rand() % 52 - 1;

När det gäller arrayen har den deklarerats Globalt men skall den inte fungera i alla funktioner?

Permalänk
Medlem
Skrivet av Cosmo pope:

Det är sant!
Har ändrat det till
x = rand() % 52 - 1;

Du är medveten om prioriteringen på operationerna % och - hoppas jag. Vilka värden hade du tänkt dig att x ska kunna anta?

Rent generellt med tanke på koden i sin helhet - Har du bestämt dig om du har 51 eller 52 kort i kortleken?

Citat:

När det gäller arrayen har den deklarerats Globalt men skall den inte fungera i alla funktioner?

Om den är global har du den lättåtkomlig i alla funktioner där du inte deklarerar något annat med samma namn.

Har du någon bok eller tutorial du går efter?
Om ja, berätta för oss vilken det är.
Om nej, överväg att ta en paus och gå igenom en sådan, du kommer ha stor glädje av det.

Permalänk
Medlem

Jag hade gärna skapat en enumeration för att representera respektive kort.
Kanske en klass, beror på implementationen och vad man själv känns mest bekväm med.
Kanske även både och, eller en man där man kör samma tankesätt som du tänkt.