Мне не нравится, потому не конвертировал, кому надо, найдете по тегу flash конвертер в экзешники.
Но оставлю это здесь в рамках сохранения HTML-памятников истории и культуры.
Коллекция Flash-игр #3

Все сконвертировано в экзешники и запускается на всех виндах, начиная с XP, флэш-плеер/плагин не нужен.
Азартные: 777 - симулятор "Однорукого бандита" naperstok - игра в наперстки ochko - Очко ochko_s_bo - Очко с зайцем Бо Драки: Boks - Бокс kapojero - капоэйра samurai - файтинг Хип-Хоп: ebosh_skrejchi - симулятор диджея Квесты: princeofpercia - римейк досовского "Принца Персии" Логические: krestiki_noliki - Крестики-нолики shakhmaty - Шахматы Спортивные: futbol - футбол kyorling - керлинг motiki - гонки на мотоциклах skejt - скейт tennis - Пинг-понг
Еще одна коллекция Flash-игр
Все перекодировано в экзешники, совместимо со всеми Windows от XP до 10.

2 — надо спасать милых шарообразных существ от попадания в кислоту и другие неприятности
8_figur — надо расположить 8 шахматных фигур, чтоб они не стояли на одной прямой или диагонали
bobry_i_futbol — Бобры и футбол
bubble — надо порвести мыльный пузырь по лабиринту
CAT_bowling — боулинг, вместо кеглей коты
cat_kill — стреляем котами (аналог классических «Пингвинов», только с котами)
catjump — аналог динозаврика Google, только с котом
Crazy_Race — гоночный симулятор
cubshoot3 — еще один аналог «Пингвинов», но я не понял, как играть
dead_morozzz — Пьяный Санта
dead_morozzz2 — Пьяный Санта 2
deathjunior3 — ученик Смерти
e-states — Захвати все США (мини-стратегия)
headspace — леталка, надо отбиваться от НЛО
heliattak3 — простенький платформер
hovercraftgame — лабиринт, аналог мыльного пузыря
Immigrant — вы перешли мексиканскую границу, надо свалить от ментов!
lesnik [НЕПОЛИТКОРРЕКТНО] — мочи пидорасов, иначе выебут!
Missile_strike — надо защищать базу от метеоритов
muravji — мочи тараканов, иначе жильцы разбегутся!
nu_pogodi — симулятор игры «Ну, погоди»
Opol4enezIraka — симулятор чмобика
Orbox — головоломка
Panic — симулятор пользователя ПК
pong — Пинг-понг
security — очередной лабиринт, избегайте камер наблюдения
skakalka — симулятор скакалки, садистский и неполиткорректный (можно расчленить негра)
Smehun — логическая игра, надо не взять последний шарик.
Snezhki — замочи снежками российских звезд, политкорректная игра
Strelbishe
xiaoxiao6
xiaoxiao8
xiaoxiao9 — файтинг рисованных человечков
yozh — платформер, играем за ежика
zamok — классический «расстрел замка», есть возможность играть вдвоем
zmeyka — Змейка, почти как на Nokia 3310
zmeyka2 — еще один вариант Змейки
Lazarus: Crt, WinCrt, русский язык и нажатие клавиши в консоли.
Понадобилось сделать что-то типа такого:
Файл уже существует. Заменить? [Y/N]
Вспомнил, что в Турбопаскале была функция ReadKey
из модуля Crt
, а вдруг и во FreePascal есть?
Есть, но модуль Crt
делает глюк русскому языку:
program TestCrt; uses Crt; var Ch:char; begin WriteLn('Нажмите любую клавишу...'); Ch:=ReadKey; end.

Ладно, пробуем заменить Crt
на WinCrt
.
Глюк с русским языком пропал, но функция ReadKey
на нажатие клавиш не реагирует, да пиздец, еб твою мать!
В общем, долго плевался, реализовал через TKeyEvent
из модуля Keyboard
:
uses SysUtils,Keyboard; function Ask(FilePath:UnicodeString):boolean; var K: TKeyEvent; KS:String; begin WriteLn ('File ', FilePath, ' is exists! Replace file? [Y/N]'); InitKeyBoard; while true do begin K:=GetKeyEvent; K:=TranslateKeyEvent(K); KS:=KeyEventToString(K); if (KS='Y') or (KS='y') then begin DoneKeyBoard; exit(true); end; if (KS='N') or (KS='n') then begin DoneKeyBoard; exit(false); end; end; DoneKeyBoard; exit(false); end;
Lazarus, сортировка TStringList.
Иногда список строк (TStringList
) требуется сортировать, что, как бы, понятно. Но во Freepascal сортировка устроена довольно странно, в C# у аналогичного класса из коробки несколько больше возможностей, во всяком случае, можно поменять направление, по возрастанию или по убыванию. С хитрыми сортировками, конечно, тоже вылезает нетривиальщина, но на то они и хитрые сортировки.
Для начала сформируем тестовые списки, для русского и английского языков. Там код тривиален, потому не буду загружать заметку, ссылки на PasteBin:
Тестовый список для английского языка
Тестовый список для русского языка
Заодно уж и выведем списки в их изначальном виде:


Она же единственная из коробки, является стандартной сортировкой по возрастанию, т.е. список сортируется от меньшего к большему, а об алгоритме будет ниже. Вызов функции простой:
lstTest.Sort;
Пробуем. Выводим список на экран:
WriteLn('Сортировка по возрастанию (по-умолчанию, логическая):');
i:=0;
while i < lstTest.Count do begin
WriteLn(lstTest[i]);
inc(i);
end;
Writeln(); WriteLn('Press Enter...'); ReadLn();
Результат:

Как обычно, с поддержкой русского язкы все весело, но чинить эту поддержку в данной заметке не буду. Кому сильно надо — пишите.
Алгоритм:
1. Строки сравниваются посимвольно. Например, в словах parrot
и puppy
первые символы (p
и p
) равны, а далее a
меньше u
, т.е u
в кодовой таблице находится ниже, чем a
.
2. На этом сравнение прекращается, строка puppy
больше чем parrot
.
3. Если начальные символы строк совпадают, то в дело вступает длина, чем строка длиннее, тем она больше, поэтому, зависимая от центра Каталония, все еще больше, чем кот, который гуляет сам по себе:
program test; var S1:string; S2:string; begin S1:='cat'; S2:='catalonia'; if S1 < S2 then Writeln ('S1 (',S1,') < S2 (',S2,')' ); if S1 = S2 then Writeln ('S1 (',S1,') = S2 (',S2,')' ); if S1 > S2 then Writeln ('S1 (',S1,') > S2 (',S2,')' ); Readln(); end.
Вывод:
S1 (cat) < S2 (catalonia)
Что, конечно, печально, потому что кот свободнее Каталонии, и явно больше в этом смысле.
Ограничение, накладываемое одной функцией сортировки в комплекте класса TStringList
легко решается тем, что можно подключить любую пользовательскую сортировку ссылкой на внешнюю функцию.
Для этого надо установить пользовательскую функцию сортировки, таким вот образом:
lstTest.CustomSort(@MySort);
где MySort
— имя вашей функции сортировки. Естественно, она должна быть заранее создана, чтобы все откомпилировалось и заработало.
Не забудьте про символ @ перед именем функции, в Delphi не надо было его указывать, компилятор сам знал, где вместо имени функции вставить ссылку на ее адрес, в freepascal это надо указывать явно.
Формат функции следующий:
MySort(List: TStringList; Index1, Index2: Integer): Integer;
Т.е. на входе нужна переменная типа TStringList
и две переменные типа Integer
, для индексов строк в списке, функция должна возвращать значение типа Integer
:
1
— Если строка Index1 > Index2
0
— Если строки равны
-1
— Если строка Index1 < Index2
Конечно, по мнению пользовательского алгоритма сортировки. Например, можем повторить стандартный метод сортировки:
function SortByAsc(List: TStringList; Index1, Index2: Integer): Integer; begin if List[Index1]>List[Index2] then begin Result := 1; Exit; end; if List[Index1]=List[Index2] then Result := 0 else Result := -1; end;

Внезапно, починился русский язкы 🙂
function SortByDesc(List: TStringList; Index1, Index2: Integer): Integer; begin if List[Index1]<List[Index2] then begin Result := 1; Exit; end; if List[Index1]=List[Index2] then Result := 0 else Result := -1; end;
Вообще просто, достаточно заменить знак >
на <
в операторе сравнения.

Возможности пользовательских сортировок не ограничены практически ничем. Покажу, как обычно, самое простое — сортировка строк по длине.
Сортировка по возрастанию:
function SortByLenAsc(List: TStringList; Index1, Index2: Integer): Integer; begin if Length(List[Index1])>Length(List[Index2]) then begin Result := 1; Exit; end; if Length(List[Index1])=Length(List[Index2]) then Result := 0 else Result := -1; end;
Т.е. просто применяем функцию Length
в операторе сравнения:
Length(List[Index1])

Тот же вариант, но по убыванию:
function SortByLenDesc(List: TStringList; Index1, Index2: Integer): Integer; begin if Length(List[Index1])<Length(List[Index2]) then begin Result := 1; Exit; end; if Length(List[Index1])=Length(List[Index2]) then Result := 0 else Result := -1; end;

Пример для английского языка на GitHub
Пример для русского языка на GitHub
Обсуждения на Исходниках, но более подробнее и лучше у меня.