Snake: Difference between revisions

Content deleted Content added
Vvshard (talk | contribs)
m →‎{{header|Rust}}: Changed screenshot ref
Mr Dalien (talk | contribs)
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}}==