Я полагаю, что по этой причине вы выполняете операцию по модулю только для части назначенного значения, а не для целого:
for (int dir = 0; dir < DIRECTIONS.length; dir++)
{
dir = ( (dir) + (randDirection) % DIRECTIONS.length);
}
Вероятно, должно быть:
for (int dir = 0; dir < DIRECTIONS.length; dir++)
{
dir = ( (dir) + (randDirection) ) % DIRECTIONS.length;
}
Несколько ключевых замечаний: форматирование в вашем вопросе не очень хорошее - форматирование должно разбить вопрос на ключевые части, предоставляя нам простой способ понять, что именно вы спрашиваете нас, и отформатировать все части кода, чтобы их можно было различить. их от остальных.
Вам, вероятно, следует прочитать и о рефакторинге - в этот день, когда компиляторы форматируют наш код и показывают нам точно, где начинается и заканчивается каждый блок - на самом деле нет необходимости комментировать каждый конец скобки.
Дать вашим переменным значимые имена, имеющие r, rr, c, cc, довольно запутанно для тех, кто не знает, что должен делать ваш код.
Вы также можете извлечь части своего кода в отдельные методы, чтобы сделать его более понятным.
В конечной точке
for (i = 0, rr = r, cc = c; i < word.length(); i++) {
if (rr < rows && cc < cols && i < word.length()) {
Эта проверка избыточна и может измениться на
for (i = 0, rr = r, cc = c; i < word.length(); i++) {
if (rr < rows && cc < cols) {