Program mastermind, problem z kodem.

0

Witam serdecznie.

Jest to mój pierwszy post na forum także proszę o wyrozumiałość. Mam pewien problem..Mam napisać program, który generuje losowy ciąg 5 liczb, np. „ 1 2 3 4 5”. Ja jako użytkownik podaję jakiś ciąg liczbowy, np. „1 1 2 3 6”. Program ma sprawdzać 2 rzeczy:

a. Ilość zgodnych wartości liczbowych i pozycji (w przykładzie pierwsza jedynka jest na dobrej pozycji)
b. Ilość dobrych cyfr z kodu (w przykładzie mamy 3 takie cyfry: 1, 2, 3, ale tylko 1 jest na dobrej pozycji).

Gracz odgaduje kod aż do momentu w którym trafi. Dla uproszczenia: zakładamy, że cyfry kodu składają się z cyfr 1…6.

Chciałbym zaznaczyć iż dopiero zaczynam swoją przygodę z programowaniem także...liczę na każdą pomoc :) Poniżej umieszczam kod, który napisałem..(opierałem się o gotowy kod podobnego programu)

#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

using namespace std;

int sprawdzenie1(char*,char*,int);
int sprawdzenie2(char*,char*,int);

int main(int argc, char *argv[])
{
int i,j;
char losowane[20],zgadywane[7];
char odp,c,*s;
int kroki = 10;

do
  {
     for(i=0;i<7;i++) zgadywane[i]='0'; 
     for(i=0;i<10;i++) losowane[i]='0';
do
  {
     for(i=0;i<6;i++) losowane[i]=(rand()%10)+48;
     s=argv[1];
     if (*s=='a')
  {
	  printf("Poprawna kombinacja: ");
	  for(i=0;i<6;i++) printf("%c ",losowane[i]);
      for(i=1;i<=kroki;i++)//petla obslugujaca ilosc krokow
	{
	  printf("Krok %d, Podaj %d liczb : ",i,5);
	  j=0;
	  while(j<6+1)//prtla obslugujaca ilosc wpisywanych liczb
	  {
		if (j!=6)//obsluga wpisywania dla liczb oprocz ostatniej
		{
		  c=getch();
		  if ((zgadywane[j]=c)>='0' && (zgadywane[j]=c)<='9')
		  //liczby obslugiwane tylko z zakresu 0 - 9
		  {
			printf("%c ",zgadywane[j]);//wyswietlenie liczby jezeli
			//jest z zakresu 0-9
			j++;
		  }
		  if ((c=='\010') && (j>0))//czy backspace?? 010 - kod z ascii
		  //w kodzie 8kowym, kod zmazuje liczby po wcisnieciu backspace
		  {
			j--;//cofnij licznik
			printf("\010");//backspace
			printf("\010");//backspace
			printf(" ");//wstaw pusty znak
			printf("\010");//backspace
		  }
		} else if (j==5)//obsluga ostatniej liczby wpisanej
		{
		  c=getch();
		  if( c=='\015')//czy enter?? 015 - kod z ascii w kodzie 8kowym
		  {
			if (sprawdzenie1(losowane,zgadywane,5)==5)
			//czy cala kombinacja jest prawidlowa?
			{
			  printf("Brawo!\n");
			  i=kroki;//sztuczne spelnienie warunku zakonczenia gry
			  break;//przerwanie petli
			} else
			{
			  j++;
			  printf("(%d,",sprawdzenie1(losowane,zgadywane,5));
			  //sprawdza ilosc liczb na swoim miejscu
			  printf("%d)",sprawdzenie2(losowane,zgadywane,5));
			  //sprawdza ilosc liczb nie na swoim miejscu
			  printf("\n");
			}
		  }
		  if ((c=='\010') && (j>0))//czy backspace?? 010 - kod z ascii w kodzie 8kowym
		  {
			j--;
			printf("\010");
			printf("\010");
			printf(" ");
			printf("\010");
		  }
		}
	  }
	}
    printf("Prawidlowa kombinacja: ");
	for (i=0;i<6;i++) printf("%c ",losowane[i]);
	printf("\nJeszcze raz?(t/n): ");//odp reaguje tylko dla t - powtarza gre
	//dla kazdego innego znaku wychodzi z gry
	odp=getch();
	if (odp=='t') printf("t\n");
  }while (odp=='t');

  return 0;
}
int sprawdzenie1(char *los,char *zgad,int poz)

{
  int i,licznik=0;

  for(i=0;i<poz;i++) if (los[i]==zgad[i]) licznik++;//proste porownanie
  //odpowiednich miejsc w tablicach liczb losowanych i zgadywanych
  return licznik;
}

int sprawdzenie2(char *los,char *zgad,int poz)
{
  int i,j,licznik=0;//liczniki petli i liczb nie na swoim miejscu
  int ilosc[10],ilosc2[10];//tablice ilosci powtarzajacych sie liczb

  for(i=0;i<10;i++) ilosc[i]=0;//wyzerowanie tablic
  for(i=0;i<10;i++) ilosc2[i]=0;

  for(i=0;i<poz;i++) if (los[i]!=zgad[i])//zliczenie powtarzajacych
  //sie liczb w tablicy liczb losowanych bez zliczania liczb na swoim
  // miejscu
  {
	switch(los[i])
	{
	  case '0': ilosc[0]=ilosc[0]+1;
				break;
	  case '1': ilosc[1]=ilosc[1]+1;
				break;
	  case '2': ilosc[2]=ilosc[2]+1;
				break;
	  case '3': ilosc[3]=ilosc[3]+1;
				break;
	  case '4': ilosc[4]=ilosc[4]+1;
				break;
	  case '5': ilosc[5]=ilosc[5]+1;
				break;
	  case '6': ilosc[6]=ilosc[6]+1;
				break;
	  case '7': ilosc[7]=ilosc[7]+1;
				break;
	  case '8': ilosc[8]=ilosc[8]+1;
				break;
	  case '9': ilosc[9]=ilosc[9]+1;
				break;
	}
	switch(zgad[i])//jak wyzej tylko dla liczb zgadywanych
	{
	  case '0': ilosc2[0]=ilosc2[0]+1;
				break;
	  case '1': ilosc2[1]=ilosc2[1]+1;
				break;
	  case '2': ilosc2[2]=ilosc2[2]+1;
				break;
	  case '3': ilosc2[3]=ilosc2[3]+1;
				break;
	  case '4': ilosc2[4]=ilosc2[4]+1;
				break;
	  case '5': ilosc2[5]=ilosc2[5]+1;
				break;
	  case '6': ilosc2[6]=ilosc2[6]+1;
				break;
	  case '7': ilosc2[7]=ilosc2[7]+1;
				break;
	  case '8': ilosc2[8]=ilosc2[8]+1;
				break;
	  case '9': ilosc2[9]=ilosc2[9]+1;
				break;
	}
  }
  for(i=0;i<10;i++)
  //zaleznosci sprawdzajace ilosc liczb nie na swoim miejscu
  //bez uwzgledniania liczb na swoim miejscu przy uzyciu tablic
  //z iloscia powtarzajacych sie liczb losowanych i zgadywanych
  {
	if (ilosc[i]==ilosc2[i]) licznik=licznik+ilosc[i];
	if (ilosc[i]<ilosc2[i]) licznik=licznik+ilosc[i];
	if (ilosc[i]>ilosc2[i]) licznik=licznik+ilosc2[i];
  }

  return licznik;
}
}
{
   	printf("\n"); //przejscie do nastepnej lini
//menu
    cout << "1. Nowa Gra" << endl;
    cout << "2. Statystyki" << endl;
    cout << "3. Autor" << endl;
    cout << "4. Wyjscie" << endl;
   	
    printf("\n"); //przejscie do nastepnej lini
    
    cout << "Wybierz opcje z Menu gry ";
   	
    printf("\n"); //przejscie do nastepnej lini
    
    int menu = 0;
    
   	printf("\n"); //przejscie do nastepnej lini 
    
    cin >> menu;
    
   	printf("\n"); //przejscie do nastepnej lini
    	
    switch(menu) {
                 
                  case 1: cout << "1. 1 gracz" << endl;
                          cout << "2. 2 graczy" << endl;
                          cout << "3. 3 graczy" << endl;
                  break;
                          
                  case 2: cout << "1. Gracz Karel wygral 3 rozgrywki" << endl;
                          cout << "2. Gracz Jacek wygral 2 rozgrywki" << endl;
                          cout << "3. Gracz Bubus wygral 1 rozgrywke" << endl;
                  break;
                          
                  case 3: cout << "Autorem tego programu jest: blabla" << endl;
                          cout << "Wszelkie prawa zastrzezone." << endl;
                          cout << ";)" << endl;
                  break; 
    
                  case 4: cout << "Wcisnij dowolny klawisz by zakonczyc" << endl;
                  break;
                  }
    
    printf("\n"); //przejscie do nastepnej lini
    
    int gracze = 0;
    cin >> gracze;
    
    printf("\n"); //przejscie do nastepnej lini
   switch(gracze) {
                  
                  case 1: cout << "Gra rozpoczyna sie...1 gracz" << endl;
                  break;
                  case 2: cout << "Gra rozpoczyna sie...2 graczy" << endl;
                  break;
                  case 3: cout << "Gra rozpoczyna sie...3 graczy" << endl;
                  break;
                  
    printf("\n"); //przejscie do nastepnej lini         
    }           
    
    int buba = 0;
    cin >> buba;
    
    switch(buba) {
    
    break;
                  case 2: cout << "Gracz nr 1 zdobyl mistrzostwo juhu" << endl; 
    break;
                  case 3: cout << "Autorem tego programu jest" << endl; 
    break;
                  case 4: cout << "wyjscie" << endl; 
    break;
}
    system("PAUSE");
    return EXIT_SUCCESS;
}
 

Ponadto program powinien mieć następujące funkcjonalności:

  1. Wyświetlenie menu głównego z opcjami nowej gry, zakończenia programu, wyświetlenie statystyk oraz
    wyświetlenia informacji o autorze programu.
  2. Program ma się kończyć na wyraźne polecenie użytkownika, a nie po każdej grze.
  3. Nowa gra dla od jednego do trzech graczy (każdy odgaduje ten sam kod, ale wygrywa tylko ten, który zgadł).
  4. Gra ma wyświetlać historyczne odgadnięcia gracza wraz z podpowiedziami (pobodnie do planszowego
    odpowiednika).
  5. Wyświetlenie w ilu krokach hasło zostało odgadnięte.
  6. W każdym kroku użytkownik może się poddać.
  7. Wyświetlenie statystyk wygranych i przegranych poszczególnych graczy

Proszę o jakiekolwiek wskazówki, naprostowanie mnie na właściwą ścieżkę itp. itd. z góry dziękuję za pomoc i pozdrawiam serdecznie.

0

Najprosciej to zrobic na 2 tablicach. 1 przechowuje ciag liczb, druga tablica bool zaznacza odpowiednie pozycje na ktorych sie zgadzaja wpisane cyfry. Wczytujesz ciag liczb, i sprawdzasz w 1 funkcji po kolei kazda liczbe czy sie powtarza i zapamietujesz indeks w ustawiajac 1 w tablicy bool + ewentualny licznik powtarzanych cyfr.

Statystyki graczy najlepiej zapisywac do pliku i z niego na starcie wczytywac dane.

Warunek konca mozesz zrobic jesli powiedzmy uzytkownik wpisze okreslony znak zamiast ciagu cyfr lub co runde pytac sie czy chce zakonczyc gre. Sama gra nie jest trudna.

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