Скачать программы на паскале можно бесплатно. В архиве иммется файл приложения *.exe и исходный код *.pas (при необходимости и другие файлы для корректного запуска и выполнения). Все программы проверены на работоспособность и отсутствие вирусов в исполняемых файлах.
Поиск не чувствителен к регистру. При поиске игнорируются общеупотребительные и слишком короткие слова (менее 4-х символов). Расширенный поиск производит сканирование слов как в названиях ресурсов, так и в их описаниях, в то время как обычный сканирует только названия.
Программы выводятся по релевантности (частоте вхождения слов в запрос). Необходимо отметить, что при автоматическом поиске не учитывается морфология слов, поэтому будьте внимательны при выборе падежа или склонения. Кроме того, поиск происходит по правилу “или” (or), согласно которому результаты сканирования будут положительными даже если в описании программы присутствует только одно из нескольких указанных слов.
Если желаемые программы на паскале не были найдены, необходимо переформулировать запрос либо воспользоваться поиском по разделам вручную.
Как нарисовать домик в PascalABC.NET ?
Программы на паскале отсортированы по 18 разделам (игры, графика, …), благодаря чему даже самостоятельный поиск не займет много времени. Программы на pascal также могут быть упорядочены по имени, дате или времени загрузки.
В течение нескольких лет программы на языке паскаль собирались из личных архивов, учебных материалов, российских и иностранных сайтов со всего мира. Процесс модернизации сайта продолжается и сейчас. Производится постоянное обновление базы программ.
Внимание: Принимаются исходники программ на паскале.
Если вы хотите помочь в продвижении сайта и у вас в наличии имеются готовые программы на паскале, высылайте их по указанному внизу адресу. Не забывайте подписываться.
Источник: bpascal.ru
Интересные программы на паскале abc
Пользователь
: 57
Игра Змейка на PascalABC.NET
Игра Змейка на PascalABC.NET
Изображения
Змейка.png (57.4 Кб, 63 просмотров) |
Вложения
Zmeyka.zip (25.7 Кб, 12 просмотров) |
Пользователь
: 57
uses graphWPF; begin Window.Title := ‘Змейка’; window.SetSize(20 * 30 — 10, 20 * 30 — 10); Window.IsFixedSize := True; var NewGame: boolean; var q := new queue;//очередь для нажатых клавиш OnKeyDown := procedure (k: key) → lock q do //блокируем q от второго потока в теле программы case k of key.Left: q.Enqueue(1); Key.Right: q.Enqueue(2); Key.Up: q.Enqueue(8); Key.Down: q.Enqueue(9); Key.Escape: halt(); Key.Enter: NewGame := true; //по нажатию Enter — новая игра end; repeat NewGame := false; Window.Clear; var (i, j) := (-1, 0); //координаты головы var n := 5; //длина змейки var p := 2; //направление следующего шага для головы var a := |(-1,0)|*n; //создаем массив индексов для звеньев змейки var (bi, bj) := Random2(2, 19); //координаты еды FillRectangle(bi * 30, bj * 30, 30, 30, Colors.DarkCyan); //вывод еды на экран repeat lock q do begin //блокируем q от второго потока OnKeyDown во избежание получения мусора var newp := if q.Any then q.Dequeue else p; //перебираем очередь while q.Any and (abs(newp — p) < 2) do newp := q.Dequeue; //всё не нужное выбрасываем if abs(newp — p) >2 then p := newp; //если новое направление «поворот», то записываем его в p end; case p of //меняем индекс для головы змейки в торону p 1: i -= 1; //влево 2: i += 1;//вправо 8: j -= 1;//вверх 9: j += 1;//вниз end; if i = -1 then i := 19 else if i = 20 then i := 0; //перескок от стенки до стенки в другой конец экрана if j = -1 then j := 19 else if j = 20 then j := 0; if a.Contains((i, j)) and (a[n — 1] <> (i, j)) then //проверка на столкновение головы с телом змейки begin FillRectangle(i * 30, j * 30, 30, 30, Colors.Magenta); break; end; if (i = bi) and (j = bj) then //поели? удлиняем змейку на три клетки begin n += 3; SetLength(a,n); for var f := 1 to 3 do a[n-f] := a[n — 4]; //массив змейки увеличить на 3 элемента (bi, bj) := Random2(0, 19); //новые координаты еды, которые.. while a.Contains((bi, bj)) do (bi, bj) := Random2(0, 19); //..не совпадут с телом змейки FillRectangle(bi * 30, bj * 30, 30, 30, Colors.DarkCyan);//вывод еды на экран end; var pXBOCT: integer; //направление в котором нужно затирать клетку хвоста (след после хвоста) if abs(a[n — 2].Item1 — a[n — 3].Item1 + (a[n — 2].Item2 — a[n — 3].Item2) * 2 + 3) < 6 then//не перескчили в другой край экрана? pXBOCT := (a[n — 2].Item1 — a[n — 3].Item1 + (a[n — 2].Item2 — a[n — 3].Item2) * 2 + 3); for var f := n — 1 downto 1 do a[f] := a[f — 1]; a[0] := (i, j); //каждая клетка змейки продвинулась на шаг впреред for var f := 0 to 29 do //вывод головы и затирание хвоста begin case p of //рисуем плавный шаг головы в новой клетке 1: FillRectangle(29 — f + i * 30, j * 30, 1, 30, Colors.Red); 2: FillRectangle(i * 30 + f, j * 30, 1, 30, Colors.Red); 8: FillRectangle(i * 30, 29 — f + j * 30, 30, 1, Colors.Red); 9: FillRectangle(i * 30, j * 30 + f, 30, 1, Colors.Red); end; case pXBOCT of //затираем плавно последнюю клетку хвоста 4: FillRectangle(29 — f + a[n — 1].Item1 * 30, a[n — 1].Item2 * 30, 1, 30, Colors.White); //лево 2: FillRectangle(a[n — 1].Item1 * 30 + f, a[n — 1].Item2 * 30, 1, 30, Colors.White); //право 5: FillRectangle(a[n — 1].Item1 * 30, 29 — f + a[n — 1].Item2 * 30, 30, 1, Colors.White);//вверх 1: FillRectangle(a[n — 1].Item1 * 30, a[n — 1].Item2 * 30 + f, 30, 1, Colors.White); //вниз end; sleep(7);//скорость змейки end until NewGame; repeat sleep(100) until NewGame; //ждем нажатия Enter или Escape until false; end.
Змейка на основе Queue
Самая лёгкая программа на Pascal.ABS
uses graphWPF; begin Window.Title := ‘Змейка’; window.SetSize(20 * 30 — 10, 20 * 30 — 10); Window.IsFixedSize := True; var NewGame: boolean; var q := new queue;//очередь для нажатых клавиш OnKeyDown := procedure (k: key) → lock q do //блокируем q от второго потока в теле программы case k of key.Left: q.Enqueue(1); Key.Right: q.Enqueue(2); Key.Up: q.Enqueue(8); Key.Down: q.Enqueue(9); Key.Escape: halt(); Key.Enter: NewGame := true; //по нажатию Enter — новая игра end; repeat NewGame := false; Window.Clear; var (i, j) := (-1, 0); //координаты головы var n := 5; //длина змейки var p := 2; //направление следующего шага для головы var a := new queue; //создаем массив индексов для звеньев змейки a.Enqueue((-1,0)); //голова в очередь var nn := 1; //для наращивания звеньев змейки с каждым шагом до длины n, вначале одно звено (голова) var (bi, bj) := Random2(2, 19); //координаты еды FillRectangle(bi * 30, bj * 30, 30, 30, Colors.DarkCyan); //вывод еды на экран repeat lock q do begin //блокируем q от второго потока OnKeyDown во избежание получения мусора var newp := if q.Any then q.Dequeue else p; //перебираем очередь while q.Any and (abs(newp — p) < 2) do newp := q.Dequeue; //всё не нужное выбрасываем if abs(newp — p) >2 then p := newp; //если новое направление «поворот», то записываем его в p end; case p of //меняем индекс для головы змейки в торону p 1: i -= 1; //влево 2: i += 1;//вправо 8: j -= 1;//вверх 9: j += 1;//вниз lock end; if i = -1 then i := 19 else if i = 20 then i := 0; //перескок от стенки до стенки в другой конец экрана if j = -1 then j := 19 else if j = 20 then j := 0; var XBOCT := a.Peek; //индекс хвоста (первый элемент очереди) if a.Contains((i, j)) and ( XBOCT <> (i, j)) then //проверка на столкновение головы с телом змейки begin FillRectangle(i * 30, j * 30, 30, 30, Colors.Magenta); break; end; a.Enqueue((i,j)); //новвый положение(индекс) головы в очередь if (i = bi) and (j = bj) then //поели? удлиняем змейку на три клетки begin n += 3; (bi, bj) := Random2(0, 19); //новые координаты еды, которые.. while a.Contains((bi, bj)) do (bi, bj) := Random2(0, 19); //..не совпадут с телом змейки FillRectangle(bi * 30, bj * 30, 30, 30, Colors.DarkCyan);//вывод еды на экран end; var pXBOCT: integer; //направление в котором нужно затирать клетку хвоста (след после хвоста) if abs(XBOCT.Item1 — a.ElementAt(1).Item1 + (XBOCT.Item2 — a.ElementAt(1).Item2) * 2 + 3) < 6 then//не перескчили в другой край экрана? pXBOCT := (XBOCT.Item1 — a.ElementAt(1).Item1 + (XBOCT.Item2 — a.ElementAt(1).Item2) * 2 + 3); for var f := 0 to 29 do //вывод головы и затирание хвоста begin case p of //рисуем плавный шаг головы в новой клетке 1: FillRectangle(29 — f + i * 30, j * 30, 1, 30, Colors.Red); 2: FillRectangle(i * 30 + f, j * 30, 1, 30, Colors.Red); 8: FillRectangle(i * 30, 29 — f + j * 30, 30, 1, Colors.Red); 9: FillRectangle(i * 30, j * 30 + f, 30, 1, Colors.Red); end; if n-nn = 0 then case pXBOCT of //затираем плавно последнюю клетку хвоста 4: FillRectangle(29 — f + XBOCT.Item1 * 30, XBOCT.Item2 * 30, 1, 30, Colors.White); //лево 2: FillRectangle(XBOCT.Item1 * 30 + f, XBOCT.Item2 * 30, 1, 30, Colors.White); //право 5: FillRectangle(XBOCT.Item1 * 30, 29 — f + XBOCT.Item2 * 30, 30, 1, Colors.White);//вверх 1: FillRectangle(XBOCT.Item1 * 30, XBOCT.Item2 * 30 + f, 30, 1, Colors.White); //вниз end; sleep(7);//скорость змейки end; if n-nn = 0 then a.Dequeue else nn += 1; //если змейку нужно нарастить после еды, то очередь не уменьшаем until NewGame; repeat sleep(100) until NewGame; //ждем нажатия Enter или Escape until false; end.
Последний раз редактировалось canadamoscow; 05.10.2020 в 10:11 .
Источник: www.programmersforum.ru
Игра 2048 на Pascal ABC .NET
Попросил меня однажды один человек помочь ему с курсовой. Все делали что-то простенькое, а он вот решил выделиться, замахнулся на игру, даже начал, но потом он понял, что как-то не понимает некоторых вещей, поэтому обратился за помощью ко мне
Ну а я что… Помог ему, конечно же! Да и самому было интересно! А теперь расскажу о некоторых подробностях и «возможностях» игры, а также ниже можно будет ссылку на исходники найти
Если честно, до этого мало дел имел с паскалем, к тому же, с паскалем .net!
Открыв наброски, которые тот человек уже сделал, увидел модули GraphABC, ABCObjects, с которыми раньше не приходилось работать.
Но до меня уже была часть работы сделана, а именно создание окна нужного размера и размещение «сетки» квадратиков 4х4.
Это облегчило задачу, потому что я увидел, что много схожестей есть с обычными паскалевскими объектами или графическими примитивами, а тут ещё удобство было в том, что все эти объекты (квадратики, кружочки и другие штуки) сами отвечают за свою прорисовку, не нужно рисовать на canvas-е и т.д., тут можно просто указать новую позицию или ещё как-то изменить объект, а перерисуется он уже сам!
И тут началась разработка! Никогда не приходилось до этого делать игру 2048, но найдя на просторах интернетов браузерную реализацию данной игры, пришлось поиграть в неё, опробовать разные ситуации, чтобы наглядно ознакомиться с правилами. Оттуда же были стянуты цвета и записаны в несколько чудном формате, потому что оказалось, что данный паскаль не поддерживает запись цветов через $, как это сделано в том же Delphi, например )
Вот такой вышел код, который возвращал нужный цвет текста и фона, в зависимости от цифры.
//получить цвет в зависимости от цифры function getSquareColorByNumber(num: integer): TSquareColor; begin case num of 2: result := createColor(rgb(238, 228, 218), rgb(119, 110, 101)); 4: result := createColor(rgb(237, 224, 200), rgb(119, 110, 101)); 8: result := createColor(rgb(242, 177, 121), rgb(249, 246, 242)); 16: result := createColor(rgb(245, 149, 99), rgb(249, 246, 242)); 32: result := createColor(rgb(246, 124, 95), rgb(249, 246, 242)); 64: result := createColor(rgb(246, 94, 59), rgb(249, 246, 242)); 128: result := createColor(rgb(237, 207, 114), rgb(249, 246, 242)); 256: result := createColor(rgb(237, 204, 97), rgb(249, 246, 242)); 512: result := createColor(rgb(237, 200, 80), rgb(249, 246, 242)); 1024: result := createColor(rgb(237, 197, 63), rgb(249, 246, 242)); 2048: result := createColor(rgb(237, 194, 46), rgb(249, 246, 242)); 4096: result := createColor(rgb(60, 58, 50), rgb(249, 246, 242)); else result := createColor(rgb(238, 228, 218), rgb(119, 110, 101)); end; end;
TSquareColor — это запись, хранящая в себе фоновый цвет и цвет текста. Функция createColor принимает на вход первым параметром цвет фона, а вторым — цвет текста и возвращает уже заполненную запись TSquareColor, которая потом уже используется для задания цвета определённой клеточки )
Вообще, код неплохо откомментирован. В некоторых местах даже избыточно, т.к. это курсовая работа, пришлось комментировать почти всё
А некоторые куски кода, которые можно было бы оптимизировать и вынести в отдельную функцию, лишь изменяя некоторые параметры, пришлось оставить так, как есть, задублированными… )
Поэтому всякие объяснения можно найти в коде!
Сразу скажу, что настройки размера поля, отступов клеточек друг от друга, другие отступы, настройки анимации и т.д. можно задавать тоже в коде, эти константы вынесены специально для этих целей )
Настало время показать, как это дело выглядит! А вот так:
Ничего особенного. Всё как обычно )
А в заголовке отображается ещё и количество очков. Управление то же самое, как и в классической реализации игры. Поведение тоже )
При появлении и сложении клеточек есть анимация небольшая, которая порой работает кривовато… Тут уж был задействован таймер, а также изменение размеров этих блоков. Иногда просто почему-то размер не доходит до начального состояния, и поэтому некоторые клеточки так и остаются немного больше или меньше, но это происходит редко )
Также был написан небольшой класс для показа «диалоговых» окон, который содержит в себе простенькую реализацию некоего подобия окна подтверждения (которое содержит вопрос и кнопки ОК и Отмена). Суть в том, что можно динамически создавать эти диалоговые окошки, модально показывать их, реагируют они также на нажатия клавиши Esc (отмена) и Enter (ок).
Также можно показывать просто уведомление с кнопкой Ок!
Простенько, но большего и не нужно.. ) Даже это уже было лишним
Код класса этого находится в файле controlUtils.pas, который тоже находится в архиве
Выглядят окошки примерно вот так:
Про модальные диалоги я, конечно, загнул немножко )
Вся модальность работает вот так:
procedure KeyDown(Key: integer); begin //если открыто какое-то диалоговое окно! if dialogs.modalVisible then begin case Key of VK_RETURN: dialogs.pressOK; VK_ESCAPE: dialogs.closeLastDialog(); end; exit; end; //если нет открытого диалогового окна case Key of VK_UP: move(tdUp); VK_DOWN: move(tdDown); VK_LEFT: move(tdLeft); VK_RIGHT: move(tdRight); VK_Escape: dialogs.showConfirm(‘Вы действительно хотите начать заново?’, newGame); end; end;
Обрабатываются нажатия в главном окне программы, а там уже идёт проверка, если открыто какое-то диалоговое окно, то нужно обрабатывать нажатия несколько иначе, а если же нет никаких окон, то там уж управлять игрой нужно )
При нажатии мышкой на кнопку ОК или Enter на клавиатуре срабатывает уже определённое заданное событие, которое передаётся как callback (типа того) при вызове функции dialogs.showConfirm. Как-то так оно и работает… )
Прикольно, в общем. Остальное можно найти в коде и в комментариях, которых там, как уже было сказано выше, предостаточно.
Были некоторые идеи, типа сохранения состояния игры при закрытии и восстановление при открытии, но как-то не было в этом необходимости, да и интерес через некоторое время пропал, поэтому всё осталось на таком уровне, на котором есть сейчас. К тому же, для курсовой тому человеку всех этих окошек диалоговых не нужно, поэтому на каком-то этапе он просто оставил старую версию и стал дорабатывать её по-своему )
Скачать исходник и готовый ехе-шник, который, кстати, весит довольно мало из-за .Net, можно вот в этом замечательном архиве: http://shpirat.net/etc/2048_PascalABC.NET.zip
Сделано это всё было ещё осенью, но сейчас стало можно это опубликовать, может, ещё кому-то пригодится или же просто интересно будет
Источник: shpirat.net