Когда у меня появился свой компьютер я подумывал составить программу "Морской бой"- любил я эту игру на тетради в клеточку. Дальше раздумий дело не пошло))
Научить компьютер расставлять корабли - хорошая задача, которая может со временем и вырасти в полную игру.
Классический "Морской бой"
Поле 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 четыре раза))
В следующий раз рассмотрим расстановку более-палубных кораблей. Они чуть больше по размеру, это выглядит более сложным. К тому же они могут быть расположены горизонтально или верткально.
✅
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
spinner, littleboo, ianboil, francisgrey, strecoza, mishka, sergiy, vako, rbrown, gildar, andrvik, max-max, oleg257, zoss, dimarss, tristamoff, kilobucks, ohlamoon, shuler, maksina, zlody, dr-boo, arsar, volv, nefer, turkish-r, renat242, markvial, nikalaich, status7, gryph0n, voltash, ladynazgool, decha, sharps, snaryaga, cepera, rubin, francesco, exan, retoldname, stranniksenya, alikssandra, gapel, polyakov, galerina, acidgarry, aivanouski, oagalakova, borisss, candy777, optimist, edsaw, yurchello, dayver, bammbuss, dmitrijv, manavendra, mr-nikola, ondantr, vladsm, mirgais, varja, prifix, mp42b, abloud, dignityinside, ksantoprotein, process, chugoi, nikulinsb, tulencha, amalinavia, kito-boy, vsebudethorosho, nikitosuna, izbushka, astramar, propoker, cryptovisitor, zelivsky, html, vredinka2345, benken, kash47, makcl, marina-spring, azarovskiy, funt33, samael27, kalter, maksh, mister-omortson, nightinga1e, apnigrich, siddxa, cryptobandera, doublingseason, necrogenesis, maryatekun, lologom, anykeycheg, prezza, yroslav94, akva22, tyi-ra, elcpa, karabum, dobrotanya, boliwar, veta-less, irkinmick, denispavlov, svetozarhobbot, archual, alexxela, vitalist, burger-knig, marko44, cryptenthusiast, flint, charisma
Поэтому я тоже проголосовал за него!
dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:
Здравствуйте. Мысли навскидку (может будут полезными) :
И ещё одна мысль. При разработки пятерных крестиков-ноликов на не ограниченном поле я придумал хранить в линейной динамической матрице только значимые клетки (а не всё расширяющееся поле). Я бы (возможно) сделал матрицы с координатами для каждого корабля.
Спасибо, это мне на будущее, читал о таком,но не практиковал))
а это я для своих учеников пишу(и для себя), которые у меня иногда появляются.. поучиться..
@sergiy ОЧЕНЬ КРУТО !!! Подписался на вас. Буду рад если и вы оцените мои посты и подпишитесь на мой аккаунт )) спасибо
✅🤙 🚀
Сюда приплывал Моби Дик