Согласен с wernher - GOTO явно лишний оператор в этой программе! Его нужно использовать лишь в крайнем случае, когда по другому получится сложнее. Но не нужно его пихать везде, даже там, где без него можно обойтись. И кроме того, для такой задачи вполне подойдет консоль, зачем было использовать "игровой" 2D режим?
Вот мой вариант такой игры, правда на PureBasic.
Code
If OpenConsole() Print("Введите ваше имя: ") name$=Input() Print("Сколько вам лет? ") age=Val(Input()) If age=0 : age=1 : EndIf PrintN("Ваше имя '"+name$+"', вам "+Str(age)+" лет")
Repeat Print("Вы можете пойти в ДОМ, можете погладить КОТа ") ; Пишем текст action$=LCase(Input()) ;Читаем If action$ = "дом" PrintN("Вы в доме!!!") ;Мы дома=) ElseIf action$ = "кот" PrintN("Вы погладили вашего кота и он остался довольным :)") ; Ммяяяяяяуууууууу Else MessageRequester("","Только 'дом' или 'кот'. Попробуйте сначала",48) EndIf PrintN("") ForEver
TubeRoll.bat упакован (сжат) и кстати, он у меня не запускается! Если он не сжат, то почему его WinRAR не сживает, а? В распакованном виде будет примерно 16 КБ!
Какие библиотеки? Скачайте демо-версию PureBasic и установите, а затем посмотрите что в папках PureLibraries и SubSystems. Ознакомится с описанием всех функций этих библиотек, можно здесь (правая колонка). Именно от них (их использования), во многом зависит размер исполняемого файла. Но если не использовать функции этих библиотек, а юзать исключительно API, то размер будет вообще крошечным, но время разработки увеличится и пропадет кроссплатформенность кода.
Уточняйте в таких случаях, что это заслуга FASM, а не вашего all inclusive языка
Это не столько заслуга FASM, сколько продуманность организации библиотек функций. Многие библиотеки написаны на ассемблере, а это существенно повышает скорость программ и уменьшает их размер. Кроме того, runtime всегда статически линкуется с программой. В исполняемый файл будут добавлены только реально использованные функции, а не все подряд. Это так же позволяет свести к минимуму размер исполняемого файла и гарантирует что прога будет работать на любом компе, а не ныть что нужная DLL не найдена, как это бывает с VB6. Скажем, на PureBasic реально написать программу со статической линковкой runtime создающей окно, и имеющей размер, всего 2.5 КБ и это без каких-либо ухищрений и оптимизаций - просто написал и скомпилировал прогу.
настало время изучить ещё один бейсик, самый крутой - VB
Ну с этим можно поспорить какой бейсик самый крутой. PureBasic, весьма хорош и во многих моментах "сделает" VB, особенно если программируешь под Linux или MacOS X. А еще, он в отличии от Microsoft Visual Basic 2008 не требует .NET, а ведь он отсутствует в чистых дистрибутивах WinXP! На сколько мне известно, по скорости работы прог, PureBasic может лишь обойти FreeBasic, а VB плетется далеко в хвосте! А по размеру исполняемого файла, у PureBasic кажется нет конкурентов среди бейсиков, при статической линковке runtime.
Сообщение отредактировал PBPROG - Четверг, 24 Марта 2011, 01:46
Ну какбы надо было уточнить с самого начала, что это не самостоятельный компилятор, а надстройка с синтаксисом бейсика.
Это не имеет значения. FASM всего лишь промежуточное звено в компиляции программы.
Quote (Stage)
Паскаль как язык вобще не нужен.
Под паскалем можно подразумевать так же дельфи.
Quote (Stage)
Будет кроссплатформенным исходный код, а не сама программа.
Разве я что-то писал про кроссплатформенность исполняемых файлов? Ежу понятно что в данном случае она существует на уровне исходного текста.
Quote (Stage)
А что если появится нужда заюзать системное api, не описанное в макросах пурбейсика?
Если действительно понадобится кроссплатформенность программы, юзающей системные API, то обычно используют условную компиляцию. Здесь подробнее это этом http://pure-basic.narod.ru/docs/MultiOS.html
Quote (Stage)
Может быть полезен, когда есть необходимость быстро накатать native программу без лишнего мусора.
По вашему это редко бывает?
Сообщение отредактировал PBPROG - Суббота, 19 Марта 2011, 00:33
Как вам после этого в голову пришло сравнивать скорость исполнения чистого ассемблера с vb6/vb.net?
Вы предлагаете использовать vb6/vb.net. Так? Вот и сравнил их скорости с PureBasic.
Quote (Stage)
Я говорил не про "компилятор" пурбейсика, а про сам язык.
Как вы определяете что язык устаревший? Если по времени его создания, то в этом случае, паскаль и Си тоже устаревшие, а ассемблер давно пора списать по выслуге лет, но по факту ведь это не так? Так как же вы определили что язык устарел? По каким критериям?
Quote (Stage)
Ваш язык процедурный, так?
Так-то оно так, но если нужно, можно писать в ООП стиле, посредством интерфейсов.
Quote (Stage)
Что мешает выбрать fasm напрямую
То, что разработать программу на PureBasic во много раз проще чем на фасме и она к тому же будет кроссплатформенная чего сложно достичь, кодя на ассемблере.
если я хочу нативный бинарник под win почему бы не взять VB6?
Во первых, VB6 уступает в несколько раз, в скорости работы исполняемого файла. Во вторых, в юзая VB6 придется ручками объявлять WinAPI функции, а в PureBasic они уже объявлены. В третих, VB6 только для винды, и если захочится перенести код на Linux или MacOS X, то VB6 тут не помощник (мелкософт не поддерживает другие платформы), а вот PureBasic позволит создать проги для выше перечисленных платформ. И к тому же, PureBasic в отличие от VB6, не использует runtime библиотеку.
Quote (Stage)
Если я хочу быстро набыдлокодить, почему бы мне не выбрать VB.NET c огромным количеством библиотек и развитым коммьюнити?
Уж поверьте, у PureBasic возможностей и библиотек не меньше! Но он позволяет создавать нативные проги даже для Win95 что VB.NET с его .NET даже и не снится!
Quote (Stage)
Какой смысл форсировать свою реализацию устаревшего бейсика
С чего вы взяли что он устаревший? PureBasic постоянно развивается и текущий релиз 4.51 был в сентябре 2010 года. Сначала ознакомтесь с сабжем, прежде чем писать такой бред.
PureBasic не требует .NET Framework Библиотека после установки, интегрируется со средой и ее код добавляется в исполняемый файл при компиляции. В итоге программе состоит из одного исполняемого файле не требующего runtime или .NET. Кроме того, программа на PureBasic будет работать быстрее и требовать меньше ресурсов чем аналогичная на VB.NET, но при этом сложность создания программы не увеличится.
PS. Что-то не могу найти пример самораспаковывающегося архива на VB.NET - гугл молчит. Может это не возможно из-за особенности технологии .NET? А на PureBasic, ссылка на пример выше.
И кроме того, программы на PureBasic без установки дополнительных компонентов запускаются даже на древних компах, с Windows 98, а прогу на VB.NET на них не запустишь!
Сообщение отредактировал PBPROG - Вторник, 15 Марта 2011, 10:38
На просторах инета нашел интересную на мой взгляд статью о работе с ZIP архивами, может еще кому будет интересна.
---------------------------------------------
Для уменьшения размера файлов, их обычно сжимают - архивируют. Существует много типов архивов, но сейчас мы поговорим о ZIP архивах.
Для работы с ZIP архивами, нужно скачать и установить библиотеку PureZIP.
Теперь создадим простейшую программу, упаковывающую один файл в архив.
Code
; Создаем архив с именем MyArchive.ZIP в корне диска C: If PureZIP_Archive_Create("C:\MyArchive.ZIP",#APPEND_STATUS_CREATE) If PureZIP_Archive_Compress("C:\WINDOWS\NOTEPAD.exe",#False)=#Z_OK MessageRequester("","Файл успешно добавлен в архив", 64) Else MessageRequester("","Ошибка при добавлении файла в архив", 48) EndIf PureZIP_Archive_Close(); Закрываем файл архива. Else MessageRequester("","Не удалось создать архив", 64) EndIf End
Как видите, этот код, создает архив с именем MyArchive.ZIP на диске C:. Если архив был успешно создан, то в него добавляется файл NOTEPAD.exe, расположенный в системной папке ОС. Этот архив можно открыть любым архиватором, поддерживающим работу с ZIP, например WinRAR.
Нужно отметить, в некоторых операционных системах, архив может не создастся на диске, из-за отсутствия прав доступа к диску C:, который обычно является системным диском. Если такое произошло (появилось сообщение "Не удалось создать архив"), то просто укажите другое место сохранения архива. Это же касается и добавляемого файла, к которому задан абсолютный путь. Вполне возможно что путь к системной папке окажется другим и файл NOTEPAD.exe не будет обнаружен. В этом случае, нужно указать правильный путь или выбрать другой файл для архивирования.
Теперь создадим заготовку для программы архивирования и распаковки множества файлов и папок.
Repeat ; Главный цикл Repeat - Until Event = WaitWindowEvent(); Идентификатор события
If Event =#PB_Event_Gadget Select EventGadget(); Идентификатор гаджета по которому кликнули Case #Button_1; Кнопка выбора папки с файлами Path.s=PathRequester("Укажите путь к архивируемым файлам","") If FileSize(Path)=-2 ; Папка существует SetGadgetText(#String_0, Path) EndIf
Case #Button_2; Кнопка выбора места сохранения архива File.s=SaveFileRequester("","","ZIP архивы|*.zip|Все файлы|*.*",0) If File<>"" If GetExtensionPart(File)=""; Неуказанно расширение файла File+".zip" EndIf SetGadgetText(#String_1, File) EndIf
Case #Button_Archive; Кнопка создания архива String1.s=GetGadgetText(#String_0) String2.s=GetGadgetText(#String_1) If String1<>"" And String2<>"" Password.s = GetGadgetText(#String_Password); Пароль архива PureZIP_SetArchivePassword(Password) Button_Archive(String1, String2) Else MessageRequester("","Заполните поля!", 48) EndIf EndSelect EndIf
Until Event =#PB_Event_CloseWindow
Процедура Open_Window_0 создает окно со всеми гаджетами (текстовыми надписями, полями ввода текста, кнопками, прогресс-барами и т. д.). Процедуры File_Progress и All_Progress служат для отображения текущего прогресса обработки файла и общего прогресса, соответственно. А процедура Button_Archive, вызывается при каждом клике по кнопке с надписью "Создать архив" и ей через аргументы, передаются путь к папке и файлу, находящийся в соответствующих полях окна программы. От кода данной процедуры, зависит поведение программы при клике по этой кнопке.
Программа начинает выполнятся с вызова процедуры Open_Window_0, которая создает окно со всеми гаджетами. Далее, в библиотеке PureZIP с помощью функций PureZIP_SetCompressionCallback и PureZIP_SetProgressionCallback регистрируются процедуры, отвечающие за отображения текущего прогресса обработки файла и общего прогресса архивирования. Символ @ перед именем процедуры необходим для получения указателя на процедуру, соответствующего ее первому байту кода. После чего следует главный цикл программы, код которого расположен между операторами Repeat и Until. Работа цикла прервется при закрытии окна. В цикле определяется текущее событие и если произошел клик по гаджету, (событие #PB_Event_Gadget) производится идентификация гаждета, по которому кликнули и выполнение соответствующего кода. При клике по кнопке с идентификатором #Button_Archive (с надписью "Создать архив") считываются данные со строковых полей (хранящих пути в папке и файлу) в строковые переменные с именами String1 и String2, а затем, проверяется чтобы в переменных были данные. Затем, устанавливается пароль архива при помощи функции PureZIP_SetArchivePassword. После чего вызывается процедура Button_Archive, от кода которой будут зависеть дальнейшее поведение программы. В данной версии программы, в этой процедуре находится только код, отображающий небольшое окно с сообщением что "Функция не реализована".
Теперь давайте немного изменим код процедуры Button_Archive, таким образом, чтобы программа могла создать архив из файлов выбранной папки. Замените эту процедуру вот такой:
Code
Procedure Button_Archive(Directory.s, File.s) If PureZIP_AddFiles(File, Directory+"*.*", #PureZIP_StorePathRelative, #PureZIP_Recursive) <> 0 MessageRequester("", "Архив успешно создан", 64) Else MessageRequester("", "Произошла ошибка при создании архива", 16) EndIf EndProcedure
Упаковывает файлы в архив, функция PureZIP_AddFiles. Ее первый аргумент - полный путь к создаваемому архиву в месте с его именем и расширением. Во втором аргументе, указан путь к папке с файлами, которые нужно упаковать в архиве. "*.*" - маска упаковки. В данном случае, будут упакованы все файлы, но при необходимости, можно задать расширение файлов, которые требуется упаковать, а остальные пропустить .Флаг #PureZIP_StorePathRelative означает что при упаковке, в архиве будет сохранен путь к файлам, относительно папки упаковки. Флаг #PureZIP_Recursive указывает упаковать не только содержимое выбранной папки, но и все имеющиеся подпапки. Учтите, данная функция не заменяет файлы в существующем архиве, а создает новые!
Теперь программа может создать ZIP архив (в т. ч. и защищенный паролем) из выбранной папки с файлами.
А теперь программно распакуем ZIP архив. Для этого немного модифицируем процедуру Button_Archive и заменим ею уже имеющуюся в программе.
Code
Procedure Button_Archive(Directory.s, File.s) If PureZIP_ExtractFiles(File, "*.*", Directory, #True) <> 0 MessageRequester("", "Архив успешно распакован", 64) Else MessageRequester("", "Произошла ошибка при открытии архива", 16) EndIf EndProcedure
За извлечение файлов из архива, отвечает функция PureZIP_ExtractFiles. В ее первом аргументе, указывается путь к распаковываемому архиву. Второй аргумент, задает маску распаковки, а данном случае - все файлы. Третий аргумент - папка, куда будут распакованы файлы. Ну и четвертый аргумент, указывает что при распаковке будет учитываться относительный путь, заданный при упаковке.
Лицензия покупается всего один раз (99$) и распространяется на все продукты фирмы Fantaisie Software, в т. ч. выпущенные после покупки лицензии. Это не так много и окупается после выполнения нескольких заказов создания программ. [spoiler]Но варез еще не отменили если нет возможности приобрести лицензию - продукт находится в свободном доступе в сети.
PureBasic попробуй. Он простой, но в тоже время, довольно мощный. По скорости работы скомпилированных прог, не уступает Си. Поддерживаются Windows, Linux, Mac OS X и Amiga OS. Есть компиляторы для процессоров, типа x86 (32 бита) и x64 (64 бита). Создает компактные, нативные исполняемые файлы. Короче, хорошая штука.
Сообщение отредактировал PBPROG - Вторник, 01 Марта 2011, 16:42
Другой вопрос - на чем написать проще. Из тех языков, что я знаю, проще всего оказалось на С#.
Пример создания сервера на PureBasic и обработки его событий.
Code
InitNetwork()
If CreateNetworkServer(0, 80 , #PB_Network_TCP) Repeat S_Event = NetworkServerEvent() ; Получаем тип события сервреа If S_Event ClientID = EventClient() ; Получаем идентификатор клиента Select S_Event ; Анализируем тип события серврера Case #PB_NetworkEvent_Connect ; Новый клиент подключился к серверу
Case #PB_NetworkEvent_Data ; От клинета пришли данные
Case #PB_NetworkEvent_Disconnect ; Клиент разорвал соединение с сервером