Log In  

(v00 07-15-22)

Cart #secret_snake2-0 | 2022-07-15 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA
3

TO LOAD THIS PICO-8 CART, in immediate mode, type: load #secret_snake2


A couple of years back I wrote a post called, "The Secret Of The Snake" and it was me investigating the complex code involved in making a "Snake" type game. In the link below, the only way I knew was to update the entire screen, in the case I wrote was 16x16 and keep track of the snake segments this way.

https://www.lexaloffle.com/bbs/?tid=35685

Thanks to @SquidLight and the marvelous "array rotation" code I am now able to create a true "snake" type program where only two pixels are drawn at a time.

One for the head of the snake and one for the back, and no need to redraw the screen or each snake segment each time; only those two points, the first and last.


In the demo above, use the arrow keys to navigate.

Press and hold 🅾️ to increase the length of the snake.

Press and hold ❎ to decrease the length of the snake, but not smaller than 8-pixels.

Release the 🅾️ or ❎ keys to continue the snake's movement.


Be aware no checks for collision are being made at this time. The code is to demonstrate how to make a SNAKE type game plotting only 2-points.

See source-code for documentation and information.


P#114335 2022-07-15 05:34 ( Edited 2022-10-13 18:07)

Wow I'm chuffed that you found a use for something that I had written. Credit isn't needed for that but its nice to see.

Redrawing the entire screen though isn't really a problem in pico-8. I had to use a different redraw method in vb4 but never thought rotating an array at the time.

Thank you.

P#114353 2022-07-15 13:02

Hi @SquidLight:

You are more than welcome. I have a question though, how would you REVERSE the rotation, that is instead of it traveling LEFT it would travel right:

This is what your code does currently:

<< TRAVEL TO LEFT <<
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3

How do I get it to do this ?

>> TRAVEL TO RIGHT >>
1 2 3 4
4 1 2 3
3 4 1 2
2 3 4 1

?

P#114371 2022-07-15 17:22 ( Edited 2022-07-15 17:55)

Wait ... I think I may have solved it, @SquidLight:

cls()
a={1,2,3,4}
add(a,deli(a,#a),1)
for i=1,4 do
  ?a[i]
end

4 1 2 3 scroll numbers to the RIGHT.

P#114376 2022-07-15 20:13

@dw817
The second parameter in deli() is unnecessary. By default, the last element is deleted and returned.

Amusingly, this means the difference between left and right scrolling is just where that one parenthesis is.

P#114377 2022-07-15 20:28
1

Thank you, @kimiyoribaka !

This DELI() stuff is very new to me and I'm not entirely understanding the definition of it - even in looking it up in HELP.

OK here are the two important codes:

add(a,deli(a,1)) -- scroll and wrap array LEFT
add(a,deli(a),1) -- scroll and wrap array RIGHT
P#114378 2022-07-15 20:33

I'm not sure if this helps, but I suspect under the hood the add and deli functions are doing this:

-- raw lua equivalent to add
function add(t, v, i)
  i = i or #t
  for n=#t,i,-1 do t[n+1] = t[n] end
  t[i] = v
end

-- raw lua equivalent to deli
function deli(t, i)
  i=i or #t
  local r = t[i]
  for n=i,#t do t[n] = t[n + 1] end
  return r
end
P#114382 2022-07-15 23:13

They might well be, @kimiyoribaka.

Here now are two functions to cover what I needed if I wasn't using the single line DELI() function.

-- simple shift array by dw817

function main()

typ="right"

array={0,1,2,3}

if typ=="left" then
  array=shiftleft(array)
elseif typ=="right" then
  array=shiftright(array)
end

cls()
for i=0,3 do
  print("["..i.."]="..array[i])
end

end

function shiftleft(a)
local b={}
  for i=0,#a-1 do
    b[i]=a[(i+1)%#a+1]
  end
  return b
end

function shiftright(a)
local b={}
  for i=0,#a-1 do
    b[i]=a[(i-1)%#a+1]
  end
  return b
end

main()
P#114386 2022-07-16 00:15

You've got it sorted?

P#114389 2022-07-16 00:23

Yep, I do, @SquidLight, thanks ! I wanted to know how to scroll the array in the opposite direction you had yours going, the answer to that was:

add(a,deli(a),1)
P#114390 2022-07-16 00:34

for the record if you are looking for the real computationally minimal way to do this. This type of rotation is not cheap (on real hardware).

Basically it involves copying a whole array each rotation. There are much less computational expensive ways. Something like a ring buffer.

I think its good for pico-8 because its not using the real computational cost.

P#114503 2022-07-18 11:58

[Please log in to post a comment]