IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Курсовая: крестики - нолики
сообщение
Сообщение #1


Гость






Задача: сделать крестики - нолики для двоих на безграничном поле, выигрывает, тот кто посптаит 5 в ряд.

Подскажите как сделать, чтобы поле увеличивалось вместе с окном.
И как осуществить проверку 5ти в ряд.

Спасибо.
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: Василий

Репутация: -  -2  +


Проверка на наличие пяти меток в ряд. Сразу обозначим "пять" - понятием "выигрышное количество" (ВК). Нам нужно проверить наличие ВК меток в ряд по горизонтали, по вертикали, по диагонали, наклоненной влево, и по диагонали, наклоненной вправо. Допустим игровое поле у нас задается массивом целых чисел:
a: Array [1..10,1..10] of Byte;

Допустимые значения элементов этого массива: 0 - поле пусто, 1 - на поле "крестик", 2 - на поле "нолик". (Значения могут быть и другие - это не принципиально, важно то, что они, естественно, должны быть различными smile.gif) Наша функция будет возвращать true если ход игрока принесет ему победу и будет описываться так:
Function won(X,Y,P: Byte): Boolean;

где X - номер столбца массива в котором находится ячейка, куда игрок собирается поставить свою метку, Y - строка... , а P - значение поля, соответствующее метке игрока, совершающего ход (т.е. если P = 1, то в нашем случае это "крестик"). Рассмотрим случай по горизонтали.
Function won(x,y,p: Byte): Boolean;
Const
VK = 5;
var
i,j: Byte;
begin
i:=x;
j:=x;
while (a[y,i-1] = p)
do Dec(i);
while (a[y,j+1] = p)
do Inc(j);
if j-i >= VK-1
then begin
won:=true;
exit
end;
won:=false
end;

i,j - границы горизонтального интервала, который полностью заполнен метками P, и который содержит поле проверяемое функцией. Изначально эти границы совпадают. Рассматриваем метки слева от нашего поля: если слева от левой границы интервала стоит метка P, то подвигаем левую границу влево. Так же мы поступаем и с правой границей: если справа от правой границы интервала стоит метка P, то подвигаем правую границу вправо.
Примечание: так как игра изначально начинается с пустого поля, то размер интервалов при проверке не будет превышать 2*ВК-1, поэтому не стОит делать проверку на превышение размером интервала ВК - оно все равно почти не повлияет на время выполнения.
Теперь мы "расширяем" нашу функцию для проверок остальных направлений. Думаю, разобраться в этом "расширении", а также связать массив A с игровым полем не должно вызвать сложностей. Вот полный код функции:
Function won(x,y,p: Byte): Boolean;
Const
VK = 5;
var
i,j: Byte;
begin
i:=x;
j:=x;
while (a[y,i-1] = p)
do Dec(i);
while (a[y,j+1] = p)
do Inc(j);
if j-i >= VK-1
then begin
won:=true;
exit
end;

i:=y;
j:=y;
while (a[i-1,x] = p)
do Dec(i);
while (a[j+1,x] = p)
do Inc(j);
if j-i >= VK-1
then begin
won:=true;
exit
end;

i:=x;
j:=x;
while (a[y-(x-i+1),i-1] = p)
do Dec(i);
while (a[y+(j-x+1),j+1] = p)
do Inc(j);
if j-i >= VK-1
then begin
won:=true;
exit
end;

i:=x;
j:=x;
while (a[y+(x-i+1),i-1] = p)
do Dec(i);
while (a[y-(j-x+1),j+1] = p)
do Inc(j);
if j-i >= VK-1
then begin
won:=true;
exit
end;

won:=false
end;


P.S.
Цитата
Подскажите как сделать, чтобы поле увеличивалось вместе с окном.

ЧТО должно изменяться - размер ячеек или их количество?

Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 25.04.2024 15:45
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name