Вот смотрите: Если мы в аутпуте видим "game over", значит у вас выполняется условие:

Код AS3:
if(head.x<10 || head.x>590 || head.y<10 || head.y>590)
game_over();
То есть, например head.x меньше 10 (так сказано в условии), допустим "7", а y будет к примеру 25. Что происходит дальше:

Код AS3:
if (map[(head.x-10)/20][(head.y-10)/20]==1)
То есть

Код AS3:
if (map[(7-10)/20][(25-10)/20]==1)
Мы получаем элемент массива:

Код AS3:
map[-0.15][0.75]
Вы когда-нибудь видели в массиве индексы -0.15 и 0.75?
Добавлено через 53 секунды
return здесь ничего не решает. То есть он нужен, но сначала исправьте ошибку!
Добавлено через 8 минут
Меня вообще удивляет, как это работает:

Код AS3:
if (map[(head.x-10)/20][(head.y-10)/20]==1)
..............................................................
if (map[(head.x-10)/20][(head.y-10)/20]==2){
Вы же обращаетесь к массиву по НЕЦЕЛЫМ числам...