|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
06.08.2008, 22:31 | #171 |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
To Titan123, дам совет. Разделяй код логики и вывода на экран. То есть обработка геймплея не должна базироваться на панелях или на кнопках или на чем-то там еще. Делай универсальный (абстрактный, не зависимый от графики) код, к к-рому можно будет прикрутить любой вывод на экран. Читабельность кода намного вырастет, да и не всегда у тебя будут панели чтобы на них опираться.
Используй структуры, классы, просто переменные, массивы и т.д. Крестики нолики не делал, времени нет. Но подумал, как бы я их сделал. Сразу отбросил вариант 3х3, слишком маленькие, алгоритм даже потестировать негде, тесновато и не интересно. Я еще с первого класса помню какой нужно сделать первый ход чтобы выиграть. Я бы сделал поле 10х10, и по таким правилам, если пять подряд по горизонтали, вертикали или диагонали выстроил - победа. Не совсем крестики нолики но так интересней. Думал над алгоритмом. Сразу нужно отсеять рутинные операции типа вывода на экран, очистки поля, обработки мыши и т.п. В итоге я бы сделал функцию "СделатьХод" MakeMove(параметры): возвращаемый тип; Вобщем она должна сделать ход, параметры и возвращаемое значение можно сделать разные, но на вход она должна получить игрока за к-рого ходить, т.е. крестиком или ноликом, уровень мастерства, т.е. насколько умным должен быть ход (Random - самый тупой =), а вернуть позицию куда лепить тот же крестик или нолик. Матрицу - игровое поле можно передать в параметрах или обращаться к ней как к глобальной. С теорией пока все, сделать так чтоб работало не проблема, но все что приходило мне в голову какое-то громоздкое и слишком "человеко ориентированное". Тут наверное математика не помешала бы.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог |
06.08.2008, 23:07 | #172 |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
Посмотрел те крестики нолики, ну и наворочено. Явно для примера не подходят, процедура где генерируется следующий ход - procedure putO(); в Unit1, вся суть в ней.
Игровое поле матрица 3х3 of integer; Как такового алгоритма нет, тупо проверяются различные комбинации, заточено под поле 3х3, если бы таким методом сделать проверку поля 10х10, код вырос бы до огромных размеров. Там где компьютер - дурачок, ход генерируется функцией Random. Там где поумней - 200 строк кода, сплошные проверки if. Наверное перебрана каждая комбинация к-рая может возникнуть на поле.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог |
07.08.2008, 14:35 | #173 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
mutabor, простого показательного кода не получить в любом случае. Тут как в шахматах, есть логические ходы, БД с комбинациями, проверка в ней на соответствие, это первое, ...а второе - перебор последовательности вероятного хода противника до оптимального варианта, в котором будет выигрыш за какое-то число ходов.
Так что, 3х3 хоть и неинтересно, но показательно с точки зрения алгоритма.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Последний раз редактировалось Beermonza; 10.06.2013 в 16:40. |
07.08.2008, 17:17 | #174 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Простой пример основы РПГ
Вот, держите примерчик. Упрощено до минимума, на исходниках L_M.
Это может быть РПГ или стратегия.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
08.08.2008, 21:23 | #175 |
Форумчанин Подтвердите свой е-майл
Регистрация: 25.02.2008
Сообщений: 289
|
спасибо, то что нужно было...пока.
Упс...
|
09.08.2008, 00:40 | #176 |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
Урок Крестики-нолики на большом поле Часть1
В этом уроке я расскажу как сделать большие крестики-нолики на Дельфи. Скорее всего вы знаете эту игру, возможно под другим названием. Объясню вкратце: прямоугольное поле в клетку, кто раньше выстроил пять своих фишек (крестиков, ноликов, клякс и т.п.) подряд по горизонтали, вертикали или диагонали тот и выиграл.
Урок расчитан на новичков, если вы не новичек, для вас тоже может найтись интересное, почитайте P.S. Итак приступим. Часть первая — интерфейс. Для вывода графики будем использовать компонент TImage. Поле будет 10х10 клеток, но код будет универсальный и вы потом сможете без особого труда сделать изменяемые размеры. Поле реализовано как двумерный массив с элементом типа Shortint, вместо него можно было и Integer использовать, Shortint выбран т.к. занимает меньше памяти. Тип выбран с возможность присваивать отрицательные значения, -1 будет означать пусто, 0 — нолик, 1- крестик. Можно было создать свой перечисляемый тип для элемента, со значениями Krestik, Nolik, но простые числа более гибкие в коде, с ними удобнее, хотя не так наглядно. Рассмотрим секцию var Код:
CPUMark, HumanMark — будет хранить кто чем играет, крестиком или ноликом. 0 — нолик, 1 — крестик. В дальнейшем я буду стараться чтобы 0 совпадал с ноликом при создании переменных. table — игровое поле. TableWidth, TableHeight — тут думаю понятно ширина и высота. Менять не советую, так как в процессе написания универсльность несколько потерялась. Константа одна - CELL_SIDE = 40; это размер клетки, а точнее длина ее стороны в пикселях. TImage соответственно будет иметь размеры 400 х 400. Настройки я засунул в главное меню, их там немного и вы сами я думаю разберетесь. Выбор противника не работает, но в коде все под него есть, алгоритмы заточены ходить за любого игрока. Так что доделать будет не так сложно, лучше выбор игроков сделать в двух комбобоксах, чтобы разные алгоритмы друг на друге тестировать можно было. Смотрим дальше главный юнит — Main. (Код во вложении.) Сначала идут обработчики пунктов меню, в них ничего интересного. Дальше идет сам игровой процесс. Он состоит из двух процедур — обработчик нажатия мыши в Image и обработчик пукта меню Новая игра. Вот и вся игра. Но это конечно не весь код, самое интересное скрыто в юните Game, о нем попозже.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог |
09.08.2008, 00:41 | #177 |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
продолжение...
В обработчике пункта Новая игра всего одна строка - вызов функции NewGame;
В ней описаны все действия необходимые при старте новой игры. Какие в этот момент выбраны настройки в меню, с такими и начнется игра. В процедуре Image1MouseDown заключается высокоуровневый алгоритм игры, как видите он довольно простой, если не вникать в сами функции. Разберем по строкам. cx:=x div CELL_SIDE; cy:=y div CELL_SIDE; Переводим координаты клика из пикселей в координаты клетки на поле. if Empty(table[cx,cy]) then Функция Empty возвращает True если клетка пустая, т.е. в нее можно ходить HumanMove(cx,cy); Ходим. Application.ProcessMessages; Это нужно чтобы ваш ход сразу отобразился на экране. Иначе это произойдет только после завершения всей процедуры. if EndOfGame = 0 then Проверяем не выиграли ли мы. Или не последний ли это был возможный ход. Функция EndOfGame вернет 0 — если еще не конец игры, 1 - выиграли нолики, 2 — крестики. Sleep(500); Если управление дошло сюда, значит еще не конец игры. Делаем задержку в полсекунды, чтобы компьютер не отвечал мгновенно. CPUMove(CPUSkill,CPUMark); Ходит компьютер. Параметры — уровень мастерства и чем собственно ходить. if EndOfGame > 0 then ShowMessage('the end '+IntToStr(EndOfGame)); Если условие верно, значит наступил конец игры после хода компьютера. Результат игры возвращает та же функция, об этом написано выше. ShowMessage здесь просто как заглушка, к написанию второй части урока я это доделаю. else ShowMessage('the end '+IntToStr(EndOfGame)); То же самое, только конец игры наступил после хода человека. Пока это все. Разбор юнита Game будет во второй части урока. В текущей версии при выборе мастерства Новичек и Мастер, компьютер ходит всегда как новичек, вообще не думая, используется Random. Над более продвинутым алгоритмом я как раз сейчас думаю. P.S. Для кое-чего умеющих. Если вам интересно, можете написать свою версию алгоритма для хода компьютера - procedure CPUMove(skill: byte; mark: byte); На вход процедура получает уровень мастерства и чем ходить. Доступ к массиву как к глобальному. Массив 10 х 10 - table: array of array of shortint; //-1 — пусто, 0 — нолик, 1 — крестик Готовый ход делается в конце процедуры двумя строками table[x,y]:=mark; //сохранение хода в матрице PutMark(x,y,mark); //вывод хода на экран Для отладки можете использовать проект во вложении, он рабочий.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог |
12.08.2008, 13:42 | #178 |
Форумчанин
Регистрация: 27.06.2008
Сообщений: 113
|
mutabor спасибо, что откликнулись на мою просьбу, но компьютер играет довольно скудно.
я, конечно, буду разбираться в коде, но как можно увеличить его мастерство? |
12.08.2008, 18:14 | #179 |
Участник клуба
Регистрация: 12.08.2008
Сообщений: 1,977
|
Всем привет!Первый раз на этом форуме.Очень жалею, что только сейчас обнаружил этот форум. Давно занимаюсь изучением программирования и мне кажется ,что через создание игр, даже простейших, самый оптимальный способ обучения.Создал несколько игрушек, но есть вопросы.Вот только незнаю куда и как можно выложить коды,exe-шники,
чтобы потом давать на них ссылки.Подскажите, плз.
И не сомневайся даже ... отдых - кайф, работа - лажа!
|
12.08.2008, 19:11 | #180 | |
Форумчанин
Регистрация: 29.10.2007
Сообщений: 628
|
Цитата:
Последний раз редактировалось Rembo; 12.08.2008 в 19:15. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Хорошие уроки | Render | Общие вопросы Delphi | 9 | 15.09.2012 07:13 |
Акцесс вопросы новичков | Yaga | Помощь студентам | 4 | 02.06.2008 00:16 |
Учебники для новичков в програмировании | Рар | Общие вопросы Delphi | 6 | 08.01.2007 08:07 |