[C++]Symulator "LOTTO" - pomoc.

0

A więc mogę powiedzieć, że od niedawna uczę się programowania może z półtory tygodnia, niedługo będę kończył kurs "Od Zera do Hackera" zaś zacznę się czytaniem Symfonii, ale do rzeczy dziś pomyślałem, że fajnie byłoby napisać symulator - "LOTTO".

Program miał za zadanie:
-Pobrać od użytkownika 6 liczb w zakresie od 1-49.
-Być zabezpieczony przed podaniem złych wartości (nie mieszczących się w zakresie, lub takich samych).
-Następnie program losował, by 6 liczb. Pokazywał wytypowane liczby przez użytkownika, po czym po naciśnięciu klawisza "ENTER" pokazywały by się wylosowane liczby.
-Następnie użytkownik miałby możliwość wprowadzenia ilości trafionych liczb - w konsekwencji czego dostawałby komunikat z kwotą wygranej.

Większość z tych rzeczy poradziłem sobie sam, lecz powiem, że stworzyłem to na zasadzie struktury tablicy z [6] liczb typu int oraz tablicy liczb do typowania. Miałem problem z niektórymi pętlami, lecz jakoś to poszło. Chciałbym abyście pomogli mi spełnić jeszcze dwa warunki programu. Gdyż zauważyłem, że program niekiedy losuje dwa takie same liczby, oraz nie potrafiłem zrobić zabezpieczenia na wprowadzenia dwóch tych samych cyfr(zrobiłem tylko na to jak nie mieszczą się w podanym zakresie). Jutro dorobię pętle, aby można ponownie uruchomić program lub zakończyć jego działanie.

Udostępnię wam kod źródłowy - abyście mieli wgląd na to.

 #include <iostream> // Udostępnia bibliotekę "isostream"
#include <conio.h> //  Udostępnia kolejną bibliotekę
#include <stdlib.h>

using namespace std;
 


int main()

{
    
    
   /*Stworzenie struktury losowanie.*/
  struct losowanie

  {

    int l[6];

    int n[4];
   };
   
     losowanie pc;
     
     
     
     int t[6];
     int n;
     int ile;
     /*Ustalenie wygranych dla danych ilości trafień*/
     pc.n[0]=10;
     pc.n[1]=4521;
     pc.n[2]=12500;
     pc.n[3]=5300000;
     
     srand(time( NULL ));
     /*Pętla losująca liczby w zakresie od "1" - "49".*/
     for(n=0;n<6;n++)
     {
         
                    
           pc.l[n]=( rand() % 49 ) + 1;
             
     }
     /*Powitalne 'Menu'*/
     cout<<"                              _____             \n";
     cout<< "                             |LOTTO|                \n";
     cout<<"                              -----"<<endl;
     
     cout<<"Witaj w symulacji gry \"LOTTO\" - zostaniesz poproszony o wypisanie szesciu liczb.";
     cout<<"Po wpisaniu  liczb, rozpocznie sie losowanie - nastepnie ujrzysz wylosowanie \nliczby i ewentualne wygrane.\n\n\n";
     
     cout<<" A wiec zaczynamy prosze podac szesc liczb z zakresu od '1' do '49'.\n";
     cout<<" Uwaga - liczby nie moga sie powtarzac.\n\n";
     
     n=0;
     int s;
     s=5;
       /*Pętla do podawania typowanych liczb oraz wszelakie zabezpieczenia.*/
       while(n>=0 && n<6 && s>0 && s<6)
       {
            
             n++;
            
         cout<< "Liczba podana przez Ciebie to: "; 
         cin >> t[n];
         
         
          if(t[n]>0 && t[n]<50)
     {
          
      
        cout<<"Poprawnie wprowadziles liczbe.\n"<<endl;
        
      
     }   
         else 
      {    
           
         if(n>-1) 
        {
         cout<<"\nWprowadziles zle liczby!!!\n\n";
         cout<<"Pamietaj liczby musza byc z zakresu od '0' - '49' - ponadto liczby nie moga sie powtarzac.";
         n=7;
         cout<<"\n\nUruchom program ponownie i tym razem wprowadz odpowiednie liczby.";
         getch();
         exit(-1);
         
        }       
      }                                       
     
    
         }
         /*Czyszczenie konsoli, ukazanie typowanych liczb oraz tych wylosowanych.*/
          system("cls");
          cout<<"\n\nTwoje liczby to      : | "<<t[1];
          cout<<" | "<<t[2];
          cout<<" | "<<t[3];
          cout<<" | "<<t[4];
          cout<<" | "<<t[5];
          cout<<" | "<<t[6]<<" |";
          
          cout<<"\n\nZa chwile rozpocznie sie losowanie.";
          cout<<"\n\nWcisnij \"ENTER\", aby rozpoczac losowanie.";
          cout<<"\n\nOto wylosowane liczby: | ";
          
          getch();
          
          for(n=0;n>-1 && n<6;n++)
              {
                 
                 cout<<pc.l[n]<<" | ";
              } 
              
         cout<<"\n\nCzas sprawdzic ile wytypowanych liczb - bylo trafnych.";
         cout<<"\n\nDobrze jesli juz sprawdziles ilosc trafionych liczb - wprowadz ich ilosc: ";
         cin>>ile;
         /*Możliwości wygranych zależnych od ilości "trafionych" liczb.*/
         switch(ile)
        {
          case 0:
               cout<<"\n\nMoze nastepnym razem Ci sie poszczesci.";
               break;
          case 1:
               cout<<"\n\nNiestety wygrana jest dopiero od trzech trafien.";
            break;
          case 2:  
               cout<<"\n\nNiestety wygrana jest dopiero od trzech trafien.";
            break;
          case 3:
               cout<<"\n\nWygrana dla 3 trafien wynosi: "<<pc.n[0]<<" zl.";
               break;
          case 4:
               cout<<"\n\nWygrana dla 4 trafien wynosi: "<<pc.n[1]<<" zl.";
               break;
          case 5:
               cout<<"\n\nWygrana dla 5 trafien wynosi: "<<pc.n[2]<<" zl.";
               break;
          case 6:
               cout<<"\n\nWygrana dla 6 trafien wynosi: "<<pc.n[3]<<" zl.";
               break;
          default:
               cout<<"\n\nNalezalo podac liczbe z zakresu 1-6.";
               
               }

          
            
           
                         
           
           
                               
         
         
     
    

  
  
   
   
     
    
     
    getch();

    

  
} 

 



0

Tworzysz 49-elementową tablicę, na początku zainicjowaną samymi zerami i jak wylosujesz jakąś liczbę to sprawdzasz czy w tablicy (element o wylosowanym indeksie) jest 0, jak tak to zmieniasz wartość na 1. Wczytujesz następna i powtarzasz rozumowanie (sprawdzasz-> jak 0 to ok, jak jeden to losujsz czy tam wczytujesz jeszcze raz)

bool check[50] = {0};
//... tu dalszy kod
if(check[wylosowana]==1)
     //blad -> losuj ponownie
0

Eeee dziwne podejście - powtarzasz niepotrzebnie losowania.
Już lepiej zrobić tak:

#include <vector>
#define ILOSC_LOSOW 49
#define DO_WYLOSOWANIA 6

int losuj_int(int od, int do){
     return ( rand() % do ) + od;
}

void losuj_i_pokaz(){
vector<int> vnToGrab;
vector<int> vnGrabbed;

for(int nI=0; nI<ILOSC_LOSOW; ++nI)
vnToGrab.push_back(nI+1);

for(int nI=0; nI<DO_WYLOSOWANIA; ++nI){
int nLos = losuj_int(0,ILOSC_LOSOW-nI);
vnGrabbed.push_back(vnToGrab[nLos]);
vnToGrab.erase(nLos);
}

for(int nI=0; nI<DO_WYLOSOWANIA; ++nI){
  cout << vnGrabbed[nI] << endl;
}

}

Chociaż to tez nie jest idealne rozwiązanie (z najłatwiejszych usprawnień wcale nie jest potrzeba trzecia pętla jeśli program i tak ma wyświetlać od razu wynik).

PS. Nie testowałem - nie daje gwarancji działania ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1