Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
sergiy
6 лет назад

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 четыре раза))

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

10
474.783 GOLOS
На Golos с October 2016
Комментарии (7)
Сортировать по:
Сначала старые