I have a table:
a={0,0,1,2,0,6,9,2,0,5,3,0,7,0,0}
I want to sort it so the 0's are moved to the front
This works:
a={0,0,1,2,0,3,4,0,0,5,6,7,8,0,9,10}
b={}
c={}
for v in all(a) do
if v==0 then
add(b,v)
else
add(c,v)
end
end
for v in all(c) do
add(b,v)
end
a=b |
but is clunky and since this will be in a recursive function, efficiency is essential.
what is a more elegant/quicker way to do this?
Alice Chess
50 Alice Chess Mate-in-2 puzzles
About Alice Chess Mate-in-2
Alice chess is a chess variant played on 2 boards. What is cool is that there is no fairy-stockfish engine for it. Therefore, these puzzles are custom built using an experimental engine made by ubdip over at pychess.org. These are very fun once you understand how to play.
How to play Alice Chess
from chessvariants.com :
*The standard game of Alice Chess is played using two boards, A and B. All pieces move as in standard chess. The normal array is on board A; board B starts empty.
The rules are very simple. In turn, each player makes a single move on either board following these three rules:
Moving game pieces using atan2().
I check to see if the position (px,py)
has reached the target (tx,ty) by
absolute values of positions minus targets.
If they havent reached the destination I increment
by the dx I got from the atan2() calculation.
This works as it is. But I cannot actually control the speed.
If I want it to go faster, say speed 8, there are certain
situations where condition if abs(px-tx)<3 and abs(py-ty)<3 will never
be met and piece will just go forever. And I cant fine tune the <3 either
because sometimes the math just wont allow it.
How do I write code or think about this to move my sprite so I can actually control
the speed and/or accuracy?
Must be able to move any direction at any angle.
Thank you.
speed=5 px,py=getxy(location) tx,ty=getxy(destination) local angle=atan2(ty-py,tx-px) dx=sin(angle)*speed dy=cos(angle)*speed --PROBLEM HERE function _update_move() if abs(px-tx)<3 and abs(py-ty)<3 then --AND PROBLEM HERE --ARRIVED AT LOCATION else px+=dx py+=dy end end |
Piconissimo v1.5
Sound editor
Version 1.5 Additions
-
copy/paste
(Z=copy,X=paste) - horizontal pattern scroll
(click right/left icons on either side of note display.)
Getting started
- click garbage icon at top right for fresh start. This will permanently erase everything...Including theme music :(
- all numbers can be right/left clicked
- rightclick a piano key to test, leftclick to insert note into selected sfx
- red 'stop sign' stops anything playing
- unmute dark blue sfx in patterns by clicking on dot
- click blue floppy icon to save. save often.
- see manual for detailed info
100 Headaches
100 extremely difficult mate in 2 chess puzzles.
Based on the book 100 Headachingly Hard Mate In Two Chess Puzzles by Sam Loyd by Martin B. Justesen.
Gameplay
It is white to move on every puzzle. But the player ALSO makes black's move rather than a computer-automated response. That way, you can try out different moves for black to prove to yourself that it is, indeed, mate in 2.
Scoring
Plus 5 for every correct move. Minus 1 for every wrong move. Only on unsolved puzzles. Once a puzzle is completed, you can replay it as many times as you like and not lose/gain points.
Navigation
All progress is automatically saved. There is a handy 'map' of all 100 puzzles and you are free to jump to any number you like.

Freestyle Chess == Chess960 == Fischer Random
NICE: Nice Is Camp39's Engine
The Good
- pass n play and board flip option
- clean interface & themes
- play against computer
- opening book for standard chess
- endless openings with Freestyle Chess (press up while on chess960 to view positions)
- all rules, including 50 move and 3-fold repetition
The Bad
- my first engine ever... its a little slow
- my first engine ever... its a little dumb
- maybe 2.0 will be better!
About NICE
[hidden]
This was a real accomplishment for me and is my first engine. The move generation follows the tutorial of Bluefever Software video series on Youtube: Programming a Chess Engine in Pure Javascript.
When it came to the search functions I learned a ton by following the book: Chess Algorithms by Noah Caplinger.
The limitations of Pico-8 though make for a challenging adaptation of these types of tutorials. (translating from zero-based arrays can give some crazy nasty bugs). The speed limitations make some variation strategies useless e.g. "killer moves" only make sense with a depth of at least 4. It was a really cool experience and gave me more insight into the game.
I liked the board layout from cart #quickchessyness-4 by @Adam_Howell so much that I copied it :)
This cart will need some updates however. I was unable to get quiesence to work without a move taking FOREVER. Maybe due to my move ordering, maybe due to the evaluation function, maybe due to lots of things. Its all very complicated and hurts my brain since it is recursive at iterative depths. Hard to pinpoint problems like that. If any kind soul wants to offer tips, I'm all ears!
@Krystman of course released the fabulous Pico Checkmate, cart #54038 6 years ago. I definitely looked through his code for clues but couldn't manage to find a way to cut off a search if time got too long. But I did follow his lead and purge illegal moves right off the bat instead of making and taking them. Without a full quiesence search though, I don't think NICE will stand a chance against Pico Checkmate.
This cart, while not having the best engine still has some nice features. Chess960 is chess but with almost random starting positions. Its just like standard chess with the exception that castling can be a little weird. Just remember that king and rook end up in the same ending positions as in regular chess, regardless of where they started. Otherwise, same rules apply. This eliminates the same opening every time you play against the computer. Also, to prevent that from happening in standard chess, I coded in a small opening book with response options being chosen randomly so that you can get different responses even if you play the same.
I hope this cart is popular with hand-held users (I don't personally own one). The pass n play is not something I've seen on other chess carts and I imagine a game of chess on a long flight or bus ride would be cool, but playing upside down is a bit awkward.
Crazy idea: what if there was a cart with the move generation and graphics already on it (and optimized to the max) and then two different users could put in a tiny engine each and let them battle. Maybe more realistic on picotron?

how do i test for big numbers that print different than their true value?
function _init() srand(39) a=rnd(-1) --prints -20954.2428 b=-20954.2428 end function draw() if b==a then ?"true" else ?"false" end --prints false end |
I have some big numbers that would be nice to know their true value.
thanks and merry Christmas!

When the AI plays itself in my game, it is too much for the _update() so PICO-8 drops _draw() frames. The moves are correct, but its awkward because both pieces move at once.
How do I remedy this? Is it a coroutine I need? I've been playing with them and have gotten some crazy results, not really knowing what I am trying to accomplish. But is that even the right approach?
Or can I make some kind of delay between moves to give the cpu time to catch up? I tested by making it only run the engine after a button press and it works fine.
I also tried calling flip() explicitly after the resource-heavy function but no dice.
any pointers are appreciated.

@toadofsky
I moved the conversation to chat so as not to clog up the cartridge section.
in response to your last post;
how are you going to hook up PICO-8 to the internet though? Can you do that?

I'd like to make some associative tables e.g. table={x=7,y=90,z=40}
but I want to save tokens by using a string because I'm going to have a lot of them, and make a function that returns a table based on whatever is in the string.
So something like:
string1="x=7,y=90,z=40" string2="empty=100, dinner=casserole, transport=horse, weight=150" table1=assoc_table(string1) table2=assoc_table(string2) ?table1.z -- 40 ?table2.transport -- horse |
how do I go about this? split wont work. what does my function assoc_table(str) look like?

v0.2.6b
The hide_mouse_cursor feature is very buggy. That is the option that makes the mouse cursor disappear while typing in the PICO-8 editor. Length in seconds can be configured in config.txt but the problem is there even with the default of 5 sec.
On startup it works but after a while of coding it stops working at all. I posted this before but deleted my post because the steps I gave to reproduce didn't always make it happen. So it's hard for me to say exactly when it stops working. But I think that everyone here will notice if they pay attention, that after a some time working on a game, the mouse cursor will remain in the way while typing.
If you ctrl-r ctrl-r it will start working again. But if you type something at the command prompt and say, get a syntax error, or even just ls to show whats in the directory, or cls(), most of the time (but not always!) when you esc back to the editor it will be broken and the mouse will show even while you are typing. This will persist for the rest of the session. ctrl-r TWICE seems to reset it, but once is not enough.
I bought a couple of bluetooth gamepads off Amazon:
KIWITATA 2.4G Wireless NES USB Controller
Which are imitation NES classic, 2-button, D-pad, select start controllers.
It gets recognized right away by my latest Linux Mint OS and works in Pico-8
EXCEPT that both buttons do the same thing (I think they are both X).
I ran this code:
function _draw() cls() ?btn() end --both B and A output 32 |
and sure enough I get different values for all the buttons except both B1 and B2 print 32.
I've found this thread https://www.lexaloffle.com/bbs/?tid=3623 where one poster talks about the same problem. But its from 2016 and was for pocketCHIP and they solved it by getting a different controller.
I've also installed the SDL2 gamepad-tool for Linux but had issues. It sort of works EXCEPT that it wont recognize left/right on the dpad. I tried a million times and also tried skipping and mapping it to the little joysticks instead but it didn't work.





0 comments
.jpg)







