Guest User

Untitled

a guest
Jul 21st, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.86 KB | None | 0 0
  1. /*  Towers of Hanoi Simulation
  2.  
  3.     Mehedee Zaman
  4.     Studend ID # 0905072
  5.  
  6. */
  7.  
  8. # include "iGraphics.h"
  9.  
  10. #define LTOC 1                     
  11. #define LTOR 2
  12. #define CTOL 3
  13. #define CTOR 4
  14. #define RTOL 5
  15. #define RTOC 6
  16.  
  17. #define MAXDISK 20
  18. #define MAXMOVE 1500
  19.  
  20. #define speed 2
  21.  
  22. #define XL 40
  23. #define XC 360
  24. #define XR 640
  25.  
  26. #define HEIGHT 450
  27. #define BASE 100
  28.  
  29.  
  30. int l,r,c;
  31. int ndisk;
  32. int lstack[MAXMOVE],rstack[MAXMOVE],cstack[MAXMOVE];
  33. int diskx[MAXDISK],disky[MAXDISK],diskwidth[MAXDISK];
  34. int i,j,k,flag;
  35. int move[MAXMOVE],disk[MAXMOVE];
  36. int nmove=0;
  37. int diskxspeed[MAXDISK],diskyspeed[MAXDISK];
  38. int movei=1;
  39. int moving,completed;
  40.  
  41. char str1[]="Moves needed : 0000";
  42. char str2[]="Current move : 0000";
  43.  
  44.  
  45.  
  46.  
  47. void str1update(void)
  48. {
  49.     str1[18]= nmove%10 + 48;
  50.     str1[17]= (nmove/10)%10 +48;
  51.     str1[16]= (nmove/100)%10 +48;
  52.     str1[15]= (nmove/1000)%10 +48;
  53. }
  54.  
  55. void strupdate(void)
  56. {
  57.     int p=movei;
  58.  
  59.     if(p>nmove) p--;
  60.  
  61.     str2[18]= p%10 + 48;
  62.     str2[17]= (p/10)%10 +48;
  63.     str2[16]= (p/100)%10 +48;
  64.     str2[15]= (p/1000)%10 +48;
  65.  
  66. }
  67.  
  68.  
  69. void iDraw()
  70. {
  71.    
  72.     iClear();
  73.    
  74.     iSetColor(0,125,255);
  75.     iRectangle(XL,600,XR-XL+200,50);
  76.     iFilledRectangle(XL,600,(XR-XL+200)*(movei-1)/nmove,50);
  77.  
  78.     iSetColor(125,125,255);
  79.     iFilledRectangle(XL,0,XR-XL+250,BASE);
  80.     iFilledRectangle(XL+100,BASE,10,ndisk*20+20);
  81.     iFilledRectangle(XC+100,BASE,10,ndisk*20+20);
  82.     iFilledRectangle(XR+100,BASE,10,ndisk*20+20);
  83.  
  84.     iSetColor(255,255,255);
  85.     for(j=1;j<=ndisk;j++)
  86.     {
  87.        
  88.         iFilledRectangle(diskx[j],disky[j],diskwidth[j],15);
  89.    
  90.         diskx[j]+=diskxspeed[j];
  91.         disky[j]+=diskyspeed[j];
  92.        
  93.     }
  94.  
  95.     iSetColor(200,200,255);
  96.     iText(XC+50,620,"Progress",GLUT_BITMAP_TIMES_ROMAN_24);
  97.     iText(XC,BASE/2-12,"Towers of Hanoi",GLUT_BITMAP_TIMES_ROMAN_24);
  98.  
  99.     strupdate();   
  100.     iText(XC+25,550,str1,GLUT_BITMAP_9_BY_15);
  101.     iText(XC+25,530,str2,GLUT_BITMAP_9_BY_15);
  102.  
  103.     if(completed)
  104.     {
  105.         iSetColor(255,100,100);
  106.         iText(XC+50,400,"Complete!",GLUT_BITMAP_TIMES_ROMAN_24);
  107.    
  108.     }
  109.    
  110.  
  111.    
  112. }
  113.  
  114.  
  115. void iMouseMove(int mx, int my)
  116. {
  117.    
  118. }
  119.  
  120.  
  121. void iMouse(int button, int state, int mx, int my)
  122. {
  123.     if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
  124.     {
  125.        
  126.     }
  127.     if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
  128.     {
  129.     }
  130. }
  131.  
  132.  
  133. void iKeyboard(unsigned char key)
  134. {
  135.  
  136.  
  137.    
  138. }
  139.  
  140. /*
  141. function iSpecialKeyboard() is called whenver user hits special keys like-
  142. function keys, home, end, pg up, pg down, arraows etc. you have to use
  143. appropriate constants to detect them. A list is:
  144. GLUT_KEY_F1, GLUT_KEY_F2, GLUT_KEY_F3, GLUT_KEY_F4, GLUT_KEY_F5, GLUT_KEY_F6,
  145. GLUT_KEY_F7, GLUT_KEY_F8, GLUT_KEY_F9, GLUT_KEY_F10, GLUT_KEY_F11, GLUT_KEY_F12,
  146. GLUT_KEY_LEFT, GLUT_KEY_UP, GLUT_KEY_RIGHT, GLUT_KEY_DOWN, GLUT_KEY_PAGE UP,
  147. GLUT_KEY_PAGE DOWN, GLUT_KEY_HOME, GLUT_KEY_END, GLUT_KEY_INSERT
  148. */
  149. void iSpecialKeyboard(unsigned char key)
  150. {
  151.    
  152.     if(key == GLUT_KEY_END)
  153.     {
  154.         exit(0);   
  155.     }
  156.    
  157. }
  158.  
  159.  
  160.  
  161.  
  162. void fly(void)
  163. {
  164.     if(move[movei]==LTOC)
  165.     {
  166.         diskyspeed[disk[movei]]=speed;
  167.        
  168.         if(disky[disk[movei]]>HEIGHT)
  169.         {
  170.             diskyspeed[disk[movei]]=0;
  171.             diskxspeed[disk[movei]]=speed;
  172.             moving=1;
  173.         }
  174.        
  175.         if(diskx[disk[movei]]>=XC+(ndisk-disk[movei])*10)
  176.         {
  177.             diskxspeed[disk[movei]]=0;
  178.  
  179.             diskyspeed[disk[movei]]=-speed;
  180.            
  181.         }
  182.        
  183.         if(disky[disk[movei]]<=BASE+20*cstack[movei] && moving ==1)
  184.         {
  185.             diskyspeed[disk[movei]]=0;
  186.             disky[disk[movei]]=BASE+20*cstack[movei];
  187.        
  188.             flag=1;
  189.    
  190.            
  191.         }
  192.        
  193.        
  194.        
  195.        
  196.        
  197.        
  198.        
  199.     }
  200.    
  201.     if(move[movei]==LTOR)
  202.     {
  203.         diskyspeed[disk[movei]]=speed;
  204.        
  205.         if(disky[disk[movei]]>HEIGHT)
  206.         {
  207.             diskyspeed[disk[movei]]=0;
  208.             diskxspeed[disk[movei]]=speed;
  209.             moving=1;
  210.         }
  211.        
  212.         if(diskx[disk[movei]]>=XR+(ndisk-disk[movei])*10)
  213.         {
  214.             diskxspeed[disk[movei]]=0;
  215.             diskyspeed[disk[movei]]=-speed;
  216.            
  217.         }
  218.        
  219.         if(disky[disk[movei]]<=BASE+20*rstack[movei] && moving ==1)
  220.         {
  221.             diskyspeed[disk[movei]]=0;
  222.             disky[disk[movei]]=BASE+20*rstack[movei];
  223.             flag=1;
  224.        
  225.         }
  226.        
  227.        
  228.     }
  229.    
  230.  
  231.    
  232.     if(move[movei]==CTOL)
  233.     {
  234.         diskyspeed[disk[movei]]=speed;
  235.        
  236.         if(disky[disk[movei]]>HEIGHT)
  237.         {
  238.             diskyspeed[disk[movei]]=0;
  239.             diskxspeed[disk[movei]]=-speed;
  240.             moving=1;
  241.         }
  242.        
  243.         if(diskx[disk[movei]]<=XL+(ndisk-disk[movei])*10)
  244.         {
  245.             diskxspeed[disk[movei]]=0;
  246.  
  247.             diskyspeed[disk[movei]]=-speed;
  248.            
  249.         }
  250.        
  251.         if(disky[disk[movei]]<=BASE+20*lstack[movei] && moving ==1)
  252.         {
  253.             diskyspeed[disk[movei]]=0;
  254.             disky[disk[movei]]=BASE+20*lstack[movei];
  255.             flag=1;
  256.        
  257.         }
  258.        
  259.     }
  260.    
  261.     if(move[movei]==CTOR)
  262.     {
  263.         diskyspeed[disk[movei]]=speed;
  264.        
  265.         if(disky[disk[movei]]>HEIGHT)
  266.         {
  267.             diskyspeed[disk[movei]]=0;
  268.             diskxspeed[disk[movei]]=speed;
  269.             moving=1;
  270.         }
  271.        
  272.         if(diskx[disk[movei]]>=XR+(ndisk-disk[movei])*10)
  273.         {
  274.             diskxspeed[disk[movei]]=0;
  275.  
  276.             diskyspeed[disk[movei]]=-speed;
  277.            
  278.         }
  279.        
  280.         if(disky[disk[movei]]<=BASE+20*rstack[movei] && moving ==1)
  281.         {
  282.             diskyspeed[disk[movei]]=0;
  283.             disky[disk[movei]]=BASE+20*rstack[movei];
  284.             flag=1;
  285.        
  286.         }
  287.        
  288.     }
  289.  
  290.         if(move[movei]==RTOL)
  291.     {
  292.         diskyspeed[disk[movei]]=speed;
  293.        
  294.         if(disky[disk[movei]]>HEIGHT)
  295.         {
  296.             diskyspeed[disk[movei]]=0;
  297.  
  298.             diskxspeed[disk[movei]]=-speed;
  299.             moving=1;
  300.         }
  301.        
  302.         if(diskx[disk[movei]]<=XL+(ndisk-disk[movei])*10)
  303.         {
  304.             diskxspeed[disk[movei]]=0;
  305.  
  306.             diskyspeed[disk[movei]]=-speed;
  307.            
  308.         }
  309.        
  310.         if(disky[disk[movei]]<=BASE+20*lstack[movei] && moving ==1)
  311.         {
  312.             diskyspeed[disk[movei]]=0;
  313.             disky[disk[movei]]=BASE+20*lstack[movei];
  314.             flag=1;
  315.        
  316.            
  317.         }
  318.        
  319.        
  320.        
  321.     }
  322.    
  323.     if(move[movei]==RTOC)
  324.     {
  325.         diskyspeed[disk[movei]]=speed;
  326.        
  327.         if(disky[disk[movei]]>HEIGHT)
  328.         {
  329.             diskyspeed[disk[movei]]=0;
  330.             diskxspeed[disk[movei]]=-speed;
  331.             moving=1;
  332.         }
  333.        
  334.         if(diskx[disk[movei]]<=XC+(ndisk-disk[movei])*10)
  335.         {
  336.             diskxspeed[disk[movei]]=0;
  337.  
  338.             diskyspeed[disk[movei]]=-speed;
  339.            
  340.         }
  341.        
  342.         if(disky[disk[movei]]<=BASE+20*cstack[movei] && moving ==1)
  343.         {
  344.             diskyspeed[disk[movei]]=0;
  345.             disky[disk[movei]]=BASE+20*cstack[movei];
  346.             flag=1;
  347.        
  348.            
  349.         }
  350.        
  351.     }
  352.    
  353.    
  354.  
  355.     if (flag==1){
  356.  
  357. //      printf("Total moves needed: %d, Current move # %d\n\n\n",nmove,movei);
  358.         movei++;
  359.         flag=0;
  360.         moving=0;
  361.     }
  362.    
  363.     if(movei>nmove)
  364.     {
  365.         iPauseTimer(0);
  366.         completed=1;
  367.     }
  368.    
  369.    
  370.    
  371. }
  372.  
  373. void hanoi(int n, char f,char to, char tmp)
  374. {
  375.     if(n>0)
  376.     {
  377.         hanoi(n-1,f,tmp,to);
  378.        
  379.         //  printf("Move disk %d from %c to %c\n",n,f,to);
  380.        
  381.         nmove++;
  382.        
  383.         lstack[nmove]=l;
  384.         cstack[nmove]=c;
  385.         rstack[nmove]=r;
  386.        
  387.         if(f=='L')
  388.         {
  389.             l--;
  390.             if(to=='C') {c++; move[nmove]=LTOC;}
  391.             else { r++; move[nmove]=LTOR;}
  392.         }
  393.         else if(f=='C')
  394.         {
  395.             c--;
  396.             if(to=='L') {l++; move[nmove]=CTOL;}
  397.             else {r++; move[nmove]=CTOR;}
  398.         }
  399.         else
  400.         {
  401.             r--;
  402.             if(to=='L') {l++; move[nmove]=RTOL;}
  403.             else {c++; move[nmove]=RTOC;}
  404.            
  405.         }
  406.        
  407.        
  408.         disk[nmove]=n;
  409.        
  410.        
  411.         hanoi(n-1,tmp,to,f);
  412.        
  413.     }
  414.    
  415.    
  416. }
  417.  
  418. int main()
  419. {
  420.     int n;
  421.     char from='L',temp='C',to='R';
  422.     for(;;)
  423.     {
  424.         printf("How Many disks? ");
  425.         scanf("%d",&n);
  426.        
  427.         if(n>10) printf("This may need thousands of moves. Please enter a smaller number.\n\n");
  428.         else break;
  429.     }
  430.     ndisk=l=n;
  431.     l=n;c=0;r=0;
  432.    
  433.     hanoi(n,from,to,temp);
  434.    
  435.    
  436.     for(int i=1;i<=ndisk;i++)
  437.     {
  438.         diskx[i]=XL+(ndisk-i)*10;
  439.         disky[i]=BASE+(ndisk-i)*20;
  440.         diskwidth[i]=200-(ndisk-i)*20;
  441.        
  442.        
  443.     }
  444.    
  445.     str1update();
  446.     iSetTimer(1,fly);
  447.    
  448.     iInitialize(1000,700,"Towers of Hanoi Simulation");
  449.    
  450.     return 0;
  451.    
  452. }
Add Comment
Please, Sign In to add comment