03.11.2014 Views

Выпуск 5 - Российский государственный профессионально ...

Выпуск 5 - Российский государственный профессионально ...

Выпуск 5 - Российский государственный профессионально ...

SHOW MORE
SHOW LESS

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 / ИНФОРМАТИКА

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!