main.nim 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import nodesnim
  2. import random
  3. randomize()
  4. Window("Snake game")
  5. type
  6. Snake = ref object
  7. dir: Vector2Obj
  8. size: Vector2Obj
  9. food: Vector2Obj
  10. body: seq[Vector2Obj]
  11. build:
  12. - Scene main:
  13. call rename("Main")
  14. - Canvas canvas
  15. - Scene game_over:
  16. call rename("GameOverScene")
  17. - Label label_go:
  18. text: stext"Game Over"
  19. call setTextAlign(0.5, 0.5, 0.5, 0.5)
  20. call setSizeAnchor(1, 1)
  21. var
  22. snake = Snake(
  23. dir: Vector2(),
  24. body: @[Vector2(0, 0)],
  25. size: Vector2(40, 40),
  26. food: Vector2(160, 160))
  27. time = 0
  28. addKeyAction("forward", "w")
  29. addKeyAction("backward", "s")
  30. addKeyAction("left", "a")
  31. addKeyAction("right", "d")
  32. canvas@on_process(self):
  33. if isActionJustPressed("forward"):
  34. snake.dir = Vector2(0, -40)
  35. elif isActionJustPressed("backward"):
  36. snake.dir = Vector2(0, 40)
  37. elif isActionJustPressed("left"):
  38. snake.dir = Vector2(-40, 0)
  39. elif isActionJustPressed("right"):
  40. snake.dir = Vector2(40, 0)
  41. if time < 10:
  42. inc time
  43. return
  44. canvas.resize(main.rect_size.x, main.rect_size.y)
  45. let
  46. grid_size = Vector2(
  47. (main.rect_size.x.int div snake.size.x.int).float,
  48. (main.rect_size.y.int div snake.size.y.int).float
  49. )
  50. canvas.fill(Color(0, 0, 0, 0))
  51. if snake.dir.y < 0:
  52. for i in countdown(snake.body.len()-1, 0):
  53. if i > 0:
  54. snake.body[i] = Vector2(snake.body[i-1].x, snake.body[i-1].y)
  55. else:
  56. if snake.body[i].y > 0:
  57. snake.body[i].y += snake.dir.y
  58. else:
  59. snake.body[i].y = grid_size.y*snake.size.y - snake.size.y
  60. elif snake.dir.y > 0:
  61. for i in countdown(snake.body.len()-1, 0):
  62. if i > 0:
  63. snake.body[i] = Vector2(snake.body[i-1].x, snake.body[i-1].y)
  64. else:
  65. if snake.body[i].y < grid_size.y*snake.size.y - snake.size.y:
  66. snake.body[i].y += snake.dir.y
  67. else:
  68. snake.body[i].y = 0
  69. elif snake.dir.x < 0:
  70. for i in countdown(snake.body.len()-1, 0):
  71. if i > 0:
  72. snake.body[i] = Vector2(snake.body[i-1].x, snake.body[i-1].y)
  73. else:
  74. if snake.body[i].x > 0:
  75. snake.body[i].x += snake.dir.x
  76. else:
  77. snake.body[i].x = grid_size.x*snake.size.x - snake.size.x
  78. elif snake.dir.x > 0:
  79. for i in countdown(snake.body.len()-1, 0):
  80. if i > 0:
  81. snake.body[i] = Vector2(snake.body[i-1].x, snake.body[i-1].y)
  82. else:
  83. if snake.body[i].x < grid_size.x*snake.size.x - snake.size.x:
  84. snake.body[i].x += snake.dir.x
  85. else:
  86. snake.body[i].x = 0
  87. if snake.body[0] == snake.food:
  88. snake.body.add(snake.body[^1])
  89. snake.food.x = (rand(grid_size.x.int-1) * snake.size.x.int).float
  90. snake.food.y = (rand(grid_size.y.int-1) * snake.size.y.int).float
  91. elif snake.body[0] in snake.body[1..^1]:
  92. changeScene("GameOverScene")
  93. # draw
  94. for i in snake.body:
  95. canvas.fillRect(i.x, i.y, snake.size.x, snake.size.y, Color(1f, 1f, 1f))
  96. # head
  97. canvas.fillRect(
  98. snake.body[0].x, snake.body[0].y,
  99. snake.size.x, snake.size.y,
  100. Color(0xaaccffff'u32))
  101. # food
  102. canvas.fillRect(
  103. snake.food.x, snake.food.y,
  104. snake.size.x, snake.size.y,
  105. Color(0xffccaaff'u32))
  106. time = 0
  107. addScene(game_over)
  108. addMainScene(main)
  109. windowLaunch()