Полезности с брошенного сайта (часть 1)

Данный материал был опубликован на другом сайте, но сайт долгое время не развивался и в конце-концов был брошен и закрыт. Выборочно информацию из той которая на данный момент еще доступна в архиве,  я решил выложить здесь, польза я думаю будет. Я умышленно старался не менять пояснения операторов, оставляя авторскую мысль. Хотя были те, которые попали под редактирование по разным причинам.

Простой BAT файл для компиляции:

set app=1.bas
"%ProgramFiles%\FreeBasic\fbc.exe" -s gui %app% if errorlevel 1 pause

Пример инверсии рисунка (не забудьте для этого примера какой нибудь рисунок с именем 1.bmp):

Screen 19,32
Dim x As Integer ' для цикла координаты x
Dim y As Integer ' для цикла координаты y
Dim p As Integer ' цвет точки
Dim garray(921604) As Byte
Bload "1.bmp", @garray(0)
Put (0,0),garray(0) 'вывод основной картинки
''''''''''''''''''''''''''''''''''''''''''''''''''
For y=0 To 314
    For x=0 To 380
        p=point (x,y)
        Pset(x+420,y),Not(p) 'инверсия
    Next x
Next y
''''''''''''''''''''''''''''''''''''''''''''''''''''
Sleep


Генерация звука:

Sub Sound(Byval freq As Uinteger, dur As Uinteger)
    Dim t As Double,f1 As Unsigned Short
    f1 = 1193181 \ freq
    Out &h61,Inp(&h61) Or 3
    Out &h43,&hb6
    Out &h42,Lobyte(f1)
    Out &h42,Hibyte(f1)
    t=Timer
    While ((Timer - t) * 1000) < dur
        Sleep 0,1
    Wend
    Out &h61,Inp(&h61) And &hfc
End Sub

Sound(523, 60) 'C5
Sound(587, 60) 'D5
Sound(659, 60) 'E5
Sound(698, 60) 'F5
Sound(784, 60) 'G5
Sound(880, 60) 'A5
Sound(988, 60) 'B5
Sound(1046, 60) 'C6


Далее идут команды, небольшие пояснения к ним и примеры:

 

PRINT

Например, в Freebasic, Вы хотите вывести в окне надпись 'Неllo World!', Вы должны написать следующее:

 Screen 2
 Print "Hello World!"
 Sleep


 где,

  Screen 2 - это режим экрана 640x200, 16 цветов,
  Print "Hello World!" - непосредственно вывод сообщения,
  Sleep - пауза, ожидание нажатия любой клавиши.

Так же этим оператором можно записывать данные в файл:

 Open "test.txt" For Output As #1
 Print #1,"abcdef"
 Close #1

Создаётся файл test.txt и в него с помощью оператора PRINT # записывается текст "abcdef".
Так же для вывода текста , цифр в freebasic можно использовать оператор WRITE

 

LOCATE

Для вывода текста в нужное место на экране используется оператор LOCATE x,y
Где x,y - это столбцы и строки куда мы хотим вывести сообщение.
Оператор LOCATE обязательно пишется перед оператором PRINT.
Выведем нашу надпись "Hello World!" в координату 10,10

Screen 13
Locate 10,10
Print "Hello World!";
Sleep


Можете поэксперементировать, посмотреть команду Locate в цикле FOR...NEXT :

Dim i As Integer
Screen 13
For i=1 To 15
Locate i,i
Print "Hello World!";
Next i
Sleep


Конечно, для нормальной работы цикла, необходимо объявить о создании переменой i. Что мы и делаем, написав DIM i AS INTEGER
Для определения положения курсора используем функции CsrLin и POS

 

INPUT

Для ввода данных пользователем можно использовать команду INPUT. Можно вводить как строковые данные, так и числовые. Для этого, вначале, вводимую переменную нужно объявить. Мы это делаем с помощью DIM i AS INTEGER.

Dim i As Integer
Screen 13
Input "ENTER NUMBER";i
Print "NUMBER=";i
Sleep

Пользователю предлагается ввести число "ENTER NUMBER", при этом знак вопроса "?" добавляется автоматически. Так же с помощью команды INPUT # можно выводить данные из файла. Например, у нас есть файл test.txt, и в нём хранится число 12345. Следующая программка считывает переменную 'a' на экран из файла test.txt с помощью оператора INPUT #

Dim a As Integer
Open "test.txt" For Input As #1
Input #1,a
Close #1
Screen 13
Print "a=";a
Sleep

 

GOTO

Для применения безусловного перехода в Freebasic применяется оператор Goto. Для того, чтобы переход состоялся, необходимо что бы у метки, куда будет выполнен переход, стоял знак ":" . В нашем примере две метки: "odin:" и "dva:". В операторе Goto знак ":" не пишется.

Screen 13 
Goto dva 
 odin:
       Sleep 
       End 
 dva:
       Print "Welcome!" 
       Goto odin


Вначале, с помощью Screen 13 - мы включили режим экрана 320x200, далее перешли по метке "dva" с помощью Goto dva. Вывели сообщение "Welcome!" с помощью Print "Welcome!". Далее перешли с помощью Goto odin на метку "odin", где начали ожидать любое нажатие клавиши с помощью Sleep. И когда нажали клавишу, программа остановилась с помощью оператора End.

 

 FOR , NEXT

Это, пожалуй самый любимый мой оператор. Почему? Да потому что с помощью него можно сделать из ничего о-очень много! Вот посмотрите пример программки, и что она делает:

Dim i As Integer
Screen 13
For i=1 To 200 Step 10
    Line (0,i)-(200,i)
    Line (i,0)-(i,200)
Next i
Sleep


Объявили о переменной "i" типа INTEGER с помощью Dim, переключили экран - Screen 13. Далее начали цикл с оператора For, указав что переменная i ,будет изменятся от 1 до 200 (1 to 200), с шагом 10 (STEP 10). Нарисовали две линии с помощью LINE (0,i)-(200,i) и LINE (i,0)-(i,200), и начали всё это повторять, увеличивая значение переменной i с помощью оператора NEXT. Когда нарисовали - ждём, с помощью SLEEP.

 

 DIM

Для того, что бы в языке Freebasic использовать переменные, вначале программы нужно объявить о переменных, которые будут использоваться. Так же нужно указать тип переменных. Если Вы не объявите переменную и её тип, то при компиляции программы, возникнет ошибка, и программа не скомпилируется.
Всё это легко решается с помощью оператора Dim, в котором указываем имя переменной и её тип. А типов в Freebasic зарезервировано очень много. Обычно используется намного меньше. Вот программка из справочника:

Dim a As Byte
Dim b As Short
Dim c As Integer
Dim d As Longint
Dim au As Ubyte
Dim bu As Ushort
Dim cu As Uinteger
Dim du As Ulongint
Dim e As Single
Dim f As Double
Dim g As Integer Ptr
Dim h As Byte Ptr
Dim s1 As String * 10 'fixed string
Dim s2 As String 'variable length string
Dim s3 As Zstring Ptr 'zstring
s1 = "Hello World!"
s2 = "Hello World from FreeBasic!"
s3 = Allocate( Len( s2 ) + 1 )
*s3 = s2
Screen 13
Print "Byte: ";len(a)
Print "Short: ";len(b)
Print "Integer: ";len(c)
Print "Longint: ";len(d)
Print "UByte: ";len(au)
Print "UShort: ";len(bu)
Print "UInteger: ";len(cu)
Print "ULongint: ";len(du)
Print "Single: ";len(e)
Print "Double: ";len(f)
Print "Integer Pointer: ";len(g)
Print "Byte Pointer: ";len(h)
Print "Fixed String: ";len(s1)
Print "Variable String: ";len(s2)
Print "ZString: ";len(*s3)
Deallocate(s3)
Sleep


Типы переменных freebasic:

BYTE, UBYTE, SHORT, USHORT, INTEGER, UINTEGER, LONGINT и ULONGINT (64-разряда) - подмножество целочисленных типов.

SINGLE и DOUBLE - два вещественных типа

STRING * - cтроковые типы фиксированной длины

STRING - cтроковые типы переменной длины

ZSTRING - строки с завершающим нулевым байтом

 

 IF , THEN

Для того, что бы что-то сравнить в Freebasic, как и в обычно бейсике применяется оператор IF и THEN. А так же ELSE, который переводится как "Иначе", т.е. если условие IF THEN не выполнится, то выполнится то, что после ELSE. Вот наш пример:

Dim a As Integer
Screen 13
vvod:
Input "VVEDITE CHISLO OT 1 DO 5";a
If a<1 Or a>5 Then Goto vvod Else Print "VASHE CHISLO OT 1 DO 5"
Sleep


Предлагаем пользователю ввести число от 1 до 5. Пользователь вводит. И если число меньше 1 или больше 5, то мы предлагаем ввести число заново. Все сравнения мы производим с помощью IF, Then, Else.

 

 INKEY

Возвращает строковое представление нажатой пользователем клавиши. Как говорится, лучше один раз увидеть... Вот программа, использующая оператор INKEY

Dim As Integer i
Dim key As String, driver As String
Dim As Integer x,y
Screen 14,0
x=0
y=0
For i=1 To 150
    key = Inkey
    While key = "": key = Inkey: Wend
    If key=Chr(255)+"H" Then y=y-2 '' verh
    If key=Chr(255)+"P" Then y=y+2 '' vniz
    If key=Chr(255)+"M" Then x=x+2 '' pravo
    If key=Chr(255)+"K" Then x=x-2 '' vlevo
    Cls
    If key = Chr(255) + "k" Then End
    Circle(100+x,100+y),5, 50
Next i


В данной програме показано как можно, используя оператор INKEY, осуществить эффект движения маленькой окружности вверх-вниз от курсорных клавиш.
Как работает эта программа? Да очень просто, мы объявляем о переменной "key" строкой "Dim key AS STRING, driver AS STRING", и запускаем оператор INKEY в цикле "WHILE key = "": key = INKEY: WEND ". Пока не нажата ни одна клавиша, ничего не происходит, а INKEY, сканирует клавиатуру. Как только мы нажали клавишу, мы определяем с помощью строки "if key=chr(255)+"H" then y=y-2 '' verh ", нажат ли курсор вверх, если да, то уменьшаем координату "y" на 2 позиции. Очищаем экран с помощью CLS, и рисуем окружность на новой координате с помощью "circle(100+x,100+y),5, 50". Ну и так далее, пока не будет нажата кнопка "ESC", что мы вылавливаем спомощью "IF key = CHR(255) + "k" THEN END". Всё, программа остановилась.

 

CLS

Очистку экрана в freebasic можно сделать с помощью оператора CLS. Вот небольшая программа показывает как работает оператор CLS:

Dim i As Integer
For i=1 To 100
    x=int(Rnd(1)*400)
    y=int(Rnd(1)*400)
    c=int(Rnd(1)*100)
    s=int(Rnd(1)*100)
    Circle (x,y),c,s
Next i
Sleep
Cls
Sleep


В общем, тут и рассказывать нечего. Оператор CLS действует в freebasic, так же как и в консоли. Очищает экран, и всё тут.

 

COLOR

Freebasic предоставляет множество цветовых гамм, ну давайте посмотрим хотя бы 200 оттенков цветов при рисовании линии. Цвет мы указываем так: 
line (x1,y1)-(x2,y2), цвет линии.

Screen 13
Dim i As Integer
For i=1 To 200
Line (0,i)-(400,i),i
Next i
Sleep

А теперь выведем надпись 'Hello World!' в красках. Это можно сделать, указав предварительно в операторе Color цвет фона , цвет текста .

Screen 13
Cls
Color 0,1
Print "Hello World! - SINIJ"
Color 0,2
Print "Hello World! - ZELENYJ"
Color 0,3
Print "Hello World! - GOLUBOJ"
Color 0,4
Print "Hello World! - KRASNYJ"
Color 0,5
Print "Hello World! - ROZOVYJ"
Color 0,6
Print "Hello World! - KORICHNEVYJ"
Color 0,7
Print "Hello World! - BELYJ"
Color 0,8
Print "Hello World! - SERYJ"
Sleep

 

PSET

Рисование точки в freebasic не представляет никакой трудности. Для этого применяется оператор PSET(x,y),c - где x,y - координаты точки, с - цвет точки.

Screen 13
Dim i As Integer
Dim x As Integer
Dim y As Integer
For i=1 To 3000
    x=cos(i)*(Int(Rnd(1)*75))
    y=cos(i)*(Int(Rnd(1)*75))
    Pset (x+150,y+100),6
Next i
Sleep

 

LINE

Оператор для рисования линии. Что бы нам было интересно, давайте сделаем с помощью оператора LINE эффект ёлочной снежинки

Screen 13
Dim i As Integer
Dim x As Integer
Dim y As Integer
Dim g As String, driver As String
g=inkey
While g = ""
    g = Inkey
    For i=1 To 50000
        x=cos(i)*(Int(Rnd(1)*190))
        y=sin(i)*(Int(Rnd(1)*190))
        Line (140,140)-(x*2.5,y*2.5),x
    Next i
Wend

 

CIRCLE

С помощью оператора Circle, можно рисовать не только окружности. Спомощью него можно нарисовать также часть окружности, эллипс указав, после цвета параметры:

Circle(координата X, координата Y),радиус,цвет,начало,конец,коэффициент сжатия.

Чем больше параметр коэффициента сжатия, тем уже будет ваша окружность. Идеальный круг имеет коэффициент сжатия равным 1. Если Вы будете уменьшать коэффициент сжатия от 1 до 0, то Ваша окружность начнёт толстеть, превращаясь в эллипс.

Screen 13
Circle (100,90),50,3,0.01,0.5
Circle (100,100),50,3,0.01,1
Circle (100,110),50,3,0.01,1.5
Circle (100,120),50,3,0.01,2
Circle (100,130),50,3,0.01,2.5
Circle (100,140),50,3,0.01,3
Circle (200,100),50,3,0.1,3
Circle (200,110),50,3,0.3,3
Circle (200,120),50,3,0.05,3
Circle (200,130),50,3,0.05,3.5
Circle (140,60),10,7
Circle (135,55),10,7
Circle (135,60),10,7
Circle (140,55),10,7
Paint (138,57),7,7
Sleep

 

SCREEN

Обычно, режим экрана переключают с помощью оператора SCREEN n, где n-режим. Более расширенный вариант:
SCREEN режим экрана,глубина цвета в битах,активная страница,видимая страница.

Глубина цвета в битах за пиксель может иметь значение 8,15,16,24,32 бита. Это значение отражает качество картинки.

В таблице приведены старые, которые применялись в qbasic'e (1 до13) и новые режимы FB SVGA (с 14 по 21), которые все применяются сейчас в freebasic :

Режим Разрешение Экран Текст Символ Цвета
1 320x200 CGA 80x25 8x8 16 фоновых цветов
2 640x200 CGA 40x25 8x8 16 цветов
7 320x200 EGA 40x25 8x8 16 цветов
8 320x200 EGA 40x25 8x8 16 цветов
9 640x350 EGA 80x25 или 80x43 8x14 или 8x8 16 цветов
11 640x480 VGA 80x30 или 80x60 8x16 или 8x8 256К цветов 2 атрибутам
12 320x200 MCGA 40x25 8x8 или 8x8 256К цветов 16 атрибутам
13 320x200 MCGA 40x25 8x8 или 8x8 256K цветов 256 атрибутам
14 320x240 - 40x30 8x8 256K цветов 256 атрибутам
15 400x300 - 50x37 8x8 256K цветов 256 атрибутам
16 512x384 - 64x24 или 64x48 8x16 или 8x8 256K цветов 256 атрибутам
17 640x400 - 80x25 или 80x50 8x16 или 8x8 256K цветов 256 атрибутам
18 640x480 - 80x30 или 80x60 8x16 или 8x8 256K цветов 256 атрибутам
19 800x600 - 100x37 или 100x75 8x16 или 8x8 256K цветов 256 атрибутам
20 1024x768 - 128x48 или 128x96 8x16 или 8x8 256K цветов 256 атрибутам
21 1280x1024 - 160x64 или 160x128 8x16 или 8x8 256K цветов 256 атрибутам

Пример использования оператора SCREEN:

Screen 13
Sleep

 

PAINT

Оператор - заливка цветом.  Формат оператора  PAINT, следующий. Указывается координата точки заливки x,y:    Paint (x,y),цвет заливки, цвет границы.

Dim i As Integer,j As Integer ' объявляем о переменных i,j 
Screen 13 ' режим экрана 320x200
For i=1 To 320 Step 20 'цикл для х-координаты
 For j=1 To 200 Step 20 'цикл для y-координаты
   Line (i,j)-(i+10,j+10),2,b ' рисуем квадрат 
  Paint (i+5,j+5),i,2 ' закрашиваем квадрат цветом i, граница 2
Next j,i ' цикл j,i 
Sleep ' пауза


1 часть | 2 часть | 3 часть