Задача: сделать крестики - нолики для двоих на безграничном поле, выигрывает, тот кто посптаит 5 в ряд.
Подскажите как сделать, чтобы поле увеличивалось вместе с окном.
И как осуществить проверку 5ти в ряд.
Спасибо.
![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.
![]() ![]() |
![]() |
T2D |
![]()
Сообщение
#1
|
Гость ![]() |
Задача: сделать крестики - нолики для двоих на безграничном поле, выигрывает, тот кто посптаит 5 в ряд.
Подскажите как сделать, чтобы поле увеличивалось вместе с окном. И как осуществить проверку 5ти в ряд. Спасибо. |
Бравый генерал |
![]()
Сообщение
#2
|
Новичок ![]() Группа: Пользователи Сообщений: 39 Пол: Мужской Реальное имя: Василий Репутация: ![]() ![]() ![]() |
Проверка на наличие пяти меток в ряд. Сразу обозначим "пять" - понятием "выигрышное количество" (ВК). Нам нужно проверить наличие ВК меток в ряд по горизонтали, по вертикали, по диагонали, наклоненной влево, и по диагонали, наклоненной вправо. Допустим игровое поле у нас задается массивом целых чисел:
a: Array [1..10,1..10] of Byte; Допустимые значения элементов этого массива: 0 - поле пусто, 1 - на поле "крестик", 2 - на поле "нолик". (Значения могут быть и другие - это не принципиально, важно то, что они, естественно, должны быть различными ![]() Function won(X,Y,P: Byte): Boolean; где X - номер столбца массива в котором находится ячейка, куда игрок собирается поставить свою метку, Y - строка... , а P - значение поля, соответствующее метке игрока, совершающего ход (т.е. если P = 1, то в нашем случае это "крестик"). Рассмотрим случай по горизонтали. Function won(x,y,p: Byte): Boolean; i,j - границы горизонтального интервала, который полностью заполнен метками P, и который содержит поле проверяемое функцией. Изначально эти границы совпадают. Рассматриваем метки слева от нашего поля: если слева от левой границы интервала стоит метка P, то подвигаем левую границу влево. Так же мы поступаем и с правой границей: если справа от правой границы интервала стоит метка P, то подвигаем правую границу вправо. Примечание: так как игра изначально начинается с пустого поля, то размер интервалов при проверке не будет превышать 2*ВК-1, поэтому не стОит делать проверку на превышение размером интервала ВК - оно все равно почти не повлияет на время выполнения. Теперь мы "расширяем" нашу функцию для проверок остальных направлений. Думаю, разобраться в этом "расширении", а также связать массив A с игровым полем не должно вызвать сложностей. Вот полный код функции: Function won(x,y,p: Byte): Boolean; P.S. Цитата Подскажите как сделать, чтобы поле увеличивалось вместе с окном. ЧТО должно изменяться - размер ячеек или их количество? Сообщение отредактировано: volvo - |
Гость |
![]()
Сообщение
#3
|
Гость ![]() |
Должно изменяться количество ячеек
|
Бравый генерал |
![]()
Сообщение
#4
|
Новичок ![]() Группа: Пользователи Сообщений: 39 Пол: Мужской Реальное имя: Василий Репутация: ![]() ![]() ![]() |
Все просто.
width, height - ширина и высота поля, отводимого под ячейки (в самом простом случае это сама форма). m, n - кол-во ячеек на поле по горизонтали и вертикали соответственно. a, b - соответственно ширина и высота одной ячейки. При каждом изменении размеров игрового поля нужно делать следующее: m:=width div a; Думаю, сможешь присобачить к компонентам. |
Гость |
![]()
Сообщение
#5
|
Гость ![]() |
Я так и делал, только у меня почему то при очень маленьком окне, ячеек было в 2 раза меньше, чем надо, а при большом, наоборот штук на 10 больше.
|
Гость |
![]()
Сообщение
#6
|
Гость ![]() |
Я использую такуб процедуру, но получается не очень:
procedure TForm7.FormResize(Sender: TObject); |
Гость |
![]()
Сообщение
#7
|
Гость ![]() |
Не работает твой код пяти в ряд. Вот процедура и функция, немного измененная:
procedure TForm8.poleSelectCell(Sender: TObject; ACol, ARow: Integer; function TForm8.won(x,y: Byte; p:string): Boolean; |
![]() ![]() |
![]() |
Текстовая версия | 24.03.2025 0:08 |