• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Losowanie kart - zadanie z książki C++

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
1,363 wizyt
pytanie zadane 13 czerwca 2016 w C i C++ przez SebekMakaron Obywatel (1,290 p.)

Oto treść zadania:

"Rozdaj użytkownikowi pięć kart, pozwól mu dobrać nowe karty" - (skrócona wersja)

A dokładniej chodzi mi o to ażeby ktoś pomógł mi wymyślić kod na sprawdzenie czy dana karta się nie powtórzyła oto mój kod na wylosowanie 5 kart.

#include <cstdlib>
#include <ctime>

using namespace std;

int karty[9] =  {2, 3, 4, 5, 6, 7, 8, 9, 10};
char figury[4] = {'J', 'Q', 'K', 'A'};
char znak[4] = {'s', 'h', 'd', 'c'};


int Losuj(){
     int liczba = rand() % 13;

     return liczba;
}

int main()
{
    srand(time(NULL));
    int karta, lZnak;

     for(int i = 0; i < 5; i++){
          karta = Losuj();
          lZnak = (Losuj() +4) % 4;

          if(karta < 9){
               cout<<karty[karta]<<znak[lZnak]<<" ";
          }
          else {
               karta -= 9;
               cout<<figury[karta]<<znak[lZnak]<<" ";
          }
     }

    return 0;
}

Oczywiście nie jestem pewien czy mój kod w ogóle cokolwiek jest warty w tym oto zadaniu więc także porosił bym o komentarz na temat tego kodu.

A jeśli to możliwe napisanie poprawnego kodu według Ciebie. :)

komentarz 13 czerwca 2016 przez Bondrusiek Maniak (61,440 p.)
Dodałbym do Twojego kodu na wstęp bibliotekę

#include <iostream>

odpowiedzialną za wyświetlanie i pobieranie strumieni.
komentarz 13 czerwca 2016 przez MetRiko Nałogowiec (37,110 p.)

Patrząc wstępnie na kod mogę wywnioskować, że nie ma sensu tworzyć dwóch osobnych tablic.. mówię o int karty[9] oraz char figury[4]. Zrób z tego jedną tablicę a do figur odwołuj się poprzez ID tj. od 11 w górę to już nie będą liczby tylko właśnie figury, a każda będzie miała swoje ID. Coś w stylu 11-J 12-Q 13-K 14-A Tylko oczywiście o jeden mniej (tablicę indeksuje się od zera)

2 odpowiedzi

+1 głos
odpowiedź 13 czerwca 2016 przez MetRiko Nałogowiec (37,110 p.)
wybrane 14 czerwca 2016 przez SebekMakaron
 
Najlepsza

Masz tutaj ode mnie zdrowo przekombinowany kod do tego zadania.. taki bonus :D

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

const unsigned int TAB_SIZE=4*(9+4);

struct c_Gracz
{
    bool Karty[TAB_SIZE];
    int PosiadaneKarty[TAB_SIZE];
    int IloscPosiadanychKart;

    c_Gracz():Karty{false},IloscPosiadanychKart(-1){;}

    void Losuj()
    {
        int temp;
        do temp=rand()%TAB_SIZE; while(Karty[temp]);
        Karty[temp]=true;
        IloscPosiadanychKart++;
        PosiadaneKarty[IloscPosiadanychKart]=temp;
    }
    void CzytajKarte(int ID)
    {
        static string Figury[13]={"2","3","4","5","6","7","8","9","10","J","D","K","A"};
        static string Znaki[4]={"Kier","Karo","Trefl","Pik"};
        cout<<Figury[ID%13]<<":"<<Znaki[ID/13];
    }
    void WypiszPosiadaneKarty()
    {
        cout<<"Posiadane karty: ";
        for(int i=0; i<IloscPosiadanychKart; i++)
        {
            CzytajKarte(PosiadaneKarty[i]); cout<<" ";
        }
    }
    bool SprawdzKarte(int ID)
    {
        return PosiadaneKarty[ID];
    }
};

int main()
{
    srand(time(NULL));
    c_Gracz Gracz;
    for(int i=0; i<5; i++) Gracz.Losuj();

    Gracz.WypiszPosiadaneKarty();

    cin.get();
}

 

1
komentarz 14 czerwca 2016 przez SebekMakaron Obywatel (1,290 p.)
Nie chciałbym spamować i pod każdym komentarzem dziękować więc DZIĘKUJĘ bardzo wszystkim przeanalizuje wasz kod na spokojnie porównam z moimi umiejętnościami i wysunę wnioski DZIĘKUJĘ JESZCZE RAZ WSZYSTKIM :)
+2 głosów
odpowiedź 13 czerwca 2016 przez Bondrusiek Maniak (61,440 p.)

Witam,

zamieniłem int na char oraz pozbyłem się zmiennych globalnych.

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;




int Losuj(){
     int liczba = rand() % 13;

     return liczba;
}

int main()
{
    char znak[4] = {'s', 'h', 'd', 'c'};

    char karty[13] =  {'2', '3', '4', '5', '6', '7', '8', '9', '10','J','Q','K','A'};

    srand(time(NULL));
    int karta, lZnak;

     for(int i = 0; i < 5; i++){
          karta = Losuj();
          lZnak = (Losuj()) % 4;

          if(karta < 13){

             cout<< karty[karta] << znak[lZnak]<<" ";
          }

     }

    return 0;
}

 

komentarz 13 czerwca 2016 przez MetRiko Nałogowiec (37,110 p.)
Mała poprawka.. zamień tablicę char karty na string.. Dziesiątki nie wpiszesz w chara :D Ostatecznie można też zrobić warunek, że ma wypisywać 10 jeżeli jest równe 0.
komentarz 13 czerwca 2016 przez Bondrusiek Maniak (61,440 p.)
fakt nie zwróciłem na to uwagi, plus

Podobne pytania

+2 głosów
2 odpowiedzi 3,723 wizyt
pytanie zadane 14 lipca 2015 w C i C++ przez Wadim Początkujący (260 p.)
0 głosów
3 odpowiedzi 2,415 wizyt
pytanie zadane 21 czerwca 2015 w C i C++ przez szymonn7 Początkujący (350 p.)
0 głosów
2 odpowiedzi 634 wizyt
pytanie zadane 30 listopada 2018 w C i C++ przez Michał_Warmuz Mądrala (5,830 p.)

93,440 zapytań

142,431 odpowiedzi

322,678 komentarzy

62,802 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...