The applet requires Java 5 or higher. Java must be enabled in your browser settings. Mac users must have Mac OS X 10.4 or higher. Windows and Linux users may obtain the latest Java from Oracle's Java site.

powered by NetLogo

view/download model file: sudoku-v19.nlogo

WHAT IS IT?

This is an ant based Sudoku puzzle solver

HOW IT WORKS

There are 36 ants created out of 4 breeds. The breeds are:
hants : These ants go across a row and change the list of possible values in every blank square, depending on the permanent values of the other squares in the row. They also will make permanent a value if there is only one possible value for that square. They leave an updated list in that square. Like a “pheromone”.

vants : These ants go down a column and change the list of possible values in every blank square, depending on the permanent values of the other squares in the column. They leave an updated list in that square. Like a “pheromone”.

sants : These ants go back and forth in a block and change the list of possible values in every blank square, depending on the permanent values of the other squares in the block. They leave an updated list in that square. Like a “pheromone”.

hlants : These ants go across a row and remember a list of possible values in every blank square. They add up the possible values. At the end of the row if there are any values equal to 1, then there is only one possibility of that number in that row. It will make that square permanently that number next time it lands on it.

HOW TO USE IT

There are 3 different puzzles you may choose. These are randomly chosen out of a Sudoku puzzle book. One is easy, one is challenging, and one is hard.
You can vary the speed with the slider at the top. This would allow you to see the ants as they move.

THINGS TO NOTICE

Because the way the ants operate, by leaving a “smell” of all possible values, they can do much more complex auditing than a human can. So some times a hard puzzle is quicker to solve than an easy one.
The ants don’t stop when the puzzle is finished. Each ant does not know what the goal of the entire ant colony is.

EXTENDING THE MODEL

I would like to do a 16x16 puzzle next. It would require no change in the algorithms.
Since each square can not have any permanent value that is also in that row, column, or block, there are 20 other squares that are influenced by any single square. These 20 squares are called a unit. One ant per unit would be very fast and efficient, and only require one breed of ants for the whole puzzle.

CREDITS AND REFERENCES

This code was written by Kgwedi Wise. There were many helpful sites on the web that helped clarify some of the programming and algorithms.

CODE

;;This Sudoku-V1 - Draw a grid
;;This Sudoku-V2 - this creates 3 types of ants, and sets ant motion
;;This Sudoku-V3 - this sets up the initial data variables
;;This Sudoku-V4 - This fixes sant to stay in box.Also works for hant to change value in square.
;;This Sudoku-V5 - has hant amd vant working perfect
;;This Sudoku-V6 - has sant,hant,vant working perfect
;;This Sudoku-V7 - has a trial sudoku puzzel. Works to check if square can be a single number. :-)
;;This Sudoku-V8.1 - makes new ants called lone ants HLANT to check if a turf has 1 instance of a digit.
;;This Sudoku-V9 - THIS SOLVES PUZZLE
;;This Sudoku-V10 - with choise of puzzle...Final...Works perfect
;;This Sudoku-V13 - is v10 with SR and text
;;This Sudoku-V14 - Adds vlants works on easy, challenging, hard
;;This Sudoku-V15 - Adds suicide puzzle adds color coding of answers
;;This Sudoku-V16 - Make HLANT and hant the same ant
;;This Sudoku-V17 - Make vLANT and vant the same ant
;;This Sudoku-V18 - Use easy loops for making the initial grid
;;This Sudoku-V19 - 

;; make the three types of ant movements done by a single ant
;; so far this only check which numbers CAN be in a box. Needs to also check which numbers are unique to a rcs.

breed [vants vant]
breed [hants hant]
breed [sants sant]

globals
[
 xcord
 ycord 
 easy1
 challenging1
 hard1
 suicide1
 temp
 templ
 x
  y
]

patches-own [
 can-be-1
 can-be-2
 can-be-3 
 can-be-4
 can-be-5
 can-be-6   
 can-be-7
 can-be-8
 can-be-9 
 positive-value
  ]
hants-own [
 hcan-be-1  
 hcan-be-2
 hcan-be-3 
 hcan-be-4
 hcan-be-5
 hcan-be-6   
 hcan-be-7
 hcan-be-8
 hcan-be-9 
 hlcan-be-1  
 hlcan-be-2
 hlcan-be-3 
 hlcan-be-4
 hlcan-be-5
 hlcan-be-6   
 hlcan-be-7
 hlcan-be-8
 hlcan-be-9 
 hl-needs-to-draw
]

vants-own [
 vcan-be-1  
 vcan-be-2
 vcan-be-3 
 vcan-be-4
 vcan-be-5
 vcan-be-6   
 vcan-be-7
 vcan-be-8
 vcan-be-9 
 vlcan-be-1  
 vlcan-be-2
 vlcan-be-3 
 vlcan-be-4
 vlcan-be-5
 vlcan-be-6   
 vlcan-be-7
 vlcan-be-8
 vlcan-be-9 
 vl-needs-to-draw
  ]

sants-own [
 scan-be-1  
 scan-be-2
 scan-be-3 
 scan-be-4
 scan-be-5
 scan-be-6   
 scan-be-7
 scan-be-8
 scan-be-9 
  ]

to setup
  ;; (for this model to work with NetLogo's new plotting features,
  ;; __clear-all-and-reset-ticks should be replaced with clear-all at
  ;; the beginning of your setup procedure and reset-ticks at the end
  ;; of the procedure.)
  __clear-all-and-reset-ticks
  make-the-ants
  draw-grid
  set-possibles
  set xcord [ 10 30 50 70 90 110 130 150 170 ]
  set ycord [ -10 -30 -50 -70 -90 -110 -130 -150 -170 ]
    ;;x = 10, 30, 50, 70, 90, 110, 130, 150, 170
  ;;y = -10, -30, -50, -70, -90, -110, -130, -150, -170
 
  set-initial-square-values
  
end

to go
  move-ants
 
end

;;================================================================
;;This is the SRs for the main program

;;This sr draws the basic sudoku squares. They are 20 patches wide, so total is 180 9x20
to draw-grid
  
  ask patches
 [
if (pxcor <= 59) and (pycor >= -59)
[
  set pcolor 8 
]

if (pxcor <= 59) and ((pycor <= -60) and (pycor >= -119))
[
  set pcolor 9 
]

if (pxcor <= 59) and ((pycor <= -120) and (pycor >= -179))
[
  set pcolor 8
]

if ((pxcor >= 60) and (pxcor <= 119)) and (pycor >= -59)
[
  set pcolor 9 
]

if ((pxcor >= 60)  and (pxcor <= 119)) and ((pycor <= -60) and (pycor >= -119))
[
  set pcolor 8 
]

if ((pxcor >= 60) and (pxcor <= 119)) and ((pycor <= -120) and (pycor >= -179))
[
  set pcolor 9
]

if ((pxcor >= 120) and (pxcor <= 179)) and (pycor >= -59)
[
  set pcolor 8 
]

if ((pxcor >= 120)  and (pxcor <= 179)) and ((pycor <= -60) and (pycor >= -119))
[
  set pcolor 9 
]

if ((pxcor >= 120) and (pxcor <= 179)) and ((pycor <= -120) and (pycor >= -179))
[
  set pcolor 8
]

if (pxcor = 20) or (pxcor = 40) or (pxcor = 60) or (pxcor = 80) or (pxcor = 100) or (pxcor = 120) or (pxcor = 140) or (pxcor = 160) or (pycor = -20) or (pycor = -40) or (pycor = -60) or (pycor = -80) or (pycor = -100) or (pycor = -120) or (pycor = -140) or (pycor = -160)
[ set pcolor 3
 ]
set plabel-color black
 set plabel " "

 ]

end
;;===============================
;;this moves the 3 different type of ants on 3 different patterns
to move-ants
    move-hants
    move-vants
    move-sants
end
;;=========================================
;;this makes 3 different types of ants one type only moves horizontal, one type only vertical, and one type does the squares.
to make-the-ants
    create-hants 9
   ask hants 
  [ 
     set color red
    set shape "bug"
    set size 5
    setxy 10 ((-10 + (-20 * who)))
    facexy 11 ((-10 + (-20 * who)))
    
 one-all-hcan-be   
 zero-all-hlcan-be   
     ]
  
  create-vants 9
   ask vants 
  [ 
     set color green
    set shape "bug"
    set size 5
    setxy  (10 + (20 * (who - 36))) -10
    facexy (10 + (20 * (who - 36))) -11
 set vcan-be-1  1
 set vcan-be-2  1 
 set vcan-be-3  1
 set vcan-be-4  1
 set vcan-be-5  1
 set vcan-be-6  1
 set vcan-be-7  1
 set vcan-be-8  1
 set vcan-be-9  1 
     ]

  
  create-sants 9
   ask sants
  [ 
     set color brown
    set shape "bug"
    set size 5
 set scan-be-1  1
 set scan-be-2  1 
 set scan-be-3  1
 set scan-be-4  1
 set scan-be-5  1
 set scan-be-6  1
 set scan-be-7  1
 set scan-be-8  1
 set scan-be-9  1 
     ]
  
  ask sant 18
  [ setxy 10 -10
   facexy 11 -10  ]
  ask sant 19
  [ setxy 10 -70
    facexy 11 -70 ]  
  ask sant 20
  [ setxy 10 -130
    facexy 11 -130 ] 
  ask sant 21
  [ setxy 70 -10
    facexy 71 -10 ]
  ask sant 22
  [ setxy 70 -70
    facexy 71 -70 ]  
  ask sant 23
  [ setxy 70 -130
    facexy 71 -130 ] 
  ask sant 24
  [ setxy 130 -10
    facexy 131 -10 ]
  ask sant 25
  [ setxy 130 -70
    facexy 131 -70 ]  
  ask sant 26
  [ setxy 130 -130
    facexy 131 -130 ]


end
;;===============
;;this sets initial values of each patch. What it can be 1-9
to set-possibles
ask patches
[
 set can-be-1  1
 set can-be-2  1 
 set can-be-3  1
 set can-be-4  1
 set can-be-5  1
 set can-be-6  1
 set can-be-7  1
 set can-be-8  1
 set can-be-9  1
 
 set plabel " "
]

end
;;=============================

;;====================================
;;sant check values
to sant-check-values
          if [positive-value] of patch-here = 1
          [
           set scan-be-1 0 
          ]
          if [positive-value] of patch-here = 2
          [
           set scan-be-2 0 
          ]
          if [positive-value] of patch-here = 3
          [
           set scan-be-3 0 
          ]
          if [positive-value] of patch-here = 4
          [
           set scan-be-4 0 
          ]
          if [positive-value] of patch-here = 5
          [
           set scan-be-5 0 
          ]
          if [positive-value] of patch-here = 6
          [
           set scan-be-6 0 
          ]
          if [positive-value] of patch-here = 7
          [
           set scan-be-7 0 
          ]
          if [positive-value] of patch-here = 8
          [
           set scan-be-8 0 
          ]
          if [positive-value] of patch-here = 9
          [
           set scan-be-9 0 
          ]
          
         ;; also checks for totals of all can-be to see if one value is alone and mandatory
         if scan-be-1 = 0 [ ask patch-here [set can-be-1 0 ]]
         if scan-be-2 = 0 [ ask patch-here [set can-be-2 0 ]]
         if scan-be-3 = 0 [ ask patch-here [set can-be-3 0 ]]
         if scan-be-4 = 0 [ ask patch-here [set can-be-4 0 ]]
         if scan-be-5 = 0 [ ask patch-here [set can-be-5 0 ]]
         if scan-be-6 = 0 [ ask patch-here [set can-be-6 0 ]]
         if scan-be-7 = 0 [ ask patch-here [set can-be-7 0 ]]
         if scan-be-8 = 0 [ ask patch-here [set can-be-8 0 ]]
         if scan-be-9 = 0 [ ask patch-here [set can-be-9 0 ]]     
end

;;============================
;;this makes all patch can be equal to 0 because a positive value was detected in this square
to zero-all-can-be
  ask patch-here
  [
    set can-be-1 0
    set can-be-2 0
    set can-be-3 0
    set can-be-4 0
    set can-be-5 0
    set can-be-6 0
    set can-be-7 0
    set can-be-8 0
    set can-be-9 0
  ]
end

;;============================
;;this makes all hcan-be equal to 1 
to one-all-hcan-be
   set hcan-be-1  1
 set hcan-be-2  1 
 set hcan-be-3  1
 set hcan-be-4  1
 set hcan-be-5  1
 set hcan-be-6  1
 set hcan-be-7  1
 set hcan-be-8  1
 set hcan-be-9  1 
end

;;============================
;;this makes all hlant-can-be equal to 0 to start a fresh row
to zero-all-hlcan-be
  
    set hlcan-be-1 0
    set hlcan-be-2 0
    set hlcan-be-3 0
    set hlcan-be-4 0
    set hlcan-be-5 0
    set hlcan-be-6 0
    set hlcan-be-7 0
    set hlcan-be-8 0
    set hlcan-be-9 0

end
;;============================
;;this makes all hlant-can-be equal to 9 to so none will be 1 for end of line 
to nine-all-hlcan-be
  
    set hlcan-be-1 9
    set hlcan-be-2 9
    set hlcan-be-3 9
    set hlcan-be-4 9
    set hlcan-be-5 9
    set hlcan-be-6 9
    set hlcan-be-7 9
    set hlcan-be-8 9
    set hlcan-be-9 9

end;;============================
;;this makes all vlant-can-be equal to 0 to start a fresh column
to zero-all-vlcan-be
  
    set vlcan-be-1 0
    set vlcan-be-2 0
    set vlcan-be-3 0
    set vlcan-be-4 0
    set vlcan-be-5 0
    set vlcan-be-6 0
    set vlcan-be-7 0
    set vlcan-be-8 0
    set vlcan-be-9 0

end
;;============================
;;this makes all vlant-can-be equal to 9 to so none will be 1 for end of line 
to nine-all-vlcan-be
  
    set vlcan-be-1 9
    set vlcan-be-2 9
    set vlcan-be-3 9
    set vlcan-be-4 9
    set vlcan-be-5 9
    set vlcan-be-6 9
    set vlcan-be-7 9
    set vlcan-be-8 9
    set vlcan-be-9 9

end
;;=========================
to move-hants
 
      ask hants
  [
          forward 20 
          if [positive-value] of patch-here = 1
          [
           set hcan-be-1 0 
           zero-all-can-be
           set can-be-1 1
          ]
          if [positive-value] of patch-here = 2
          [
           set hcan-be-2 0
           zero-all-can-be 
           set can-be-2 1
          ]
          if [positive-value] of patch-here = 3
          [
           set hcan-be-3 0
           zero-all-can-be 
           set can-be-3 1
          ]
          if [positive-value] of patch-here = 4
          [
           set hcan-be-4 0
           zero-all-can-be
           set can-be-4 1 
          ]
          if [positive-value] of patch-here = 5
          [
           set hcan-be-5 0
           zero-all-can-be
           set can-be-5 1 
          ]
          if [positive-value] of patch-here = 6
          [
           set hcan-be-6 0
           zero-all-can-be
           set can-be-6 1 
          ]
          if [positive-value] of patch-here = 7
          [
           set hcan-be-7 0
           zero-all-can-be
           set can-be-7 1 
          ]
          if [positive-value] of patch-here = 8
          [
           set hcan-be-8 0
           zero-all-can-be
           set can-be-8 1 
          ]
          if [positive-value] of patch-here = 9
          [
           set hcan-be-9 0
           zero-all-can-be
           set can-be-9 1 
          ]
          
      
         ;;hants also checks for totals of all can-be to see if one value is alone and mandatory
         if hcan-be-1 = 0 [ ask patch-here [set can-be-1 0 ]]
         if hcan-be-2 = 0 [ ask patch-here [set can-be-2 0 ]]
         if hcan-be-3 = 0 [ ask patch-here [set can-be-3 0 ]]
         if hcan-be-4 = 0 [ ask patch-here [set can-be-4 0 ]]
         if hcan-be-5 = 0 [ ask patch-here [set can-be-5 0 ]]
         if hcan-be-6 = 0 [ ask patch-here [set can-be-6 0 ]]
         if hcan-be-7 = 0 [ ask patch-here [set can-be-7 0 ]]
         if hcan-be-8 = 0 [ ask patch-here [set can-be-8 0 ]]
         if hcan-be-9 = 0 [ ask patch-here [set can-be-9 0 ]]
         ;;check the value
         if ([can-be-1] of patch-here + [can-be-2] of patch-here + [can-be-3] of patch-here + [can-be-4] of patch-here + [can-be-5] of patch-here + [can-be-6] of patch-here + [can-be-7] of patch-here + [can-be-8] of patch-here + [can-be-9] of patch-here = 1) 
         [  ;;so we know that there is only one possibility
         
               if ([can-be-1] of patch-here = 1)  
               [ ask patch-here [
                   set positive-value 1
                   set plabel-color green
                   set plabel "1"]
               ]
               if ([can-be-2] of patch-here = 1)   
               [ ask patch-here [
                   set positive-value 2
                   set plabel-color green
                   set plabel "2"]
               ]
               if ([can-be-3] of patch-here = 1)   
               [ ask patch-here [
                   set positive-value 3
                   set plabel-color green
                   set plabel "3"]
               ]
               if ([can-be-4] of patch-here = 1)   
               [ ask patch-here [
                   set positive-value 4
                   set plabel-color green
                   set plabel "4"]
               ]
               if ([can-be-5] of patch-here = 1) 
               [ ask patch-here [
                   set positive-value 5
                   set plabel-color green
                   set plabel "5"]
               ]
               if ([can-be-6] of patch-here = 1) 
               [ ask patch-here [
                   set positive-value 6
                   set plabel-color green
                   set plabel "6"]
               ]
               if ([can-be-7] of patch-here = 1) 
               [ ask patch-here [
                   set positive-value 7
                   set plabel-color green
                   set plabel "7"]
               ]
               if ([can-be-8] of patch-here = 1) 
               [ ask patch-here [
                   set positive-value 8
                   set plabel-color green
                   set plabel "8"]
               ]
               if ([can-be-9] of patch-here = 1) 
               [ ask patch-here [
                   set positive-value 9
                   set plabel-color green
                   set plabel "9"]
               ]
                    
            ]
         ;;begining of old HLant
     if hl-needs-to-draw > 0 ;;this means it needs to draw a positive-value
    [
    
      if ([can-be-1] of patch-here = 1) and (hl-needs-to-draw = 1)[ 
        set plabel-color red
        set plabel "1"
        set positive-value 1 
        set hl-needs-to-draw 0
        nine-all-hlcan-be]
      if ([can-be-2] of patch-here = 1) and (hl-needs-to-draw = 2) [ 
        set plabel-color red
        set plabel "2"
        set positive-value 2 
        set hl-needs-to-draw 0
        nine-all-hlcan-be]
      if ([can-be-3] of patch-here = 1) and (hl-needs-to-draw = 3) [ 
        set plabel-color red
        set plabel "3"
        set positive-value 3 
        set hl-needs-to-draw 0
        nine-all-hlcan-be]
      if ([can-be-4] of patch-here = 1) and (hl-needs-to-draw = 4) [ 
        set plabel-color red
        set plabel "4"
        set positive-value 4 
        set hl-needs-to-draw 0
        nine-all-hlcan-be]
      if ([can-be-5] of patch-here = 1) and (hl-needs-to-draw = 5) [ 
        set plabel-color red
        set plabel "5"
        set positive-value 5 
        set hl-needs-to-draw 0
        nine-all-hlcan-be]
      if ([can-be-6] of patch-here = 1) and (hl-needs-to-draw = 6) [ 
        set plabel-color red
        set plabel "6"
        set positive-value 6 
        set hl-needs-to-draw 0
        nine-all-hlcan-be]
      if ([can-be-7] of patch-here = 1) and (hl-needs-to-draw = 7) [ 
        set plabel-color red
        set plabel "7"
        set positive-value 7 
        set hl-needs-to-draw 0
        nine-all-hlcan-be]
      if ([can-be-8] of patch-here = 1) and (hl-needs-to-draw = 8)[ 
        set plabel-color red
        set plabel "8"
        set positive-value 8 
        set hl-needs-to-draw 0
        nine-all-hlcan-be]
      if ([can-be-9] of patch-here = 1) and (hl-needs-to-draw = 9) [ 
        set plabel-color red
        set plabel "9"
        set positive-value 9 
        set hl-needs-to-draw 0
        nine-all-hlcan-be]
     
    ]
   ;; so hl-needs to draw = 0
  
     if [positive-value] of patch-here = 1 [ set hlcan-be-1 9 ]
     if [positive-value] of patch-here = 2 [ set hlcan-be-2 9 ]
     if [positive-value] of patch-here = 3 [ set hlcan-be-3 9 ]
     if [positive-value] of patch-here = 4 [ set hlcan-be-4 9 ]
     if [positive-value] of patch-here = 5 [ set hlcan-be-5 9 ]
     if [positive-value] of patch-here = 6 [ set hlcan-be-6 9 ]
     if [positive-value] of patch-here = 7 [ set hlcan-be-7 9 ]
     if [positive-value] of patch-here = 8 [ set hlcan-be-8 9 ]
     if [positive-value] of patch-here = 9 [ set hlcan-be-9 9 ]
     
    set hlcan-be-1  ([can-be-1] of patch-here + hlcan-be-1)
    set hlcan-be-2  ([can-be-2] of patch-here + hlcan-be-2)
    set hlcan-be-3  ([can-be-3] of patch-here + hlcan-be-3)
    set hlcan-be-4  ([can-be-4] of patch-here + hlcan-be-4)
    set hlcan-be-5  ([can-be-5] of patch-here + hlcan-be-5)
    set hlcan-be-6  ([can-be-6] of patch-here + hlcan-be-6)
    set hlcan-be-7  ([can-be-7] of patch-here + hlcan-be-7)
    set hlcan-be-8  ([can-be-8] of patch-here + hlcan-be-8)              
    set hlcan-be-9  ([can-be-9] of patch-here + hlcan-be-9)           
  
 if xcor = 170
 [
  if hlcan-be-1 = 1 [ set hl-needs-to-draw 1 ]
  if hlcan-be-2 = 1 [ set hl-needs-to-draw 2 ]
  if hlcan-be-3 = 1 [ set hl-needs-to-draw 3 ]
  if hlcan-be-4 = 1 [ set hl-needs-to-draw 4 ]
  if hlcan-be-5 = 1 [ set hl-needs-to-draw 5 ]
  if hlcan-be-6 = 1 [ set hl-needs-to-draw 6 ]
  if hlcan-be-7 = 1 [ set hl-needs-to-draw 7 ]
  if hlcan-be-8 = 1 [ set hl-needs-to-draw 8 ]
  if hlcan-be-9 = 1 [ set hl-needs-to-draw 9 ] 
  zero-all-hlcan-be
 ]
  ]
end
;;===================================
to move-vants
  ask vants
  [
       forward 20 
          if [positive-value] of patch-here = 1
          [
           set vcan-be-1 0 
          ]
          if [positive-value] of patch-here = 2
          [
           set vcan-be-2 0 
          ]
          if [positive-value] of patch-here = 3
          [
           set vcan-be-3 0 
          ]
          if [positive-value] of patch-here = 4
          [
           set vcan-be-4 0 
          ]
          if [positive-value] of patch-here = 5
          [
           set vcan-be-5 0 
          ]
          if [positive-value] of patch-here = 6
          [
           set vcan-be-6 0 
          ]
          if [positive-value] of patch-here = 7
          [
           set vcan-be-7 0 
          ]
          if [positive-value] of patch-here = 8
          [
           set vcan-be-8 0 
          ]
          if [positive-value] of patch-here = 9
          [
           set vcan-be-9 0 
          ]
          
         ;; set pcolor red
         ;;hants also checks for totals of all can-be to see if one value is alone and mandatory
         if vcan-be-1 = 0 [ ask patch-here [set can-be-1 0 ]]
         if vcan-be-2 = 0 [ ask patch-here [set can-be-2 0 ]]
         if vcan-be-3 = 0 [ ask patch-here [set can-be-3 0 ]]
         if vcan-be-4 = 0 [ ask patch-here [set can-be-4 0 ]]
         if vcan-be-5 = 0 [ ask patch-here [set can-be-5 0 ]]
         if vcan-be-6 = 0 [ ask patch-here [set can-be-6 0 ]]
         if vcan-be-7 = 0 [ ask patch-here [set can-be-7 0 ]]
         if vcan-be-8 = 0 [ ask patch-here [set can-be-8 0 ]]
         if vcan-be-9 = 0 [ ask patch-here [set can-be-9 0 ]]     
;;begining of old VLant
;;   forward 20
     if vl-needs-to-draw > 0 ;;this means it needs to draw a positive-value
    [
    
      if ([can-be-1] of patch-here = 1) and (vl-needs-to-draw = 1)[
        set plabel-color blue 
        set plabel "1"
        set positive-value 1 
        set vl-needs-to-draw 0
        nine-all-vlcan-be]
      if ([can-be-2] of patch-here = 1) and (vl-needs-to-draw = 2) [
        set plabel-color blue 
        set plabel "2"
        set positive-value 2 
        set vl-needs-to-draw 0
        nine-all-vlcan-be]
      if ([can-be-3] of patch-here = 1) and (vl-needs-to-draw = 3) [
        set plabel-color blue 
        set plabel "3"
        set positive-value 3 
        set vl-needs-to-draw 0
        nine-all-vlcan-be]
      if ([can-be-4] of patch-here = 1) and (vl-needs-to-draw = 4) [
        set plabel-color blue 
        set plabel "4"
        set positive-value 4 
        set vl-needs-to-draw 0
        nine-all-vlcan-be]
      if ([can-be-5] of patch-here = 1) and (vl-needs-to-draw = 5) [ 
        set plabel-color blue
        set plabel "5"
        set positive-value 5 
        set vl-needs-to-draw 0
        nine-all-vlcan-be]
      if ([can-be-6] of patch-here = 1) and (vl-needs-to-draw = 6) [
        set plabel-color blue 
        set plabel "6"
        set positive-value 6 
        set vl-needs-to-draw 0
        nine-all-vlcan-be]
      if ([can-be-7] of patch-here = 1) and (vl-needs-to-draw = 7) [ 
        set plabel-color blue
        set plabel "7"
        set positive-value 7 
        set vl-needs-to-draw 0
        nine-all-vlcan-be]
      if ([can-be-8] of patch-here = 1) and (vl-needs-to-draw = 8)[ 
        set plabel-color blue
        set plabel "8"
        set positive-value 8 
        set vl-needs-to-draw 0
        nine-all-vlcan-be]
      if ([can-be-9] of patch-here = 1) and (vl-needs-to-draw = 9) [ 
        set plabel-color blue
        set plabel "9"
        set positive-value 9 
        set vl-needs-to-draw 0
        nine-all-vlcan-be]
     
    ]
   ;; so vl-needs to draw = 0
  
     if [positive-value] of patch-here = 1 [ set vlcan-be-1 9 ]
     if [positive-value] of patch-here = 2 [ set vlcan-be-2 9 ]
     if [positive-value] of patch-here = 3 [ set vlcan-be-3 9 ]
     if [positive-value] of patch-here = 4 [ set vlcan-be-4 9 ]
     if [positive-value] of patch-here = 5 [ set vlcan-be-5 9 ]
     if [positive-value] of patch-here = 6 [ set vlcan-be-6 9 ]
     if [positive-value] of patch-here = 7 [ set vlcan-be-7 9 ]
     if [positive-value] of patch-here = 8 [ set vlcan-be-8 9 ]
     if [positive-value] of patch-here = 9 [ set vlcan-be-9 9 ]
     
    set vlcan-be-1  ([can-be-1] of patch-here + vlcan-be-1)
    set vlcan-be-2  ([can-be-2] of patch-here + vlcan-be-2)
    set vlcan-be-3  ([can-be-3] of patch-here + vlcan-be-3)
    set vlcan-be-4  ([can-be-4] of patch-here + vlcan-be-4)
    set vlcan-be-5  ([can-be-5] of patch-here + vlcan-be-5)
    set vlcan-be-6  ([can-be-6] of patch-here + vlcan-be-6)
    set vlcan-be-7  ([can-be-7] of patch-here + vlcan-be-7)
    set vlcan-be-8  ([can-be-8] of patch-here + vlcan-be-8)              
    set vlcan-be-9  ([can-be-9] of patch-here + vlcan-be-9)           
  
 if ycor = -170
 [
  if vlcan-be-1 = 1 [ set vl-needs-to-draw 1 ]
  if vlcan-be-2 = 1 [ set vl-needs-to-draw 2 ]
  if vlcan-be-3 = 1 [ set vl-needs-to-draw 3 ]
  if vlcan-be-4 = 1 [ set vl-needs-to-draw 4 ]
  if vlcan-be-5 = 1 [ set vl-needs-to-draw 5 ]
  if vlcan-be-6 = 1 [ set vl-needs-to-draw 6 ]
  if vlcan-be-7 = 1 [ set vl-needs-to-draw 7 ]
  if vlcan-be-8 = 1 [ set vl-needs-to-draw 8 ]
  if vlcan-be-9 = 1 [ set vl-needs-to-draw 9 ] 
  zero-all-vlcan-be
 ]
  ]
end






;;========================
to move-sants
      ifelse ([xcor] of sant 18 = 10) or ([xcor] of sant 18 = 30)
  [
     ask sants
    [
    forward 20 
    sant-check-values
    ]
   ]   ;;end of if sant is at xcor 10 or 30
  
   [   ;;start of ifelse sant not at 10 or 50
    if ([xcor] of sant 18 = 50) and ([ycor] of sant 18 != -50)
     [
      ask sants
      [
      right 90
      forward 20
      right 90
      forward 40 
      right 180
      sant-check-values
      ]
     ] 
      if ([xcor] of sant 18 = 50) and ([ycor] of sant 18 = -50)
      [
      ask sants
        [
        left 90
        forward 40
        left 90
        forward 40 
        right 180
        sant-check-values
        ]
      ] 
  ]
end
;;===========================
 ;;x = 10, 30, 50, 70, 90, 110, 130, 150, 170
  ;;y = -10, -30, -50, -70, -90, -110, -130, -150, -170

;; set challenging1 [ [ [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 0 " "] ]
 ;;                  [ [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 0 " "] ]  
   ;;;                [ [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 0 " "] ]
      ;;             [ [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 0 " "] ]  
        ;;           [ [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 0 " "] ] 
          ;;         [ [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 0 " "] ] 
            ;;       [ [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 0 " "] ] 
              ;;     [ [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 0 " "] ] 
                ;;   [ [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 0 " "] ] ]
;;
 ;;=======================================
 
 ;;sets initial values of squares
to set-initial-square-values
  ask patches [set plabel-color black]
 if select-puzzle = "Easy1 Puzzle"
 [
   set easy1 [ [ [ 0 " "] [ 0 " "] [ 1 "1" ] [ 0 " "] [ 0 " "] [ 5 "5" ] [ 6 "6" ] [ 0 " "] [ 0 " "] ]
               [ [ 0 " "] [ 0 " "] [ 9 "9" ] [ 3 "3"] [ 0 " "] [ 0 " " ] [ 2 "2" ] [ 0 " "] [ 7 "7"] ]  
               [ [ 7 "7"] [ 0 " "] [ 0 " " ] [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " " ] [ 1 "1"] [ 0 " "] ]
               [ [ 2 "2"] [ 0 " "] [ 0 " " ] [ 8 "8"] [ 0 " "] [ 4 "4" ] [ 9 "9" ] [ 0 " "] [ 0 " "] ]  
               [ [ 0 " "] [ 3 "3"] [ 0 " " ] [ 2 "2"] [ 6 "6"] [ 1 "1" ] [ 0 " " ] [ 7 "7"] [ 0 " "] ] 
               [ [ 0 " "] [ 0 " "] [ 4 "4" ] [ 5 "5"] [ 0 " "] [ 3 "3" ] [ 0 " " ] [ 0 " "] [ 2 "2"] ] 
               [ [ 0 " "] [ 2 "2"] [ 0 " " ] [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 6 "6"] ] 
               [ [ 8 "8"] [ 0 " "] [ 6 "6" ] [ 0 " "] [ 0 " "] [ 7 "7" ] [ 3 "3" ] [ 0 " "] [ 0 " "] ] 
               [ [ 0 " "] [ 0 " "] [ 3 "3" ] [ 6 "6"] [ 0 " "] [ 0 " " ] [ 7 "7" ] [ 0 " "] [ 0 " "] ] ]

  foreach [ 0 1 2 3 4 5 6 7 8]  
 [    
   set y ?
foreach [ 0 1 2 3 4 5 6 7 8 ]
[
  set x ?
 set temp item x (item y easy1)
ask patch (item x xcord) (item y ycord) [
    set positive-value item 0 temp
    set plabel item 1 temp]
]
]
 ]

if select-puzzle = "Challenging1 Puzzle"
[
 ;;x = 10, 30, 50, 70, 90, 110, 130, 150, 170
  ;;y = -10, -30, -50, -70, -90, -110, -130, -150, -170
set challenging1 [ [ [ 1 "1"] [ 0 " "] [ 0 " " ] [ 0 " "] [ 5 "5"] [ 0 " " ] [ 0 " " ] [ 8 "8"] [ 0 " "] ]
                   [ [ 0 " "] [ 7 "7"] [ 8 "8" ] [ 0 " "] [ 6 "6"] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 0 " "] ]  
                   [ [ 0 " "] [ 9 "9"] [ 0 " " ] [ 0 " "] [ 0 " "] [ 2 "2" ] [ 3 "3" ] [ 0 " "] [ 0 " "] ]
                   [ [ 0 " "] [ 3 "3"] [ 0 " " ] [ 0 " "] [ 0 " "] [ 7 "7" ] [ 8 "8" ] [ 1 "1"] [ 0 " "] ]  
                   [ [ 0 " "] [ 0 " "] [ 2 "2" ] [ 3 "3"] [ 0 " "] [ 9 "9" ] [ 7 "7" ] [ 0 " "] [ 0 " "] ] 
                   [ [ 0 " "] [ 4 "4"] [ 5 "5" ] [ 6 "6"] [ 0 " "] [ 0 " " ] [ 0 " " ] [ 2 "2"] [ 0 " "] ] 
                   [ [ 0 " "] [ 0 " "] [ 3 "3" ] [ 1 "1"] [ 0 " "] [ 0 " " ] [ 0 " " ] [ 9 "9"] [ 0 " "] ] 
                   [ [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " "] [ 9 "9"] [ 0 " " ] [ 1 "1" ] [ 3 "3"] [ 0 " "] ] 
                   [ [ 0 " "] [ 5 "5"] [ 0 " " ] [ 0 " "] [ 3 "3"] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 6 "6"] ] ]

  foreach [ 0 1 2 3 4 5 6 7 8]  
 [    
   set y ?
foreach [ 0 1 2 3 4 5 6 7 8 ]
[
  set x ?
 set temp item x (item y challenging1)
ask patch (item x xcord) (item y ycord) [
    set positive-value item 0 temp
    set plabel item 1 temp]
]
]
]  
 if Select-Puzzle = "Hard1 Puzzle"
 [
  ;;x = 10, 30, 50, 70, 90, 110, 130, 150, 170
  ;;y = -10, -30, -50, -70, -90, -110, -130, -150, -170
set hard1 [ [ [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " "] [ 0 " "] [ 0 " " ] [ 6 "6" ] [ 8 "8"] [ 0 " "] ]
            [ [ 0 " "] [ 6 "6"] [ 2 "2" ] [ 3 "3"] [ 0 " "] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 9 "9"] ]  
            [ [ 5 "5"] [ 0 " "] [ 0 " " ] [ 0 " "] [ 4 "4"] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 0 " "] ]
            [ [ 1 "1"] [ 0 " "] [ 0 " " ] [ 0 " "] [ 3 "3"] [ 5 "5" ] [ 9 "9" ] [ 7 "7"] [ 0 " "] ]  
            [ [ 8 "8"] [ 0 " "] [ 0 " " ] [ 0 " "] [ 2 "2"] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 6 "6"] ] 
            [ [ 0 " "] [ 9 "9"] [ 7 "7" ] [ 6 "6"] [ 1 "1"] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 8 "8"] ] 
            [ [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " "] [ 8 "8"] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 3 "3"] ] 
            [ [ 9 "9"] [ 0 " "] [ 0 " " ] [ 0 " "] [ 0 " "] [ 7 "7" ] [ 4 "4" ] [ 5 "5"] [ 0 " "] ] 
            [ [ 0 " "] [ 7 "7"] [ 4 "4" ] [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 0 " "] ] ]
   foreach [ 0 1 2 3 4 5 6 7 8]  
 [    
   set y ?
foreach [ 0 1 2 3 4 5 6 7 8 ]
[
  set x ?
 set temp item x (item y hard1)
ask patch (item x xcord) (item y ycord) [
    set positive-value item 0 temp
    set plabel item 1 temp]
]
]
 ]
 

 if Select-Puzzle = "Suicide1 Puzzle"
 [
  ;;x = 10, 30, 50, 70, 90, 110, 130, 150, 170
  ;;y = -10, -30, -50, -70, -90, -110, -130, -150, -170
    set suicide1 [ [ [ 0 " "] [ 0 " "] [ 3 "3" ] [ 0 " "] [ 0 " "] [ 2 "2" ] [ 5 "5" ] [ 0 " "] [ 4 "4"] ]
                   [ [ 6 "6"] [ 0 " "] [ 2 "2" ] [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " " ] [ 9 "9"] [ 0 " "] ]  
                   [ [ 8 "8"] [ 0 " "] [ 5 "5" ] [ 0 " "] [ 3 "3"] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 0 " "] ]
                   [ [ 0 " "] [ 0 " "] [ 0 " " ] [ 4 "4"] [ 0 " "] [ 5 "5" ] [ 0 " " ] [ 0 " "] [ 0 " "] ]  
                   [ [ 3 "3"] [ 0 " "] [ 0 " " ] [ 0 " "] [ 2 "2"] [ 0 " " ] [ 0 " " ] [ 0 " "] [ 1 "1"] ] 
                   [ [ 0 " "] [ 0 " "] [ 0 " " ] [ 3 "3"] [ 0 " "] [ 6 "6" ] [ 0 " " ] [ 0 " "] [ 0 " "] ] 
                   [ [ 0 " "] [ 0 " "] [ 0 " " ] [ 0 " "] [ 4 "4"] [ 0 " " ] [ 9 "9" ] [ 0 " "] [ 6 "6"] ] 
                   [ [ 0 " "] [ 3 "3"] [ 0 " " ] [ 0 " "] [ 0 " "] [ 0 " " ] [ 1 "1" ] [ 0 " "] [ 5 "5"] ] 
                   [ [ 1 "1"] [ 0 " "] [ 4 "4" ] [ 6 "6"] [ 0 " "] [ 0 " " ] [ 7 "7" ] [ 0 " "] [ 0 " "] ] ]
;;
   foreach [ 0 1 2 3 4 5 6 7 8]  
 [    
   set y ?
foreach [ 0 1 2 3 4 5 6 7 8 ]
[
  set x ?
 set temp item x (item y suicide1)
ask patch (item x xcord) (item y ycord) [
    set positive-value item 0 temp
    set plabel item 1 temp]
]
]

 ]


end