Мое творчество. Игра Шахматный сапёр

Видео, книги, журналы, научные статьи, (по тематике форума), наше творчество
Аватара пользователя
Андрей
Архитектор
Сообщения: 5528
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов
Благодарил (а): 479 раз
Поблагодарили: 390 раз

Re: Мое творчество. Игра Шахматный сапёр

Сообщение Андрей » 30 ноя 2020, 11:50

Михаил Киселев писал(а):
30 ноя 2020, 10:56
судя по дизайну, вы используете массив button-элементов, хотя проще использовать StringGrid или DrawGrid (это готовая таблица из ячеек, и к ней легко применим матричный принцип обработки данных).
С этим я согласен. Но какой смысл менять то, что уже хорошо работает? Есть такая пословица у американцев: "Не надо чинить то, что не сломано".

Если же при переносе на Андроид (чему пока препятствует сетевой код, нужно его дорабатывать) окажется, что данный элемент интерфейса там будет выглядеть лучше (в чём я сомневаюсь, потому что на PC каждая кнопка имеет выпуклость, тени, состояние нажатия и на PC точно красивее выглядят кнопки), то можно подумать о переделке.

===

Также у нас используется наложение картинок на кнопки (TBitBtn). StringGrid сразу отметается.
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.

Аватара пользователя
Андрей
Архитектор
Сообщения: 5528
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов
Благодарил (а): 479 раз
Поблагодарили: 390 раз

Re: Мое творчество. Игра Шахматный сапёр

Сообщение Андрей » 01 дек 2020, 18:04

Многие новички в программировании на Delphi озадачены изменением громкости системы в своих приложениях. Во многих форумах пишут код весьма замудренным. Я решил максимально просто показать код процедуры изменения громкости в системе. Вот собственно и сам код:

Код: Выделить всё

uses
   MMSystem;
 ...
 procedure SetVolume(const volL, volR: Word);
 var
   hWO: HWAVEOUT;
   waveF: TWAVEFORMATEX;
   vol: DWORD;
 begin
  FillChar(waveF, SizeOf(waveF), 0);
  waveOutOpen(@hWO, WAVE_MAPPER, @waveF, 0, 0, 0);
   vol := volL + volR shl 16;
  waveOutSetVolume(hWO, vol);
   waveOutClose(hWO);
 end;
Кидаем на форму TrackBar, в палитре свойств прописываем: min=0, max=65535.
В событии OnChange пишем:

Код: Выделить всё

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  SetVolume(trackbar1.position, trackbar1.position);
end; 
Получить громкость:
http://rusproject.narod.ru/winapi/w/wav ... olume.html

Код: Выделить всё

function GetVolume: Word;
var Woc : TWaveOutCaps;
    vol : DWORD;
   numV : byte;
begin
  result:=0;
  if WaveOutGetDevCaps(WAVE_MAPPER, @Woc, sizeof(Woc)) = MMSYSERR_NOERROR then
    begin
    if (Woc.dwSupport and WAVECAPS_LRVOLUME) = WAVECAPS_LRVOLUME then numV := 2
                                                                 else numV := 1;
    WaveOutGetVolume(WAVE_MAPPER, @vol);
    if numV=1 then Result:=vol AND 65535  // единственный канал
              else Result:=vol AND 65535; // левый канал
    end;
end;
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.

Аватара пользователя
Андрей
Архитектор
Сообщения: 5528
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов
Благодарил (а): 479 раз
Поблагодарили: 390 раз

Re: Мое творчество. Игра Шахматный сапёр

Сообщение Андрей » 05 дек 2020, 21:43

Работа с компонентами Ararat Synapse

Послать пакет на порт:

Код: Выделить всё

uses blcksock;
var sock: TUDPBlockSocket;
...
procedure SendString;
begin
  sock:=TUDPBlockSocket.Create;
  try
    sock.Connect ('62.16.155.77', '5001');
    if sock.LastError<>0 then begin ShowMessage ('error'); exit; end;
    sock.SendString ('delivered via UDP');
  finally
    sock.Free;
  end;
end;
Слушать порт (UDP Server):

Код: Выделить всё

procedure TSomeThread.Execute;
var
  sock: TUDPBlockSocket;
  size: integer;
  buf: string;
begin
  sock:=TUDPBlockSocket.Create;
  try
    sock.Bind('0.0.0.0','5001');
    if sock.LastError<>0 then begin ShowMessage ('error'); exit; end;
    while True do
      begin
        if terminated then break;
	buf := sock.RecvPacket(1000);
	if sock.lasterror=0 then
	  begin
          // do something with data and prepare response data
          sock.SendString(Buf);
          end;
        sleep(1);
      end;
    sock.CloseSocket;
  finally
    sock.Free;
  end;
end;
http://synapse.ararat.cz/doku.php/publi ... :udpserver

https://webdelphi.ru/2013/12/kniga-o-sy ... -0-sokety/

https://webdelphi.ru/2011/03/post-dlya- ... -v-google/
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.

Аватара пользователя
Андрей
Архитектор
Сообщения: 5528
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов
Благодарил (а): 479 раз
Поблагодарили: 390 раз

Re: Мое творчество. Игра Шахматный сапёр

Сообщение Андрей » 06 дек 2020, 02:57

Удалось мне сделать UDP-чат на компонентах Ararat Synapse. Причём столкнулся с той же проблемой, что и на Indy - не отправлял ответный пакет за NAT. И решение то же: экземпляр объекта Сервер и экземпляр объекта Клиент внутри одной программы должны быть одним и тем же объектом (переменной).

Следующий шаг - компиляция чата под Андроид и сеанс сообщений между Андроидом и Виндой.

Чат на Синапсе делается сложнее, чем на Инди - нужно самому создавать под слушающий код отдельный поток.
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.

Аватара пользователя
Андрей
Архитектор
Сообщения: 5528
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов
Благодарил (а): 479 раз
Поблагодарили: 390 раз

Re: Мое творчество. Игра Шахматный сапёр

Сообщение Андрей » 07 дек 2020, 09:26

Андрей писал(а):
06 дек 2020, 02:57
Следующий шаг - компиляция чата под Андроид и сеанс сообщений между Андроидом и Виндой.
Проделан и следующий шаг - компиляция под Андроид при помощи LAMW и сеанс сообщений. Сетевой код для ШС под Андроид готов.
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.

Аватара пользователя
Андрей
Архитектор
Сообщения: 5528
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов
Благодарил (а): 479 раз
Поблагодарили: 390 раз

Re: Мое творчество. Игра Шахматный сапёр

Сообщение Андрей » 07 дек 2020, 09:36

Реализация программы под Андроид

Для начала нам надо нарисовать игровое поле. Это будут Buttons или StringGrid, DrawGrid?

1. В Андроиде кнопки не делаются квадратными вроде. Нам надо на кнопки накладывать изображения. Есть ли там BitBtn?
2. Есть ли там StringGrid, DrawGrid?
3. Как в Андроиде будут выглядеть юникодные шахматные шрифты? Нужна проверка.
4. Сможем ли мы уместить 2 поля и чат на одном экране или свайп лево-право будет переключать поля?
5. Специфичные жесты на Андроиде: "тач", "тап", "свайп" (https://yandex.ru/turbo/mob-mobile.ru/s ... sleng.html). Как их использовать при помощи компонентов Lazarus и рассчитаны ли на это компоненты Lazarus?

Под компонентами Lazarus я имею в виду Android-bridges компоненты из комплекта LAMW - Lazarus Android Module Wizard (jButton, jTextView).
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.

Аватара пользователя
Андрей
Архитектор
Сообщения: 5528
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов
Благодарил (а): 479 раз
Поблагодарили: 390 раз

Re: Мое творчество. Игра Шахматный сапёр

Сообщение Андрей » 10 дек 2020, 10:59

Версия игры Шахматный сапёр 2.89 имеет следующие улучшения:

+ Добавлена плавная регулировка громкости звуков в игре, которая сохраняется в системе
+ Возможно полное отключение звука (уровень = 0)
+ Улучшен дизайн формы НАСТРОЙКИ
+ Улучшена графика игры (заменены стрелки)
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.

Аватара пользователя
Андрей
Архитектор
Сообщения: 5528
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов
Благодарил (а): 479 раз
Поблагодарили: 390 раз

Re: Мое творчество. Игра Шахматный сапёр

Сообщение Андрей » 13 дек 2020, 18:59

Некоторые ответы по Андроиду:

- jButton нельзя делать квадратными
+ Шахматные шрифты на Андроиде есть и они хорошо отображаются
+ На Андроиде есть jImageBtn и они по умолчанию квадратные
- Эти jImageBtn при добавлении на форму вызывают ошибку компиляции APK, так что проверить их в деле не удалось

пока всё...
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.

Аватара пользователя
Андрей
Архитектор
Сообщения: 5528
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов
Благодарил (а): 479 раз
Поблагодарили: 390 раз

Re: Мое творчество. Игра Шахматный сапёр

Сообщение Андрей » 19 дек 2020, 13:37

Возможно, jImageBtn при добавлении на форму вызывали ошибку компиляции APK из-за того, что я не добавил (загрузил) сами картинки на эти кнопки. То есть голая кнопка без картинки вызывает ошибку.

Пока не проверял эту версию...
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.

Аватара пользователя
Андрей
Архитектор
Сообщения: 5528
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов
Благодарил (а): 479 раз
Поблагодарили: 390 раз

Re: Мое творчество. Игра Шахматный сапёр

Сообщение Андрей » 28 дек 2020, 20:31

В результате сетевых тестов 2.89 на ОЧЕНЬ плохих сетях было найдено несколько недочётов:

- если нужно угадать фигуру и она была выбрана и нажата, а пакет не дошёл - не происходит никакого события.
метод решения: до момента приёма подтверждения о доставке нужно повторно в цикле слать пакеты до победного конца (как было сделано с уведомлением о расстановке)

- если поменять Имя игрока во время игры, оно не меняется в заголовке формы
+ методом подбора найдено более точное значение для циклов ожиданий, 900 000 циклов вместо 3 000 000
- не написано внизу что Сетевая игра начинается (просто пишет "кликами мыши выставите фигуры")

ничего я не забыл, Михаил?
Я спокоен, я возвышаюсь над землёю,
Притягиваю взгляды, знаю, Бог всегда со мною,
Не скрою - планов наперёд не строю,
О том, что было раньше, шепчут годы за спиною.