var dirToDx: int[4]; var dirToDy: int[4]; var snake: int[16]; fun main() { dirToDx[1] = 1; dirToDx[3] = -1; dirToDy[0] = -1; dirToDy[2] = 1; var sx = getInt(); var sy = getInt(); var spos = (sy << 4) + sx; drawAddr(spos); drawData(10); drawSwap(1); snake[0] = spos; var snakeStart = 0; var snakeEnd = 1; var fpos = 256; var dx = 1; var dy = 0; while (true) { var event = getInt(); if (event == 0) { sx += dx; sy += dy; spos = (sy << 4) + sx; if (sx > 15 || sx < 0 || sy > 15 || sy < 0) break; var idx = snakeStart; var collide = false; while (true) { idx = (idx + 1) & 15; if (idx == snakeEnd) break; if (spos == snake[idx]) { collide = true; break; } } if (collide) break; if (spos == fpos) { fpos = 256; } else { drawAddr(snake[snakeStart]); drawData(0); snakeStart = (snakeStart + 1) & 15; } drawAddr(spos); drawData(10); drawSwap(1); snake[snakeEnd] = spos; snakeEnd = (snakeEnd + 1) & 15; } else if (event == 1) { var fx = getInt(); var fy = getInt(); fpos = (fy << 4) + fx; drawAddr(fpos); drawData(9); drawSwap(1); } else { dx = dirToDx[event - 2]; dy = dirToDy[event - 2]; } } for (var idx = snakeStart; idx != snakeEnd; idx = (idx + 1) & 15) { drawAddr(snake[idx]); drawData(9); } drawSwap(1); halt(); }