Settings

Theme

Snake in Elm with WebGL

github.com

82 points by tibastral2 9 years ago · 28 comments

Reader

pgt 9 years ago

I made Snake in 103 lines of ClojureScript for a talk from 2015: https://github.com/theronic/cljs-snake

It would be fun to implement WebGL as a renderer.

dyarosla 9 years ago

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 9 years ago

    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 9 years ago

      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.

  • KurtMueller 9 years ago

    Why not file a Github issue? :)

  • fareesh 9 years ago

    Yeah happened to me too, thought it was my mistake but now I blame the bug :D

Kiro 9 years ago

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

donatj 9 years ago

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 9 years ago

    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 9 years ago

      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 9 years ago

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

        • crimsonalucard 9 years ago

          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.

    • winstonewert 9 years ago

      Well, something like C-like, for maximum familiarity.

      What functionality is difficult to render in C-like syntax?

      • orblivion 9 years ago

        Currying

        • winstonewert 9 years ago

          I can get the same effect as currying with C syntax by deliberating invoking a special function:

              functools.partial(old_function, my_new_argument)
          
          Is this such a useful thing that you need the functional style syntax to make it even easier to do?
          • orblivion 9 years ago

            You can do it in Python as you have, but it becomes second nature with Haskell (I can't speak to Elm directly). You might not even realize you're doing it.

            Add 5 to each num in a list (using a pretend function called `add` in both languages to be fair):

              map(functools.partial(add, 5), nums)
            
              map (add 5) nums
            
            Add 5 to each in a list of list of numbers:

              map(functools.partial(map, functools.partial(add, 5)), nums)
            
              map (map (add 5)) nums
            • winstonewert 9 years ago

              I suppose it would make more sense to write these as lambdas in a c style syntax

                 nums.map(|sublist| sublist.map(|num| add(num, 5))
              
              Maybe I haven't done enough functional programming yet, but I still like the explicitness of the C-style over the functional style.
              • kasbah 9 years ago

                Sorry, but there is nothing more explicit about using lambdas as you have done, it's simply redundant (notice the repetition of sublist and num arguments).

          • nathancahill 9 years ago

            Yes

  • chenglou 9 years ago

    I work on Reason, which is something you might like: http://facebook.github.io/reason/

    Elm has been personally an inspiration too. Nice set of decisions and tradeoffs for what they're trying to achieve, though yeah, mainstream syntax might not be one of them, but that's fine.

    • xfer 9 years ago

      sorry, what are these decisions and tradeoffs? why not just use ocaml(for anyone who doesn't mind not C-like syntax)?

  • KurtMueller 9 years ago

    Imho, Elm's syntax is more akin to OCaml than to Haskell. Besides OCaml, it reminds me a lot of F#.

    • _0w8t 9 years ago

      Or any other strict language in ML family like SML. Still it tells something about language popularity when is Elm is only compared with Haskell.

lolc 9 years ago

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

Keyboard Shortcuts

j
Next item
k
Previous item
o / Enter
Open selected item
?
Show this help
Esc
Close modal / clear selection