Лекция 25.Двумерные массивы. Игра «Морской бой» автор: Садовский Ефим Моисеевич1. Повторение. Двумерные массивы. Ввод, заполнение случайными числами, вывод на экран. Игра «Морской бой». Двумерные массивы используются при написании программ самого разнообразного назначения. Сегодня мы попробуем воспользоваться двумерным массивом для реализации упрощенной версии игры «Морской бой». Принцип игры: Игрок (человек) рисует на бумаге поле 10х10 (нумерация строк и столбцов - числами от 1 до 10), расставляет свои корабли. То же самое «делает» компьютер. Затем по очереди «стреляют», указывая координаты (номер строки и столбца). При «точном выстреле» попавший стреляет повторно. Побеждает тот, кто первым уничтожил все корабли противника. Для простоты попробуем написать игру для 10 однопалубных кораблей, которые можно располагать как угодно (в том числе рядом). Составление программы удобно разбить на несколько этапов: расстановка кораблей компьютером, выстрел «компьютера», выстрел «человека». В памяти компьютера будем хранить два массива (первый – с расставленными случайным образом «кораблями», второй – с отметкой координат прошлых выстрелов, чтобы не стрелять два раза в одну и ту же точку). В программе удобно использовать оператор безусловного перехода goto. Опишем переменные и определим их назначение:
program seawar;
label 1;
var a,b:array[1..10,1..10] of integer;
k1,k2,i,j,x,y,t:integer;
begin
end.
О назначении двух массивов мы уже говорили. Переменные k1 и k2 – для подсчета количества потопленных кораблей с каждой стороны. X и Y – координаты корабля. t – вспомогательная переменная (Компьютер после своего выстрела задает вопрос попал он или нет, если да, то игрок вводит 1, если нет – 0. Остается надеяться на честность игрока!) Первым шагом удобно оба исходных массива заполнить нулями (это будут пустые места, на которых не кораблей или по которым еще не стреляли). Будем отмечать единичками в массиве А сами корабли, а в массиве В – места, по которым уже стреляли.
for i:=1 to 10 do
for j:=1 to 10 do
begin
a[i,j]:=0;
b[i,j]:=0;
end;
Следующий этап – расстановка кораблей компьютера случайным образом. Хочется написать вот так:
randomize;
for i:=1 to 10 do
begin
x:=random(10)+1;
y:=random(10)+1;
a[x,y]:=1;
end;
Но если мы выведем исходный массив на экран (а в процессе отладки программы это делать ОБЯЗАТЕЛЬНО!), то увидим, что при одном запуске программы – кораблей 10, а при другом – 9. Почему? Дело в том, что случайные числа они и есть случайные, то есть компьютер может случайно задумать ту пару чисел, которая уже была, то есть «поставить корабль наверх». Поэтому делаем так:
randomize;
for i:=1 to 10 do
begin
1: x:=random(10)+1;
y:=random(10)+1;
if a[x,y]=0 then a[x,y]:=1
else goto 1;
end;
То есть мы ставим корабль (единичку) только на свободное место (нолик). Если «место занято» - перезадумываем координаты. Расстановку кораблей можно было реализовать и с помощью цикла While (без Goto): t:=0; (в данном случае t-количество «расставленных» кораблей)
while t<10 do
begin
x:=random(10)+1;
y:=random(10)+1;
if a[x,y]=0 then
begin
a[x,y]:=1;
t:=t+1;
end;
end;
Далее обнуляем количество сбитых кораблей:
k1:=0;
k2:=0;
Перестрелка будет происходить до тех пор, пока одна из переменных (k1 или k2) не станет равной 10:
While (k1<>10) and (k2<>10) do
begin
end;
В операторных скобках самостоятельно пробуем организовать «стрельбу» человека по кораблям компьютера и наоборот (не забывая о том, что компьютер стреляет случайным образом в точки, которые еще не стрелял (в массиве В – цифра 0), помечая координаты выстрелов (в массиве В присваиваем цифру 1)). Попавший стреляет повторно (это проще организовать оператором goto). После окончания стрельбы оцениваем операторами if кто победил.
Решение задачи.
|