Advertisement
ptrelford

Snake with FunSharp

Nov 23rd, 2015
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 2.87 KB | None | 0 0
  1. #r "../src/bin/Debug/FunSharp.Library.dll"
  2.  
  3. open Library
  4.  
  5. let size = 8.0
  6. let w,h = 80.,60.
  7. GraphicsWindow.Width <- int (size * w)
  8. GraphicsWindow.Height <- int (size * h)
  9. let directions = [(1.,0.);(0.,1.);(-1.,0.);(0.,-1.)]
  10. let opposite dir = (dir + 2) % 4
  11.  
  12. let position shape =
  13.     (Shapes.GetLeft(shape), Shapes.GetTop(shape))
  14.  
  15. let create_snake dir =
  16.     let x,y = 30.,30.
  17.     let (dx,dy) = directions.[opposite dir]
  18.     let snake = ResizeArray()
  19.     for i = 0 to 3 do  
  20.         let segment = Shapes.AddRectangle(size,size)
  21.         Shapes.Move(segment, size*(x+dx*float i), size*(y+dy*float i))
  22.         snake.Add(segment)  
  23.     snake
  24.  
  25. let move (snake:ResizeArray<_>) (dx,dy) =
  26.     let length = Seq.length snake
  27.     let last = snake.[length-1]
  28.     let first = snake.[0]
  29.     let x = Shapes.GetLeft(first)
  30.     let y = Shapes.GetTop(first)
  31.     for i = length - 1 downto 1 do
  32.         snake.[i] <- snake.[i-1]
  33.     Shapes.Move(last, x+size*dx, y+size*dy)
  34.     snake.[0] <- last
  35.  
  36. let self_harm (snake:ResizeArray<_>) =
  37.     let (x,y) = position(snake.[0])
  38.     let mutable collided = false
  39.     for i = 1 to snake.Count - 1 do
  40.         let (x',y') = position(snake.[i])
  41.         if x = x' && y = y' then
  42.             collided <- true
  43.     collided
  44.  
  45. let hit_wall (snake:ResizeArray<_>) =
  46.     let (x,y) = position(snake.[0])
  47.     x <= 0.0 || y <= 0.0 || x >= w*size || y >= h*size
  48.  
  49. let mutable dir = 0
  50. GraphicsWindow.KeyDown <- fun () ->
  51.     let key = GraphicsWindow.LastKey
  52.     if key = "Right" then dir <- 0
  53.     elif key = "Down" then dir <- 1
  54.     elif key = "Left" then dir <- 2
  55.     elif key = "Up" then dir <- 3
  56.  
  57. GraphicsWindow.FontSize <- 32.0
  58. while true do
  59.     let prompt = Shapes.AddText("Click to Start")
  60.     Shapes.Move(prompt, 100, 200)
  61.     while not Mouse.IsLeftButtonDown do ()
  62.     Shapes.Remove(prompt)
  63.     let snake = create_snake dir    
  64.     let mutable spawn_count = 10
  65.     let apple = Shapes.AddEllipse(size,size)
  66.     Shapes.Move(apple, -size,-size)
  67.     while not (self_harm snake || hit_wall snake) do
  68.         Program.Delay(300)
  69.         move snake (directions.[dir])        
  70.         if spawn_count > 0 then
  71.             spawn_count <- spawn_count - 1
  72.             if spawn_count = 0 then
  73.                 Shapes.Move(apple, float(Math.GetRandomNumber(int(w-1.))) * size, float(Math.GetRandomNumber(int(h-1.)))*size)
  74.         else
  75.             let (x,y) = position snake.[0]
  76.             let (x',y') = position apple
  77.             if x = x' && y = y' then
  78.                 let segment = Shapes.AddRectangle(size,size)
  79.                 let dx,dy = directions.[dir]
  80.                 Shapes.Move(segment,x+size*dx,y+size*dy)
  81.                 snake.Insert(0,segment)
  82.                 Shapes.Move(apple, -size, -size)
  83.                 spawn_count <- 10
  84.     let go = Shapes.AddText("Game Over")
  85.     Shapes.Move(go, 100, 200)
  86.     Program.Delay(5000)
  87.     Shapes.Remove(go)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement