Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.08.2008, 22:31   #171
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 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)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 06.08.2008, 23:07   #172
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 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)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 07.08.2008, 14:35   #173
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

mutabor, простого показательного кода не получить в любом случае. Тут как в шахматах, есть логические ходы, БД с комбинациями, проверка в ней на соответствие, это первое, ...а второе - перебор последовательности вероятного хода противника до оптимального варианта, в котором будет выигрыш за какое-то число ходов.
Так что, 3х3 хоть и неинтересно, но показательно с точки зрения алгоритма.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 10.06.2013 в 16:40.
Beermonza вне форума Ответить с цитированием
Старый 07.08.2008, 17:17   #174
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Простой пример основы РПГ

Вот, держите примерчик. Упрощено до минимума, на исходниках L_M.
Это может быть РПГ или стратегия.
Вложения
Тип файла: zip GameRPG.zip (15.5 Кб, 263 просмотров)
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 08.08.2008, 21:23   #175
L_M
Форумчанин Подтвердите свой е-майл
 
Регистрация: 25.02.2008
Сообщений: 289
По умолчанию

спасибо, то что нужно было...пока.
Упс...
L_M вне форума Ответить с цитированием
Старый 09.08.2008, 00:40   #176
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию Урок Крестики-нолики на большом поле Часть1

В этом уроке я расскажу как сделать большие крестики-нолики на Дельфи. Скорее всего вы знаете эту игру, возможно под другим названием. Объясню вкратце: прямоугольное поле в клетку, кто раньше выстроил пять своих фишек (крестиков, ноликов, клякс и т.п.) подряд по горизонтали, вертикали или диагонали тот и выиграл.

Урок расчитан на новичков, если вы не новичек, для вас тоже может найтись интересное, почитайте P.S.

Итак приступим.

Часть первая — интерфейс.

Для вывода графики будем использовать компонент TImage. Поле будет 10х10 клеток, но код будет универсальный и вы потом сможете без особого труда сделать изменяемые размеры. Поле реализовано как двумерный массив с элементом типа Shortint, вместо него можно было и Integer использовать, Shortint выбран т.к. занимает меньше памяти. Тип выбран с возможность присваивать отрицательные значения, -1 будет означать пусто, 0 — нолик, 1- крестик.
Можно было создать свой перечисляемый тип для элемента, со значениями Krestik, Nolik, но простые числа более гибкие в коде, с ними удобнее, хотя не так наглядно.

Рассмотрим секцию var

Код:
var
  Form1: TForm1;
  CPUSkill: byte; //мастерство компьютера
  CPUMark: byte; //чем играет компьютер
  HumanMark: byte; //чем играет человек
  table: array of array of shortint;
  TableWidth: byte = 10;
  TableHeight: byte = 10;
CPUSkill — уровень мастерства компьютера, их может быть много, я сделаю два, новичек и мастер.
CPUMark, HumanMark — будет хранить кто чем играет, крестиком или ноликом. 0 — нолик, 1 — крестик. В дальнейшем я буду стараться чтобы 0 совпадал с ноликом при создании переменных.
table — игровое поле.
TableWidth, TableHeight — тут думаю понятно ширина и высота. Менять не советую, так как в процессе написания универсльность несколько потерялась.

Константа одна - CELL_SIDE = 40; это размер клетки, а точнее длина ее стороны в пикселях.
TImage соответственно будет иметь размеры 400 х 400.
Настройки я засунул в главное меню, их там немного и вы сами я думаю разберетесь. Выбор противника не работает, но в коде все под него есть, алгоритмы заточены ходить за любого игрока. Так что доделать будет не так сложно, лучше выбор игроков сделать в двух комбобоксах, чтобы разные алгоритмы друг на друге тестировать можно было.

Смотрим дальше главный юнит — Main. (Код во вложении.) Сначала идут обработчики пунктов меню, в них ничего интересного. Дальше идет сам игровой процесс. Он состоит из двух процедур — обработчик нажатия мыши в Image и обработчик пукта меню Новая игра.
Вот и вся игра. Но это конечно не весь код, самое интересное скрыто в юните Game, о нем попозже.
Вложения
Тип файла: rar krenoliki_v1.rar (11.5 Кб, 85 просмотров)
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)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 09.08.2008, 00:41   #177
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 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)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 12.08.2008, 13:42   #178
Titan123
Форумчанин
 
Аватар для Titan123
 
Регистрация: 27.06.2008
Сообщений: 113
По умолчанию

mutabor спасибо, что откликнулись на мою просьбу, но компьютер играет довольно скудно.
я, конечно, буду разбираться в коде, но как можно увеличить его мастерство?
Titan123 вне форума Ответить с цитированием
Старый 12.08.2008, 18:14   #179
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Всем привет!Первый раз на этом форуме.Очень жалею, что только сейчас обнаружил этот форум. Давно занимаюсь изучением программирования и мне кажется ,что через создание игр, даже простейших, самый оптимальный способ обучения.Создал несколько игрушек, но есть вопросы.Вот только незнаю куда и как можно выложить коды,exe-шники,
чтобы потом давать на них ссылки.Подскажите, плз.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 12.08.2008, 19:11   #180
Rembo
Форумчанин
 
Аватар для Rembo
 
Регистрация: 29.10.2007
Сообщений: 628
По умолчанию

Цитата:
Сообщение от DeKot Посмотреть сообщение
Вот только незнаю куда и как можно выложить коды,exe-шники,
чтобы потом давать на них ссылки.Подскажите, плз.
Код программы можно выкладывать и в самом сообщении, но при этом не забывать использовать тег [CODE]. exe-шники можно выложить в виде архива во "вложении" или же если файл большой (не помещается во вложение), можно использовать файлообменники например этот или этот. И после загрузки файла на файлообменник, просто выложить ссылку на скачивание вашего файла...

Последний раз редактировалось Rembo; 12.08.2008 в 19:15.
Rembo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хорошие уроки Render Общие вопросы Delphi 9 15.09.2012 07:13
Акцесс вопросы новичков Yaga Помощь студентам 4 02.06.2008 00:16
Учебники для новичков в програмировании Рар Общие вопросы Delphi 6 08.01.2007 08:07