ÐÑпÑÑк 5 - РоÑÑийÑкий гоÑÑдаÑÑÑвеннÑй пÑоÑеÑÑионалÑно ...
ÐÑпÑÑк 5 - РоÑÑийÑкий гоÑÑдаÑÑÑвеннÑй пÑоÑеÑÑионалÑно ...
ÐÑпÑÑк 5 - РоÑÑийÑкий гоÑÑдаÑÑÑвеннÑй пÑоÑеÑÑионалÑно ...
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Next i<br />
'Расставляем корабли "вручную"<br />
'4-секционный<br />
поле(6) = 1<br />
… (см. выше)<br />
поле(9) = 1<br />
For i = 6 To 9<br />
тип(i) = 4<br />
Next i<br />
'3-секционные<br />
поле(21) = 1<br />
…<br />
For i = 21 To 23<br />
тип(i) = 3<br />
Next i<br />
поле(37) = 1<br />
…<br />
For i = 37 To 39<br />
тип(i) = 3<br />
Next i<br />
'2-секционные<br />
поле(3) = 1<br />
…<br />
тип(3) = 2<br />
тип(4) = 2<br />
тип(12) = 2<br />
тип(13) = 2<br />
тип(17) = 2<br />
тип(18) = 2<br />
'Односекционные<br />
поле(15) = 1<br />
…<br />
тип(15) = 1<br />
тип(27) = 1<br />
тип(32) = 1<br />
тип(34) = 1<br />
'Обнуляем переменную число_потоп<br />
число_потоп = 0<br />
'Выводим сообщение<br />
MsgBox ("Корабли расставлены - можете<br />
начинать")<br />
End Sub<br />
Так как массивы и величина число_потоп используются<br />
в обоих макросах, их следует описать<br />
как глобальные — в верхней части модуля кода, до<br />
всех макросов (рис. 4).<br />
Рис. 4<br />
Запись Option Explicit в начале модуля предусматривает,<br />
что все используемые переменные<br />
должны быть предварительно объявлены (описаны).<br />
Это уменьшает вероятность ошибок.<br />
Теперь можно обсудить выбор расположения<br />
кораблей не нами, а компьютером. Это можно сделать,<br />
используя случайные числа. Напомним, что<br />
для получения случайного целого числа n, значения<br />
которого лежат в диапазоне от А до В включительно,<br />
используется формула:<br />
n = А + int(rnd * (B – A + 1)).<br />
Итак, начнем с выбора положения 4-секционного<br />
корабля:<br />
'Выбираем случайный номер от 1 до 37<br />
номер = 1 + Int(Rnd * 37)<br />
'Записываем в соответствующий элемент<br />
'и в 3 следующих элемента:<br />
'в массиве поле — значение 1,<br />
'в массиве тип — значение 4<br />
For i = номер To номер + 3<br />
поле(i) = 1<br />
тип(i) = 4<br />
Next i<br />
Для 3-секционных кораблей следует найти такую<br />
клетку, чтобы:<br />
1) справа от нее было еще 3 свободных клетки<br />
(две — для остальных секций и как минимум<br />
одна клетка должна быть между ними и соседним<br />
кораблем);<br />
2) слева от нее была свободная клетка (чтобы данный<br />
корабль не “касался” расположенного левее).<br />
Так как при первом случайном выборе эти условия<br />
могут не соблюдаться, следует применить оператор<br />
цикла с постусловием:<br />
Do<br />
номер = 2 + Int(Rnd * 36)<br />
Loop Until поле(номер) = 0<br />
And поле(номер + 1) = 0<br />
And поле(номер + 2) = 0<br />
And поле(номер + 3) = 0<br />
And поле(номер - 1) = 0<br />
После нахождения подходящих клеток должны<br />
также быть заполнены соответствующие элементы<br />
массивов поле и тип:<br />
For i = номер To номер + 2<br />
поле(i) = 1<br />
тип(i) = 3<br />
Next i<br />
Указанные действия должны выполняться дважды<br />
(для двух 3-секционных кораблей).<br />
Для 2-секционных и односекционных кораблей<br />
выбор проводится аналогично:<br />
'2-секционные<br />
For j = 1 To 3 'Три корабля<br />
Do<br />
номер = 2 + Int(Rnd * 37)<br />
Loop Until поле(номер) = 0<br />
And поле(номер + 1) = 0<br />
And поле(номер + 2) = 0<br />
And поле(номер - 1) = 0<br />
поле(номер) = 1<br />
поле(номер + 1) = 1<br />
тип(номер) = 2<br />
тип(номер + 1) = 2<br />
Next j<br />
'Односекционные<br />
61<br />
май 2012 / ИНФОРМАТИКА