main.nim 3.3 KB

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