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