MidnightsunCTF – Snake++
141 points, 38 solves
Snake Oil Co. has invented a special programming language to play their new and improved version of Snake. Beat the game to get the flag. settings Service:
nc snakeplusplus-01.play.midnightsunctf.se 55555
When I first connected to the remote server, I was presented with a menu, detailing 3 options: Play in player mode, play in computer mode, or exit. The rules detail that a score of 42 will grant you a flag, so I first tried in player mode (where I direct the snake).
Ais a good apple: it grows the snake 1 in length
Bis a bad apple, it shrinks the snake in length. Best shoot these
The snake is controlled with:
L– will advance the snake one place then turn the direction 90 degrees left.
R– will advance the snake one place then turn the direction 90 degrees right.
' '(space) will “shoot” in the direction the snake is pointed, until it hits either
A(which it will delete),
B, which it will delete, or your snake, or the wall. Note: you don’t die if you shoot yourself. After shooting, the snake moves forward one square
''(enter), which will advance the snake 1 in the direction it points.
When I played in player mode, I noticed no warning that no flag would be given for a win in player mode, so I figured if I could endure the tedious game (the move before turn, paired with me being bad at rights and lefts made this angering at best), I would get flag… easy, right? Two hours later, I finally reached a score of 42, and the game did not give me a flag >:(.
Now to computerize it. The language description for Snake++ is presented in lang-desc.txt.
Our game plan now becomes the writing of a function in Snake++ that can choose the next move based on board state. We implemented it in parts:
- driver.py – supplies snake.ai to server, and runs in while loop, detecting flag if won.
- snake.ai – a misnomer, as this is really quite a dumb function (and not at all optimized, which we were too tired to see at the time). This is the Snake++ program/function that determines the move to make. This function encompasses:
- A hamiltonian cycle through the map, stored to RAM. hampath.txt shows this – start in left bottom corner facing right, and the move in your cell is what to submit to stay on hampath.
- Logic to determine what to do based on cycle, apple type…
snake.ai loads the hamiltonian path/cycle into RAM if it is not there already (we could optimize this by not writing all the
- If we are on a turn in the hampath, we must turn
- If there is a
Bnear, return shoot (
- Else, move forward.
snake.airequires the starting (random) position to be the same direction of the hampath at that spot, so probability decrees that it works 1/4 tries.
I know, we are all CS majors, and while you might expect a better solution from us, we are also masters of minimal effort.
So, this scrip barely works… We ran it in a loop, one run at a time (as to keep the server as fast as possible), and consistently got scores of 30-39 (there’s a 90-sec timeout for computer mode). Then, on a lucky run, we got a score of 42.
~ Lyell Read, Phillip Mestas, Athos