Regarding survival mode...
I originally let my Voronoi + minimax code fill space for me, but it would often leave holes. Then I just did an "iteratively deepened" DFS on only my bot's moves (not the opponent's) to find the longest path I could that did not reduce the reachable squares.
This worked ok, but would often leave long tunnels instead of sacrificing one square to fill in the others in the tunnel.
Now I have code to find the cut vertexes in the graph, and to estimate how many of them I will fill (sort of like the tree of chambers idea.) I then use this function + the iterative DFS to find the move that gives me the most possible squares.
My evaluation functions are expensive, and the code is in Python, so it does not look very far out. Sometimes it leaves squares open that I think it should hit, but I think I am done tweaking my survival mode.
Fun idea, but mostly useless:
When I was frustrated with some of the holes my bot left, I remembered a puzzle about checker boards, and realized we have the same thing here. Bots can only move from red to black and vice-versa. So, if you have 10 black squares to fill, and 6 red, you know that at least 3 of your black squares are not going to be reachable (and that is only if you are starting on a red square). I tried to put that in my evaluation functions, but it only made a tiny difference, if any. Of course, I have made many mistakes so far, so maybe I did not do it right.
