home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / amiga / misc / amoner03.dms / amoner03.adf / Knight.AMOS / Knight.amosSourceCode < prev    next >
Encoding:
AMOS Source Code  |  1991-12-15  |  14.2 KB  |  487 lines

  1. '  ******************************************************************  
  2. '  ***                                                            ***
  3. '  ***                          Knights Tour                      ***
  4. '  ***                By: Scott Bonen & Mike Sheldrake            ***
  5. '  ***                                                            ***
  6. '  ******************************************************************
  7. Break Off 
  8. '
  9. '  ******************************
  10. '  ***  Initialize variables  ***
  11. '  ******************************
  12. '
  13. Led Off : Music 1
  14. _COPYRIGHT[75]
  15. Screen Open 1,640,200,16,Hires : Palette ,,,,,,$C4E
  16. Curs Off : Hide : Fix(2) : Gr Writing 0 : Set Paint 1
  17. Screen To Back 1
  18. Screen Open 2,640,200,16,Hires
  19. ITRO=0
  20. BUILD_INTRO
  21. Screen 1
  22. Dim MATRIX(10,64),DR(2,8),WEIGHT(64),SQ(5,64),NM(2,64),CORN(8,4)
  23. Def Fn RC(A,B)=(A-1)*8+B
  24. Def Fn RR(A)=(A-1) mod 8
  25. Def Fn CC(A)=Int((64-A)/8)
  26. XMAX=40 : YMAX=16 : XTOP=157 : YTOP=29
  27. Global MATRIX(),DR(),WEIGHT(),SQ(),NM(),CORN(),XMAX,YMAX,XTOP,YTOP,ANS,ITRO
  28. '
  29. ' *******************************  
  30. ' ***      Find Solution      ***
  31. ' *******************************
  32. '  
  33. BUILD_MATRIX
  34. FIND:
  35. DISP_BOARD
  36. '
  37. ' *******************************  
  38. ' ***         Main Loop       ***
  39. ' *******************************
  40. '
  41. WALKS=0 : PRNES=0 : COUNT=0 : LOMOVE=0 : HIMOVE=64 : MOVE=1
  42. X=ANS : MATRIX(1,X)=MOVE
  43. Ink 4 : Text NM(1,X),NM(2,X),Str$(MATRIX(1,X)) : Shoot 
  44. '
  45. Timer=0
  46. Repeat 
  47.    M=Mouse Click : If M=2 Then Goto RESET
  48.    FOUND=0
  49.    FX=3
  50.    While FX<=10 and FOUND=0 : Rem        More Links??'     
  51.       FL=MATRIX(FX,X) : Rem                Get Forward Link'     
  52.       If FL>0 : Rem                        Is Link Seen/Used??'    
  53.          MATRIX(FX,X)=-1*FL : Rem           Mark Link as Seen    
  54.          If MATRIX(1,FL)=0 : Rem            Is Forward Link Free??    
  55.             FOUND=1 : Rem                    Set Found Flag  
  56.             FFX=3 : Rem                      Prune out Dead Branches!  
  57.             While FFX<=10 and FOUND=1
  58.                FFL=MATRIX(FFX,FL)
  59.                If FFL>0
  60.                   If MATRIX(1,FFL)=0
  61.                      FRE=0
  62.                      FFFX=3
  63.                      While FFFX<=10 and FRE<2
  64.                         FFFL=MATRIX(FFFX,FFL)
  65.                         If FFFL>0
  66.                            If MATRIX(1,FFFL)=0
  67.                               Inc FRE
  68.                            End If 
  69.                         End If 
  70.                         Inc FFFX
  71.                      Wend 
  72.                      If FRE<2 and MOVE<62
  73.                         FOUND=0
  74.                         Inc PRNES
  75.                      End If 
  76.                   End If 
  77.                End If 
  78.                Inc FFX
  79.             Wend 
  80.          End If 
  81.       End If 
  82.       If FOUND=1 : Rem                          Walk Forward  
  83.          Inc MOVE : Rem                          Bump Move(Branch Level) 
  84.          MATRIX(1,FL)=MOVE : Rem                 Set Move Number
  85.          MATRIX(2,FL)=X : Rem                    Set BackLink  
  86.          If MOVE>50 and LOMOVE=0
  87.             LOMOVE=MOVE
  88.          End If 
  89.          X=FL : Rem                              Forward Link is New Move  
  90.          Ink 6 : Text NM(1,X),NM(2,X),Str$(MATRIX(1,X))
  91.       End If 
  92.       Inc FX : Rem                              Bump Link 
  93.    Wend 
  94.    '  
  95.    ' *******************************
  96.    ' ***     Gather Statitics    ***
  97.    ' *******************************
  98.    '
  99.    If MOVE<LOMOVE
  100.       LOMOVE=MOVE
  101.       HIMOVE=MOVE
  102.       COUNT=0
  103.    End If 
  104.    If MOVE>HIMOVE
  105.       HIMOVE=MOVE
  106.       COUNT=0
  107.    End If 
  108.    Inc WALKS
  109.    Dec COUNT
  110.    If COUNT<=0 or MOVE>=64
  111.       Pen 4 : Paper 0 : Locate 10,22
  112.       ET#=Timer/50.0
  113.       Print Using "Walks=###### ";WALKS;
  114.       Print Using "Prunes=###### ";PRNES;
  115.       Print Using "Move=## ";MOVE;
  116.       Print Using "Low=## ";LOMOVE;
  117.       Print Using "Hi=## ";HIMOVE;
  118.       Print Using "Time=#####.## ";ET#
  119.       COUNT=100
  120.       If MOVE>=64
  121.          Bell 
  122.          CIR=0
  123.          For I=3 To 10
  124.             If MATRIX(1,MATRIX(I,X))=1 : Rem      CIRCULAR SOLUTION 
  125.                Ink 3 : Text NM(1,X),NM(2,X),Str$(MATRIX(1,X))
  126.                Wait 25
  127.                Boom 
  128.                CIR=1
  129.             End If 
  130.          Next I
  131.          If CIR=0
  132.             Ink 4 : Text NM(1,X),NM(2,X),Str$(MATRIX(1,X))
  133.          End If 
  134.          Pen 5 : Paper 0 : Locate 15,23
  135.          Print "Left Click= Search More, Right Click= New Square"
  136.          Do 
  137.             M=Mouse Click
  138.             If M=1
  139.                FOUND=0
  140.                LOMOVE=64
  141.                Timer=0
  142.                Exit 
  143.             End If 
  144.             If M=2
  145.                Exit 
  146.             End If 
  147.          Loop 
  148.          Pen 0 : Locate 16,23 : Cline : Curs Off 
  149.       End If 
  150.    End If 
  151.    If FOUND=0 : Rem                            Walk Backwards  
  152.       If SQ(5,X)=8
  153.          Set Pattern -1
  154.       End If 
  155.       Ink SQ(5,X) : Bar SQ(1,X),SQ(2,X) To SQ(3,X),SQ(4,X)
  156.       Set Pattern 0
  157.       MATRIX(1,X)=0 : Rem                       Clear Move Number
  158.       For I=3 To 2+WEIGHT(X)
  159.          MATRIX(I,X)=Abs(MATRIX(I,X)) : Rem       Reset Link Flags   
  160.       Next I
  161.       X=MATRIX(2,X) : Rem                       Backup a Branch
  162.       Dec MOVE
  163.    End If 
  164. Until MOVE>=64
  165. '
  166. RESET:
  167. For I=1 To 64 : Rem                          Clear Matrix  
  168.    MATRIX(1,I)=0
  169.    MATRIX(2,I)=0
  170.    For J=3 To 10
  171.       MATRIX(J,I)=Abs(MATRIX(J,I))
  172.    Next J
  173. Next I
  174. Goto FIND
  175. '
  176. ' *******************************************************************
  177. Procedure BUILD_INTRO
  178.    '
  179.    ' *******************************
  180.    ' ***    Build Intro screen   ***
  181.    ' *******************************
  182.    '
  183.    Get Sprite Palette : Curs Off 
  184.    Cls 16
  185.    DYTOP=8 : Ink 10,16
  186.    For I=1 To 15
  187.       Read A$
  188.       Text 32,DYTOP,A$
  189.       Add DYTOP,10
  190.    Next I
  191.    Ink 3,16
  192.    Text 200,176,"Click Left or Right Mouse Key"
  193.    Do 
  194.       M=Mouse Click
  195.       Exit If M<>0
  196.    Loop 
  197.    Cls 16 : DYTOP=8 : Ink 10,16
  198.    For I=1 To 17
  199.       Read A$
  200.       Text 32,DYTOP,A$
  201.       Add DYTOP,10
  202.    Next I
  203.    DYTOP=108 : Ink 6,16
  204.    For I=1 To 6
  205.       Read A$
  206.       Text 32,DYTOP,A$
  207.       Add DYTOP,10
  208.    Next I
  209.    '
  210.    ' *******************************
  211.    ' ***   Start BOB animation   ***
  212.    ' *******************************
  213.    '
  214.    Channel 1 To Bob 1 : Bob 1,610,5,3
  215.    A$="(3,5)(4,5)(5,5)(6,5)(7,5)(8,5)(9,5)(10,5)(11,5)"
  216.    A$=A$+"(12,5)(13,5)(14,5)(15,5)(16,5)(17,5)(18,5)(19,10)L"
  217.    Anim 1,A$
  218.    Anim On 
  219.    '
  220.    Data "Knights Tour is a puzzle using a knights movement on a chess board."
  221.    Data "The Knight has to jump to each of the squares on the board, without"
  222.    Data "stepping on the same square twice. Basically, make 63 moves from the"
  223.    Data "starting square and cover all squares."
  224.    Data ""
  225.    Data "We solved this problem by building a table with all possible moves from"
  226.    Data "each square. We then use a tree search method to find the solution."
  227.    Data "After a few very long test runs we determined we needed to implement a"
  228.    Data "quicker solution. So we developed a pruning technique that allowed us"
  229.    Data "to chop off branches from the tree. This vastly increased the search"
  230.    Data "speed. We then implemented a weighted board technique, which causes our"
  231.    Data "program to fill the corners of the board first. As you will see this"
  232.    Data "developed the fastest solution possible. After a few code improvements"
  233.    Data "we had what we felt to be a good program for solutions. "
  234.    Data ""
  235.    Data "The operation of this program is pretty straight forward, just follow"
  236.    Data "the instructions. You can start from any square on the board and find a"
  237.    Data "solution for that square. The longest time we found was about 1 minute."
  238.    Data "If the 64th move # is flashing, this means a circular solution. What this"
  239.    Data "means is that you can jump to the first square from the 64th square."
  240.    Data "Naturally, this would be the fastest solution possible, just set up a"
  241.    Data "matrix that has the circular solution and you could select any square and"
  242.    Data "solve the Tour in 63 steps. But, that would be to easy."
  243.    Data ""
  244.    Data "Now for a brief discription of the status line under the board."
  245.    Data "        This is how many branches of the tree we searched."
  246.    Data "        This is the number of branches we have pruned."
  247.    Data "        This is the current move we are on, between 1-64."
  248.    Data "        This is the lowest level of the tree we are on, 1 is root."
  249.    Data "        This is the highest level of the tree we are on, 64 leaf."
  250.    Data "        This is the time it took to solve the puzzle in seconds."
  251.    Data "All values above will be updated every 100 walks or a new low/high."
  252.    Data "WALKS:","PRUNES:","MOVE:","LOW:","HIGH:","TIME:"
  253. End Proc
  254. Procedure BUILD_MATRIX
  255.    '
  256.    ' *******************************
  257.    ' ***      Build Matrix       ***
  258.    ' *******************************
  259.    '
  260.    Def Fn RC(A,B)=(A-1)*8+B
  261.    Def Fn RR(A)=(A-1) mod 8
  262.    Def Fn CC(A)=Int((64-A)/8)
  263.    '
  264.    ' *******************************  
  265.    ' ***     Number of Links     ***
  266.    ' ***       per square        ***
  267.    ' *******************************
  268.    '
  269.    Data 2,3,4,4,4,4,3,2
  270.    Data 3,4,6,6,6,6,4,3
  271.    Data 4,6,8,8,8,8,6,4
  272.    Data 4,6,8,8,8,8,6,4
  273.    Data 4,6,8,8,8,8,6,4
  274.    Data 4,6,8,8,8,8,6,4
  275.    Data 3,4,6,6,6,6,4,3
  276.    Data 2,3,4,4,4,4,3,2
  277.    For I=1 To 64
  278.       Read WEIGHT(I)
  279.    Next I
  280.    '
  281.    ' *******************************
  282.    ' ***    Corner Weighting     ***
  283.    ' *******************************
  284.    '
  285.    Data 1,3,2,5,4,7,6,8
  286.    Data 8,6,7,4,5,2,3,1
  287.    Data 4,2,6,1,8,3,7,5
  288.    Data 5,7,3,8,1,6,2,4
  289.    For I=1 To 4
  290.       For J=1 To 8
  291.          Read CORN(J,I)
  292.       Next J
  293.    Next I
  294.    '
  295.    ' *******************************
  296.    ' ***        Directions       ***
  297.    ' *******************************
  298.    '
  299.    Data -2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1
  300.    For I=1 To 8
  301.       Read DR(1,I),DR(2,I)
  302.    Next I
  303.    '
  304.    For R=1 To 8
  305.       For C=1 To 8
  306.          X=3
  307.          Y= Fn RC(R,C)
  308.          If((Y-1) mod 8<4) and Y<=32
  309.             CN=1
  310.          End If 
  311.          If((Y-1) mod 8>=4) and Y>32
  312.             CN=2
  313.          End If 
  314.          If((Y-1) mod 8>=4) and Y<=32
  315.             CN=3
  316.          End If 
  317.          If((Y-1) mod 8<4) and Y>32
  318.             CN=4
  319.          End If 
  320.          For D=1 To 8
  321.             DRR=DR(1,CORN(D,CN)) : DRC=DR(2,CORN(D,CN))
  322.             If R+DRR>0 and R+DRR<9
  323.                If C+DRC>0 and C+DRC<9
  324.                   MATRIX(X,Y)= Fn RC(R+DRR,C+DRC)
  325.                   X=X+1
  326.                End If 
  327.             End If 
  328.          Next D
  329.          '
  330.          FOUND=1
  331.          While FOUND=1
  332.             A=3
  333.             B=4
  334.             FOUND=0
  335.             While B<=10
  336.                If MATRIX(B,Y)>0
  337.                   If WEIGHT(MATRIX(A,Y))>WEIGHT(MATRIX(B,Y))
  338.                      FOUND=1
  339.                      Swap MATRIX(A,Y),MATRIX(B,Y)
  340.                   End If 
  341.                End If 
  342.                Inc A
  343.                Inc B
  344.             Wend 
  345.          Wend 
  346.          '
  347.          ' *******************************
  348.          ' ***   build box locations   ***
  349.          ' ***           and           ***
  350.          ' ***    number placements    ***
  351.          ' *******************************
  352.          '
  353.          NM(1,Y)= Fn RR(Y)*XMAX+XTOP+XMAX/2-14
  354.          NM(2,Y)= Fn CC(Y)*YMAX+YTOP+YMAX/2+3
  355.          SQ(1,Y)= Fn RR(Y)*XMAX+XTOP
  356.          SQ(2,Y)= Fn CC(Y)*YMAX+YTOP
  357.          SQ(3,Y)=SQ(1,Y)+XMAX
  358.          SQ(4,Y)=SQ(2,Y)+YMAX
  359.          If Fn CC(Y) mod 2=0
  360.             C1=2 : C2=8
  361.          Else 
  362.             C1=8 : C2=2
  363.          End If 
  364.          If Fn RR(Y) mod 2=0
  365.             SQ(5,Y)=C1
  366.          Else 
  367.             SQ(5,Y)=C2
  368.          End If 
  369.          '  
  370.       Next C
  371.    Next R
  372. End Proc
  373. Procedure DISP_BOARD
  374.    '
  375.    ' *******************************
  376.    ' ***      Display Board      ***
  377.    ' *******************************
  378.    '
  379.    Def Fn RC(A,B)=(A-1)*8+B
  380.    Def Fn RR(A)=(A-1) mod 8
  381.    Def Fn CC(A)=Int((64-A)/8)
  382.    '
  383.    Cls 16
  384.    Set Pattern 32
  385.    Ink 13,,2 : Bar XTOP-XMAX/2-9,YTOP-YMAX/2-6 To 8.7*XMAX+XTOP,8.9*YMAX+YTOP
  386.    Set Pattern 0
  387.    Ink 2 : Text XTOP+(8*XMAX/2)-82,YTOP-5," *- Knight's Tour -* "
  388.    P$="Program By: Scott Bonen & Mike Sheldrake"
  389.    Ink 2 : Text XTOP,YTOP+(YMAX*8.7),P$
  390.    For I=1 To 64
  391.       If SQ(5,I)=8
  392.          Set Pattern -1
  393.       End If 
  394.       Ink SQ(5,I),,16 : Bar SQ(1,I),SQ(2,I) To SQ(3,I),SQ(4,I)
  395.       Set Pattern 0
  396.    Next I
  397.    '
  398.    Change Mouse 2
  399.    Limit Mouse X Hard(XTOP),Y Hard(YTOP) To X Hard(XMAX*8+XTOP),Y Hard(YMAX*8+YTOP)
  400.    X Mouse=X Hard(XTOP+XMAX/2) : Y Mouse=Y Hard(YTOP+YMAX*8-YMAX/2)
  401.    Pen 5 : Paper 0 : Locate 17,23
  402.    Print "Left Click= Starting Square, Right Click= EXIT"
  403.    '
  404.    ' *******************************    
  405.    ' ***      Let User Know      ***
  406.    ' *******************************  
  407.    '
  408.    If ITRO=0
  409.       Screen 2 : Curs Off 
  410.       Bob Off 1 : Anim Off 1
  411.       Ink 3,16
  412.       Text 490,187,"Click a Button"
  413.       Do 
  414.          M=Mouse Click
  415.          Exit If M<>0
  416.       Loop 
  417.       Text 490,187,"              "
  418.       Fade 10 : Wait 150
  419.       Bank Swap 11,3
  420.       Music 1 : Tempo 18
  421.       Auto View Off 
  422.       Screen 1 : Screen To Front 1
  423.       For Y=1 To Screen Height/2
  424.          Screen Display 1,,50+Screen Height/2-Y,,Y*2
  425.          View : Wait Vbl 
  426.       Next 
  427.       Auto View On 
  428.       ITRO=1
  429.    End If 
  430.    Show 
  431.    '
  432.    ' *******************************
  433.    ' ***   Get Starting Square   ***
  434.    ' *******************************
  435.    '
  436.    Do 
  437.       M=Mouse Click
  438.       If M=1
  439.          XX=X Screen(1,X Mouse) : YY=Y Screen(1,Y Mouse)
  440.          XX=Int((XX-XTOP)/XMAX)+1 : YY=8-Int((YY-YTOP-1)/YMAX)
  441.          ANS= Fn RC(YY,XX)
  442.          Exit 
  443.       End If 
  444.       If M=2
  445.          Bank Swap 11,3
  446.          Default 
  447.          Limit Mouse 
  448.          Led On 
  449.          Run "Amoner003:Autoexec.Amos"
  450.          '   End  
  451.       End If 
  452.    Loop 
  453.    Hide 
  454.    Locate 17,23 : Cline 
  455.    Pen 5 : Paper 0 : Locate 28,23
  456.    Print "Right Click= Stop Search"
  457.    '
  458. End Proc
  459. Procedure _COPYRIGHT[YDISPLAY]
  460.    '
  461.    ' *******************************
  462.    ' ***    Display Copyright    ***
  463.    ' *******************************
  464.    '
  465.    Auto View Off : Curs Off : Hide 
  466.    Unpack 10 To 7
  467.    '
  468.    For Y=2 To Screen Height/2 Step 2
  469.       Screen Display 7,,YDISPLAY+Screen Height/2-Y,,Y*2
  470.       Screen Offset 7,,Screen Height/2-Y
  471.       View 
  472.       Wait Vbl 
  473.    Next 
  474.    '
  475.    Wait 200
  476.    '
  477.    For Y=Screen Height/2 To 0 Step -8
  478.       Screen Display 7,,YDISPLAY+Screen Height/2-Y,,Y*2
  479.       Screen Offset 7,,Screen Height/2-Y
  480.       View 
  481.       Wait Vbl 
  482.    Next 
  483.    '
  484.    Screen Close 7
  485.    Auto View On : Curs On : Show 
  486.    '
  487. End Proc