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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2021, 06:15   #1
Фёст
Пользователь
 
Регистрация: 21.05.2020
Сообщений: 14
Вопрос Опять крестики-нолики

Ещё с одной проблемой я столкнулся, пока делал крестики-нолики.
Так вот... Как можно вместо номера картинки (Например, image1) записать переменную?! Ну, или, проще говоря, как написать строку imageX.picture:=......., чтобы X потом можно было программно изменить?..
Фёст вне форума Ответить с цитированием
Старый 23.01.2021, 10:02   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,547
По умолчанию

Вообще не надо заводить кучу image, достаточно одного, в который выводить картинки из ImageList в нужную позицию канвы.
Arigato вне форума Ответить с цитированием
Старый 30.01.2021, 16:38   #3
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Я думаю для решения проблемы игры нужно усвоить базовые вещи, тем более это будет полезно как начинающему программисту. По вашим вопросам, я просто понял, что вы не до конца это понимаете:

То, что видит ПО и то что видет пользователь это 2 абсолютно разные вещи. Если мы работаем с графикой, давайте поймем, из чего она вообще состоит. Как вообще РИСУЮТСЯ компоненты, которыми вы пользуетесь. Основным кирпичиком для отображения VCL компонентов является Canvas. (я думаю вы делаете обычное 32 разрядное приложение для винды, а оно построено на VCL компонентах)

Что такое Canvas компонента: Это полотно для рисования (мальберт) определенных размеров (что сериализуется/ сохраняется в dfm файле) зарегистрированное после страта проекта (RunTime) в Windows как отдельное окно(Handle) с уникальным индификатором. Именно эта регистрация и делает его отдельным объектом, способным обмениваться информацией с пользователем, получать на себя фокус,реагировать на события клавиатуры, мыши или другого устройства ввода, это очень грубое определение, но в целом это примерно так. Все VCL компоненты, и не только они, FMX компоненты ведут себя точно также, просто через абстрактный слой в зависимости от ОС(Android,IOS и.т.д.), по итогу, что мы видим это ничто иное, как просто картинка. Как вы получаете Edit? Это просто картинка, которую находит наша операционная система по Handle, после нахождения среда находит объект в dfm файле(по имени), после этого есть все сведения о размере компонента, его расположении относительно родителя, его значения и т.д, разработчики Delphi уже позаботились о том,как на канве этого Handle нарисовали бордюры, область для ввода и.т.д все согласно инструкциям из dfm файла. В новых версиях среды(XE или 10.4 Sidney, можно кастомизировать стиль компонента, с помощью отдельного компонента) Они рисуют компонент и "Оживляют" его программным кодом заставляя реагировать на действия пользователя . Вбил букву? Это просто на канве этого компонента нарисовали буковку. Как ее нарисовать определяет уже шрифт, его размер и цвет. Что это дает? Да все что угодно, установили новый шрифт, вот вам буковки по новому нарисую. Изменил цвет? Да легко, просто нарисую другим цветом. За это отвечает Canvas.Pen.Color. Цвет кисти. У Canvas много свойств, всех их описывать не буду. Важно знать, Canvas - содержит большой набор методов для кастомной визуализации и является основой любого визуального компонента используемого в среде разработки. Почитайте о DesignTime и RunTime. Еси вы кидаете компонент на форму(без запуска проекта) это DesignTime , если код исполняется при запуске это RunTime. Если хотите стать профессионалом, в этом важно разобраться

К делу:

Разберем, а что надо для реализации проекта? (примерно так, грубо, выглядит схема для работы. Перед тем как начать что то писать, нужно всегда составить, хотя бы в голове, схему основных процессов)

1 - на чем рисовать
2 - когда рисовать
3 - что рисовать
4 - кто решает, как и что рисовать

Ответы:
1 - Компонент дающий возможность рисовать. То есть компонент имеющий доступ к своему Canvas. Это может быть сама форма. TImage тоже дает доступ к своему Canvas. Это значит, что мы можем нарисовать эти компоненты как нам угодно. Преобразить их до неузнаваемости. Для вашего проекта и для начала рекомендую использовать саму TForm, хотя Вы сами можете порыть компоненты и выбрать любой. На этом этапе замечу, что все визуальные компоненты в Delphi это свойство содержат, просто они бывают скрыты и добраться до них Canvas потребует от Вас больше знаний и понимания что такое ООП. Большинтво визуальных компонентов унаследованы в Delphi (VCL) от TControl/TWinControl. (Смотри базовые принципы ООП - унаследование)
2 - Это сигнал, действие для старта. Иными словами это какое то событие, которое должно заставить наше ПО что-то выполнить/перерисовать. Понимайте, что событие не инициализируется само по себе, его инициализирует операционная система. В DELPHI, для VCL это событие чаще всего опубликовано как метод Repaint - дает старт, а код внутри события OnPaint - если он опубликован (есть в TForm) определяет как рисовать. inherited - внутри самого метода(onPaint например) говорит следующее - сначала нарисуй как должно быть, а потом рисуй что скажу я. Если убрать inherited, то приложение нарисует только то, что ты напишешь. Замечу,среда(Delphi,Embracadero) дает неограниченные возможности для переопределений свойств, методов и прочего, но тут все зависит от знаний и понимания ООП. Что такое inherited советую почитать отдельно. В 2 словах это не пояснить, inherited не относиться к рисованию, это более глобальный операнд, если грубо он определяет, необходимо ли "применять" к дочернему элементу код этого же метода родителя или нет.
3 - Рисование объекта должно быть по изначально подготовленным данным. Не верно "на лету" что-то "исполнять", рисование, это достаточно ресурсоемкий процесс и выполнять его надо как можно реже и без лишних телодвижений. Перед тем как выполнить рисование, нужно четко знать что рисовать и где. Поэтому тут изначально необходима база данных(в нашем случае это обычный массив 3 на 3), так-же тут потребуются макеты рисунков крестика,нолика и пустой области. Эти макеты можно сразу добавить в проект, поместив их скажем в ImageList либо бдуем грузить с файла напрямую. Обращаю внимание, рисунки будут в 1 экземпляре, об этом Вам говорил Arigato.
4 - Так-как это игра, то при ходе Пользователя, решать ничего не надо, нужно реализовать установку значения в нужную область массива (3 x 3) то, что выбрал пользователь (крестик или нолик). Для хода компьютера, необходимо реализовать искусственный интеллект, который и решит в какую область массива и какое значение нужно поставить. Тут понятно, что значение может быть два, либо 0 либо 1. Но суть одна, неважно кто делает ход, результатом операции будет лишь изменение значения в массиве и вызов RePaint, чтобы наш визуальный объект нарисовал все по новому.

Итог:
1 - на написание этого ответа, ушло больше времени, чем на реализацию бы самого проекта, но важно, чтобы вы поняли, а не тупо следовали инструкциям и в будущем сами бы писали инструкции
2 - определите длину стороны квадрата. Ваши рисунки - квадрат, надо знать заранее его габариты. Его длину рекомендую высчитывать динамически отталкиваясь от области в которой Component для отображения будет размещен. Для таких расчетов вы можете использовать метод/событие OnResize этого компонента.
3 - для рисование на канве используйте метод Component.Canvas.Draw(X,Y,TBitMap). Где X отступ слева, Y отступ сверху, TBitMap сам рисунок (он должен быть размером см.пункт 2). C X и Y мог перепутать
местами, поскольку пишу сразу из головы,а с VCL работал года 2 тому назад последний раз.
4 - габариты для Component прописывайте как Width = длинна массива * длину квадрата (3 * 50), Height = ширина массива * длину квадрата. Пишите сразу динамически, вдруг в будущем вы сделаете крестики и нолики не 3 на 3, а 9 на 9 например. Это условие актуально для 2 пункта. Интересная задача будет, определить оптимальные габариты для Component и оптимальную длину стороны квадрата,результатом будут оптимальные габариты игрового поля в зависимости от параметров вашей базы данных(массива 3 x 3 или какой то другой размер) и доступной отображаемой областью
5 - удачи в кодинге - будут вопросы пиши тут или на почту programistvcrb@yandex.ru. Там быстрее отвечу.
6 - Ну и если ты это все понял, Welcom в основы ООП =))

P/S: Поскольку вы задаете подобные вопросы,я просто призываю Вас с этим разобраться! Все программисты делятся на 2 типа: программист и идиот копипастер. К какому типу вы хотите относить себя - решать Вам! Качество хорошего кода определятся не его работоспособностью на текущий момент времени, а его работоспособностью при изменении условий =)) Желаю удачи и поменьше кофе))!
Пишу много и развернуто

Последний раз редактировалось Heneken87; 30.01.2021 в 21:46.
Heneken87 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Крестики и нолики Саша85 Gamedev - cоздание игр: Unity, OpenGL, DirectX 8 03.10.2013 19:12
крестики нолики) Тамерлан Абилов Паскаль, Turbo Pascal, PascalABC.NET 6 02.09.2013 21:25
крестики нолики mixon-21 Помощь студентам 1 04.08.2013 22:13
Крестики-Нолики Linker88 Паскаль, Turbo Pascal, PascalABC.NET 14 30.06.2009 22:24
Крестики нолики aud Паскаль, Turbo Pascal, PascalABC.NET 2 15.06.2009 22:32