home *** CD-ROM | disk | FTP | other *** search
/ Vectronix 2 / VECTRONIX2.iso / FILES_01 / LATTIC_3.LZH / EXAMPLES / HANOI.C < prev    next >
C/C++ Source or Header  |  1990-09-11  |  3KB  |  132 lines

  1. /*
  2.  * The Towers of Hanoi program in Lattice C
  3.  *
  4.  *    lc -csf -v -w -rr -O -Lavg hanoi.c
  5.  *
  6.  * Copyright (c) 1990 HiSoft
  7.  */
  8.  
  9. #include <aes.h>
  10. #include <vdi.h>
  11. #include <stdlib.h>
  12. #include <stdio.h>
  13. #include <time.h>
  14.  
  15. #define max_rings    25
  16. #define left    0
  17. #define middle    1
  18. #define right    2
  19. #define space    50
  20. #define gap    10
  21.  
  22. /* v_opnvwk input array */
  23. short work_in[11]={1,1,1,1,1,1,1,1,1,1,2};
  24.  
  25. /* v_opnvwk output array */
  26. short work_out[57];
  27.  
  28. short handle;        /* virtual workstation handle */
  29.  
  30. unsigned int ring_height,full_height,max_width,pole[3];
  31.  
  32. short highest[3];
  33.  
  34. unsigned int (*poles)[3];
  35.  
  36. void draw_ring(unsigned int which_pole,unsigned int size,enum {DRAW=2,ERASE=0} type,unsigned int start)
  37. {
  38.     unsigned int xstart,ystart;
  39.     short xy[4];
  40.  
  41.     vsf_interior(handle,(int)type);
  42.     xstart=pole[which_pole]-size/2;
  43.     ystart=full_height-space-start*ring_height;
  44.     
  45.     xy[0]=xstart;
  46.     xy[1]=ystart;
  47.     xy[2]=xstart+size;
  48.     xy[3]=ystart+ring_height-2;
  49.     if (type==ERASE)
  50.         vr_recfl(handle,xy);
  51.     else
  52.         v_bar(handle,xy);
  53. }
  54.  
  55. void realmove(unsigned int source, unsigned int destination)
  56. {
  57.     unsigned int ring_width;
  58.  
  59.     ring_width=poles[highest[source]-1][source];
  60.  
  61.     /* erase source ring */
  62.     draw_ring(source,ring_width,ERASE,highest[source]);
  63.     poles[highest[source]-1][source]=0;
  64.     highest[source]--;
  65.  
  66.     /* draw destination ring */
  67.     highest[destination]++;
  68.     poles[highest[destination]-1][destination]=ring_width;
  69.     vsf_style(handle,highest[destination]);
  70.     draw_ring(destination,ring_width,DRAW,highest[destination]);
  71. }
  72.  
  73. void move(unsigned int howmany, unsigned int source, unsigned int work, unsigned int destination)
  74. {
  75.     if (howmany<=1)
  76.         realmove(source,destination);
  77.     else
  78.     {
  79.         move(howmany-1,source,destination,work);
  80.         realmove(source,destination);
  81.         move(howmany-1,work,source,destination);
  82.     }
  83. }
  84.  
  85. int main(void)
  86. {
  87.     short junk;            /* unused variable */
  88.     unsigned int i,num_rings;
  89.     clock_t tm;
  90.     
  91.     appl_init();        /* start AES */
  92.     handle=graf_handle(&junk,&junk,&junk,&junk);    /* find AES handle */
  93.     v_opnvwk(work_in,&handle,work_out);                /* open workstation */
  94.     max_width=(work_out[0]-gap*4)/3;
  95.     full_height=work_out[1];
  96.  
  97.     for (i=0; i<3; i++)
  98.         pole[i]=(max_width+gap)*i+max_width/2+gap;
  99.     
  100.     do
  101.     {
  102.         printf("Number of rings to move: ");
  103.         scanf("%d",&num_rings);
  104.     }
  105.     while (num_rings<=1 || num_rings>max_rings);
  106.  
  107.     poles=malloc(max_rings*sizeof(*poles));
  108.     ring_height=(full_height-2*space)/max_rings;
  109.     graf_mouse(M_OFF,NULL);
  110.     v_clrwk(handle);
  111.     vsf_color(handle,BLACK);
  112.  
  113.     /* initialise first pole */
  114.     for (i=0; i<num_rings; i++)
  115.         poles[i][0]=max_width-i*(max_width/num_rings);
  116.  
  117.     for (i=0; i<num_rings; i++)
  118.     {        
  119.         vsf_style(handle,i+1);
  120.         highest[0]=i+1;
  121.         draw_ring(0,poles[i][0],DRAW,highest[0]);
  122.     }
  123.     tm=clock();
  124.     move(num_rings,left,middle,right);
  125.     tm=clock()-tm;
  126.     printf("%d rings moved in %ld.%03ld seconds\n",num_rings,(long)(tm/CLK_TCK),(long)(((tm%CLK_TCK)*1000)/CLK_TCK));
  127.     evnt_keybd();
  128.     v_clsvwk(handle);
  129.     graf_mouse(M_ON,NULL);
  130.     return appl_exit();
  131. }
  132.