Chodzenie po 0-1 planszy

0

Witam,
Mam do napisania pewien program w C, ale napotykam na problem z którym nie do końca wiem, jak sobie poradzić.

Program to taka "niby" gra. Na początku gracz ustala liczbę pól jednowymiarowej planszy (zwykła tablica jednowymiarowa). Następnie z klawiatury wpisuje wartości poszczególnych pól (pola mogą mieć wartość 0 lub 1, i są to również po prostu kolejne elementy tablicy). Gdy już tablica jest uzupełniona, program symuluje rzuty kostką do gry. Cała zabawa polega na tym, że jeżeli wypadnie np. k oczek na kostce, to gracz przesuwa się o k pól do przodu. Jeśli trafi na pole oznaczone jako 1, to gra dalej, jeśli na 0 - przegrywa. Wygrywa wtedy, gdy dojdzie do ostatniego pola planszy (oczywiście zakładamy, że ostatnie pole jest jedynką). Gra "gra się sama", tzn komputer sam ma losować liczbę oczek na kostce, wyświetlać ją i podawać komunikat, czy gramy dalej, czy już przegraliśmy.
Do tego momentu wszystko zrobiłem. Jednak teraz zaczynają się schody. Mam bowiem jeszcze wyliczyć, ile jest możliwych dróg dojścia do końca planszy, czyli np. jeśli mamy planszę 1 1 0 0 1 1 1 0 1, to możemy wyrzucać na kostce 1, 1, 3, 1, 1, 2, lub 2, 3, 2, 2, i tak dalej.
Mój pomysł jest następujący: chcę zrobić pewną funkcję rekurencyjną, która będzie działała na tablicy - planszy. Zaczynamy od ostatniego elementu planszy, i sprawdzamy 6 elementów poprzedzających go - jeśli dany element okaże się jedynką i jednocześnie indeks tego elementu jet mniejszy od 6 (czyli jest to pole osiągalne już przy pierwszym rzucie kostką) to mamy pierwszą drogę przejścia. Jeśli natomiast pole to jest jedynką, ale indeks jest większy od 6, to wywołujemy naszą funkcję, ale z planszą pomniejszoną, gdzie ostatnim elementem jest pole, na które właśnie trafiliśmy. Problem pojawia się jednak w tym, jak to zapisać.
Poniżej wklejam kod (wiem, że jest w nim straszny bałagan, ale rodziły się na bieżąco różne pomysły, które były dopisywane, i dlatego tak to wygląda:)

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

int n,p,q;
float a[100];
int T1[100];
int T2[100];
char ster;
int liczba_ciagow;
int i;

int ile_ciagow(int T1[n])
{liczba_ciagow=0;
for(i=n;i>n-7;i--)
{if(T1[i]==1 && i>6)
ile_ciagow(T1[i]);
if(T1[i]==1 && i<7)
liczba_ciagow=liczba_ciagow+1;

}
}

main()
{
srand( time( NULL ) ); //uruchomienie generatora liczb pseudolosowych
int k,l;
float y,z,c;
system("cls");
printf("--------------------------------------------------------------------------\n");
printf("| |\n");
printf("| GRA |\n");
printf("| Chodzenie po 0-1 planszy |\n");
printf("| |\n");
printf("--------------------------------------------------------------------------\n");
printf("| |\n");
printf("| Podaj dlugosc planszy z przedzialu [6,100] |\n");
printf("| |\n");
printf("--------------------------------------------------------------------------\n");
scanf("%d", &n);
if (n>100)
{printf("-------------------------------------------------------------------------\n");
printf("| |\n");
printf("| Podales za duza plansze! |\n");
printf("| |\n");
printf("--------------------------------------------------------------------------\n");getche(); return(1); }
if (n<6)
{printf("-------------------------------------------------------------------------\n");
printf("| |\n");
printf("| Podales za mala plansze! |\n");
printf("| |\n");
printf("--------------------------------------------------------------------------\n");
getche(); return(1); }

printf("--------------------------------------------------------------------------\n");
printf("| |\n");
printf("|Twoja plansza wyglada nastepujaco: |\n");
printf("| |\n");
printf("--------------------------------------------------------------------------\n");

printf("Numer | Wartosc\n");
printf("pola |pola\n");
int licznik;
int j;
j=0;
for (licznik=1;licznik<n+1;licznik++) //pętla - wczytanie wartości do tablicy
{

 T1[licznik] = scanf("%d", &T1[licznik]	 );	//wpisanie wartości z klawiatury
 if(T1[licznik]==1)
 	{T2[j]=licznik;
 	 j++;
	 }

 //printf("%d.       %d \n", licznik, T1[licznik]);	
 } //jak bedzie 100 to bedzie przedział 0-99

for(k=1;k<n+1;k=k+1+rand()%6) //symulator kostki do gry
{if(T1[k]==1)
{
printf("Suma wylosowanych oczek %i",k," \n"); // sprawdzenie, czy po wyrzuceniu danej lczby oczek trafiamy na 0 czy 1
printf("\n");
printf("Grasz dalej!\n");
}

else
{ printf("Suma wylosowanych oczek %i",k," \n");
printf("\n");
printf("Przegrales!\n");
break;}
}

ile_ciagow(T1[n]);

getche();
return(0);
}

1

Można np zrobić tak: definiujesz strukturę ścieżka, w niej tablicę (albo wektor) rzutów. Każdą ze struktur możesz przechowywać we wspólnym wektorze. Później tylko piszesz f-cję, która losuje kolejne rzuty od 1 do 6 i przechodzi rekurencyjnie od początku tablicy.

0

lukusm: dziękuję za odpowiedź, a mógłbym prosić o choć kawałek kodu? Bo niestety jest to chyba zbyt ciężkie jak na moją skromną znajomość C.

0
#include <vector>

typedef struct gamePathRecord {
  vector<int> steps;
} gamePath;

vector<gamePath> paths;

vector<int> tmp;
void countPaths(int* gameArray, int startIndex) {
  /*
   * tutaj kod, który sprawdza w pętli, czy po rzucie wynoszącym od 1 do 6
   * jest już koniec tablicy (wygrana) lub pole=1 jeśli wygrana
   * to zapisujesz dane z wektora tymczasowego tmp, do wektora steps z rekordu typu gamePath
   * jeśli nie ma końca gry lub jest jeszcze zapas w tablicy, to wywołujesz rekurencyjnie 
   * funkcję od argumentu startIndex równego aktualnemu polu w tablicy, na którym stoisz ;)
   */
}

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