fafejto
Mágus fafejtő
Ha mágustanonc vagy és meggyűlt a bajod a varázsbot megszerzésével, akkor segítségképp használhatod a következő konzolos programot:
Forráskód
#include <stdio.h> #include <string.h> #ifdef linux #define BCYAN "\x1b[36;1m" #define GREY "\x1b[30;1m" #define RED "\x1b[31m" #define RESET "\x1b[0m" #else #define BCYAN "" #define GREY "" #define RED "" #define RESET "" #endif int initial[6], actual[6], goal[6], order[6]; int addition[5][6] = { { 0, 1, 2, 1, 3, 0 }, { 1, 0, 0, 1, 1, 1 }, { 1, 0, 1, 0, 0, 0 }, { 1, 0, 1, 1, 0, 0 }, { 1, 0, 1, 0, 0, 1 } }; void print_help() { printf( " Ezen program olyan magusoknak kinal segitseget, akik meg nem rendelkeznek\n" " varazsbottal.\n" " Elso lepeskent el kell menned a magikus fahoz, aminek utvonala fotertol:\n" " [ "BCYAN"#14 e;#2 k;fa"RESET" ]\n" " Ezt kovetoen a "BCYAN"nez tabla"RESET" parancs beirasaval lathatova valik relacios\n" " jelek kozott a kirakando szam, alatta pedig a jelenlegi.\n\n"); } void print_status() { int i = 0; while(i < 6) fputc(actual[i++]+'0',stdout); } void info(char *s) { printf("%s%%%s : %s\n",GREY,RESET,s); return; } void hiba(char *s) { printf("%s%%%s : %s\n",RED,RESET,s); return; } int isnum(char c) { return c > 47 && c < 58 ? 1 : 0; } void numinc(int (*prod)[6], int loc) { int i; for(i = 0;i < 6;i++) { (*prod)[i] += addition[loc][i]; if((*prod)[i] > 5) (*prod)[i] -= 6; } } void shift_hor(int (*prod)[6]) { int tmp; tmp = (*prod)[2]; (*prod)[2] = (*prod)[1], (*prod)[1] = (*prod)[0], (*prod)[0] = tmp; tmp = (*prod)[3]; (*prod)[3] = (*prod)[4], (*prod)[4] = (*prod)[5], (*prod)[5] = tmp; } void rotate(int loc1, int loc2, int loc3, int spec) { int i, sub; if(actual[loc1] != goal[loc2]) { if((sub = goal[loc2]-actual[loc1]) < 0) sub += 6; printf(" |> '%s#%d gomb %d%s' | ",BCYAN,sub,order[loc3+1],RESET); print_status(); for(i = 0;i < sub;i++) numinc(&actual,loc3); fputs(" -> ",stdout), print_status(), fputc('\n',stdout); if(spec) { printf(" |> '%s#%d gomb %d%s' | ",BCYAN,6-sub,order[3],RESET); print_status(); for(i = 0;i < 6-sub;i++) numinc(&actual,2); fputs(" -> ",stdout), print_status(), fputc('\n',stdout); } } printf(" |> '%s#%d gomb %d%s' | ",BCYAN,1,order[0],RESET); print_status(); shift_hor(&actual); fputs(" -> ",stdout), print_status(), fputs("\n(enter) ",stdout); getchar(), fputc('\n',stdout); } void line_eval(char *msg, int (*prod)[6]) { char buf[256]; int i; do { printf("> %s ",msg); fgets(buf,256,stdin), i = 0; if(strlen(buf) != 7) { hiba("a bemeneti ertek nem 6 jegyu szam."); continue; } for(i = 0;i < 6;i++) { if(isnum(buf[i])) (*prod)[i] = buf[i]-'0'; else { hiba("a string erteke nem numerikus."); break; } } } while(i != 6); } int main() { int i, k, tmp[6], size = sizeof(initial); printf("magus fafejto\ncompiled on 1230\nby %sstewie@ev%s\n\n",RED,RESET); print_help(); line_eval("a kirakando szam:",&goal); line_eval("az aktualis szam:",&initial); fputc('\n',stdout); for(i = 1;i < 7;i++) { printf("# ird be, hogy '%sgomb %d%s'.\n",BCYAN,i,RESET); line_eval("az aktualis szam:",&actual); for(k = 1;k < 6;k++) { if(order[k]) continue; memcpy(&tmp,&initial,size), numinc(&tmp,k-1); if(!memcmp(actual,tmp,size)) { order[k] = i; break; } } if(k == 6) { memcpy(&tmp,&initial,size), shift_hor(&tmp); if(!memcmp(actual,tmp,size)) order[0] = i; else { info("nincs megoldas."); return 1; } } memcpy(&initial,&actual,size); } fputs("\n Lepesek:\n\n",stdout); rotate(0,0,1,0); rotate(0,2,1,0); rotate(0,1,1,0); rotate(3,3,3,1); rotate(3,4,3,1); rotate(3,5,3,1); if(!memcmp(goal,actual,size)) info("sikerult megoldani!"); else { info("nincs megoldas."); return 1; } printf( "\n" " Most mar csak annyi a teendod, hogy nyugat fele haladsz tovabb es felveszed\n" " a tekercset, onnan pedig eszak fele talalod meg a kifele vezeto utat, a\n" " tekercset pedig a hallban odaadhatod Kyra-nak, aki cserebe megtanitja a\n" " varazsbotot.\n\n"); getchar(); return 0; }
fafejto.txt · Utolsó módosítás: 2015/12/30 20:47 szerkesztette: truth