#include #include #include #include "Netz.h" /* Speicheranforderung */ NE Element_neu() { NetzElement *elemzei; elemzei=(NetzElement*)malloc(sizeof(NetzElement)*13); if(elemzei==NULL) { printf(" Kein Speicher mehr vorhanden!\n"); exit(0); } return elemzei; } /* Neues Netz generieren (Verschieben) */ NE Verschieben(NetzElement *Feld,int schwgrad) { int zahl,a=0,u=1; while(schwgrad>=0) { while(Feld[a].eintrag!=0) a++; while(u!=0) { zahl=rand()%12; if (((*Feld[a].zeiger1)!=zahl) && ((*Feld[a].zeiger2)!=zahl)) { if ( (a==0) || (a==2) || (a==6) || (a==10) ) { if((*Feld[a].zeiger3)!=zahl) u=1; else u=0; } else u=1; } else u=0; } Feld=Akt_Element(Feld,zahl,a); a=0; schwgrad--; u=1; } return Feld; } /* Ausgangsposition=Zielposition */ NE Netz_neu(NetzElement *Feld) { int z,i=12; for (z=0;z<=12;z++) { Feld[z].eintrag=z; } for (z=1;z<=12;z++) { if(z==12) Feld[12].zeiger1=&Feld[1].eintrag; else { Feld[z].zeiger1=&Feld[z+1].eintrag; } Feld[z].zeiger2=&Feld[i].eintrag; Feld[z].zeiger3=NULL; i=z; } for(z=2;z<=10;z=z+4) { Feld[z].zeiger3=&Feld[0].eintrag; } Feld[0].zeiger1=&Feld[6].eintrag; Feld[0].zeiger2=&Feld[2].eintrag; Feld[0].zeiger3=&Feld[10].eintrag; return Feld; } /* Aktualisierung des Netzes */ NE Akt_Element(NetzElement *Feld,int zahl,int i) { int z; for(z=0;z<=12;z++) { if(Feld[z].eintrag==zahl) break; else ; } Feld[z].eintrag=0; Feld[i].eintrag=zahl; i=12; for (z=1;z<=12;z++) { if(z==12) Feld[12].zeiger1=&Feld[1].eintrag; else { Feld[z].zeiger1=&Feld[z+1].eintrag; } Feld[z].zeiger2=&Feld[i].eintrag; if((z==2) || (z==6) || (z==10)) Feld[z].zeiger3=&Feld[0].eintrag; else { Feld[z].zeiger3=NULL; } i=z; } Feld[0].zeiger1=&Feld[2].eintrag; Feld[0].zeiger2=&Feld[10].eintrag; Feld[0].zeiger3=&Feld[6].eintrag; return Feld; } /* Loeschen des Netzes */ void Loeschen(NetzElement *Feld) { free(Feld); } void AnzeigenSpiel(NetzElement *Feld) { printf("\n\n\t\t\t%d\n",Feld[12].eintrag); printf("\t\t%d\t\t%d\n\n",Feld[1].eintrag,Feld[11].eintrag); printf("\t\t%d\t\t%d\n\n",Feld[2].eintrag,Feld[10].eintrag); printf("\t%d\t\t%d\t\t%d\n\n",Feld[3].eintrag,Feld[0].eintrag,Feld[9].eintrag); printf("\t%d\t\t%d\t\t%d\n\n",Feld[4].eintrag,Feld[6].eintrag,Feld[8].eintrag); printf("\t\t%d\t\t%d\n",Feld[5].eintrag,Feld[7].eintrag); } int Ziel(NetzElement *Feld) { int i; for(i=0;i<12;i++) { if(Feld[i].eintrag==i); else break; } return i; } int main() { int zahl=0,a=0,u=1,zi,schwgrad=25; NetzElement *Feld; Feld=Element_neu(); Feld=Netz_neu(Feld); Feld=Verschieben(Feld,schwgrad); printf("\n\t\t\tHam Ham Spiel\n\n"); /* Anzeigen der Reihenfolge der Einträge (im Kreis geshen ausser 0) */ AnzeigenSpiel(Feld); /* Verschiebung der Einträge */ while(zi!=12) { while(Feld[a].eintrag!=0) a++; while(u!=0) { printf("\nZahl verschieben (die an leeres Feld angrenzt): "); scanf("%d",&zahl); if (((*Feld[a].zeiger1)!=zahl) && ((*Feld[a].zeiger2)!=zahl)) { if ( (a==0) || (a==2) || (a==6) || (a==10) ) { if((*Feld[a].zeiger3)!=zahl) { printf("Falsche Eingabe !!"); u=1; } else u=0; } else { printf("Falsche Eingabe !!"); u=1; } } else u=0; } Feld=Akt_Element(Feld,zahl,a); AnzeigenSpiel(Feld); a=0; u=1; zi=Ziel(Feld); } Loeschen(Feld); printf("\n\n\t\tYou are the Winner\n\n"); return 1; }