Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Towers of Hanoi Simulation
- Mehedee Zaman
- Studend ID # 0905072
- */
- # include "iGraphics.h"
- #define LTOC 1
- #define LTOR 2
- #define CTOL 3
- #define CTOR 4
- #define RTOL 5
- #define RTOC 6
- #define MAXDISK 20
- #define MAXMOVE 1500
- #define speed 2
- #define XL 40
- #define XC 360
- #define XR 640
- #define HEIGHT 450
- #define BASE 100
- int l,r,c;
- int ndisk;
- int lstack[MAXMOVE],rstack[MAXMOVE],cstack[MAXMOVE];
- int diskx[MAXDISK],disky[MAXDISK],diskwidth[MAXDISK];
- int i,j,k,flag;
- int move[MAXMOVE],disk[MAXMOVE];
- int nmove=0;
- int diskxspeed[MAXDISK],diskyspeed[MAXDISK];
- int movei=1;
- int moving,completed;
- char str1[]="Moves needed : 0000";
- char str2[]="Current move : 0000";
- void str1update(void)
- {
- str1[18]= nmove%10 + 48;
- str1[17]= (nmove/10)%10 +48;
- str1[16]= (nmove/100)%10 +48;
- str1[15]= (nmove/1000)%10 +48;
- }
- void strupdate(void)
- {
- int p=movei;
- if(p>nmove) p--;
- str2[18]= p%10 + 48;
- str2[17]= (p/10)%10 +48;
- str2[16]= (p/100)%10 +48;
- str2[15]= (p/1000)%10 +48;
- }
- void iDraw()
- {
- iClear();
- iSetColor(0,125,255);
- iRectangle(XL,600,XR-XL+200,50);
- iFilledRectangle(XL,600,(XR-XL+200)*(movei-1)/nmove,50);
- iSetColor(125,125,255);
- iFilledRectangle(XL,0,XR-XL+250,BASE);
- iFilledRectangle(XL+100,BASE,10,ndisk*20+20);
- iFilledRectangle(XC+100,BASE,10,ndisk*20+20);
- iFilledRectangle(XR+100,BASE,10,ndisk*20+20);
- iSetColor(255,255,255);
- for(j=1;j<=ndisk;j++)
- {
- iFilledRectangle(diskx[j],disky[j],diskwidth[j],15);
- diskx[j]+=diskxspeed[j];
- disky[j]+=diskyspeed[j];
- }
- iSetColor(200,200,255);
- iText(XC+50,620,"Progress",GLUT_BITMAP_TIMES_ROMAN_24);
- iText(XC,BASE/2-12,"Towers of Hanoi",GLUT_BITMAP_TIMES_ROMAN_24);
- strupdate();
- iText(XC+25,550,str1,GLUT_BITMAP_9_BY_15);
- iText(XC+25,530,str2,GLUT_BITMAP_9_BY_15);
- if(completed)
- {
- iSetColor(255,100,100);
- iText(XC+50,400,"Complete!",GLUT_BITMAP_TIMES_ROMAN_24);
- }
- }
- void iMouseMove(int mx, int my)
- {
- }
- void iMouse(int button, int state, int mx, int my)
- {
- if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
- {
- }
- if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
- {
- }
- }
- void iKeyboard(unsigned char key)
- {
- }
- /*
- function iSpecialKeyboard() is called whenver user hits special keys like-
- function keys, home, end, pg up, pg down, arraows etc. you have to use
- appropriate constants to detect them. A list is:
- GLUT_KEY_F1, GLUT_KEY_F2, GLUT_KEY_F3, GLUT_KEY_F4, GLUT_KEY_F5, GLUT_KEY_F6,
- GLUT_KEY_F7, GLUT_KEY_F8, GLUT_KEY_F9, GLUT_KEY_F10, GLUT_KEY_F11, GLUT_KEY_F12,
- GLUT_KEY_LEFT, GLUT_KEY_UP, GLUT_KEY_RIGHT, GLUT_KEY_DOWN, GLUT_KEY_PAGE UP,
- GLUT_KEY_PAGE DOWN, GLUT_KEY_HOME, GLUT_KEY_END, GLUT_KEY_INSERT
- */
- void iSpecialKeyboard(unsigned char key)
- {
- if(key == GLUT_KEY_END)
- {
- exit(0);
- }
- }
- void fly(void)
- {
- if(move[movei]==LTOC)
- {
- diskyspeed[disk[movei]]=speed;
- if(disky[disk[movei]]>HEIGHT)
- {
- diskyspeed[disk[movei]]=0;
- diskxspeed[disk[movei]]=speed;
- moving=1;
- }
- if(diskx[disk[movei]]>=XC+(ndisk-disk[movei])*10)
- {
- diskxspeed[disk[movei]]=0;
- diskyspeed[disk[movei]]=-speed;
- }
- if(disky[disk[movei]]<=BASE+20*cstack[movei] && moving ==1)
- {
- diskyspeed[disk[movei]]=0;
- disky[disk[movei]]=BASE+20*cstack[movei];
- flag=1;
- }
- }
- if(move[movei]==LTOR)
- {
- diskyspeed[disk[movei]]=speed;
- if(disky[disk[movei]]>HEIGHT)
- {
- diskyspeed[disk[movei]]=0;
- diskxspeed[disk[movei]]=speed;
- moving=1;
- }
- if(diskx[disk[movei]]>=XR+(ndisk-disk[movei])*10)
- {
- diskxspeed[disk[movei]]=0;
- diskyspeed[disk[movei]]=-speed;
- }
- if(disky[disk[movei]]<=BASE+20*rstack[movei] && moving ==1)
- {
- diskyspeed[disk[movei]]=0;
- disky[disk[movei]]=BASE+20*rstack[movei];
- flag=1;
- }
- }
- if(move[movei]==CTOL)
- {
- diskyspeed[disk[movei]]=speed;
- if(disky[disk[movei]]>HEIGHT)
- {
- diskyspeed[disk[movei]]=0;
- diskxspeed[disk[movei]]=-speed;
- moving=1;
- }
- if(diskx[disk[movei]]<=XL+(ndisk-disk[movei])*10)
- {
- diskxspeed[disk[movei]]=0;
- diskyspeed[disk[movei]]=-speed;
- }
- if(disky[disk[movei]]<=BASE+20*lstack[movei] && moving ==1)
- {
- diskyspeed[disk[movei]]=0;
- disky[disk[movei]]=BASE+20*lstack[movei];
- flag=1;
- }
- }
- if(move[movei]==CTOR)
- {
- diskyspeed[disk[movei]]=speed;
- if(disky[disk[movei]]>HEIGHT)
- {
- diskyspeed[disk[movei]]=0;
- diskxspeed[disk[movei]]=speed;
- moving=1;
- }
- if(diskx[disk[movei]]>=XR+(ndisk-disk[movei])*10)
- {
- diskxspeed[disk[movei]]=0;
- diskyspeed[disk[movei]]=-speed;
- }
- if(disky[disk[movei]]<=BASE+20*rstack[movei] && moving ==1)
- {
- diskyspeed[disk[movei]]=0;
- disky[disk[movei]]=BASE+20*rstack[movei];
- flag=1;
- }
- }
- if(move[movei]==RTOL)
- {
- diskyspeed[disk[movei]]=speed;
- if(disky[disk[movei]]>HEIGHT)
- {
- diskyspeed[disk[movei]]=0;
- diskxspeed[disk[movei]]=-speed;
- moving=1;
- }
- if(diskx[disk[movei]]<=XL+(ndisk-disk[movei])*10)
- {
- diskxspeed[disk[movei]]=0;
- diskyspeed[disk[movei]]=-speed;
- }
- if(disky[disk[movei]]<=BASE+20*lstack[movei] && moving ==1)
- {
- diskyspeed[disk[movei]]=0;
- disky[disk[movei]]=BASE+20*lstack[movei];
- flag=1;
- }
- }
- if(move[movei]==RTOC)
- {
- diskyspeed[disk[movei]]=speed;
- if(disky[disk[movei]]>HEIGHT)
- {
- diskyspeed[disk[movei]]=0;
- diskxspeed[disk[movei]]=-speed;
- moving=1;
- }
- if(diskx[disk[movei]]<=XC+(ndisk-disk[movei])*10)
- {
- diskxspeed[disk[movei]]=0;
- diskyspeed[disk[movei]]=-speed;
- }
- if(disky[disk[movei]]<=BASE+20*cstack[movei] && moving ==1)
- {
- diskyspeed[disk[movei]]=0;
- disky[disk[movei]]=BASE+20*cstack[movei];
- flag=1;
- }
- }
- if (flag==1){
- // printf("Total moves needed: %d, Current move # %d\n\n\n",nmove,movei);
- movei++;
- flag=0;
- moving=0;
- }
- if(movei>nmove)
- {
- iPauseTimer(0);
- completed=1;
- }
- }
- void hanoi(int n, char f,char to, char tmp)
- {
- if(n>0)
- {
- hanoi(n-1,f,tmp,to);
- // printf("Move disk %d from %c to %c\n",n,f,to);
- nmove++;
- lstack[nmove]=l;
- cstack[nmove]=c;
- rstack[nmove]=r;
- if(f=='L')
- {
- l--;
- if(to=='C') {c++; move[nmove]=LTOC;}
- else { r++; move[nmove]=LTOR;}
- }
- else if(f=='C')
- {
- c--;
- if(to=='L') {l++; move[nmove]=CTOL;}
- else {r++; move[nmove]=CTOR;}
- }
- else
- {
- r--;
- if(to=='L') {l++; move[nmove]=RTOL;}
- else {c++; move[nmove]=RTOC;}
- }
- disk[nmove]=n;
- hanoi(n-1,tmp,to,f);
- }
- }
- int main()
- {
- int n;
- char from='L',temp='C',to='R';
- for(;;)
- {
- printf("How Many disks? ");
- scanf("%d",&n);
- if(n>10) printf("This may need thousands of moves. Please enter a smaller number.\n\n");
- else break;
- }
- ndisk=l=n;
- l=n;c=0;r=0;
- hanoi(n,from,to,temp);
- for(int i=1;i<=ndisk;i++)
- {
- diskx[i]=XL+(ndisk-i)*10;
- disky[i]=BASE+(ndisk-i)*20;
- diskwidth[i]=200-(ndisk-i)*20;
- }
- str1update();
- iSetTimer(1,fly);
- iInitialize(1000,700,"Towers of Hanoi Simulation");
- return 0;
- }
Add Comment
Please, Sign In to add comment