Advertisement
ptrelford

Pacman Score in FunScript

Sep 11th, 2013
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 20.35 KB | None | 0 0
  1. [<ReflectedDefinition>]
  2. module Program
  3.  
  4. open FunScript
  5. open FunScript.TypeScript
  6.  
  7. type ts = Api<"../Typings/lib.d.ts">
  8.  
  9. let cyand =
  10.     14, 14,
  11.     let A, B, C, D = 0x00000000, 0xFF00FFDE, 0xFFDEDEDE, 0xFF2121DE
  12.     [|
  13.     A; A; A; A; A; B; B; B; B; A; A; A; A; A
  14.     A; A; A; B; B; B; B; B; B; B; B; A; A; A
  15.     A; A; B; B; B; B; B; B; B; B; B; B; A; A
  16.     A; B; B; B; B; B; B; B; B; B; B; B; B; A
  17.     A; B; B; C; C; B; B; B; B; C; C; B; B; A
  18.     A; B; C; C; C; C; B; B; C; C; C; C; B; A
  19.     B; B; C; C; C; C; B; B; C; C; C; C; B; B
  20.     B; B; C; D; D; C; B; B; C; D; D; C; B; B
  21.     B; B; B; D; D; B; B; B; B; D; D; B; B; B
  22.     B; B; B; B; B; B; B; B; B; B; B; B; B; B
  23.     B; B; B; B; B; B; B; B; B; B; B; B; B; B
  24.     B; B; B; B; B; B; B; B; B; B; B; B; B; B
  25.     B; B; A; B; B; B; A; A; B; B; B; A; B; B
  26.     B; A; A; A; B; B; A; A; B; B; A; A; A; B
  27.     |]
  28. let oranged =
  29.     14, 14,
  30.     let A, B, C, D = 0x00000000, 0xFFFFB847, 0xFFDEDEDE, 0xFF2121DE
  31.     [|
  32.     A; A; A; A; A; B; B; B; B; A; A; A; A; A
  33.     A; A; A; B; B; B; B; B; B; B; B; A; A; A
  34.     A; A; B; B; B; B; B; B; B; B; B; B; A; A
  35.     A; B; B; B; B; B; B; B; B; B; B; B; B; A
  36.     A; B; B; C; C; B; B; B; B; C; C; B; B; A
  37.     A; B; C; C; C; C; B; B; C; C; C; C; B; A
  38.     B; B; C; C; C; C; B; B; C; C; C; C; B; B
  39.     B; B; C; D; D; C; B; B; C; D; D; C; B; B
  40.     B; B; B; D; D; B; B; B; B; D; D; B; B; B
  41.     B; B; B; B; B; B; B; B; B; B; B; B; B; B
  42.     B; B; B; B; B; B; B; B; B; B; B; B; B; B
  43.     B; B; B; B; B; B; B; B; B; B; B; B; B; B
  44.     B; B; A; B; B; B; A; A; B; B; B; A; B; B
  45.     B; A; A; A; B; B; A; A; B; B; A; A; A; B
  46.     |]
  47. let pinkd =
  48.     14, 14,
  49.     let A, B, C, D = 0x00000000, 0xFFFFB8DE, 0xFFDEDEDE, 0xFF2121DE
  50.     [|
  51.     A; A; A; A; A; B; B; B; B; A; A; A; A; A
  52.     A; A; A; B; B; B; B; B; B; B; B; A; A; A
  53.     A; A; B; B; B; B; B; B; B; B; B; B; A; A
  54.     A; B; B; B; B; B; B; B; B; B; B; B; B; A
  55.     A; B; B; C; C; B; B; B; B; C; C; B; B; A
  56.     A; B; C; C; C; C; B; B; C; C; C; C; B; A
  57.     B; B; C; C; C; C; B; B; C; C; C; C; B; B
  58.     B; B; C; D; D; C; B; B; C; D; D; C; B; B
  59.     B; B; B; D; D; B; B; B; B; D; D; B; B; B
  60.     B; B; B; B; B; B; B; B; B; B; B; B; B; B
  61.     B; B; B; B; B; B; B; B; B; B; B; B; B; B
  62.     B; B; B; B; B; B; B; B; B; B; B; B; B; B
  63.     B; B; A; B; B; B; A; A; B; B; B; A; B; B
  64.     B; A; A; A; B; B; A; A; B; B; A; A; A; B
  65.     |]
  66. let redd =
  67.     14, 14,
  68.     let A, B, C, D = 0x00000000, 0xFFFF0000, 0xFFDEDEDE, 0xFF2121DE
  69.     [|
  70.     A; A; A; A; A; B; B; B; B; A; A; A; A; A
  71.     A; A; A; B; B; B; B; B; B; B; B; A; A; A
  72.     A; A; B; B; B; B; B; B; B; B; B; B; A; A
  73.     A; B; B; B; B; B; B; B; B; B; B; B; B; A
  74.     A; B; B; C; C; B; B; B; B; C; C; B; B; A
  75.     A; B; C; C; C; C; B; B; C; C; C; C; B; A
  76.     B; B; C; C; C; C; B; B; C; C; C; C; B; B
  77.     B; B; C; D; D; C; B; B; C; D; D; C; B; B
  78.     B; B; B; D; D; B; B; B; B; D; D; B; B; B
  79.     B; B; B; B; B; B; B; B; B; B; B; B; B; B
  80.     B; B; B; B; B; B; B; B; B; B; B; B; B; B
  81.     B; B; B; B; B; B; B; B; B; B; B; B; B; B
  82.     B; B; A; B; B; B; A; A; B; B; B; A; B; B
  83.     B; A; A; A; B; B; A; A; B; B; A; A; A; B
  84.     |]
  85.  
  86. let pr1 =
  87.     13, 13,
  88.     let A, B = 0x00000000, 0xFFFFFF00
  89.     [|
  90.     A; A; A; A; B; B; B; B; B; A; A; A; A
  91.     A; A; B; B; B; B; B; B; B; B; B; A; A
  92.     A; B; B; B; B; B; B; B; B; B; B; B; A
  93.     A; B; B; B; B; B; B; B; B; B; B; A; A
  94.     B; B; B; B; B; B; B; B; B; A; A; A; A
  95.     B; B; B; B; B; B; B; A; A; A; A; A; A
  96.     B; B; B; B; B; B; A; A; A; A; A; A; A
  97.     B; B; B; B; B; B; B; A; A; A; A; A; A
  98.     B; B; B; B; B; B; B; B; B; A; A; A; A
  99.     A; B; B; B; B; B; B; B; B; B; B; A; A
  100.     A; B; B; B; B; B; B; B; B; B; B; B; A
  101.     A; A; B; B; B; B; B; B; B; B; B; A; A
  102.     A; A; A; A; B; B; B; B; B; A; A; A; A
  103.     |]
  104. let pr2 =
  105.     13, 13,
  106.     let A, B = 0x0, 0xFFFFFF00
  107.     [|
  108.     A; A; A; A; B; B; B; B; B; A; A; A; A
  109.     A; A; B; B; B; B; B; B; B; B; B; A; A
  110.     A; B; B; B; B; B; B; B; B; B; B; B; A
  111.     A; B; B; B; B; B; B; B; B; B; B; B; A
  112.     B; B; B; B; B; B; B; B; B; B; B; B; B
  113.     B; B; B; B; B; B; B; B; B; A; A; A; A
  114.     B; B; B; B; B; B; A; A; A; A; A; A; A
  115.     B; B; B; B; B; B; B; B; B; A; A; A; A
  116.     B; B; B; B; B; B; B; B; B; B; B; B; B
  117.     A; B; B; B; B; B; B; B; B; B; B; B; A
  118.     A; B; B; B; B; B; B; B; B; B; B; B; A
  119.     A; A; B; B; B; B; B; B; B; B; B; A; A
  120.     A; A; A; A; B; B; B; B; B; A; A; A; A
  121.     |]
  122. let pl1 =
  123.     13, 13,
  124.     let A, B = 0x0, 0xFFFFFF00
  125.     [|
  126.     A; A; A; A; B; B; B; B; B; A; A; A; A
  127.     A; A; B; B; B; B; B; B; B; B; B; A; A
  128.     A; B; B; B; B; B; B; B; B; B; B; B; A
  129.     A; A; B; B; B; B; B; B; B; B; B; B; A
  130.     A; A; A; A; B; B; B; B; B; B; B; B; B
  131.     A; A; A; A; A; A; B; B; B; B; B; B; B
  132.     A; A; A; A; A; A; A; B; B; B; B; B; B
  133.     A; A; A; A; A; A; B; B; B; B; B; B; B
  134.     A; A; A; A; B; B; B; B; B; B; B; B; B
  135.     A; A; B; B; B; B; B; B; B; B; B; B; A
  136.     A; B; B; B; B; B; B; B; B; B; B; B; A
  137.     A; A; B; B; B; B; B; B; B; B; B; A; A
  138.     A; A; A; A; B; B; B; B; B; A; A; A; A
  139.     |]
  140. let pl2 =
  141.     13, 13,
  142.     let A, B = 0x0, 0xFFFFFF00
  143.     [|
  144.     A; A; A; A; B; B; B; B; B; A; A; A; A
  145.     A; A; B; B; B; B; B; B; B; B; B; A; A
  146.     A; B; B; B; B; B; B; B; B; B; B; B; A
  147.     A; B; B; B; B; B; B; B; B; B; B; B; A
  148.     B; B; B; B; B; B; B; B; B; B; B; B; B
  149.     A; A; A; A; B; B; B; B; B; B; B; B; B
  150.     A; A; A; A; A; A; A; B; B; B; B; B; B
  151.     A; A; A; A; B; B; B; B; B; B; B; B; B
  152.     B; B; B; B; B; B; B; B; B; B; B; B; B
  153.     A; B; B; B; B; B; B; B; B; B; B; B; A
  154.     A; B; B; B; B; B; B; B; B; B; B; B; A
  155.     A; A; B; B; B; B; B; B; B; B; B; A; A
  156.     A; A; A; A; B; B; B; B; B; A; A; A; A
  157.     |]
  158. let pu1 =
  159.     13, 13,
  160.     let A, B = 0x0, 0xFFFFFF00
  161.     [|
  162.     A; A; A; A; A; A; A; A; A; A; A; A; A
  163.     A; A; B; A; A; A; A; A; A; A; B; A; A
  164.     A; B; B; B; A; A; A; A; A; B; B; B; A
  165.     A; B; B; B; A; A; A; A; A; B; B; B; A
  166.     B; B; B; B; B; A; A; A; B; B; B; B; B
  167.     B; B; B; B; B; A; A; A; B; B; B; B; B
  168.     B; B; B; B; B; B; A; B; B; B; B; B; B
  169.     B; B; B; B; B; B; B; B; B; B; B; B; B
  170.     B; B; B; B; B; B; B; B; B; B; B; B; B
  171.     A; B; B; B; B; B; B; B; B; B; B; B; A
  172.     A; B; B; B; B; B; B; B; B; B; B; B; A
  173.     A; A; B; B; B; B; B; B; B; B; B; A; A
  174.     A; A; A; A; B; B; B; B; B; A; A; A; A
  175.     |]
  176. let pu2 =
  177.     13, 13,
  178.     let A, B = 0x0, 0xFFFFFF00
  179.     [|
  180.     A; A; A; A; B; A; A; A; B; A; A; A; A
  181.     A; A; B; B; B; A; A; A; B; B; B; A; A
  182.     A; B; B; B; B; A; A; A; B; B; B; B; A
  183.     A; B; B; B; B; A; A; A; B; B; B; B; A
  184.     B; B; B; B; B; B; A; B; B; B; B; B; B
  185.     B; B; B; B; B; B; A; B; B; B; B; B; B
  186.     B; B; B; B; B; B; A; B; B; B; B; B; B
  187.     B; B; B; B; B; B; B; B; B; B; B; B; B
  188.     B; B; B; B; B; B; B; B; B; B; B; B; B
  189.     A; B; B; B; B; B; B; B; B; B; B; B; A
  190.     A; B; B; B; B; B; B; B; B; B; B; B; A
  191.     A; A; B; B; B; B; B; B; B; B; B; A; A
  192.     A; A; A; A; B; B; B; B; B; A; A; A; A
  193.     |]
  194. let pd1 =
  195.     13, 13,
  196.     let A, B = 0x0, 0xFFFFFF00
  197.     [|
  198.     A; A; A; A; B; B; B; B; B; A; A; A; A
  199.     A; A; B; B; B; B; B; B; B; B; B; A; A
  200.     A; B; B; B; B; B; B; B; B; B; B; B; A
  201.     A; B; B; B; B; B; B; B; B; B; B; B; A
  202.     B; B; B; B; B; B; B; B; B; B; B; B; B
  203.     B; B; B; B; B; B; B; B; B; B; B; B; B
  204.     B; B; B; B; B; B; A; B; B; B; B; B; B
  205.     B; B; B; B; B; A; A; A; B; B; B; B; B
  206.     B; B; B; B; B; A; A; A; B; B; B; B; B
  207.     A; B; B; B; A; A; A; A; A; B; B; B; A
  208.     A; B; B; B; A; A; A; A; A; B; B; B; A
  209.     A; A; B; A; A; A; A; A; A; A; B; A; A
  210.     A; A; A; A; A; A; A; A; A; A; A; A; A
  211.     |]
  212. let pd2 =
  213.     13, 13,
  214.     let A, B = 0x0, 0xFFFFFF00
  215.     [|
  216.     A; A; A; A; B; B; B; B; B; A; A; A; A
  217.     A; A; B; B; B; B; B; B; B; B; B; A; A
  218.     A; B; B; B; B; B; B; B; B; B; B; B; A
  219.     A; B; B; B; B; B; B; B; B; B; B; B; A
  220.     B; B; B; B; B; B; B; B; B; B; B; B; B
  221.     B; B; B; B; B; B; B; B; B; B; B; B; B
  222.     B; B; B; B; B; B; A; B; B; B; B; B; B
  223.     B; B; B; B; B; B; A; B; B; B; B; B; B
  224.     B; B; B; B; B; B; A; B; B; B; B; B; B
  225.     A; B; B; B; B; A; A; A; B; B; B; B; A
  226.     A; B; B; B; B; A; A; A; B; B; B; B; A
  227.     A; A; B; B; B; A; A; A; B; B; B; A; A
  228.     A; A; A; A; B; A; A; A; B; A; A; A; A
  229.     |]
  230.  
  231.  
  232.  
  233. let maze = "\
  234. ##/------------7/------------7##,\
  235. ##|............|!............|##,\
  236. ##|./__7./___7.|!./___7./__7.|##,\
  237. ##|o|  !.|   !.|!.|   !.|  !o|##,\
  238. ##|.L--J.L---J.LJ.L---J.L--J.|##,\
  239. ##|..........................|##,\
  240. ##|./__7./7./______7./7./__7.|##,\
  241. ##|.L--J.|!.L--7/--J.|!.L--J.|##,\
  242. ##|......|!....|!....|!......|##,\
  243. ##L____7.|L__7 |! /__J!./____J##,\
  244. #######!.|/--J LJ L--7!.|#######,\
  245. #######!.|!          |!.|#######,\
  246. #######!.|! /__==__7 |!.|#######,\
  247. -------J.LJ |      ! LJ.L-------,\
  248. ########.   | **** !   .########,\
  249. _______7./7 |      ! /7./_______,\
  250. #######!.|! L______J |!.|#######,\
  251. #######!.|!          |!.|#######,\
  252. #######!.|! /______7 |!.|#######,\
  253. ##/----J.LJ L--7/--J LJ.L----7##,\
  254. ##|............|!............|##,\
  255. ##|./__7./___7.|!./___7./__7.|##,\
  256. ##|.L-7!.L---J.LJ.L---J.|/-J.|##,\
  257. ##|o..|!.......<>.......|!..o|##,\
  258. ##L_7.|!./7./______7./7.|!./_J##,\
  259. ##/-J.LJ.|!.L--7/--J.|!.LJ.L-7##,\
  260. ##|......|!....|!....|!......|##,\
  261. ##|./____JL__7.|!./__JL____7.|##,\
  262. ##|.L--------J.LJ.L--------J.|##,\
  263. ##|..........................|##,\
  264. ##L--------------------------J##".Split(',')
  265.  
  266. let pills =
  267.     maze |> Array.map (fun line ->
  268.         line.ToCharArray() |> Array.map (fun c -> c)
  269.     )
  270.  
  271. let tl = [|
  272.     0b00000000
  273.     0b00000000
  274.     0b00000000
  275.     0b00000000
  276.     0b00000011
  277.     0b00000100
  278.     0b00001000
  279.     0b00001000|]
  280. let top = [|
  281.     0b00000000
  282.     0b00000000
  283.     0b00000000
  284.     0b00000000
  285.     0b11111111
  286.     0b00000000
  287.     0b00000000
  288.     0b00000000|]
  289. let tr = [|
  290.     0b00000000
  291.     0b00000000
  292.     0b00000000
  293.     0b00000000
  294.     0b11000000
  295.     0b00100000
  296.     0b00010000
  297.     0b00010000|]
  298. let left = [|
  299.     0b00001000
  300.     0b00001000
  301.     0b00001000
  302.     0b00001000
  303.     0b00001000
  304.     0b00001000
  305.     0b00001000
  306.     0b00001000|]
  307. let blank = [|
  308.     0b00000000
  309.     0b00000000
  310.     0b00000000
  311.     0b00000000
  312.     0b00000000
  313.     0b00000000
  314.     0b00000000
  315.     0b00000000|]
  316. let right = [|
  317.     0b00010000
  318.     0b00010000
  319.     0b00010000
  320.     0b00010000
  321.     0b00010000
  322.     0b00010000
  323.     0b00010000
  324.     0b00010000|]
  325. let bl = [|
  326.     0b00001000
  327.     0b00001000
  328.     0b00000100
  329.     0b00000011
  330.     0b00000000
  331.     0b00000000
  332.     0b00000000
  333.     0b00000000|]
  334. let bottom = [|
  335.     0b00000000
  336.     0b00000000
  337.     0b00000000
  338.     0b11111111
  339.     0b00000000
  340.     0b00000000
  341.     0b00000000
  342.     0b00000000|]
  343. let br = [|
  344.     0b00010000
  345.     0b00010000
  346.     0b00100000
  347.     0b11000000
  348.     0b00000000
  349.     0b00000000
  350.     0b00000000
  351.     0b00000000|]
  352. let door = [|
  353.     0b00000000
  354.     0b00000000
  355.     0b00000000
  356.     0b00000000
  357.     0b11111111
  358.     0b00000000
  359.     0b00000000
  360.     0b00000000|]
  361. let pill = [|
  362.     0b00000000
  363.     0b00000000
  364.     0b00000000
  365.     0b00011000
  366.     0b00011000
  367.     0b00000000
  368.     0b00000000
  369.     0b00000000|]
  370. let power = [|
  371.     0b00000000
  372.     0b00011000
  373.     0b00111100
  374.     0b01111110
  375.     0b01111110
  376.     0b00111100
  377.     0b00011000
  378.     0b00000000|]
  379.  
  380. type Brush = Blue | Yellow
  381.  
  382. let toTile c =
  383.     match c with  
  384.     | '=' -> door, Blue
  385.     | '_' -> top, Blue
  386.     | '|' -> left, Blue
  387.     | '!' -> right, Blue
  388.     | '/' -> tl, Blue
  389.     | '7' -> tr, Blue
  390.     | 'L' -> bl, Blue
  391.     | 'J' -> br, Blue
  392.     | '-' -> bottom, Blue
  393.     | '.' -> pill, Yellow
  394.     | 'o' -> power, Yellow
  395.     | _ -> blank, Blue
  396.  
  397. let isWall x=
  398.     match x with
  399.     | '_' | '|' | '!' | '/' | '7' | 'L' | 'J' | '-' | '*' -> true
  400.     | _ -> false
  401.  
  402. let tileAt (x,y) =
  403.     if x < 0 then ' '
  404.     elif x > 30 then ' '
  405.     else maze.[y].[x]
  406.        
  407. let isWallAt (x,y) = tileAt(x,y) |> isWall
  408.  
  409. [<JSEmit("return {0} << {1};")>]
  410. let ShiftLeft(x:int,n:int) : int = failwith "never"
  411.  
  412. [<JSEmit("return {0} >> {1};")>]
  413. let ShiftRight(x:int,n:int) : int = failwith "never"
  414.  
  415. [<JSEmit("return {0} & {1};")>]
  416. let And(a:int,b:int) : int = failwith "never"
  417.  
  418. let draw f (lines:int[]) =
  419.     let width = 8
  420.     lines |> Array.iteri (fun y line ->
  421.         for x = 0 to width-1 do
  422.             let bit = ShiftLeft(1, width - 1 - x)
  423.             let pattern = And(line,bit)
  424.             if pattern <> 0 then f (x,y)
  425.     )
  426.  
  427. let part x n =
  428.     let bits = ShiftRight(x,n)      
  429.     let byte = And(bits, 255)
  430.     float byte
  431.  
  432. let createImage (width, height, pixels) =
  433.     let layer = unbox<ts.HTMLCanvasElement>(ts.document.createElement("canvas"))  
  434.     layer.width <- float width
  435.     layer.height <- float height
  436.     let context = layer.getContext("2d")    
  437.     let id = context.createImageData(float width,float height)
  438.     let d = id.data
  439.     pixels |> Array.iteri (fun i pixel ->
  440.             let x = i * 4
  441.             d.[x+0] <- part pixel 16
  442.             d.[x+1] <- part pixel 8
  443.             d.[x+2] <- part pixel 0
  444.             d.[x+3] <- part pixel 24
  445.         )
  446.     context.putImageData(id,0.,0.)
  447.     let image = unbox<ts.HTMLImageElement>(ts.document.createElement("image"))  
  448.     image.src <- layer.toDataURL()
  449.     unbox<ts.HTMLElement>(image)
  450.  
  451. type Plotter(context:ts.CanvasRenderingContext2D) =
  452.     member __.createBrush(r,g,b,a) =
  453.         let id = context.createImageData(float 1,float 1)
  454.         let d = id.data
  455.         d.[0] <- float r; d.[1] <- float g; d.[2] <- float b; d.[3] <- float a
  456.         id
  457.     member __.plot(brush,x,y) =
  458.         context.putImageData(brush, float x, float y)          
  459.  
  460. let createBackground () =
  461.     let background = unbox<ts.HTMLCanvasElement>(ts.document.createElement("canvas"))  
  462.     background.width <- 256.
  463.     background.height <- 256.    
  464.     let context = background.getContext("2d")
  465.     context.fillStyle <- "rgb(0,0,0)"
  466.     context.fillRect (0., 0. , 256., 256.);
  467.     let plotter = Plotter(context)
  468.     let blue = plotter.createBrush (63,63,255,255)
  469.     let yellow = plotter.createBrush (255,255,0,255)
  470.     let lines = maze      
  471.     for y = 0 to lines.Length-1 do
  472.         let line = lines.[y]
  473.         for x = 0 to line.Length-1 do
  474.             let c = line.[x]
  475.             let tile, color = toTile c                
  476.             let brush = match color with Blue -> blue | Yellow -> yellow        
  477.             let f (x',y') = plotter.plot(brush, x*8 + x', y*8 + y')
  478.             draw f tile
  479.     unbox<ts.HTMLElement>(background)
  480.  
  481. let clearCell background (x,y) =    
  482.     let background = unbox<ts.HTMLCanvasElement>(background)
  483.     let context = background.getContext("2d")
  484.     let plotter = Plotter(context)
  485.     let black = plotter.createBrush (0,0,0,255)
  486.     for y' = 0 to 7 do
  487.        for x' = 0 to 7 do                  
  488.             plotter.plot(black, x*8 + x', y*8 + y')        
  489.  
  490. let noWall (x,y) (ex,ey) =
  491.     let bx, by = ShiftRight(x+6+ex,3), ShiftRight(y+6+ey,3)
  492.     isWallAt (bx,by) |> not
  493.  
  494. let verticallyAligned (x,y) =  (x % 8) = 5
  495. let horizontallyAligned (x,y) = (y % 8) = 5
  496. let isAligned n = (n % 8) = 5
  497.  
  498. let canGoUp (x,y) = isAligned x && noWall (x,y) (0,-4)
  499. let canGoDown (x,y) = isAligned x && noWall (x,y) (0,5)
  500. let canGoLeft (x,y) = isAligned y && noWall (x,y) (-4,0)
  501. let canGoRight (x,y) = isAligned y && noWall (x,y) (5,0)
  502.  
  503. let wrap (x,y) (dx,dy) =
  504.     let x =
  505.         if dx = -1 && x = 0 then 30 * 8
  506.         elif dx = 1  && x = 30 *8 then 0
  507.         else x
  508.     x + dx, y + dy
  509.  
  510. type Ghost(image:ts.HTMLElement,x,y,v) =
  511.     let mutable x' = x
  512.    let mutable y' = y
  513.     let mutable v' = v
  514.    member val Image = image
  515.    member __.X = x'
  516.     member __.Y = y'
  517.    member __.V = v'
  518.     member ghost.Move(v) =
  519.         v' <- v        
  520.        let dx,dy = v
  521.        let x,y = wrap (x',y') (dx,dy)
  522.        x' <- x
  523.         y' <- y
  524.  
  525. let chooseDirection (ghost:Ghost) =
  526.    let x,y = ghost.X, ghost.Y
  527.    let dx,dy = ghost.V
  528.    let isBackwards (a,b) =
  529.        (a <> 0 && a = -dx) || (b <> 0 && b = -dy)
  530.    let directions =
  531.        [|canGoLeft(x,y),(-1,0)
  532.          canGoDown(x,y),(0,1)
  533.          canGoRight(x,y),(1,0)
  534.          canGoUp(x,y),(0,-1)|]
  535.        |> Array.filter fst
  536.        |> Array.map snd
  537.        |> Array.filter (not << isBackwards)        
  538.    let i = int (ts.Math.floor(ts.Math.random() * float directions.Length))
  539.    let dx,dy = directions.[i]
  540.    dx,dy
  541.  
  542. let createGhosts context =
  543.    [|
  544.         redd, (16, 11), (1,0)
  545.         cyand, (14, 15), (1,0)
  546.         pinkd, (16, 13), (0,-1)
  547.         oranged, (18, 15), (-1,0)
  548.    |]
  549.    |> Array.map (fun (data,(x,y),v) ->
  550.        let image = createImage data
  551.        Ghost(image, (x*8)-7, (y*8)-3, v)
  552.    )
  553.  
  554. type Keys() =
  555.    let leftCode, upCode, rightCode, downCode = 90(*z*), 81(*q*), 88(*x*), 65(*a*)
  556.    let mutable isLeft = false
  557.    let mutable isUp = false
  558.    let mutable isDown = false
  559.    let mutable isRight = false
  560.    member keys.Update (e:ts.KeyboardEventExtensions,pressed) =
  561.        let keyCode = int e.keyCode        
  562.        if keyCode = leftCode then isLeft <- pressed
  563.        if keyCode = rightCode then isRight <- pressed
  564.        if keyCode = upCode then isUp <- pressed
  565.        if keyCode = downCode then isDown <- pressed          
  566.    member keys.LeftPressed = isLeft
  567.    member keys.RightPressed = isRight
  568.    member keys.UpPressed = isUp
  569.    member keys.DownPressed = isDown
  570.  
  571. let bindKeys (keys:Keys) =
  572.    ts.addEventListener("keydown", unbox<ts.EventListener>(fun e ->
  573.        let e = (unbox<ts.KeyboardEventExtensions>(e))
  574.        keys.Update(e, true)
  575.        )
  576.    )
  577.    ts.addEventListener("keyup", unbox<ts.EventListener>(fun e ->
  578.            let e = (unbox<ts.KeyboardEventExtensions>(e))
  579.            keys.Update(e,false)
  580.        )
  581.    )  
  582.  
  583. let main() =  
  584.    let keys = Keys()
  585.    bindKeys keys
  586.  
  587.    let canvas = unbox<ts.HTMLCanvasElement>(ts.document.getElementById("canvas"))
  588.    canvas.width <- 256.
  589.    canvas.height <- 256.    
  590.    let context = canvas.getContext("2d")
  591.    context.fillStyle <- "rgb(0,0,0)"
  592.    context.fillRect (0., 0. , 256., 256.);
  593.  
  594.    let background = createBackground()
  595.    let ghosts = createGhosts(context)
  596.    let pu1, pu2 = createImage pu1, createImage pu2
  597.    let pd1, pd2 = createImage pd1, createImage pd2
  598.    let pl1, pl2 = createImage pl1, createImage pl2
  599.    let pr1, pr2 = createImage pr1, createImage pr2
  600.  
  601.    let score = ref 0
  602.    let x, y = ref (16 * 8 - 7), ref (23 * 8 - 3)
  603.    let v = ref (0,0)
  604.    let lastp = ref pr1
  605.  
  606.    let moveGhosts () =
  607.        ghosts |> Array.iter (fun ghost ->
  608.            let v = chooseDirection ghost
  609.            ghost.Move(v)
  610.        )
  611.  
  612.    let movePacman () =      
  613.        v :=
  614.            if keys.LeftPressed && canGoLeft(!x,!y) then (-1,0)
  615.            elif keys.RightPressed && canGoRight(!x,!y) then (1,0)
  616.            elif keys.UpPressed && canGoUp(!x,!y) then (0,-1)
  617.            elif keys.DownPressed && canGoDown(!x,!y) then (0,1)
  618.            else (0,0)        
  619.        let x',y' = wrap (!x,!y) !v
  620.        x := x'
  621.         y := y'
  622.        let tx = int (ts.Math.floor(float ((!x+6)/8)))      
  623.        let ty = int (ts.Math.floor(float ((!y+6)/8)))      
  624.        let c = pills.[ty].[tx]
  625.        if c = '.' then
  626.            pills.[ty].[tx] <- ' '
  627.            clearCell background (tx,ty)
  628.            score := !score + 10
  629.        if c = 'o' then
  630.            pills.[ty].[tx] <- ' '
  631.            clearCell background (tx,ty)
  632.            score := !score + 50
  633.  
  634.    let logic () =
  635.        moveGhosts()
  636.        movePacman()
  637.  
  638.    let getPacmanImage () =
  639.        let p1, p2 =
  640.            match !v with
  641.            | -1,  0 -> pl1, pl2
  642.            |  1,  0 -> pr1, pr2
  643.            |  0, -1 -> pu1, pu2
  644.            |  0,  1 -> pd1, pd2
  645.            |  _,  _ -> !lastp, !lastp
  646.        let x' = int (ts.Math.floor(float (!x/6)))
  647.         let y' = int (ts.Math.floor(float (!y/6)))
  648.        if (x' + y') % 2 = 0 then p1 else p2
  649.  
  650.    let renderPacman () =
  651.        let p = getPacmanImage()
  652.        lastp := p
  653.        context.drawImage(p, float !x, float !y)
  654.  
  655.    let renderGhosts () =
  656.        ghosts |> Array.iter (fun ghost ->
  657.            context.drawImage(ghost.Image, float ghost.X, float ghost.Y)
  658.        )
  659.  
  660.    let renderScore () =
  661.        context.fillStyle <- "white"
  662.        context.font <- "bold 8px";
  663.        context.fillText("Score " + (!score).ToString(), 0., 255.)
  664.  
  665.    let render () =
  666.        context.drawImage(background, 0., 0.)
  667.        renderScore ()
  668.        renderPacman()
  669.        renderGhosts ()
  670.  
  671.    let rec update () =
  672.        render ()
  673.        logic ()
  674.        ts.setTimeout(update, 1000. / 60.) |> ignore
  675.  
  676.    update()
  677.  
  678. do Runtime.Run(directory="Web", components=Interop.Components.all)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement