Here is the source code:
REBOL [
File: %snake-game.r
Date: 19-Aug-2009
Title: "Snake Game"
Author: Nick Antonaccio
Purpose: {
A little graphic game.
Taken from the tutorial at http://musiclessonz.com/rebol.html
}
]
snake: to-image layout/tight [button red 10x10]
food: to-image layout/tight [button green 10x10]
the-score: 0 direction: 0x10 newsection: false random/seed now
rand-pair: func [s] [
to-pair rejoin [(round/to random s 10) "x" (round/to random s 10)]
]
b: reduce [
'image food ((rand-pair 190) + 50x50)
'image snake ((rand-pair 190) + 50x50)
]
view center-face layout/tight gui: [
scrn: box white 300x300 effect [draw b] rate 15 feel [
engage: func [f a e] [
if a = 'key [
if e/key = 'up [direction: 0x-10]
if e/key = 'down [direction: 0x10]
if e/key = 'left [direction: -10x0]
if e/key = 'right [direction: 10x0]
]
if a = 'time [
if any [b/6/1 < 0 b/6/2 < 0 b/6/1 > 290 b/6/2 > 290] [alert "You hit the wall!" quit ]
if find (at b 7) b/6 [alert "You hit yourself!" quit]
if within? b/6 b/3 10x10 [
append b reduce ['image snake (last b)]
newsection: true
b/3: (rand-pair 290)
]
newb: copy/part head b 5 append newb (b/6 + direction)
for item 7 (length? head b) 1 [
either (type? (pick b item) = pair!) [
append newb pick b (item - 3)
] [append newb pick b item ]
]
if newsection = true [
clear (back tail newb)
append newb (last b)
newsection: false
]
b: copy newb
show scrn
the-score: the-score + 1
score/text: to-string the-score
]
]
]
origin across h2 "Score:"
score: h2 bold "000000"
do [focus scrn]
]