後半の判定条件見ると、毎回必ず八方向のどれかに移動しないといけない
(どこにも移動しないというのはナシ)なのかな。
だとすると、まずどこが空いているか調べておいて、その中から選ぶのが良いかと。
// 空いている場所を調べて配列に入れる
count = 0;
for (ix = -32; ix <= 32; ix += 32) for (iy = -32; iy <= 32; iy += 32) {
if ((ix != 0 || iy != 0) && place_free(x+ix, y+iy)) {
vx[count] = ix; vy[count] = iy; count += 1;
}
}
// 配列の中から移動先を選ぶ
ii = floor(random(count)); x += vx[ii]; y += v[ii];