Program cgi w jezyku c udajacy kostke rubika. Problem nie jest przesadnie zlozony, ale mam z nim pewnien klopot.
Zabawa - w moim wykonaniu - polega na tym, ze dysponuje 6 tablicami typu char, ktore przechowuja literki odpowiadajace poszczegolnym kolorom (g-green,y-yellow, itd), literki te pozwalaja mi 'sterowac' 36 gifami, ktore odpowiednio ustawione, wygladaja na calkiem ladna kostke.
mam tez forme, w ktorej wybieram pole (tj konkretny 'kwadracik' kostki - na razie z jednej sciany), oraz kierunek przesuniecia (gora,dol,lewo,prawo).
dane wybrane z formy pozwalaja mi wywolac jedna z 12 funkcji do przesuwania.
wszystkie te funkcje dzialaja podobnie - 1. kopiuja interesujace nas trojki pol z okreslonych tablic wyjsciowych do 4 tablic tymczasowych; 2. podmieniaja to co ma zostac podmienione; 3 jesli trzeba to 'transponuja' scianke, ktora tego wymaga.
rozwiazanie, jak sadze, malo optymalne i blyskotliwe, ale potencjalnie dzialajace - sprawdzilam piszac program - nie cgi -
przy okazji cgi wlasnie - zaczynaja sie problemy:
- kostka istnieje, forma pobiera dane
ALE - funkcje przesuwajace dzialaja, ale nie wspoldzialaja - tj kazde kolejne wywolanie operuje na kostce, ktorej pola sa ulozone tak, jak na samym poczatku (wartosci poczatkowe dla zadeklarowanych tablic)
dlaczego moje cgi nie potrafi zapamietac, ze elementy w tablicach zostaly inaczej ulozone?
zamieszczam okrojony, chodz nadal obszerny fragment kodu:
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
void gora1(char lewap[3][3], char prawat[3][3], char dol[3][3], char gora[3][3], char lewat[3][3]);
void dol1(char lewap[3][3], char prawat[3][3], char dol[3][3], char gora[3][3], char lewat[3][3]);
void prawo1(char lewap[3][3],char prawap[3][3],char gora[3][3],char lewat[3][3],char prawat[3][3]);
void lewo1(char lewap[3][3],char prawap[3][3],char gora[3][3],char lewat[3][3],char prawat[3][3]);
void wypisz_strone (char lewap[3][3],char prawap[3][3],char dol[3][3],char gora[3][3],char lewat[3][3],char prawat[3][3]);
int main (int argc, char **argv, char **envp)
{
char lewap[3][3]={
'R','R','R',
'R','R','R',
'R','R','R'
};
char prawap[3][3]={
'G','G','G',
'G','G','G',
'G','G','G'
};
char gora[3][3]={
'B','B','B',
'B','B','B',
'B','B','B'
};
char dol[3][3]={
'U','U','U',
'U','U','U',
'U','U','U'
};
char lewat[3][3]={
'Y','Y','Y',
'Y','Y','Y',
'Y','Y','Y'
};
char prawat[3][3]={
'O','O','O',
'O','O','O',
'O','O','O'
};
wypisz_strone(lewap,prawap,dol,gora,lewat,prawat);
return 0;
}
void wypisz_strone (char lewap[3][3],char prawap[3][3],char dol[3][3],char gora[3][3],char lewat[3][3],char prawat[3][3])
{
char *form_data;
int i, j, k;
int strzalka=0;
int pole=0;
form_data=NULL;
form_data = getenv ("QUERY_STRING");
if (NULL != form_data) {
if (2 == sscanf (form_data, "strzalka=%d&pole=%d", &strzalka, &pole));
}
if ((strzalka ==1) && ((pole==1) || (pole==4) || (pole==7)))
gora1(lewap,prawat,dol,gora,lewat);
if ((strzalka ==2) && ((pole==1) || (pole==4) || (pole==7)))
dol1(lewap,prawat,dol,gora,lewat);
if ((strzalka ==3) && ((pole==1) || (pole==2) || (pole==3)))
prawo1(lewap,prawap,gora,lewat,prawat);
if ((strzalka ==4) && ((pole==1) || (pole==2) || (pole==3)))
lewo1(lewap,prawap,gora,lewat,prawat);
printf ("Content-type: text/html\n\n");
printf ("<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"pl-PL\" lang=\"pl-PL\">\n");
printf ("<head><title>kosteczka</title>\n");
printf ("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-2\" />\n");
printf ("<link rel=\"stylesheet\" media=\"all\" type=\"text/css\" href=\"styl.css\" />\n");
printf ("</head><body><h1> przepiekna kosteczka </h1>\n");
printf ("<div class=\"gora\">\n");
k=1;
for(i=0;i<3;i++){
for(j=0;j<3;j++) {
printf ("<img id=\"gora%d\" src=\"D%c.gif\" alt=\"kostka\" />\n",k,gora[i][j]);
k++;
}
}
printf ("<div class=\"lewa\">\n");
k=1;
for(i=0;i<3;i++){
for(j=0;j<3;j++) {
printf ("<img id=\"lewap%d\" src=\"L%c.gif\" alt=\"kostka\" />\n",k,lewap[i][j]);
k++;
}
}
printf ("</div>\n");
printf ("<div class=\"prawa\">\n");
k=1;
for(i=0;i<3;i++){
for(j=0;j<3;j++) {
printf ("<img id=\"prawap%d\" src=\"R%c.gif\" alt=\"kostka\" />\n",k,prawap[i][j]);
k++;
}
}
printf ("</div>\n");
printf ("<div class=\"dol\">\n");
k=1;
for(i=0;i<3;i++){
for(j=0;j<3;j++) {
printf ("<img id=\"dol%d\" src=\"D%c.gif\" alt=\"kostka\" />\n",k,dol[i][j]);
k++;
}
}
printf ("</div>\n");
printf ("<div class=\"tyll\">\n");
k=1;
for(i=0;i<3;i++){
for(j=0;j<3;j++) {
printf ("<img id=\"lewat%d\" src=\"R%c.gif\" alt=\"kostka\" />\n",k,lewat[i][j]);
k++;
}
}
printf ("</div>\n");
printf ("<div class=\"tylr\">\n");
k=1;
for(i=0;i<3;i++){
for(j=0;j<3;j++) {
printf ("<img id=\"prawat%d\" src=\"L%c.gif\" alt=\"kostka\" />\n",k,prawat[i][j]);
k++;
}
}
printf ("<div/>\n");
printf ("</div>\n");
printf ("<div class=\"forma\">\n");
printf ("<form method=\"get\" action=\"kosteczka.cgi\">\n");
printf ("<p> <input type=\"radio\" name=\"strzalka\" value=\"1\" /> gora\n");
printf ("<input type=\"radio\" name=\"strzalka\" value=\"2\" /> dol\n");
printf ("<input type=\"radio\" name=\"strzalka\" value=\"3\" /> prawo\n");
printf ("<input type=\"radio\" name=\"strzalka\" value=\"4\" /> lewo </p>\n");
printf ("<p> ktore pole chcesz przesunac? <input type=\"text\" name=\"pole\" value=\"\" maxlength=\"1\" />\n");
printf("</p>\n");
printf ("<p> <input type=\"submit\" name=\"potwierdz\" value=\"potwierdz\" /></p></form>\n");
printf ("<form method=\"get\" action=\"kosteczka.cgi\">\n");
printf ("<p> <input type=\"submit\" name=\"pomieszaj\" value=\"pomieszaj\" /> </p>\n");
printf ("<p> <input type=\"submit\" name=\"nowa\" value=\"nowa\" /> </p></form></div>\n");
printf ("<div> pola, ktore mozesz przesuwac znajduja sie po lewej stronie \"czola\" kostki, ponumerowane sa od 1 do 9 </div>");
if (NULL != form_data) {
printf ("<p>\n");
printf ("form_data: %s\n", form_data);
printf ("</p>\n");
printf("<p>\n");
printf ("strzalka: %d\n", strzalka);
printf ("</p>\n");
printf("<p>\n");
printf ("pole: %d\n", pole);
printf ("</p>\n");
}
printf ("</body></html>\n");
}
void gora1(char lewap[3][3], char prawat[3][3], char dol[3][3], char gora[3][3], char lewat[3][3])
{ char tymcz1[3],tymcz2[3],tymcz3[3],tymcz4[3];
char transp[3][3];
int i,j;
for(i=0; i<3; i++)
tymcz1[i]=lewap[i][0];
for(i=0; i<3; i++)
tymcz2[i]=dol[0][i];
for(i=0; i<3; i++)
tymcz3[i]=prawat[i][0];
for(i=0; i<3; i++)
tymcz4[i]=gora[0][i];
for(i=0; i<3; i++)
for(j=2;j>=0;j--)
lewap[i][0]=tymcz2[j];
for(i=0; i<3; i++)
dol[0][i]=tymcz3[i];
for(i=0; i<3; i++)
for(j=2;j>=0;j--)
prawat[i][0]=tymcz4[j];
for(i=0; i<3; i++)
gora[0][i]=tymcz1[i];
for(i=0; i<3; i++)
for(j=0; j<3; j++)
transp[i][j]=lewat[i][j];
lewat[0][0]=transp[2][0];
lewat[0][1]=transp[1][0];
lewat[0][2]=transp[0][0];
lewat[1][0]=transp[2][1];
lewat[1][1]=transp[1][1];
lewat[1][2]=transp[0][1];
lewat[2][0]=transp[2][2];
lewat[2][1]=transp[1][2];
lewat[2][2]=transp[0][2];
}