Гриб_под_зонтом, имхо ты уже знаешь, почему за границы массива выходить нельзя. x = 23 y = 5 - будет выход за границу? Ты должен предусмотреть эту ситуацию.
ЗЫ код проверки по диагоналям в студию.
Пользователь решил продолжить мысль 23 Февраля 2015, 23:46:18:
Гриб_под_зонтом, и ещё: твой код не очень эффективен. Сколько раз отработает цикл(если там нет пяти символов подряд), пока проверит строчку? Для нулевого элемента - 5 раз. для первого - 5 раз. Для двадцатог - 5 раз. Итог 21*5.bool win()
{
int win = 0;
for (int x2 = 0; x2 < predel; x2++)
{
for (int y2 = 0; y2 <= predel-5; y2++)
{
for (int k=0; k <= 5; k++)
{
if (pole[x2][y2+k]=='X') win++;
}
if (win==5) return true;
if (win!=5) win = 0;
}
}
return false;
}
Как тебе такой вариант? Хотел быстро написать код, по этому массив одномерный(проверяет одну строку). Думаю ты знаешь, как изменить этот код, чтобы он проверял всё поле.
void main()
{
/*Заполняем поле*/
var mass = " bbb bbbbx";
/*Последний символ. Лучше всего взять пробел*/
char last = ' ';
/*Длина цепочки*/
var length = 0;
/*Перебираем строку*/
for(var i = 0; i < mass.length; i++)
{
/*Если текущий символ равен предыдущему -
то это может быть продолжение цепочки.
А может это пробелы стоят рядом*/
if(mass[i] == last && mass[i] != ' ')
{
length++;
}
/*Встретилось начало следующей цепочки. Её длина - 1 символ*/
else
{
length = 1;
last = mass[i];
}
/*Проверка достаточная ли длина цепочки. Не забываем выйти из функции*/
if(length == 4)
{
/*Печать последнего сивола цепочки*/
stdout.printf(@"$i\n");
return;
}
}
}
Этот код проходит строку не возвращаясь. Бонусом мы получаем возможность проверки хода не только для крестиков.