void UpdateAI() { float bestUtilityValue = int.MaxValue; VoxelSnakeDirection bestDirection = VoxelSnakeDirection.Up; int utilityValue = 0; Int3 delta; Vector4 vBackgroundColor = backgroundColor; Vector4 vFoodColor = foodColor; foreach (VoxelSnakeDirection dir in Enum.GetValues(typeof(VoxelSnakeDirection))) { delta = GetDeltaByDirection(dir); Int3 nextPos = (mCurrent + delta) % mWorldSize; utilityValue = mLastFoodPosition.ManhattanDistance(nextPos); Vector4 vNextPosVoxelColor = GetVoxelColor(nextPos); if ((vBackgroundColor - vNextPosVoxelColor).sqrMagnitude > 0.001f && (vFoodColor - vNextPosVoxelColor).sqrMagnitude > 0.001f) { utilityValue = int.MaxValue; } if (utilityValue < bestUtilityValue) { bestUtilityValue = utilityValue; bestDirection = dir; } } currentSnakeDirection = bestDirection; }
Int3 GetDeltaByDirection(VoxelSnakeDirection dir) { if (dir == VoxelSnakeDirection.Forward) { return(new Int3(0, 0, 1)); } else if (dir == VoxelSnakeDirection.Backward) { return(new Int3(0, 0, -1)); } else if (dir == VoxelSnakeDirection.Left) { return(new Int3(-1, 0, 0)); } else if (dir == VoxelSnakeDirection.Right) { return(new Int3(1, 0, 0)); } else if (dir == VoxelSnakeDirection.Down) { return(new Int3(0, -1, 0)); } else if (dir == VoxelSnakeDirection.Up) { return(new Int3(0, 1, 0)); } // Up return(new Int3(0, 1, 0)); }