Snake: Difference between revisions
Content deleted Content added
m →{{header|Rust}}: Changed screenshot ref |
No edit summary |
||
Line 13: | Line 13: | ||
The game ends when the snake attempts to eat himself. |
The game ends when the snake attempts to eat himself. |
||
<br><br> |
<br><br> |
||
=={{header|Amazing Hopper}}== |
|||
{{trans|C}} |
|||
<lang Amazing Hopper> |
|||
/* Snake */ |
|||
/* Implementing this task in Hopper-FLOW-MATIC++ */ |
|||
/* The snake must catch a bite before time runs out, which decreases by |
|||
10 points every 500 milliseconds. |
|||
The remaining time will be added to your total score. */ |
|||
#include <flow.h> |
|||
#include <flow-term.h> |
|||
#include <keys.h> |
|||
#enum 1,N,E,S,W |
|||
#enum 1,SPACE,FOOD,BORDER |
|||
DEF-MAIN(argv, argc) |
|||
BREAK-ON |
|||
STACK 16 |
|||
CLR-SCR |
|||
MSET(C, quit, nHead, dir, Size, SCORE, counter, T ) |
|||
SET( symbol, " $@" ) |
|||
SET( w, 50 ) //50 |
|||
SET( h, 28 ) // 24 |
|||
SET( TIME, 100 ) |
|||
LET( Size := MUL(w,h) ) |
|||
SET( TLimit := 0.05 ) |
|||
VOID( big number, numL1, numL2, numL3 ) |
|||
GOSUB( set score ) |
|||
DIM( Size ) AS-ONES( board ) |
|||
HIDE-CURSOR |
|||
GOSUB( put titles ) |
|||
GOSUB( start ) |
|||
GOSUB( show ) |
|||
GOSUB( ready ), SLEEP(3) |
|||
TIC( T ) |
|||
WHILE( NOT (quit) ) |
|||
GOSUB( show ) |
|||
WHEN( KEY-PRESSED? ){ |
|||
SCAN-CODE( C ) |
|||
SWITCH( C ) |
|||
CASE( K_UP ) { dir = N, EXIT } |
|||
CASE( K_RIGHT ){ dir = E, EXIT } |
|||
CASE( K_DOWN ) { dir = S, EXIT } |
|||
CASE( K_LEFT ) { dir = W, EXIT } |
|||
CASE( K_ESC ) { quit = 1, EXIT } |
|||
CASE( 32 ) { PAUSE, EXIT } |
|||
SWEND |
|||
} |
|||
GOSUB( step ) |
|||
SLEEP( TLimit ) // beware, this approach |
|||
// is not suitable for anything but toy projects like this |
|||
DEVIATE-IF( 500 ~= T ) { |
|||
TIME-=10, CLAMP(0,100,TIME) |
|||
{TIME, 12, 52} GOSUB( put time ) |
|||
} |
|||
WEND |
|||
GOSUB(you lost), SLEEP(1) |
|||
GOSUB(game over ), SLEEP(2) |
|||
LOCATE(ADD(h,1),1) PRNL |
|||
SHOW-CURSOR |
|||
PRNL |
|||
END |
|||
RUTINES |
|||
// initialize the board, plant a very first food item |
|||
DEF-FUN( start ) |
|||
SET( i,1 ) |
|||
[1:w] {BORDER} CPUT(board) // top |
|||
[ SUB(MUL(h,w),MINUS-ONE(w)) : end] {BORDER} CPUT(board) // bottom |
|||
[1:w:end] {BORDER} CPUT(board) // left |
|||
SET(i, 1) |
|||
FOR( LE?(i, h), ++i ) |
|||
[ MUL(i, w )] {BORDER} PUT(board) // right |
|||
NEXT |
|||
LET( nHead := MUL( w, SUB( SUB( h, 1 ), MOD(h,2) )) DIV-INTO(2) ) |
|||
[ nHead ] {-5} CPUT( board ) |
|||
LET( dir := N ) |
|||
SRAND( ~SECONDS) |
|||
GOSUB( plant ) |
|||
RET |
|||
DEF-FUN( you lost ) |
|||
SET(i,1), SET(k,0), SET(n,1) |
|||
LOCATE(1,1) |
|||
FOR( LE?(i, h), ++i) |
|||
SET(j,1) |
|||
FOR( LE?(j, w), ++j) |
|||
LET( k := [ n ] GET(board) ) |
|||
COND( IS-NEG?( k )) |
|||
LOCATE(i,j) |
|||
PRNL("\033[38;15;3m\033[48;5;9m~\OFF") |
|||
CEND |
|||
++n |
|||
NEXT |
|||
NEXT |
|||
RET |
|||
DEF-FUN( show ) |
|||
SET(i,1) |
|||
MSET(j, k) |
|||
SET(n,1) |
|||
LOCATE(1,1) |
|||
FOR( LE?(i, h), ++i) |
|||
SET(j,1), |
|||
FOR( LE?(j, w), ++j) |
|||
LET( k := [ n ] GET(board) ) |
|||
COND( IS-NEG?( k )) |
|||
PRN("\033[38;5;3m\033[48;5;15m~\OFF") |
|||
ELS-COND( {k} IS-EQ?(BORDER)) |
|||
{"\033[38;5;4m\033[48;5;2m"} |
|||
PRN( [k] GET(symbol),"\OFF") |
|||
ELS-COND( {k}IS-EQ?(FOOD) ) |
|||
{"\033[38;5;15m\033[48;5;9m"} |
|||
PRN( [k] GET(symbol),"\OFF") |
|||
ELS |
|||
{"\033[48;5;28m"} |
|||
PRN( [k] GET(symbol),"\OFF") |
|||
CEND |
|||
++n |
|||
NEXT |
|||
PRNL |
|||
NEXT |
|||
RET |
|||
// negative values denote the snake (a negated time-to-live in given cell) |
|||
// reduce a time-to-live, effectively erasing the tail |
|||
DEF-FUN( age ) |
|||
MSET( r, jAge, jR ) |
|||
CART( IS-NEG?( board ) ) »» (r), SET-RANGE(r) |
|||
GET( board ) PLUS(1) »» (jAge) |
|||
// this is necessary, because Hopper arrays begining in 1 |
|||
CART( IS-ZERO?(jAge) ) »» (jR) |
|||
COND( IS-ARRAY?(jR) ) |
|||
SET-RANGE(jR), SET(jAge, 1), SET-RANGE(r) |
|||
CEND |
|||
// ****** |
|||
{jAge} PUT(board), CLR-RANGE |
|||
RET |
|||
DEF-FUN( step ) |
|||
SET(len,0) |
|||
LET( len := [nHead] GET(board) ) |
|||
SWITCH(dir) |
|||
CASE (N){ nHead -= w, EXIT } |
|||
CASE (S){ nHead += w, EXIT } |
|||
CASE (W){ --nHead, EXIT } |
|||
CASE (E){ ++nHead, EXIT } |
|||
SWEND |
|||
SWITCH( [nHead]CGET(board)) |
|||
CASE (SPACE){ |
|||
--len, LET( len := IF( EQ?(len,0), 1, len) ) |
|||
[nHead] { len }, CPUT(board) // keep in mind len is negative |
|||
GOSUB( age ) |
|||
EXIT |
|||
} |
|||
CASE (FOOD){ |
|||
--len, LET( len := IF( EQ?(len,0), 1, len) ) |
|||
[nHead] { len }, CPUT(board) |
|||
GOSUB( plant ) |
|||
ADD(SCORE,TIME), MOVE-TO(SCORE) |
|||
{SCORE, 4, 52} GOSUB( put score ) |
|||
LET( TIME := 100 ) |
|||
++counter, COND( GT?( counter, 3 ) ) |
|||
LET( TLimit := SUB( TLimit,0.01 )) |
|||
LET( counter := 0 ) |
|||
CEND |
|||
TIC( T ),{TIME, 12, 52} GOSUB( put time ) |
|||
EXIT |
|||
} |
|||
LET( quit := 1 ) |
|||
SWEND |
|||
RET |
|||
// put a piece of food at random empty position |
|||
DEF-FUN( plant ) |
|||
SET(r, 0) |
|||
LOOP( search position ) |
|||
LET( r := MOD( CEIL(RAND(MINUS-ONE(Size))), Size ) ) |
|||
BACK-IF-NOT-EQ( [r] GET(board), SPACE, search position) |
|||
[r] {FOOD} CPUT( board ) |
|||
RET |
|||
DEF-FUN( put titles ) |
|||
LOCATE(2,52) PRNL("\033[38;5;15mSCORE\OFF") |
|||
{SCORE, 4, 52} GOSUB( put score ) |
|||
LOCATE(10,52) PRNL("\033[38;5;11mTIME\OFF") |
|||
{TIME, 12, 52} GOSUB( put time ) |
|||
RET |
|||
DEF-FUN( put time, B, posx, posy ) |
|||
MSET( i,j,x ) |
|||
MSET( sb, lsb,nB, p4 ) |
|||
SET( k,1 ) |
|||
LOCATE (posx, posy) FILL-BOX(" ",5,20) |
|||
LET( sb := STR(B) ) |
|||
LET( lsb := LEN(sb) ) |
|||
SET( rx, posy ) |
|||
LET( p4 := ADD( posx, 4 )) |
|||
{"\033[38;5;11m\ENF"} |
|||
PERF-UP(k, lsb, 1) |
|||
LET( nB := VAL( MID( 1, k, sb )) ) |
|||
SET(x, 1), SET( i, posx ) |
|||
FOR( LE?(i, p4), ++i ) |
|||
SET( j, rx ) |
|||
FOR( LE?(j, ADD( rx, 2 ) ), ++j ) |
|||
LOCATE(i, j) PRNL( STR-TO-UTF8(CHAR( [ PLUS-ONE(nB), x] CGET(big number) MUL-BY(219) ))) |
|||
++x |
|||
NEXT |
|||
NEXT |
|||
rx += 4 |
|||
NEXT |
|||
PRNL("\OFF") |
|||
RET |
|||
DEF-FUN( put score, SCORE, posx, posy ) |
|||
MSET( ln,s, sp ) |
|||
LET( sp := STR( SCORE )) |
|||
LET( ln := LEN(sp)) |
|||
LOCATE ( posx, posy ) FILL-BOX(" ",4,20) |
|||
SET(i, 1) |
|||
{"\033[38;5;15m"} |
|||
PERF-UP( i, ln, 1) |
|||
LET( s := VAL( MID( 1, i, sp )) ) |
|||
LOCATE( posx, posy ) |
|||
PRNL (STR-TO-UTF8([ PLUS-ONE(s) ] CGET(numL1) )) |
|||
LOCATE( PLUS-ONE(posx),posy ) |
|||
PRNL ( STR-TO-UTF8([PLUS-ONE(s)] CGET(numL2) )) |
|||
LOCATE( PLUS-TWO(posx),posy ) |
|||
PRNL ( STR-TO-UTF8([PLUS-ONE(s)] CGET(numL3) )) |
|||
posy += 2 |
|||
NEXT |
|||
PRNL("\OFF") |
|||
RET |
|||
DEF-FUN( set score ) |
|||
{"┌┐"," ┐","┌┐","┌┐","┐┐","┌┐","┌┐","┌┐","┌┐","┌┐"} APND-LST(numL1) |
|||
{"││"," │","┌┘"," ┤","└┤","└┐","├┐"," │","├┤","└┤"} APND-LST(numL2) |
|||
{"└┘"," ┴","└┘","└┘"," ┘","└┘","└┘"," ┴","└┘","└┘"} APND-LST(numL3) |
|||
{1,1,1,1,0,1,1,0,1,1,0,1,1,1,1} APND-ROW( big number ) |
|||
{1,1,0,0,1,0,0,1,0,0,1,0,1,1,1} APND-ROW( big number ) |
|||
{1,1,1,0,0,1,1,1,1,1,0,0,1,1,1} APND-ROW( big number ) |
|||
{1,1,1,0,0,1,0,1,1,0,0,1,1,1,1} APND-ROW( big number ) |
|||
{1,0,1,1,0,1,1,1,1,0,0,1,0,0,1} APND-ROW( big number ) |
|||
{1,1,1,1,0,0,1,1,1,0,0,1,1,1,1} APND-ROW( big number ) |
|||
{1,0,0,1,0,0,1,1,1,1,0,1,1,1,1} APND-ROW( big number ) |
|||
{1,1,1,0,0,1,0,0,1,0,0,1,0,0,1} APND-ROW( big number ) |
|||
{1,1,1,1,0,1,1,1,1,1,0,1,1,1,1} APND-ROW( big number ) |
|||
{1,1,1,1,0,1,1,1,1,0,0,1,0,0,1} APND-ROW( big number ) |
|||
RET |
|||
DEF-FUN( ready ) |
|||
{"\033[38;5;4m\033[48;5;11m"} |
|||
LOC-COL(16) |
|||
LOC-ROW(13); PRNL( STR-TO-UTF8(" ▄ ▄▄ ▄ ▄▄ ▄ ▄ ")) |
|||
LOC-ROW(14); PRNL( STR-TO-UTF8(" █▄▀ █▀ █▄█ █ █ ▀▄▀ ")) |
|||
LOC-ROW(15); PRNL( STR-TO-UTF8(" ▀ ▀ ▀▀ ▀ ▀ ▀▄▀ ▀ ")) |
|||
PRNL("\OFF") |
|||
RET |
|||
DEF-FUN( game over ) |
|||
{"\033[38;5;15m\033[48;5;9m"} |
|||
LOC-COL(17) |
|||
LOC-ROW(12); PRNL( STR-TO-UTF8(" ▄▄ ▄ ▄ ▄ ▄▄ ")) |
|||
LOC-ROW(13); PRNL( STR-TO-UTF8(" █ ▄ █▄█ █ █ █ █▀ ")) |
|||
LOC-ROW(14); PRNL( STR-TO-UTF8(" ▀▀ ▀ ▀ ▀ ▀ ▀ ▀▀ ")) |
|||
LOC-ROW(15); PRNL( STR-TO-UTF8(" ▄ ▄ ▄ ▄▄ ▄ ")) |
|||
LOC-ROW(16); PRNL( STR-TO-UTF8(" █ █ █ █ █▀ █▄▀ ")) |
|||
LOC-ROW(17); PRNL( STR-TO-UTF8(" ▀ ▀ ▀▀ ▀ ▀ ")) |
|||
PRNL("\OFF") |
|||
RET |
|||
</lang> |
|||
{{out}} |
|||
Init game: |
|||
<pre> |
|||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
|||
@ @ SCORE |
|||
@ @ |
|||
@ @ ┌┐ |
|||
@ @ ││ |
|||
@ @ └┘ |
|||
@ @ |
|||
@ @ |
|||
@ @ |
|||
@ @ TIME |
|||
@ @ |
|||
@ @ ██ ███ ███ |
|||
@ ▄ ▄▄ ▄ ▄▄ ▄ ▄ @ █ █ █ █ █ |
|||
@ █▄▀ █▀ █▄█ █ █ ▀▄▀ @ █ █ █ █ █ |
|||
@ ▀ ▀ ▀▀ ▀ ▀ ▀▄▀ ▀ @ █ █ █ █ █ |
|||
@ @ ███ ███ ███ |
|||
@ @ |
|||
@ $ @ |
|||
@ @ |
|||
@ @ |
|||
@ @ |
|||
@ @ |
|||
@ @ |
|||
@ @ |
|||
@ @ |
|||
@ @ |
|||
@ @ |
|||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
|||
</pre> |
|||
Play game: |
|||
<pre> |
|||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
|||
@ @ SCORE |
|||
@ @ |
|||
@ @ ┌┐┌┐┌┐ |
|||
@ @ ├┐┌┘││ |
|||
@ @ └┘└┘└┘ |
|||
@ @ |
|||
@ @ |
|||
@ @ |
|||
@ @ TIME |
|||
@ @ |
|||
@ @ ███ ███ |
|||
@ @ █ █ █ █ |
|||
@ @ ███ █ █ |
|||
@ @ █ █ █ |
|||
@ @ █ ███ |
|||
@ @ |
|||
@ @ |
|||
@ @ |
|||
@ ~~~~~~ @ |
|||
@ ~ @ |
|||
@ ~ @ |
|||
@ ~~~~~~ $ @ |
|||
@ @ |
|||
@ @ |
|||
@ @ |
|||
@ @ |
|||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
|||
</pre> |
|||
Game over: |
|||
<pre> |
|||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
|||
@ @ SCORE |
|||
@ @ |
|||
@ @ ┐┌┐┌┐┌┐ |
|||
@ @ │└┐└┐││ |
|||
@ @ ┴└┘└┘└┘ |
|||
@ @ |
|||
@ @ |
|||
@ @ |
|||
@ @ TIME |
|||
@ @ |
|||
@ ▄▄ ▄ ▄ ▄ ▄▄ @ ███ ███ |
|||
@ █ ▄ █▄█ █ █ █ █▀ @ █ █ █ █ |
|||
@ ▀▀ ▀ ▀ ▀ ▀ ▀ ▀▀ @ ███ █ █ |
|||
@ ▄ ▄ ▄ ▄▄ ▄ @ █ █ █ |
|||
@ █ █ █ █ █▀ █▄▀ @ █ ███ |
|||
@ ~ ▀ ▀ ▀▀ ▀ ▀ @ |
|||
@ ~ @ |
|||
@ ~ @ |
|||
@ ~ @ |
|||
@ ~ @ |
|||
@ ~~~~~~~~~~~~~ @ |
|||
@ ~ @ |
|||
@ ~ @ |
|||
@ ~ @ |
|||
@ ~ @ |
|||
@ ~ $ @ |
|||
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
|||
</pre> |
|||
=={{header|AutoHotkey}}== |
=={{header|AutoHotkey}}== |