Advertisement
ptrelford

Pacman Maze in FunScript

Sep 2nd, 2013
267
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 5.39 KB | None | 0 0
  1. [<ReflectedDefinition>]
  2. module Program
  3.  
  4. open FunScript
  5. open FunScript.TypeScript
  6.  
  7. let maze = "\
  8. ##/------------7/------------7##,\
  9. ##|............|!............|##,\
  10. ##|./__7./___7.|!./___7./__7.|##,\
  11. ##|o|  !.|   !.|!.|   !.|  !o|##,\
  12. ##|.L--J.L---J.LJ.L---J.L--J.|##,\
  13. ##|..........................|##,\
  14. ##|./__7./7./______7./7./__7.|##,\
  15. ##|.L--J.|!.L--7/--J.|!.L--J.|##,\
  16. ##|......|!....|!....|!......|##,\
  17. ##L____7.|L__7 |! /__J!./____J##,\
  18. #######!.|/--J LJ L--7!.|#######,\
  19. #######!.|!          |!.|#######,\
  20. #######!.|! /__==__7 |!.|#######,\
  21. -------J.LJ |      ! LJ.L-------,\
  22. ########.   | **** !   .########,\
  23. _______7./7 |      ! /7./_______,\
  24. #######!.|! L______J |!.|#######,\
  25. #######!.|!          |!.|#######,\
  26. #######!.|! /______7 |!.|#######,\
  27. ##/----J.LJ L--7/--J LJ.L----7##,\
  28. ##|............|!............|##,\
  29. ##|./__7./___7.|!./___7./__7.|##,\
  30. ##|.L-7!.L---J.LJ.L---J.|/-J.|##,\
  31. ##|o..|!.......<>.......|!..o|##,\
  32. ##L_7.|!./7./______7./7.|!./_J##,\
  33. ##/-J.LJ.|!.L--7/--J.|!.LJ.L-7##,\
  34. ##|......|!....|!....|!......|##,\
  35. ##|./____JL__7.|!./__JL____7.|##,\
  36. ##|.L--------J.LJ.L--------J.|##,\
  37. ##|..........................|##,\
  38. ##L--------------------------J##".Split(',')
  39.  
  40. let tl = [|
  41.     0b00000000
  42.     0b00000000
  43.     0b00000000
  44.     0b00000000
  45.     0b00000011
  46.     0b00000100
  47.     0b00001000
  48.     0b00001000|]
  49. let top = [|
  50.     0b00000000
  51.     0b00000000
  52.     0b00000000
  53.     0b00000000
  54.     0b11111111
  55.     0b00000000
  56.     0b00000000
  57.     0b00000000|]
  58. let tr = [|
  59.     0b00000000
  60.     0b00000000
  61.     0b00000000
  62.     0b00000000
  63.     0b11000000
  64.     0b00100000
  65.     0b00010000
  66.     0b00010000|]
  67. let left = [|
  68.     0b00001000
  69.     0b00001000
  70.     0b00001000
  71.     0b00001000
  72.     0b00001000
  73.     0b00001000
  74.     0b00001000
  75.     0b00001000|]
  76. let blank = [|
  77.     0b00000000
  78.     0b00000000
  79.     0b00000000
  80.     0b00000000
  81.     0b00000000
  82.     0b00000000
  83.     0b00000000
  84.     0b00000000|]
  85. let right = [|
  86.     0b00010000
  87.     0b00010000
  88.     0b00010000
  89.     0b00010000
  90.     0b00010000
  91.     0b00010000
  92.     0b00010000
  93.     0b00010000|]
  94. let bl = [|
  95.     0b00001000
  96.     0b00001000
  97.     0b00000100
  98.     0b00000011
  99.     0b00000000
  100.     0b00000000
  101.     0b00000000
  102.     0b00000000|]
  103. let bottom = [|
  104.     0b00000000
  105.     0b00000000
  106.     0b00000000
  107.     0b11111111
  108.     0b00000000
  109.     0b00000000
  110.     0b00000000
  111.     0b00000000|]
  112. let br = [|
  113.     0b00010000
  114.     0b00010000
  115.     0b00100000
  116.     0b11000000
  117.     0b00000000
  118.     0b00000000
  119.     0b00000000
  120.     0b00000000|]
  121. let door = [|
  122.     0b00000000
  123.     0b00000000
  124.     0b00000000
  125.     0b00000000
  126.     0b11111111
  127.     0b00000000
  128.     0b00000000
  129.     0b00000000|]
  130. let pill = [|
  131.     0b00000000
  132.     0b00000000
  133.     0b00000000
  134.     0b00011000
  135.     0b00011000
  136.     0b00000000
  137.     0b00000000
  138.     0b00000000|]
  139. let power = [|
  140.     0b00000000
  141.     0b00011000
  142.     0b00111100
  143.     0b01111110
  144.     0b01111110
  145.     0b00111100
  146.     0b00011000
  147.     0b00000000|]
  148.  
  149. type Brush = Blue | Yellow
  150.  
  151. let toTile c =
  152.     match c with  
  153.     | '=' -> door, Blue
  154.     | '_' -> top, Blue
  155.     | '|' -> left, Blue
  156.     | '!' -> right, Blue
  157.     | '/' -> tl, Blue
  158.     | '7' -> tr, Blue
  159.     | 'L' -> bl, Blue
  160.     | 'J' -> br, Blue
  161.     | '-' -> bottom, Blue
  162.     | '.' -> pill, Yellow
  163.     | 'o' -> power, Yellow
  164.     | _ -> blank, Blue
  165.  
  166.  
  167. [<JSEmit("return {0} << {1};")>]
  168. let ShiftLeft(x:int,n:int) : int = failwith "never"
  169.  
  170. [<JSEmit("return {0} & {1};")>]
  171. let And(a:int,b:int) : int = failwith "never"
  172.  
  173. let draw f (lines:int[]) =
  174.     let width = 8
  175.     lines |> Array.iteri (fun y line ->
  176.         let line = line
  177.         for x = 0 to width-1 do
  178.             let bit = ShiftLeft(1, width - 1 - x)
  179.             let pattern = And(line,bit)
  180.             if pattern <> 0 then f (x,y)
  181.     )
  182.  
  183. type ts = Api<"../Typings/lib.d.ts">
  184.  
  185. type Context(context:ts.CanvasRenderingContext2D) =
  186.     member __.createBrush(r,g,b,a) =
  187.         let id = context.createImageData(float 1,float 1)
  188.         let d = id.data
  189.         d.[0] <- float r; d.[1] <- float g; d.[2] <- float b; d.[3] <- float a
  190.         id
  191.     member __.plot(brush,x,y) =
  192.         context.putImageData(brush, float x, float y)
  193.  
  194. let main() =
  195.     let map = unbox<ts.HTMLCanvasElement>(ts.document.createElement("canvas"))
  196.     map.width <- 256.
  197.     map.height <- 256.
  198.     let context = map.getContext("2d")
  199.     context.fillStyle <- "rgb(0,0,0)"
  200.     context.fillRect (0., 0. , 256., 256.);
  201.     let context = Context(context)
  202.     let blue = context.createBrush (63,63,255,255)
  203.     let yellow = context.createBrush (255,255,0,255)
  204.     let lines = maze      
  205.     for y = 0 to lines.Length-1 do
  206.         let line = lines.[y]
  207.         for x = 0 to line.Length-1 do
  208.             let c = line.[x]
  209.             let tile, color = toTile c                
  210.             let brush = match color with Blue -> blue | Yellow -> yellow        
  211.             let f (x',y') = context.plot(brush, x*8 + x', (y+1)*8 + y')
  212.             draw f tile
  213.     let b = context
  214.     let canvas = unbox<ts.HTMLCanvasElement>(ts.document.getElementById("canvas"))
  215.     let context = canvas.getContext("2d")
  216.     canvas.width <- 1000.
  217.     canvas.height <- 800.
  218.     context.drawImage(unbox<ts.HTMLElement>(map), 0., 0.)
  219.     context.drawImage(unbox<ts.HTMLElement>(map), 256., 0.)
  220.     context.drawImage(unbox<ts.HTMLElement>(map), 256., 256.)
  221.     context.drawImage(unbox<ts.HTMLElement>(map), 0., 256.)
  222.  
  223. do Runtime.Run(directory="Web", components=Interop.Components.all)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement