31 FreeBASIC - Игра "Морской бой". Выводим поле. Размещаем однопалубные корабли
Когда у меня появился свой компьютер я подумывал составить программу "Морской бой"- любил я эту игру на тетради в клеточку. Дальше раздумий дело не пошло))
Научить компьютер расставлять корабли - хорошая задача, которая может со временем и вырасти в полную игру.
Классический "Морской бой"
Поле 10х10, корабли не касаются друг друга.
На поле размещены:
4 - однопалубных, 1х1
3 - двохпалубных, 2х1 или 1х2
2 - трёхпалубных, 3х1 или 1х3
1 - четырёхпалубный, 4х1 или 1х4
Напишем сначала подпрограмму которая отображает поле боя. Оно состоит из двух квадратов - свой и противника, вернее наоборот)) Слева - противника, а справа со своими кораблями.
sub polemb(byval as integer p)
...
end sub
Для простоты вывод сделаем в текстовом режиме.
Массив k-поле боя компьютера, p-поле боя игрока.
обозначение(вывод) | код в массиве | что означает |
---|---|---|
"." | 0 | пустая клетка, "вода" |
"-" | 1 | выстрел "мимо" |
" " | 2 | пустая клетка вокруг корабля |
"Х" | 3 | ранил/убил |
"О" | 4 | клетка корабля |
sub polemb(byval as integer p)
dim as integerf i,j
for i=1 to 10
locate j,i*2:print j
for j=1 to 10
locate j+1,i*2:
if a(i,j)=1 then print "."
if a(i,j)=2 then print "X"
if a(i,j)=3 then print "O"
if a(i,j)=4 then print " "
next j
next i
end sub
подпрограмму "рисования" поля боя сделали, а придать ей графической красоты - дело десятое, на растановку кораблей это никак не влияет.
Начнём расстановку с однопалубных кораблей. Вернее подпрограммы начнём составлять для расстановки однопалубных(с того что попроще), а когда будут написаны все подпрограммы сначала установим четырёхпалубный, потом трёх- и т.д.
sub set1
dim as integer x,y
do
x=int(rnd()*10+1)
y=int(rnd()*10+1)
loop while k(x,y)>0
k(x,y)=4
if x>1 and y>1 then k(x-1,y-1)=2
if y>1 then k(x,y-1)=2
if x<10 and y>1 then k(x+1,y-1)=2
if x>1 then k(x-1,y)=2
if x<10 then k(x+1,y)=2
if x>1 and y<10 then k(x-1,y+1)=2
if y<10 then k(x,y+1)=2:
if x<10 and y<10 then k(x+1,y+1)=2
end sub
Сначала ищем пустую клетку
do
x=int(rnd()*10+1)
y=int(rnd()*10+1)
loop while k(x,y)>0
когда нашли - ставим туда корабль k(x,y)=4
А теперь нужно соседние клетки отметить "занятыми", чтобы компьютер считал их такими и не пытался установить туда корабль(палубу) - тогда корабли не буду соприкасаться.
здесь указаны координаты соседних клеток к ячейке (x,y)
нужно также учесть есть корабль расположился на краю поля - тогда некоторіе смежніе клетки будут за пределами поля, значит и запределами массива, вне массива - заполнять их нельзя. Нужно отсечь эти ячейки условиями.
Например, если однопалубный корабль установился у правого края(х=10) - то ещё правее поля нет, нет и ячеек в массиве, столбца х=11 также нет. Поэтому и рассматривать ячейки (х+1, ...) нельзя.
Устанавливаем четыре однопалубных корабля вызвав нашу подпрограмму set1 четыре раза))
В следующий раз рассмотрим расстановку более-палубных кораблей. Они чуть больше по размеру, это выглядит более сложным. К тому же они могут быть расположены горизонтально или верткально.