Из того, что я понимаю, у вас есть сетка 48x32, пространство которой составляет квадраты 16px. Алгоритм, который вы используете для генерации позиции вашей еды в сетке:
let food = {
x : Math.floor(Math.random()*((cvsW/unit)-1)+1)*unit, // Chooses 1-47
y : Math.floor(Math.random()*((cvsH/unit)-1)+1)*unit // Chooses 1-31
}
выбирает значение от 1 до 47 для x и от 1 до 31 для y. Проблема в том, что позиция 47 для x и позиция 31 для y находятся на краю сетки (это потому, что первая позиция x / y равна 0, а не 1). Чтобы исключить эти пробелы в качестве вариантов выбора, алгоритму просто необходимо вычесть 2 вместо 1 из числа пробелов в сетке (которое cvsW или cvsH, деленное на единицу):
let food = {
x : Math.floor(Math.random()*((cvsW/unit)-2)+1)*unit, // Chooses 1-46
y : Math.floor(Math.random()*((cvsH/unit)-2)+1)*unit // Chooses 1-30
}
В основном, вычитая только 1 убрал последний столбец / строку в качестве выбора для позиции x / y, а затем добавив 1, сдвинул все вправо. Вот так (для х):
Новый алгоритм делает это, первоначально исключая два последних варианта, затем смещаясь на 1: [1110 ]
Синтаксис подобен C#, другими словами, +=
перегружается для создания этого возможным:
instanceOfEventSource.MyEvent +=
gcnew EventSource::MyEventHandlerDelegate(this, &MyClass::MyEventHandlerMethod);
Аналогично для удаления. В отличие от C#, однако, Вы не можете опустить явное инстанцирование делегата обработчиков событий, таким образом, это производит довольно многоречивый код.