#include <iostream> #include <stdio.h> #include <time.h> //seed do randoma #include <stdlib.h> using namespace std; char* losuj(int); bool sprawdz(char *a, char *b, int c); //c -> length int main() { int tries = 1; int status = 0; while(status != 1) { printf("Witaj uzytkowniku, o jakiej dlugosci wygenerowac kod?: "); int len = 0; cin >> len; char inp[len + 5]; char *str; if(len > 0) { str = losuj(len); status=1; } else {printf("\nNieprawidlowa dlugosc!\n");} while(status == 1) { //prawidlowo wygenerowany kodzik, teraz "main loop" printf("Sproboj odgadnac: "); //char string_uzytk[len + 20]; //printf("%c", str[7]); cin >> inp; if (sprawdz(inp,str, len) == true) { printf("Liczba prob: %d",tries); return 0; } tries++; //delete []str; //zwalnianie mem po tablicy //scanf("%s", &string_uzytk); } } return -1; } char* losuj(int a) { char *var = new char[a+1]; //deklaracja 'dynamiczna', bo normalnie funkcja sie niszczy po wszystkim..., a jak zwr??ci pointer to do "syfu" bedzie sie odwolywac //init random srand (time(NULL)); //init seeda for(int x = 0; x < a; x++) { var[x] = rand() % 10 + '0';//48; // random, 0 to pierwszy znak... 9 to last //printf("%c,%d: \n",var[x],var[x] ); //TEST } var[a] ='\0'; //printf("%s", var); return var; } bool sprawdz(char *a, char *b, int c) { // a -> user b -> generated, c -> length int correct = 0; int correctbutinvalidplace = 0; char easy[c + 1]; char cpy[c]; cpy[c] ='\0'; // znak zakonczenia linii, inaczej sie upomina string... for (int x =0; x < c; x++) {cpy[x] = b[x];} //kopia //printf("Kopia[%s]\n",cpy); for(int x = 0; x < c; x++) { easy[x] ='X'; if(a[x] == b[x]) {correct++;easy[x] = b[x];} else { for(int x2 = 0; x2 < c; x2++) { if(a[x] == cpy[x2]) { correctbutinvalidplace++; cpy[x2] = 'x'; break; } } } } easy[c] ='\0'; // znak zakonczenia lini if (correct == c) {return true;} printf("Poprawna ilosc odgadnietych cyfr: %d, nie na swoim miejscu: %d\n",correct,correctbutinvalidplace); //printf("Easy[%s]\n",easy); // Odkomentuj ta linijke, aby wylaczyc tryb EASY return false; }
demp