[an error occurred while processing this directive]

.сс

.шп6

10 Создание случайных чисел

.шп0

В этой главе мы научимся создавать случайные числа и использовать TIME и NULL.

Компьютерные игры всегда содержат в себе элемент случайности. События происходят нерегулярно и непредсказуемо, но все же под контролем. Как же это происходит с компьютером, который выполняет только команды, которые ему подаются?

Ответ заключается в том, что одно из ключевых слов компьютера можно использовать для производства "случайных чисел". Они должны составлять непредсказуемую последовательность и должны появляться в любом месте внутри данного диапазона чисел.

.шп14

10.1  RND

.шп0

Введите и запустите следующую программу, будьте внимательны при печати и не делайте пробела между RND и скобкой.

   10 for go := 1 to 10
   20 print rnd(999)
   30 next go

Выдаваемые числа каждый раз отличаются. RND( ) - Это ключевое слово для процесса нахождения случайного числа.

RND(999) производит целое число от 1 до 999 включительно.

.шп1

RND(n) - функция, которая возвращает целое число от 1 до n (при условии, что n больше или равно 2).

.шп14

10.2  Случайные дробные числа

.шп0

Измените 20 на

   20 print rnd(1)

и запустите программу снова.

.шп1

RND (1) производит случайное число между 0 и 1.

.шп0

Дробные числа производятся только RND(1).

Для производства дробного случайного числа между 0 100 необходимо умножить RND(1) на 100.

Измените 20 на

   20 print 100 * rnd(1)

.шп14

10.3  Программа-пример.

.шп0

Введите NEW, а затем следующую программу

   10 mode := 6
   20 for shake := 1 to 24
   30 number :=  rnd(6)
   40 print number
   50 next shake

и запустите ее.

.шп2

Показ случайных чисел

.шп0

Мы можем упростить просмотр количества единиц, двоек, троек и т.д., используя команду TAB( );.

Измените строку 40

   40 print tab(5 * number);number

и запустите программу несколько раз.

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

.шп2

Комбинирование случайных чисел

.шп0

Если мы хотим иммитировать бросок двух игральных костей, то сделать это можно довольно просто. Введите NEW, а затем

   10 mode := 6
   20 print "Die 1","Die 2","Total"
   30 for throw := 1 to 20
   40 die_1 :- rnd(6)
   50 die_2 := rnd(6)
   60 score := die_1 + die_2
   70 print ;die_1;die_2,;score
   80 next throw

Запустите программу.

.шп2

Неравномерное распределение.

.шп0

Это выглядит здраво, но уничтожьте строку 20 и измените 70 на

   70 print tab(2 * score);score

Запустите программу еще раз и вы увидите кое-что интересное.

Величины 2 и 12 случаются не очень часто, тогда как 5, 6, и 7 более часты, потому что при броске игральных костей количество сочетаний, дающих 7 случается более часто, чем дающих 2.

.шп14

10.4  Случайные числа в диапазоне

.шп0

Уничтожьте строки 40 и 50 и измените строку 60 на

   60 score := rnd(2,12)

RND(2,12) производит случайные числа от 2 до 12.

Запустите эту программу несколько раз

На этот раз числа распределяются более ровно.

.шп1

RND(a#,b#) Дает случайное целое число в диапозоне от А# до b# включительно (# обозначает целое число). a# должно быть ниже b#. а# (или оба а# и b#) могут быть отрицательными.

.шп0

Измените строку 60

   60 score := rnd(6,12)

и снова запустите программу.

.шп14

10.5  TIME (время)

.шп0

(Эта функция работает только с модулем часов или RS232!)

Введите прямую команду

print time

а затем снова введите ту же команду.

.шп1

TIME - это системная переменная, которая измеряет прохождение времени. Она увеличивается каждую сотую долю секунды.

.шп0

Вот почему вторая величина TIME была больше первой.

Сейчас введите прямые команды

time := 0

и

print time

.шп2

Установка внутренних часов

.шп1

Переменной TIME можно присвоить число. При включении компьтера TIME присваивается число 0.

.шп0

Эти часы внутри компьютера можно использовать для хронометрирования происходящего.

Введите new, а затем

   10 mode := 6
   20 time := 0
   30 for measure := 1 to 24
   40 print time
   50 next measure

Запустите программу и посмотрите, сколько времени она выполнялась. Если вы запустите программу еще раз, то можете получить иную величину. Может быть небольшая разница, которая зависит от точного момента запуска программы и от того, что делал компьютер в данный момент.

.шп14

10.6  Ничего не делая

.шп0

Мы можем заставить компьютер ждать, запустив цикл, в котором ничего не происходит.

.шп1

NULL - это ключевое слово для того, чтобы компьютер ничего не делал.

.шп0

Введите new и

   10 print "Start"
   20 time := 20
   30 for pause := 1 to rnd(1000,3000)
   40 null
   50 next pause
   60 delay := time
   70 print "That took";delay/100;" secs"

затем запустите программу.

Основная цель использованя NULL - это ясность. Если мы хотим, чтобы на определенном этапе программы компьютер ничего не делал, мы можем использовать ключевое слово NULL.

.шп14

10.7  Итоговые упражнения

.шп0

Какие команды напечатают случайные целые числа в следующих пределах?

1. От 1 до 40 включительно.

2. От 0 до 39 включительно.

3. От 11 до 29 включительно.

4. От 0 до 1279 включительно.

5. От 640 до 1279 включительно.

6. От 512 до 1023 включительно.

7. Внесите поправки в программу двух игровых костей из раздела 10.3 так, чтобы она дала средний счет для 20 бросков.

Ответы находятся в главе 43.

.шп14

10.8  Выводы

.шп0

1. Если n целое число больше 1, то RND(n) возвращает сдучайное целое число от 1 до n включительно.

2. RND(a#,b#) возвращает случайное целое число от а# до b# включительно.

3. RND(1) возвращает случайное десятичное число между 0 и 1.

4. TIME - системная переменная, измеряемая сотыми долями секунды. Величина TIME постоянно увеличивается компьютером. TIME можно присвоить величину. Когда компьютер включается TIME присваивается величина 0.

5. NULL указание ничего не делать.

.сс

.шп6

11 Графика

.шп0

В этой секции мы узнаем как пользоваться некоторыми графичискими приемами, имеющимися в Комале.

.шп14

11.1  Графические режимы.

.шп0

Графическими возможностями обладают 0-й, 1-й, 2-й, 3-й и 4-й режиммы

.шп14

11.2  Координты

.шп0

В каждом графическом режиме экран рассматривается, как график с осями, идущими вдоль экрана и в верх по экрану.

Как и в графике, каждая отметка на экране имеет свою пару координат. Когда мы включаем компьютер, начало координат находится внизу в левой стороне экрана. Первая координата - это позиция вдоль экрана, а вторая координата - это позиция вверх по экрану.

Когда мы включаем компьютер, координаты экрана нумеруются от 0 до 1279 вдоль

и от 0 до 1023 вверх.

Нижний левый угол экрана - это 0,0, а верхний правый - 1279,1023.

.шп14

11.3  DRAW (чертить)

.шп0

Измените режим на 1 вводом

MODE :=1

и введите прямую команду (с пробелом после draw):

draw 1000,800

Чертится линия, начиная с нижнего левого угла до точки с координатами 1000 вдоль и 800 вверх. Графический курсор начинает движение внизу слева после изменения режима.

Введите

draw 1200,400

Была прочерчена линия от последней точки предыдущей линии до точки 1200 вдоль и 400 вверх.

.шп1

DRAW x,y - команда чертить линию до точки с координатами x единиц вдоль экрана и y единиц вверх по экрану. Каждая линия чертится из последней позиции.

.шп0

Перейдите в режим 4.

Введите new, затем

   10 left := 0
   20 right := 1279
   30 bottom :=0
   40 top := 1023
   50 *key 0 mode := 4 !M list !M
   60 mode := 1
   70 draw right,bottom
   80 draw right,top
   90 draw left,tor
  100 draw left,bottom

Запустите программу.

Нажмите функциональную клавишу f0 для изменения режима на 4 просмотрите.

Измените 30 на

   30 bottom :=200

и запустите программу снова.

.шп14

11.4  MOVE (переместить)

.шп0

Мы не получили чистого прямоугольника, потому что первая линия начинается с неправильного места. Нам нужно было начать с координат 0,200. Нам необходимо перевести наш графический маркер в эту точку перед тем, как чертить.

.шп1

MOVE x,y - команда перевода графического маркера (курсора) в точку x,y без черчения линии.

.шп0

Введите

   65 MOVE LEFT,BOTTOM

Запустите программу, затем нажмите клавишу f0.

.шп14

11.5  Графические цвета.

.шп0

Мы легко можем использовать цвета, которые есть в каждом режиме.Графические цвета изменяются довольно независимо от цветов, которые используются для печати текста.

.шп2

GCOL

.шп0

Команда GCOL используется для контроля выбора графических цветов. В этом случае за командой идут два числа. В данный момент мы поставим нуль, запятую, затем номер цвета, который мы используем.

В режиме 1, цвет Nо 1 - красный, поэтому введем

    67 GCOL 0,1

и опять запустим программу.

Таким же образом можно заменить на синий

    67 GCOL 0,3

.шп1

GCOL 0,n устанавливает цвет графики с номером n, где n является любым номером в списке цветов, имеющимся для используемого режима.

.шп0

Для ознакомления с другими значениями указаний GCOL более опытные пользователи ОС ОНИКС могут просмотреть раздел по GCOL в Части III.

.шп2

Пример с RND

.шп0

Измените 30 на

   30 bottom := 0

и добавьте

  110 move 640,512 // centre screen
  120 for line := 1 to 20
  130 x := rnd(1279)
  140 y := rnd(1023)
  150 number := rnd(3)
  160 gcol 0,number
  170 draw x,y
  180 next line

Запустите программу.

.шп14

11.6  Очистка графики

.шп0

Введите прямую команду

clg

CLG - это команда очистки поля графики.

.шп14

11.7  Фоновые цвета графики

.шп0

Если после команды GCOL 0, используется число "128 + номер цвета", то меняется цвет фона графики. Это происходит только если мы используем команду CLG.

Введите

   62 gcol 0,128 + 3

и

   64 clg

измените 150 на

  150 number := rnd(0,2)

затем запустите программу.

Черные линии сейчас четко видны.

.шп1

Команда CLG очищает поле графики и оставляет его в текущем фоновом цвете графики.

.шп0

Текстовый фоновый цвет устанавливается командой COLOUR. Команда CLS очищает текстовое поле, используя текстовый фоновый цвет.

Запустите программу еще раз и затем введите CLS. Вы увидете, что экран очистился черным цветом, т.е. текущим цветом фона текста.

.шп14

11.8  Графика в восьми цветах

.шп0

В режиме 3 имеются и другие цвета. Нажмите f0, затем сделайте следующие изменения:

   60 MODE := 3
   62 GCOL 0,128 // background black
  150 number := RND(0,6)

и получим

   10 left := 0
   20 right := 1279
   30 bottom := 0
   40 top := 1023
   50 *key 0 mode := 6 !m list !m
   60 MODE := 3
   62 GCOL 0,128 // background black
   65 MOVE left,bottom
   67 GCOl 0,2
   70 DRAW right,bottom
   80 DRAW right,top
   90 DRAW left,top
  100 DRAW left,bottom
  110 MOVE 640,512 // centre screen
  120 FOR line = 1 TO 20 DO
  130   x := RND( 1279)
  140   y := RND( 1023)
  150   number := RND( 0,6)
  160   GCOL 0,number
  170   DRAW x,y
  180 NEXT line

сейчас запустите программу.

.шп14

11.9  Построение точек

.шп0

ОС ОНИКС имеет очень мощные возможности построения точек, линий и треугольников. (детали даны в Части III.) Если мы намереваемся только отметить точку, то нам нужно только одно указание PLOT. Нажмите функциональную клавишу f0 и сделайте следующие изменения:

   120 for dot := 1 to 500
   170 plot 69,x,y
   180 next dot

Затем запустите программу.

.шп1

PLOT 69,x,y строит точку с координатами x,y в текущем графическом цвете.

.шп14

11.10 POINT (точка)

.шп0

Можно обратить этот процесс и найти, какой цвет используется в любой позиции на экране. Будьте внимательны и не делайте пробел перед скобкой, введите

print point(640,512)

Число, которое появляется является номером цвета в 640,512.

Введите

print point(2000,2000)

Такой позиции не экране нет. Число -1 показывает, что цвет отсутствует.

.шп1

POINT( x,y) возвращает номер цвета в точке x,y на экране. Если точка находится вне экрана, то возвращается -1.

.шп14

11.11 Закрашенные треугольники

.шп0

Другое мощное указание PLOT позволяет рисовать закрашенные треугольники.

Нажмите клавишу f0 и сделайте следующие изменения:

   120 for triangle := 1 to 20
   179 plot 85,x,y
   180 next triangle

Затем запустите программу.

.шп1

PLOT 85,x,y проводит линию до точки x,y в текущем графическом цвете и закрашивает треугольник, образованный точкой x,y и двумя последними точками.

.шп0

С помощью треугольников можно нарисовать и другие фигуры. Если тщательно выбрать последовательность точек, то для трапеции необходимо пройти только через 4 точки.

Нажмите клавишу f0, введите new и новую программу.

   10 mode := 3
   20 gcol 0,1 // red
   30 move 400,700 // visit point A
   40 move 800,700 // visit point B
   50 plot 85,200,300 // fill triangle ABC
   60 plot 85,1000,300 // fill triangle BCD

Надо очень внимательно смотреть, чтобы увидеть как заполняется цветом каждый треугольник.

.шп14

11.12 Окна

.шп0

Имеется возможность определять прямоугольные площади, которые могут содержать текст, и прямоугольные площади, которые могут содержать графику. Эти площади (или окна) могут накладываться. Текстовые и графические окна выводятся на полный экран, когда изменяется режим.

.шп2

Команды VDU

.шп0

Имеется набор команд VDU, которые влияют на вывод на экран или на принтер. Их список есть в Части III. В данный момент мы изучим как пользоваться только командами для окон.

.шп2

Текстовые окна

.шп0

Команда для определения текстового окна - VDU 28,. За ней следуют позиция нижнего левого угла окна, затем - верхнего правого угла окна.

Пример: VDU 28,2,24,17,16

определит нам текстовое окно, у которого позиция нижнего левого угла - 2 вдоль экрана и 24 вниз. верхний правый угол будет находиться в позиции 17 вдоль экрана и 16 вниз.

Если вы определите окно, которое не помещается на экране, то текстовая площадь займет весь экран.

Нажмите функциональную клавишу f0, введите new и следующую програму.

   10 mode := 5
   20 print tab( 2,5);"Colour coises"
   30 print tab( 2,7);"1. Red"
   40 print tab( 2,9);"2. Green"
   50 print tab( 2,11);"3. Yellow"
   60 print tab( 2,14);
   70 inrut "Choice 1-3 > ":choice
   80 vdu 28,2,24,17,16
   90 colour 128 + choice
  100 cls
  110 colour 0
  120 print "Text window"
  130 end

Запустите программу.

Вы заметили, что CLS очистила только площадь окна?

Позиции печати определяются, начиная с верхнего левого угла текстового окна.

Введите прямую команду

print tab( 20,20);"Here".

Печать будет происходить только в текстовом окне. Если позиция TAB( )находится за пределами окна, то указание игнорируется и печать происходит без выплнения части ТАВ( ) этой команды.

Введите

print tab( 20,20);"Can't"

Данная позиция находится вне окна, поэтому часть команды ТАВ( ) не исполняется и печать происходит на следующей строке.

.шп1

VDU 28, - это команда для установки текстового окна. За ней должны следовать четыре числа, разделенные запятой. Первые два числа дают позицию нижнего левого угла окна. Последние два числа дают позицию верхнего правого угла окна.

Когда окно определено, команда CLS очищает только площадь окна.

.шп2

Графические окна

.шп0

Команда, определяющая графическое окно - VDU 24,. За ней следуют четыре числа, разделенные точкой с запятой. Первые два числа являются координатами нижнего левого угла, а два последних числа - верхнего правого угла графичиской пощади.

Пример:

VDU 24,400;200;900;800;

Эта команда определяет графическое окно, у которого левый нижний угол находится в точке 400 вдоль и 200 вверх по экрану. Верхний правый угол находится в 900 вдоль и 800 вверх.

После VDU 24, ставится запятая, но после всех других номеров необходимо ставить точку с запятой.Причина этого приводится в разделе VDU в Части III.

Если вы определите графическое окно, которое не помещается на экране, то графическое окно займет весь экран.

Нажмите f0, введите new и следующую программу.

   10 red := 1
   20 yellow := 3
   30 white := 7
   40 mode := 3
   50 vdu 24,400;200;900;800;
   60 gcol 0,128 + red
   70 clg // set background to red
   80 gcol 0,yellow
   90 for y := 0 to 1000 step 40
  100 move 0,y // left side of screen
  110 draw 1000,500
  120 next y
  130 end

Запустите программу

Вы заметили, что CLG очистила только графическую площадь?

Линии имеют начальную и конечную точки, которые находятся вне графического окна.

Линии видны только там, где они пересекают окно.

.шп1

VDU 24, - это команда, которая устанавливает графическое окно. За ней следуют четыре числа, каждое из которых отделяется точкой с запятой. Первые два числа являются координатами нижней левой части графической площади. Последние два числа - координаты верхней правой части графической площади.

Когда графическое окно определено, команда CLG очищает только площадь окна.

.шп14

11.13 Итоговые упражнения

.шп0

Запишите ваши ответы и сверьте их с ответами в главе 43. Могут быть некоторые различия в том, как вы написали ваши программы, или в названиях переменных, которые вы использовали.

1. Есть ли в режиме 6 графические возможности?

2. Если вы используете графический режим, какие команды проведут линию из верхнего левого угла в нижний правый угол экрана.

Для следующих вопросов используйте режим 3.

3. Напишите программу для построения нескольких параллельных горизонтальных линий с интервалом 100 единиц.

4. Напишите программу для построения вертикальных линий с интервалом 100 единиц.

5. Напишите программу, используя команду PLOT 69, для построения нескольких точек с интервалом 80 единиц через средину экрана.

6. Напишите программу, используя команду PLOT 85, для построения красного квадрата в средине экрана на желтом фоне.

7. Какая команда определит текстовое окно, которое занимает верхнюю половину экрана?

8. Какая команда определит графическое окно, занимающее нижнюю половину экрана?

.шп14

11.14 Выводы

.шп0

1. Режимы с 0-го по 4-й поодерживают графику.

2. Когда мы выбираем режим, координаты экрана следующие: от 0 до 1279 по горизонтали и от 0 до 1023 вверх по вертикали.

3. DRAW x,y - команда для построения линии до точки x,y, начиная с последней пройденной точки.

4. MOVE x,y - команда перемещаться в точку с координатами x,y.

5. GCOL 0,n - команда установить цвет графики, соответствующий номеру n используемого режима.

6. GCOL 0,128 + n установит цвет фона графики, соответствующий номеру цвета n.

7. CLG - команда очистить площадь графики текущим цветом фона графики.

8. PLOT 69,x,y - команда построить точку с координатами x,y , используя текущий цвет графики.

9. PLOT 85 x,y - команда провести линию к точке x,y в текущем цвете графики и закрасить треугольник, образованный точками x,y и двумя последними пройденными точками.

10. ROINT( x/y) - функция, которая возвращает номер цвета в точке x,y. Если точка вне экрана, возвращается -1. Между POINT и скобкой не должно быть пробела.

11. VDU 28, - это команда, устанавливающая текстовое окно. За ней следуют позиции TAB( ) нижней левой и верхней правой частей окна; между числами ставится запятая.

12. Команда CLS очищает площадь окна, используя текущий цвет фона.

13. VDU 24, - команда для установки графического окна. За ней следуют координаты нижней левой и верхней правой частей окна. За каждой координатой должна стоять точка с запятой.

.сс

.шп6

12 Стоп и продолжение

.шп0

В этой секции мы будем использовать оператор STOP и узнаем, когда можно продолжать программу.

.шп14

12.1  Остановка программы

.шп0

Программу можно на некоторое время остановить оператором STOP или клавишей РЕД.

.шп1

STOP - это оператор, которое вызывает остановку программы и сообщение о строке, на которой остановилась программа.

.шп0

Введите new, а затем следующее:

   10 for j := 1 to 2
   20 print j
   30 stop
   40 next j
   50 print "The End"

Когда программа запущена, дается число 1, затем на экране появляется сообщение STOP at line 30 (остановиться на строке 30)

.шп14

12.2  CONT

.шп0

Введите

cont

Печатается число 2 и программа опять останавливается.

Введите

cont

и программа заканчивается.

.шп1

CONT - команда, пытающаяся продолжить программу, которая остановилась.

.шп2

CONT (Продолжение) после РЕД

.шп0

В некоторых сучаях программу можно продолжить после испльзования клавиши РЕД.

Измените 30 на

    30 INPUT "Enter a word > "word¤

Не вводите слово, когда программа идет. Нажмите РЕД.

.шп1

Если нажать на клавишу РЕД во время работы какой-либо строки программы, появляется сообщение ЕSCAPE at line ... (Выход на строке ...).

.шп0

Посмотрите на последнее напечатанное число и обратите внимание на то, что случится после ввода слов CONT и INPUT.

Прогамма должна продолжаться со строки, указанной сообщением о выходе (РЕД). Если строка, на которой произощел выход, была выполнена не полностью, то эта строка повторяется.

Завершите программу или опять нажмите РЕД.

.шп2

Изменение переменных

.шп0

Запустите программу и нажмите РЕД. Введите прямые команды x := 45 и j := 0.5 затем введите

cont

.шп1

Новые и существующие переменные можно присваивать во время перерыва.

.шп2

Изменение программы

.шп0

Запустите программу и снова нажмите РЕД. Затем введите програмную строку.

   45 print "This is"

и введите

CONT

.шп1

Программа продолжаться не будет, если ее изменили после STOP или РЕД.

.шп2

Ошибки в прямом режиме

.шп0

Запустите программу и опять нажмите РЕД. Сделайте ошибку вводом

PRUNT

А теперь попытайтесь продолжить программу вводом

CONT

Запустите программу и опять нажмите на РЕД. Находясь в этом прямом режиме, нажмите РЕД второй раз.

Введите

cont

.шп1

Программа не продолжается после нажатия РЕД, или когда в прямом режиме делается ошибка.

.шп14

12.3  Выводы

.шп0

Программа может продолжаться, если вводится CONT:

1. после STOP,

2. после того, как во время работы программы нажимается клавиша РЕД при условии, что:

- программа не была изменена;

- РЕД не была нажата еще раз

- при рабтоте в прямом режиме не было сделано ошибки.

Если остановка произошла прежде чем была выполнена строка, то после ввода CONT строка повторяется (если программу можно продолжить).

.ст комал7

[an error occurred while processing this directive]