
Snake in Elm with WebGL - tibastral2
https://github.com/tibastral/elm-snake
======
pgt
I made Snake in 103 lines of ClojureScript for a talk from 2015:
[https://github.com/theronic/cljs-snake](https://github.com/theronic/cljs-
snake)

It would be fun to implement WebGL as a renderer.

~~~
DrPhish
I'm going to make this the "Other awesome snake implementations" sub-
conversation

Here is a snake in 4k (sn4ke) mapped onto a sphere instead of a 2d
playsurface, which is one of my favourites.
[http://www.pouet.net/prod.php?which=61035](http://www.pouet.net/prod.php?which=61035)
Here is an awesome music-driven one that modifies the songs based on level and
"danger"
[http://www.pouet.net/prod.php?which=57518](http://www.pouet.net/prod.php?which=57518)

But the best snake ever was the one from FastTracker 2 by Triton!
[http://www.pouet.net/prod.php?which=13350](http://www.pouet.net/prod.php?which=13350)

------
dyarosla
Bug: Create snake of length two. Move RIGHT. Quickly press UP LEFT in quick
succession. Lose.

Similar bug with RIGHT->DOWN->LEFT

And so on for all the other initial directions.

~~~
fb03
Not the author, but I've implemented my own snake game and this bug is fairly
easy to kill.

(1) - You can only change directions that will change your axis, if you're
going left your possible changes are up and down, ....

(2) - You should be only able to consume _one_ direction change per game tick,
what is happening here is that rule (1) is working but you can change into the
other axis, and then back to the other axis again _before_ the game loop
computes another frame. Direction change can be read asynchronously but the
actual change should be tied by each tick.

~~~
baddox
Maybe it makes it too easy, but I would enjoy the mechanic that quickly
pressing UP LEFT when moving right would make the snake head move one square
up then turn left and continue left. I suppose that would require some special
casing, and you wouldn't want to support longer queued direction changes.
Maybe a nice implementation would be that for inputs queued within a single
game tick, execute the first input for one square of movement, then the last
input for the next tick.

------
Kiro
How is the actual game loop executed? I don't know Elm but I only find update,
not how it's run.

~~~
kornish
The function `Html.program`, in `main`, takes an update function which handles
(among other things) ticking the game loop.

[http://package.elm-lang.org/packages/elm-
lang/html/latest/Ht...](http://package.elm-lang.org/packages/elm-
lang/html/latest/Html#program)

------
donatj
I attended a two day Elm workshop a while back. There is a lot there to love,
I just think it's Haskell inspired syntax is a major impediment to it's
mainstream adoption. I however would love to be proven wrong as the webs
reliability would be so remarkably improved.

~~~
mikekchar
Here's a challenge for you: what syntax would be better? I don't mean that in
a derogatory way. I think you are right that the syntax (being very foreign to
people) does provide an impediment, but puzzling out how to implement the same
functionality with a more familiar syntax would be extremely difficult (though
potentially very fun).

~~~
crimsonalucard
Redux follows the same pattern with your more "familiar" syntax.

Typed functional programming offers wins that forces more safety and
modularity onto the code. These are all long term wins. Ultimately I would
argue that elm's syntax is better suited for extremely complex projects that
have low tolerance for bugs.

~~~
lilactown
Redux is a javascript library. It shares some idioms with correct Elm code,
but is a very different beast.

~~~
crimsonalucard
Right but the underlying design pattern is the same. This is all I'm saying.
Redux can almost be thought of as an Elm pattern implementation with
"familiar" imperative syntax.

------
lolc
Cool demo. And I learn there was an Elm conference close to where I live and I
missed it.

