home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume37 / magiccube / part01 / cube / layer1corner.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-05-15  |  14.0 KB  |  624 lines

  1. /* layer1corner.c
  2.    This incorporates Don Taylor's solution to the 
  3.    Buvos Kocka (Hungarian Magic Cube). 
  4.  
  5.    First Layer Corner Cube
  6.  
  7.    The following references were used:
  8.    "The X Window System Programming And Applications with Xt
  9.    OSF/MOTIF EDITION"
  10.    by Douglas A Young 
  11.    Prentice-Hall, 1990.
  12.    ISBN 0-13-642786-3
  13.  
  14.    "Mastering Rubik's Cube"
  15.    by Don Taylor
  16.    An Owl Book; Holt, Rinehart and Winston, New York, 1980
  17.    ISBN 0-03-059941-5
  18.  
  19. -------------------------------------------------------------------
  20. Copyright (C) 1993 by Pierre A. Fleurant
  21. Permission is granted to copy and distribute this program
  22. without charge, provided this copyright notice is included
  23. in the copy.
  24. This Software is distributed on an as-is basis. There will be
  25. ABSOLUTELY NO WARRANTY for any part of this software to work
  26. correct. In no case will the author be liable to you for damages
  27. caused by the usage of this software.
  28. -------------------------------------------------------------------    
  29. */   
  30.  
  31. #include "taylor.h"
  32.  
  33. extern void F(); /*  front  */
  34. extern void L(); /*  left   */
  35. extern void R(); /*  right  */
  36. extern void B(); /*  back   */
  37. extern void U(); /*  up     */
  38. extern void D(); /*  down   */
  39.  
  40. extern void first_layer_corner_tfr();   /* layer1c_txx */
  41. extern void first_layer_corner_trb();   /* layer1c_txx */
  42. extern void first_layer_corner_tbl();   /* layer1c_txx */
  43. extern void first_layer_corner_tlf();   /* layer1c_txx */
  44.  
  45. Boolean first_layer_corner(w,wdata,call_data) /* These parameters needed for macros */
  46.      Widget   w;
  47.      widget_data *wdata;
  48.      caddr_t  call_data;
  49. {
  50.   /* Search for the Top corner cubes,
  51.      place in lower layer directly below
  52.      destination cube then  
  53.      dispatch to first_layer_corner_tXX accordingly.
  54.      There are 8 corner cubes in all.
  55.      */
  56.  
  57.   /* Bottom Corner Cubes */
  58.   /* There are 12 places a TOP can be in the bottom layer.
  59.    */
  60.   
  61.   /*1*/
  62.   if(Front(8) == TOP){
  63.     if(Right(6) == FRONT){
  64.       if(Bottom(2) == RIGHT){
  65.     first_layer_corner_tfr(w,wdata,call_data); 
  66.       }
  67.       else if(Bottom(2) == LEFT){
  68.     D(-1);
  69.     first_layer_corner_tlf(w,wdata,call_data); 
  70.       }
  71.     }
  72.     else if(Right(6) == RIGHT){
  73.       if(Bottom(2) == FRONT){
  74.     first_layer_corner_tfr(w,wdata,call_data); 
  75.       }
  76.       else if(Bottom(2) == BACK){
  77.     D(1);
  78.     first_layer_corner_trb(w,wdata,call_data); 
  79.       }
  80.     }
  81.     else if(Right(6) == BACK){
  82.       if(Bottom(2) == RIGHT){
  83.     D(1);
  84.     first_layer_corner_trb(w,wdata,call_data);
  85.       }
  86.       else if(Bottom(2) == LEFT){
  87.     D(2);
  88.     first_layer_corner_tbl(w,wdata,call_data);
  89.       }
  90.     }
  91.     else if(Right(6) == LEFT){
  92.       if(Bottom(2) == FRONT){
  93.     D(-1);
  94.     first_layer_corner_tlf(w,wdata,call_data);
  95.       }
  96.       else if(Bottom(2) == BACK){
  97.     D(2);
  98.     first_layer_corner_tbl(w,wdata,call_data);
  99.       }
  100.     }
  101.   }
  102.   
  103.   else if(Right(6) == TOP){
  104.     if(Front(8) == FRONT){
  105.       if(Bottom(2) == RIGHT){
  106.     first_layer_corner_tfr(w,wdata,call_data); 
  107.       }
  108.       else if(Bottom(2) == LEFT){
  109.     D(-1);
  110.     first_layer_corner_tlf(w,wdata,call_data); 
  111.       }
  112.     }
  113.     else if(Front(8) == RIGHT){
  114.       if(Bottom(2) == FRONT){
  115.     first_layer_corner_tfr(w,wdata,call_data); 
  116.       }
  117.       else if(Bottom(2) == BACK){
  118.     D(1);
  119.     first_layer_corner_trb(w,wdata,call_data); 
  120.       }
  121.     }
  122.     else if(Front(8) == BACK){
  123.       if(Bottom(2) == RIGHT){
  124.     D(1);
  125.     first_layer_corner_trb(w,wdata,call_data);
  126.       }
  127.       else if(Bottom(2) == LEFT){
  128.     D(2);
  129.     first_layer_corner_tbl(w,wdata,call_data);
  130.       }
  131.     }
  132.     else if(Front(8) == LEFT){
  133.       if(Bottom(2) == FRONT){
  134.     D(-1);
  135.     first_layer_corner_tlf(w,wdata,call_data);
  136.       }
  137.       else if(Bottom(2) == BACK){
  138.     D(2);
  139.     first_layer_corner_tbl(w,wdata,call_data);
  140.       }
  141.     }
  142.   }
  143.   
  144.   else if(Bottom(2) == TOP){
  145.     if(Front(8) == FRONT){
  146.       if(Right(6) == RIGHT){
  147.     first_layer_corner_tfr(w,wdata,call_data); 
  148.       }
  149.       else if(Right(6) == LEFT){
  150.     D(-1);
  151.     first_layer_corner_tlf(w,wdata,call_data); 
  152.       }
  153.     }
  154.     else if(Front(8) == RIGHT){
  155.       if(Right(6) == FRONT){
  156.     first_layer_corner_tfr(w,wdata,call_data); 
  157.       }
  158.       else if(Right(6) == BACK){
  159.     D(1);
  160.     first_layer_corner_trb(w,wdata,call_data); 
  161.       }
  162.     }
  163.     else if(Front(8) == BACK){
  164.       if(Right(6) == RIGHT){
  165.     D(1);
  166.     first_layer_corner_trb(w,wdata,call_data);
  167.       }
  168.       else if(Right(6) == LEFT){
  169.     D(2);
  170.     first_layer_corner_tbl(w,wdata,call_data);
  171.       }
  172.     }
  173.     else if(Front(8) == LEFT){
  174.       if(Right(6) == FRONT){
  175.     D(-1);
  176.     first_layer_corner_tlf(w,wdata,call_data);
  177.       }
  178.       else if(Right(6) == BACK){
  179.     D(2);
  180.     first_layer_corner_tbl(w,wdata,call_data);
  181.       }
  182.     }
  183.   }
  184.   
  185.   /*2*/
  186.   if(Right(8)  == TOP){
  187.     if(Back(8) == FRONT){
  188.       if(Bottom(8) == RIGHT){
  189.     D(-1);
  190.     first_layer_corner_tfr(w,wdata,call_data); 
  191.       }
  192.       else if(Bottom(8) == LEFT){
  193.     D(2);
  194.     first_layer_corner_tlf(w,wdata,call_data); 
  195.       }
  196.     }
  197.     else if(Back(8) == RIGHT){
  198.       if(Bottom(8) == FRONT){
  199.     D(-1);
  200.     first_layer_corner_tfr(w,wdata,call_data); 
  201.       }
  202.       else if(Bottom(8) == BACK){
  203.     first_layer_corner_trb(w,wdata,call_data); 
  204.       }
  205.     }
  206.     else if(Back(8) == BACK){
  207.       if(Bottom(8) == RIGHT){
  208.     first_layer_corner_trb(w,wdata,call_data);
  209.       }
  210.       else if(Bottom(8) == LEFT){
  211.     D(1);
  212.     first_layer_corner_tbl(w,wdata,call_data);
  213.       }
  214.     }
  215.     else if(Back(8) == LEFT){
  216.       if(Bottom(8) == FRONT){
  217.     D(2);
  218.     first_layer_corner_tlf(w,wdata,call_data);
  219.       }
  220.       else if(Bottom(8) == BACK){
  221.     D(1);
  222.     first_layer_corner_tbl(w,wdata,call_data);
  223.       }
  224.     }
  225.   }
  226.   
  227.   else if(Back(8)  == TOP){
  228.     if(Right(8) == FRONT){
  229.       if(Bottom(8) == RIGHT){
  230.     D(-1);
  231.     first_layer_corner_tfr(w,wdata,call_data); 
  232.       }
  233.       else if(Bottom(8) == LEFT){
  234.     D(2);
  235.     first_layer_corner_tlf(w,wdata,call_data); 
  236.       }
  237.     }
  238.     else if(Right(8) == RIGHT){
  239.       if(Bottom(8) == FRONT){
  240.     D(-1);
  241.     first_layer_corner_tfr(w,wdata,call_data); 
  242.       }
  243.       else if(Bottom(8) == BACK){
  244.     first_layer_corner_trb(w,wdata,call_data); 
  245.       }
  246.     }
  247.     else if(Right(8) == BACK){
  248.       if(Bottom(8) == RIGHT){
  249.     first_layer_corner_trb(w,wdata,call_data);
  250.       }
  251.       else if(Bottom(8) == LEFT){
  252.     D(1);
  253.     first_layer_corner_tbl(w,wdata,call_data);
  254.       }
  255.     }
  256.     else if(Right(8) == LEFT){
  257.       if(Bottom(8) == FRONT){
  258.     D(2);
  259.     first_layer_corner_tlf(w,wdata,call_data);
  260.       }
  261.       else if(Bottom(8) == BACK){
  262.     D(1);
  263.     first_layer_corner_tbl(w,wdata,call_data);
  264.       }
  265.     }
  266.   }
  267.   
  268.   else if(Bottom(8)  == TOP){
  269.     if(Right(8) == FRONT){
  270.       if(Back(8) == RIGHT){
  271.     D(-1);
  272.     first_layer_corner_tfr(w,wdata,call_data); 
  273.       }
  274.       else if(Back(8) == LEFT){
  275.     D(2);
  276.     first_layer_corner_tlf(w,wdata,call_data); 
  277.       }
  278.     }
  279.     else if(Right(8) == RIGHT){
  280.       if(Back(8) == FRONT){
  281.     D(-1);
  282.     first_layer_corner_tfr(w,wdata,call_data); 
  283.       }
  284.       else if(Back(8) == BACK){
  285.     first_layer_corner_trb(w,wdata,call_data); 
  286.       }
  287.     }
  288.     else if(Right(8) == BACK){
  289.       if(Back(8) == RIGHT){
  290.     first_layer_corner_trb(w,wdata,call_data);
  291.       }
  292.       else if(Back(8) == LEFT){
  293.     D(1);
  294.     first_layer_corner_tbl(w,wdata,call_data);
  295.       }
  296.     }
  297.     else if(Right(8) == LEFT){
  298.       if(Back(8) == FRONT){
  299.     D(2);
  300.     first_layer_corner_tlf(w,wdata,call_data);
  301.       }
  302.       else if(Back(8) == BACK){
  303.     D(1);
  304.     first_layer_corner_tbl(w,wdata,call_data);
  305.       }
  306.     }
  307.   }
  308.   
  309.   /*3*/
  310.   if(Back(6)  == TOP){
  311.     if(Left(8) == FRONT){
  312.       if(Bottom(6) == RIGHT){
  313.     D(2);
  314.     first_layer_corner_tfr(w,wdata,call_data); 
  315.       }
  316.       else if(Bottom(6) == LEFT){
  317.     D(1);
  318.     first_layer_corner_tlf(w,wdata,call_data); 
  319.       }
  320.     }
  321.     else if(Left(8) == RIGHT){
  322.       if(Bottom(6) == FRONT){
  323.     D(2);
  324.     first_layer_corner_tfr(w,wdata,call_data); 
  325.       }
  326.       else if(Bottom(6) == BACK){
  327.     D(-1);
  328.     first_layer_corner_trb(w,wdata,call_data); 
  329.       }
  330.     }
  331.     else if(Left(8) == BACK){
  332.       if(Bottom(6) == RIGHT){
  333.     D(-1);
  334.     first_layer_corner_trb(w,wdata,call_data);
  335.       }
  336.       else if(Bottom(6) == LEFT){
  337.     first_layer_corner_tbl(w,wdata,call_data);
  338.       }
  339.     }
  340.     else if(Left(8) == LEFT){
  341.       if(Bottom(6) == FRONT){
  342.     D(1);
  343.     first_layer_corner_tlf(w,wdata,call_data);
  344.       }
  345.       else if(Bottom(6) == BACK){
  346.     first_layer_corner_tbl(w,wdata,call_data);
  347.       }
  348.     }
  349.   }
  350.   
  351.   else if(Left(8)  == TOP){
  352.     if(Back(6) == FRONT){
  353.       if(Bottom(6) == RIGHT){
  354.     D(2);
  355.     first_layer_corner_tfr(w,wdata,call_data); 
  356.       }
  357.       else if(Bottom(6) == LEFT){
  358.     D(1);
  359.     first_layer_corner_tlf(w,wdata,call_data); 
  360.       }
  361.     }
  362.     else if(Back(6) == RIGHT){
  363.       if(Bottom(6) == FRONT){
  364.     D(2);
  365.     first_layer_corner_tfr(w,wdata,call_data); 
  366.       }
  367.       else if(Bottom(6) == BACK){
  368.     D(-1);
  369.     first_layer_corner_trb(w,wdata,call_data); 
  370.       }
  371.     }
  372.     else if(Back(6) == BACK){
  373.       if(Bottom(6) == RIGHT){
  374.     D(-1);
  375.     first_layer_corner_trb(w,wdata,call_data);
  376.       }
  377.       else if(Bottom(6) == LEFT){
  378.     first_layer_corner_tbl(w,wdata,call_data);
  379.       }
  380.     }
  381.     else if(Back(6) == LEFT){
  382.       if(Bottom(6) == FRONT){
  383.     D(1);
  384.     first_layer_corner_tlf(w,wdata,call_data);
  385.       }
  386.       else if(Bottom(6) == BACK){
  387.     first_layer_corner_tbl(w,wdata,call_data);
  388.       }
  389.     }
  390.   }
  391.   
  392.   else if(Bottom(6)  == TOP){
  393.     if(Back(6) == FRONT){
  394.       if(Left(8) == RIGHT){
  395.     D(2);
  396.     first_layer_corner_tfr(w,wdata,call_data); 
  397.       }
  398.       else if(Left(8) == LEFT){
  399.     D(1);
  400.     first_layer_corner_tlf(w,wdata,call_data); 
  401.       }
  402.     }
  403.     else if(Back(6) == RIGHT){
  404.       if(Left(8) == FRONT){
  405.     D(2);
  406.     first_layer_corner_tfr(w,wdata,call_data); 
  407.       }
  408.       else if(Left(8) == BACK){
  409.     D(-1);
  410.     first_layer_corner_trb(w,wdata,call_data); 
  411.       }
  412.     }
  413.     else if(Back(6) == BACK){
  414.       if(Left(8) == RIGHT){
  415.     D(-1);
  416.     first_layer_corner_trb(w,wdata,call_data);
  417.       }
  418.       else if(Left(8) == LEFT){
  419.     first_layer_corner_tbl(w,wdata,call_data);
  420.       }
  421.     }
  422.     else if(Back(6) == LEFT){
  423.       if(Left(8) == FRONT){
  424.     D(1);
  425.     first_layer_corner_tlf(w,wdata,call_data);
  426.       }
  427.       else if(Left(8) == BACK){
  428.     first_layer_corner_tbl(w,wdata,call_data);
  429.       }
  430.     }
  431.   }
  432.   
  433.   /*4*/
  434.   if(Left(6)  == TOP){
  435.     if(Front(6) == FRONT){
  436.       if(Bottom(0) == RIGHT){
  437.     D(1);
  438.     first_layer_corner_tfr(w,wdata,call_data); 
  439.       }
  440.       else if(Bottom(0) == LEFT){
  441.     first_layer_corner_tlf(w,wdata,call_data); 
  442.       }
  443.     }
  444.     else if(Front(6) == RIGHT){
  445.       if(Bottom(0) == FRONT){
  446.     D(1);
  447.     first_layer_corner_tfr(w,wdata,call_data); 
  448.       }
  449.       else if(Bottom(0) == BACK){
  450.     D(2);
  451.     first_layer_corner_trb(w,wdata,call_data); 
  452.       }
  453.     }
  454.     else if(Front(6) == BACK){
  455.       if(Bottom(0) == RIGHT){
  456.     D(2);
  457.     first_layer_corner_trb(w,wdata,call_data);
  458.       }
  459.       else if(Bottom(0) == LEFT){
  460.     D(-1);
  461.     first_layer_corner_tbl(w,wdata,call_data);
  462.       }
  463.     }
  464.     else if(Front(6) == LEFT){
  465.       if(Bottom(0) == FRONT){
  466.     first_layer_corner_tlf(w,wdata,call_data);
  467.       }
  468.       else if(Bottom(0) == BACK){
  469.     D(-1);
  470.     first_layer_corner_tbl(w,wdata,call_data);
  471.       }
  472.     }
  473.   }
  474.   
  475.   else if(Front(6)  == TOP){
  476.     if(Left(6) == FRONT){
  477.       if(Bottom(0) == RIGHT){
  478.     D(1);
  479.     first_layer_corner_tfr(w,wdata,call_data); 
  480.       }
  481.       else if(Bottom(0) == LEFT){
  482.     first_layer_corner_tlf(w,wdata,call_data); 
  483.       }
  484.     }
  485.     else if(Left(6) == RIGHT){
  486.       if(Bottom(0) == FRONT){
  487.     D(1);
  488.     first_layer_corner_tfr(w,wdata,call_data); 
  489.       }
  490.       else if(Bottom(0) == BACK){
  491.     D(2);
  492.     first_layer_corner_trb(w,wdata,call_data); 
  493.       }
  494.     }
  495.     else if(Left(6) == BACK){
  496.       if(Bottom(0) == RIGHT){
  497.     D(2);
  498.     first_layer_corner_trb(w,wdata,call_data);
  499.       }
  500.       else if(Bottom(0) == LEFT){
  501.     D(-1);
  502.     first_layer_corner_tbl(w,wdata,call_data);
  503.       }
  504.     }
  505.     else if(Left(6) == LEFT){
  506.       if(Bottom(0) == FRONT){
  507.     first_layer_corner_tlf(w,wdata,call_data);
  508.       }
  509.       else if(Bottom(0) == BACK){
  510.     D(-1);
  511.     first_layer_corner_tbl(w,wdata,call_data);
  512.       }
  513.     }
  514.   }
  515.  
  516.   else if(Bottom(0)  == TOP){
  517.     if(Left(6) == FRONT){
  518.       if(Front(6) == RIGHT){
  519.     D(1);
  520.     first_layer_corner_tfr(w,wdata,call_data); 
  521.       }
  522.       else if(Front(6) == LEFT){
  523.     first_layer_corner_tlf(w,wdata,call_data); 
  524.       }
  525.     }
  526.     else if(Left(6) == RIGHT){
  527.       if(Front(6) == FRONT){
  528.     D(1);
  529.     first_layer_corner_tfr(w,wdata,call_data); 
  530.       }
  531.       else if(Front(6) == BACK){
  532.     D(2);
  533.     first_layer_corner_trb(w,wdata,call_data); 
  534.       }
  535.     }
  536.     else if(Left(6) == BACK){
  537.       if(Front(6) == RIGHT){
  538.     D(2);
  539.     first_layer_corner_trb(w,wdata,call_data);
  540.       }
  541.       else if(Front(6) == LEFT){
  542.     D(-1);
  543.     first_layer_corner_tbl(w,wdata,call_data);
  544.       }
  545.     }
  546.     else if(Left(6) == LEFT){
  547.       if(Front(6) == FRONT){
  548.     first_layer_corner_tlf(w,wdata,call_data);
  549.       }
  550.       else if(Front(6) == BACK){
  551.     D(-1);
  552.     first_layer_corner_tbl(w,wdata,call_data);
  553.       }
  554.     }
  555.   }
  556.  
  557.   /* Top Corner Cubes */
  558.   /* There are 12 places a TOP can be in the top layer corner cubes layer.
  559.       If all first layer corners are ok, then True is returned.
  560.       Else if a TOP is found in top layer corner, with the wrong orientation then
  561.      the operation to bring it to the lower layer is performed.
  562.       Else False is returned. 
  563.    */
  564.  
  565.   if(Top(0) == TOP &&
  566.      Top(2) == TOP &&
  567.      Top(6) == TOP &&
  568.      Top(8) == TOP &&
  569.      Front(0) == FRONT &&
  570.      Front(2) == FRONT &&
  571.      Right(0) == RIGHT &&
  572.      Right(2) == RIGHT &&
  573.      Back(0) == BACK &&
  574.      Back(2) == BACK &&
  575.      Left(0) == LEFT &&
  576.      Left(2) == LEFT)
  577.     return(True);
  578.   
  579.   /* Here if more passes needed.
  580.    * Check if any miss-oriented ones on top.
  581.    * If so, then bring it down to bottom layer.
  582.    */
  583.   if((Top(2)   == TOP ||  
  584.       Front(2) == TOP ||  
  585.       Right(0) == TOP) &&
  586.      (Top(2)   != TOP ||  
  587.       Front(2) != FRONT ||  
  588.       Right(0) != RIGHT)){
  589.     R(-1);D(1);R(1);
  590.     return(False);
  591.   }
  592.   
  593.   if((Top(8)   == TOP ||  
  594.       Right(2) == TOP ||  
  595.       Back(2)  == TOP) &&
  596.      (Top(8)   != TOP ||  
  597.       Right(2) != RIGHT ||  
  598.       Back(2)  != BACK)){
  599.     B(-1);D(1);B(1);
  600.     return(False);
  601.   }
  602.   
  603.   if((Top(6)   == TOP ||  
  604.       Back(0)  == TOP ||  
  605.       Left(2)  == TOP) &&
  606.      (Top(6)   != TOP ||  
  607.       Back(0)  != BACK ||  
  608.       Left(2)  != LEFT)){
  609.     L(-1);D(1);L(1);
  610.     return(False);
  611.   }
  612.   
  613.   if((Top(0)   == TOP ||  
  614.       Left(0)  == TOP ||  
  615.       Front(0) == TOP) &&
  616.      (Top(0)   != TOP ||  
  617.       Left(0)  != LEFT ||  
  618.       Front(0) != FRONT)){
  619.     F(-1);D(1);F(1);
  620.     return(False);
  621.   }
  622.   return(False);
  623. }
  624.