Игра "Морской бой!

Модераторы: BRashka, shuhart90, test, Vh180477, 1961uvg

bk99
Сообщения: 6
Зарегистрирован: 01 дек 2016, 08:37

Игра "Морской бой!

Сообщение bk99 » 01 дек 2016, 08:48

Представляю на суд игру "Морской бой". Собственно, это только заготовка, болванка - гуй + основной функционал. Свистелки-перделки не делал, всё очень по-спартански. Принимаю любую критику, замечания, исправления и оптимизацию. Игра адаптирована под экран 480х800, под другие разрешения гуй поползёт. Коменты в коде могут быть не очень понятны, т.к. писал их под себя.

Здесь код:

Код: Выделить всё

GR.OPEN , , , , , 1
PAUSE 500

GR.COLOR 255, 200, 200, 200, 1               % непрозрачный серый заполненный
GR.RECT button_info, 130, 650, 350, 710         % кнопка
GR.COLOR 255, 0, 0, 0, 0                  % непрозрачный чёрный незаполненный
GR.RECT info_border, 20, 20, 460, 780         % окантовка экрана
GR.RECT button_info_border, 130, 650, 350, 710   % окантовка кнопки

GR.TEXT.SIZE 50
GR.TEXT.ALIGN 2
GR.TEXT.DRAW info, 240, 70, "игра"
GR.TEXT.DRAW info, 240, 130, "\"МОРСКОЙ БОЙ\""

GR.TEXT.SIZE 30
GR.TEXT.DRAW button_info_text, 240, 690, "Я ВСЁ ПОНЯЛ"
GR.TEXT.DRAW info, 240, 760, "v.1.0b - bk99(c) - 2016"

GR.TEXT.ALIGN 1
GR.TEXT.DRAW info, 40, 190, "Расставьте свои корабли:"
GR.TEXT.DRAW info, 40, 230, " - один четырёхпалубный;"
GR.TEXT.DRAW info, 40, 260, " - два трёхпалубных;"
GR.TEXT.DRAW info, 40, 290, " - три двухпалубных;"
GR.TEXT.DRAW info, 40, 320, " - и четыре однопалубных."
GR.TEXT.DRAW info, 40, 360, "Всего должно быть десять"
GR.TEXT.DRAW info, 40, 390, "кораблей. Корабли не дол-"
GR.TEXT.DRAW info, 40, 420, "жны изгибаться и соприка-"
GR.TEXT.DRAW info, 40, 450, "саться."
GR.TEXT.DRAW info, 40, 490, "Подтверждайте свои выст-"
GR.TEXT.DRAW info, 40, 520, "релы нажатием на зелёную"
GR.TEXT.DRAW info, 40, 550, "кнопку. Можно отмечать"
GR.TEXT.DRAW info, 40, 580, "заведомо пустые поля -"
GR.TEXT.DRAW info, 40, 610, "кнопка с серой точкой."

GR.RENDER

DO
 GR.BOUNDED.TOUCH button_info, 130, 650, 350, 710   % определяем зону кнопки button_info для тапа
UNTIL button_info

start:
GR.CLS

!!
i - горизонталь (буквы)
j - вертикаль (цифры)
rect[2,4,k,n] - клетка "Б4"
k - 1:противник, 2:мы
n - 1:белый, 2:каёмка
!!

destroy_boat1_num = 0      % подсчёт количества крестов в первом поле
destroy_boat2_num = 0      % подсчёт количества крестов во втором поле
x = 40                  % от левого края до поля
d = 34                  % размер клетки
ARRAY.LOAD y[], 55, 454      % от верха до поля
ARRAY.LOAD title$[], "противник", "наша армада"
ARRAY.LOAD l$[], "а", "б", "в", "г", "д", "е", "ж", "з", "и", "к"

GR.TEXT.SIZE 30
GR.TEXT.ALIGN 2

! рисуем серый и красный квадраты и окантовку в фоне во втором поле
GR.COLOR 255, 200, 200, 200, 1                     % непрозрачный серый заполненный
GR.RECT rect_grey_bg, x, y[2], x + 10*d, y[2] + 10*d   % квадрат во втором поле
GR.COLOR 255, 255, 0, 0, 1                        % непрозрачный красный заполненный
GR.RECT rect_red_bg2, x, y[2], x + 10*d, y[2] + 10*d   % квадрат во втором поле
GR.COLOR 255, 0, 0, 0, 0                        % непрозрачный чёрный незаполненный
GR.RECT rect_border_bg2, x, y[2], x + 10*d, y[2] + 10*d   % окантовка во втором поле

!---------------------------!
!рисуем два поля с подписями!
!---------------------------!
DIM rect[10,10,2,2]
FOR k = 1 TO 2
 FOR i = 1 TO 10
  FOR j = 1 TO 10
   x1 = x + (i-1)*d
   y1 = y[k] + (j-1)*d
   x2 = x + i * d
   y2 = y[k] + j * d
   GR.COLOR 255, 255, 255, 255, 1         % непрозрачный белый заполненный
   GR.RECT rect[i,j,k,1], x1, y1, x2, y2   % квадрат
   GR.COLOR 255, 0, 0, 0, 0               % непрозрачный чёрный незаполненный
   GR.RECT rect[i,j,k,2], x1, y1, x2, y2   % окантовка
  NEXT j
  GR.TEXT.DRAW l, x - d/2 + i * d, y[k] - 4, l$[i]
  GR.TEXT.DRAW n, x - 20, y[k] - 5 + i * d, INT$(i)
 NEXT i
 GR.TEXT.DRAW title, x + 156, y[k] - 28, title$[k]
NEXT k

x1 = x + 11.5 * d

! рисуем боковые кнопки
GR.CIRCLE toggle11, x1, y[1] + 1.5 * d, d
GR.CIRCLE toggle13, x1, y[1] + 8.5 * d, d

! рисуем hit во второй боковой кнопке
y1 = y[1] + 8.5 * d
GOSUB hit

!---------------------------------------------------------!
!маркируем все клетки первого поля, 0 - пустая, 1 - палуба!
!---------------------------------------------------------!
DIM cell_ship1[10,10]
FOR i = 1 TO 10
 FOR j = 1 TO 10
  cell_ship1[i,j] = 0
 NEXT j
NEXT i

!---------------------------------!
!расставляем корабли в первом поле!
!---------------------------------!
!один четырёхпалубный
! z=1 горизонтально
! z=2 вертикально
z = INT(2*RND() + 1)
IF z = 1
 i = INT(7*RND() + 1)
 j = INT(10*RND() + 1)
 cell_ship1[i+1,j] = 1
 cell_ship1[i+2,j] = 1
 cell_ship1[i+3,j] = 1
ELSE
 i = INT(10*RND() + 1)
 j = INT(7*RND() + 1)
 cell_ship1[i,j+1] = 1
 cell_ship1[i,j+2] = 1
 cell_ship1[i,j+3] = 1
ENDIF
cell_ship1[i,j] = 1

!два трёхпалубных
! z=1 горизонтально
! z=2 вертикально
FOR m = 1 TO 2
repeat2:
z = INT(2*RND() + 1)
IF z = 1
 i = INT(8*RND() + 1)
 j = INT(10*RND() + 1)
 IF cell_ship1[i,j] = 1 | cell_ship1[i+1,j] = 1 | cell_ship1[i+2,j] = 1 THEN GOTO repeat2
 IF i > 1 THEN IF cell_ship1[i-1,j] = 1 THEN GOTO repeat2
 IF i < 8 THEN IF cell_ship1[i+3,j] = 1 THEN GOTO repeat2
 IF j > 1 THEN IF cell_ship1[i,j-1] = 1 | cell_ship1[i+1,j-1] = 1 |cell_ship1[i+2,j-1] = 1 THEN GOTO repeat2
 IF j < 10 THEN IF cell_ship1[i,j+1] = 1 | cell_ship1[i+1,j+1] = 1 |cell_ship1[i+2,j+1] = 1 THEN GOTO repeat2
 IF i > 1 & j > 1 THEN IF cell_ship1[i-1,j-1] = 1 THEN GOTO repeat2
 IF i < 8 & j > 1 THEN IF cell_ship1[i+3,j-1] = 1 THEN GOTO repeat2
 IF i > 1 & j < 10 THEN IF cell_ship1[i-1,j+1] = 1 THEN GOTO repeat2
 IF i < 8 & j < 10 THEN IF cell_ship1[i+3,j+1] = 1 THEN GOTO repeat2
 cell_ship1[i+1,j] = 1
 cell_ship1[i+2,j] = 1
ELSE
 i = INT(10*RND() + 1)
 j = INT(8*RND() + 1)
 IF cell_ship1[i,j] = 1 | cell_ship1[i,j+1] = 1 | cell_ship1[i,j+2] = 1 THEN GOTO repeat2
 IF j > 1 THEN IF cell_ship1[i,j-1] = 1 THEN GOTO repeat2
 IF j < 8 THEN IF cell_ship1[i,j+3] = 1 THEN GOTO repeat2
 IF i > 1 THEN IF cell_ship1[i-1,j] = 1 | cell_ship1[i-1,j+1] = 1 | cell_ship1[i-1,j+2] = 1 THEN GOTO repeat2
 IF i < 10 THEN IF cell_ship1[i+1,j] = 1 | cell_ship1[i+1,j+1] = 1 | cell_ship1[i+1,j+2] = 1 THEN GOTO repeat2
 IF i > 1 & j > 1 THEN IF cell_ship1[i-1,j-1] = 1 THEN GOTO repeat2
 IF i < 10 & j > 1 THEN IF cell_ship1[i+1,j-1] = 1 THEN GOTO repeat2
 IF i > 1 & j < 8 THEN IF cell_ship1[i-1,j+3] = 1 THEN GOTO repeat2
 IF i < 10 & j < 8 THEN IF cell_ship1[i+1,j+3] = 1 THEN GOTO repeat2
 cell_ship1[i,j+1] = 1
 cell_ship1[i,j+2] = 1
ENDIF
cell_ship1[i,j] = 1
NEXT m

!три двухпалубных
! z=1 горизонтально
! z=2 вертикально
FOR m = 1 TO 3
repeat3:
z = INT(2*RND() + 1)
IF z = 1
 i = INT(9*RND() + 1)
 j = INT(10*RND() + 1)
 IF cell_ship1[i,j] = 1 | cell_ship1[i+1,j] = 1 THEN GOTO repeat3
 IF i > 1 THEN IF cell_ship1[i-1,j] = 1 THEN GOTO repeat3
 IF i < 9 THEN IF cell_ship1[i+2,j] = 1 THEN GOTO repeat3
 IF j > 1 THEN IF cell_ship1[i,j-1] = 1 | cell_ship1[i+1,j-1] = 1 THEN GOTO repeat3
 IF j < 10 THEN IF cell_ship1[i,j+1] = 1 | cell_ship1[i+1,j+1] = 1 THEN GOTO repeat3
 IF i > 1 & j > 1 THEN IF cell_ship1[i-1,j-1] = 1 THEN GOTO repeat3
 IF i < 9 & j > 1 THEN IF cell_ship1[i+2,j-1] = 1 THEN GOTO repeat3
 IF i > 1 & j < 10 THEN IF cell_ship1[i-1,j+1] = 1 THEN GOTO repeat3
 IF i < 9 & j < 10 THEN IF cell_ship1[i+2,j+1] = 1 THEN GOTO repeat3
 cell_ship1[i+1,j] = 1
ELSE
 i = INT(10*RND() + 1)
 j = INT(9*RND() + 1)
 IF cell_ship1[i,j] = 1 | cell_ship1[i,j+1] = 1 THEN GOTO repeat3
 IF j > 1 THEN IF cell_ship1[i,j-1] = 1 THEN GOTO repeat3
 IF j < 9 THEN IF cell_ship1[i,j+2] = 1 THEN GOTO repeat3
 IF i > 1 THEN IF cell_ship1[i-1,j] = 1 | cell_ship1[i-1,j+1] = 1 THEN GOTO repeat3
 IF i < 10 THEN IF cell_ship1[i+1,j] = 1 | cell_ship1[i+1,j+1] = 1 THEN GOTO repeat3
 IF i > 1 & j > 1 THEN IF cell_ship1[i-1,j-1] = 1 THEN GOTO repeat3
 IF i < 10 & j > 1 THEN IF cell_ship1[i+1,j-1] = 1 THEN GOTO repeat3
 IF i > 1 & j < 9 THEN IF cell_ship1[i-1,j+2] = 1 THEN GOTO repeat3
 IF i < 10 & j < 9 THEN IF cell_ship1[i+1,j+2] = 1 THEN GOTO repeat3
 cell_ship1[i,j+1] = 1
ENDIF
cell_ship1[i,j] = 1
NEXT m

!четыре однопалубных
! z=1 горизонтально
! z=2 вертикально
FOR m = 1 TO 4
repeat4:
i = INT(10*RND() + 1)
j = INT(10*RND() + 1)
IF cell_ship1[i,j] = 1 THEN GOTO repeat4
IF i > 1 THEN IF cell_ship1[i-1,j] = 1 THEN GOTO repeat4
IF i < 10 THEN IF cell_ship1[i+1,j] = 1 THEN GOTO repeat4
IF j > 1 THEN IF cell_ship1[i,j-1] = 1 THEN GOTO repeat4
IF j < 10 THEN IF cell_ship1[i,j+1] = 1 THEN GOTO repeat4
IF i > 1 & j > 1 THEN IF cell_ship1[i-1,j-1] = 1 THEN GOTO repeat4
IF i < 10 & j > 1 THEN IF cell_ship1[i+1,j-1] = 1 THEN GOTO repeat4
IF i > 1 & j < 10 THEN IF cell_ship1[i-1,j+1] = 1 THEN GOTO repeat4
IF i < 10 & j < 10 THEN IF cell_ship1[i+1,j+1] = 1 THEN GOTO repeat4
cell_ship1[i,j] = 1
NEXT m

!-------------------------------------------!
!закончили расставлять корабли в первом поле!
!-------------------------------------------!
!----------------------------------!
!расставляем корабли во втором поле!
!----------------------------------!
!----------------------------------------------------------------------------------------------------------------------!
!маркируем все клетки второго поля                                                                                     !
!-2 - непроверена-палуба, -1 - непроверена-пусто, 0 - непроверена-неизвестно, 1 - проверена-пусто, 2 - проверена-палуба!
!----------------------------------------------------------------------------------------------------------------------!
DIM cell_ship2[10,10]
FOR i = 1 TO 10
 FOR j = 1 TO 10
  cell_ship2[i,j] = -1
 NEXT j
NEXT i

GR.RENDER
ship:
boat2 = 0               % подсчёт количества палуб во втором поле
PAUSE 200

GOSUB panel_start_info
GR.RENDER

DO
 GR.BOUNDED.TOUCH button_touch, 170, 270, 310, 330         % определяем зону кнопки panel_start_info для тапа
 GR.BOUNDED.TOUCH flag, x, y[2], x + 10 * d, y[2] + 10 * d   % определяем зону расстановки кораблей для тапа
 IF flag
  DO
   GR.TOUCH touched, a, b            % запоминаем координаты тапа (a,b)
  UNTIL !touched
  GR.GET.PIXEL a, b, ax, rx, gx, bx      % определяем цвет квадрата где тап
  i = INT((a-x)/d) + 1               % определяем квадрат по x, в котором был тап
  j = INT((b-y[2])/d) + 1            % определяем квадрат по y, в котором был тап
  IF gx = 255                     % если не красный (незанят), то:
   GR.HIDE rect[i,j,2,1]
   GR.HIDE rect[i,j,2,2]
   cell_ship2[i,j] = -2               % - занимаем ("непроверена-палуба")
  ELSE                           % если красный (занят), то:
   GR.SHOW rect[i,j,2,1]
   GR.SHOW rect[i,j,2,2]
   cell_ship2[i,j] = -1               % - отмечаем "непроверен-пусто" (снимаем "занато")
  ENDIF
 ENDIF
 GR.RENDER
UNTIL button_touch

GR.HIDE grp_panel_start_info      % скрываем инфо-панель

!-----------------------------------------!
!проверяем количество палуб во втором поле!
!-----------------------------------------!
FOR i = 1 TO 10
 FOR j = 1 TO 10
  boat2 = boat2 + cell_ship2[i,j]
 NEXT j
NEXT i
IF boat2 <> -120
 GOSUB panel_ship_alert            % рисуем panel_ship_alert
 GR.RENDER
  DO
   GR.BOUNDED.TOUCH button_alert_touch, 170, 600, 310, 660   % определяем зону кнопки rect_button_ok для тапа
   IF button_alert_touch
    GR.HIDE grp_panel_ship_alert   % скрываем panel_ship_alert
    GR.RENDER
   ENDIF
  UNTIL button_alert_touch
 GOTO ship
ENDIF

!--------------------------------------------!
!закончили расставлять корабли во втором поле!
!--------------------------------------------!

GR.HIDE grp_panel_start_info   % скрываем инфо-панель
GR.HIDE rect_red_bg2         % скрываем красный квадрат под полем 2
GR.RENDER

!-------------------------------------------!
!корабли расставлены, вперёд в бой          !
!стреляем в случайный квадрат во втором поле!
!-------------------------------------------!
shot2:
i = INT(10*RND() + 1)
j = INT(10*RND() + 1)
IF cell_ship2[i,j] > 0 THEN GOTO shot2      % если проверенная, то стреляем опять
shot2_after_destroy:
PAUSE 500
GOSUB panel_shot                     % предупреждаем о выстреле
GR.RENDER

DO
 GR.BOUNDED.TOUCH button_ok, 170, 600, 310, 660   % определяем зону кнопки rect_button_ok для тапа
UNTIL button_ok
GR.HIDE grp_panel_shot      % прячем предупреждающую панель
GR.RENDER

PAUSE 500

x1 = x + i * d - d/2                  % координаты центра квадрата
y1 = y[2] + j * d - d/2

FOR m = 1 TO 2                        % два раза мигаем check в выбранном поле
 GOSUB check
 GR.RENDER
 PAUSE 200
 GR.HIDE check
 GR.RENDER
 PAUSE 300
NEXT m

IF cell_ship2[i,j] = -2                  % если попал, то:
 cell_ship2[i,j] = 2                  % - отмечаем "проверена-палуба"
 GOSUB destroy                         % - отмечаем крестом
 GR.RENDER
 destroy_boat2_num = destroy_boat2_num + 1   % - считаем количество попаданий во втором поле
 IF destroy_boat2_num = 20
  GOSUB panel_you_lost
  GOTO finish
 ENDIF
 IF i > 1 & j > 1 THEN cell_ship2[i-1,j-1]=1   % помечаем как "пустая" угловые клетки
 IF i < 10 & j > 1 THEN cell_ship2[i+1,j-1]=1
 IF i > 1 & j < 10 THEN cell_ship2[i-1,j+1]=1
 IF i < 10 & j < 10 THEN cell_ship2[i+1,j+1]=1
 
    % стреляем в соседнюю клетку
 IF i > 1
  IF cell_ship2[i-1,j]<0
   i=i-1
   GOTO shot2_after_destroy
  ENDIF
 ENDIF
 IF i < 10
  IF cell_ship2[i+1,j]<0
   i=i+1
   GOTO shot2_after_destroy
  ENDIF
 ENDIF
 IF j > 1
  IF cell_ship2[i,j-1]<0
   j=j-1
   GOTO shot2_after_destroy
  ENDIF
 ENDIF
 IF j < 10
  IF cell_ship2[i,j+1]<0
   j=j+1
   GOTO shot2_after_destroy
  ENDIF
 ENDIF
 
 GOTO shot2                           % - стреляем опять
ENDIF                              % если непроверенная пустая, то:
cell_ship2[i,j] = 1                     % - помечаем, что пустая проверенная
GOSUB hit                            % - рисуем серую точку
GR.RENDER
PAUSE 1000

!---------------------------------!
!наш ход, стреляем по первому полю!
!---------------------------------!
! переключатель панелей красим в зелёный - переход хода
GR.COLOR 255, 0, 255, 0, 1                           % непрозрачный зелёный заполненный
GR.CIRCLE panel_switch1, x + 11.5 * d, y[1] + 1.5 * d, d   % окружность

shot1:
GOSUB panel_your_turn                  % рисуем на 1 сек и прячем панель "Ваш ход"
GR.RENDER
PAUSE 1000
GR.HIDE grp_panel_your_turn
hit1:
GR.RENDER

check = 0

DO
 GR.BOUNDED.TOUCH confirm_check, x + 10.5 * d, y[1] + 0.5 * d, x + 12.5 * d, y[1] + 2.5 * d   % определяем зону зелёной кнопки для подтверждения выстрела
 GR.BOUNDED.TOUCH confirm_hit, x + 10.5 * d, y[1] + 7.5 * d, x + 12.5 * d, y[1] + 9.5 * d      % определяем зону кнопки "проверено-пусто"
 GR.BOUNDED.TOUCH flag, x, y[1], x + 10 * d, y[1] + 10 * d                           % определяем зону первого поля для тапа
 IF flag
  DO
   GR.TOUCH touched, a, b            % запоминаем координаты тапа (a,b)
  UNTIL !touched
  GR.HIDE check                     % скрываем предыдущий красный check
  i = INT((a-x)/d) + 1               % определяем квадрат по x, в котором был тап
  j = INT((b-y[1])/d) + 1            % определяем квадрат по y, в котором был тап
  x1 = x + i * d - d/2
  y1 = y[1] + j * d - d/2
  GOSUB check                     % рисуем красный check
  x1_prev = x1
  y1_prev = y1
  GR.RENDER
 ENDIF
UNTIL check & confirm_check | confirm_hit

GR.HIDE check                        % скрываем красный check

DO
 GR.TOUCH touched, a, b
UNTIL !touched

IF confirm_hit
 GOSUB hit                           % - рисуем серую точку
 GOTO hit1                           % - стреляем по первому полю снова
ENDIF

IF cell_ship1[i,j] = 1                  % если попал, то:
 GOSUB destroy                        % - рисуем крест
 destroy_boat1_num = destroy_boat1_num + 1   % - считаем количество попаданий в первом поле
 IF destroy_boat1_num = 20
  GOSUB panel_you_won
  GOTO finish
 ENDIF
 GOTO shot1                           % - стреляем по первому полю снова
ENDIF

GOSUB hit            % рисуем серую точку
GR.HIDE panel_switch1   % переключатель панелей красим из зелёного в белый - переход хода
GR.RENDER
GOTO shot2            % стреляем по второму полю

finish:

! рисуем кнопку и вопрос в ней
GR.CIRCLE ask, x + 11.5 * d, y[2] + 8.5 * d, d
GR.TEXT.DRAW ask, x + 11.5 * d, y[2] + 8.8 * d, "?"
GR.RENDER

PAUSE 1000
GR.HIDE grp_panel_fin
GR.RENDER

count = 0
count:
DO
 GR.BOUNDED.TOUCH main_info, x + 10.5 * d, y[2] + 7.5 * d, x + 12.5 * d, y[2] + 9.5 * d      % определяем зону кнопки основного меню
IF main_info THEN DIALOG.MESSAGE "", "ИГРА ОКОНЧЕНА", count, "выйти", "играть", "отмена"
IF count = 1 THEN EXIT
IF count = 2 THEN GOTO start
IF count = 3 THEN GOTO count
UNTIL main_info

DO
UNTIL 0

panel_start_info:                     % рисуем инфо-панель и кнопку
GR.COLOR 255, 255, 255, 255, 1            % непрозрачный белый заполненный
GR.RECT rect_info, 50, 100, 430, 370      % квадрат
GR.COLOR 255, 200, 200, 200, 1            % непрозрачный серый заполненный
GR.RECT rect_button, 170, 270, 310, 330      % квадрат
GR.COLOR 255, 0, 0, 0, 0               % непрозрачный чёрный незаполненный
GR.RECT rect_info_border, 50, 100, 430, 370   % окантовка
GR.RECT button_border, 170, 270, 310, 330   % окантовка
GR.TEXT.DRAW info1, 240, 150, "Расставьте свои"
GR.TEXT.DRAW info2, 240, 190, "корабли, затем"
GR.TEXT.DRAW info3, 240, 230, "нажмите \"ГОТОВО\""
GR.TEXT.DRAW button_text, 240, 310, "ГОТОВО"
GR.GROUP grp_panel_start_info, rect_info, rect_button, rect_info_border, button_border, info1, info2, info3, button_text
RETURN

panel_ship_alert:                        % рисуем алерт-панель и кнопку
GR.COLOR 255, 255, 255, 255, 1               % непрозрачный белый заполненный
GR.RECT rect_alert, 50, 440, 430, 690         % квадрат
GR.COLOR 255, 200, 200, 200, 1               % непрозрачный серый заполненный
GR.RECT rect_button_ok, 170, 600, 310, 660      % квадрат
GR.COLOR 255, 0, 0, 0, 0                  % непрозрачный чёрный незаполненный
GR.RECT rect_alert_border, 50, 440, 430, 690   % окантовка
GR.RECT button_ok_border, 170, 600, 310, 660   % окантовка
GR.TEXT.DRAW alert1, 240, 490, "Проверьте количество"
GR.TEXT.DRAW alert2, 240, 530, "и правильность"
GR.TEXT.DRAW alert3, 240, 570, "расстановки кораблей"
GR.TEXT.DRAW button_alert_text, 240, 640, "ОК"
GR.GROUP grp_panel_ship_alert, rect_alert, rect_button_ok, rect_alert_border, button_ok_border, alert1, alert2, alert3, button_alert_text
RETURN

panel_shot:                              % рисуем панель "Стреляю!" и кнопку
GR.COLOR 255, 255, 255, 255, 1               % непрозрачный белый заполненный
GR.RECT rect_alert, 50, 460, 430, 690         % квадрат
GR.COLOR 255, 200, 200, 200, 1               % непрозрачный серый заполненный
GR.RECT rect_button_ok, 170, 600, 310, 660      % квадрат
GR.COLOR 255, 0, 0, 0, 0                  % непрозрачный чёрный незаполненный
GR.RECT rect_alert_border, 50, 460, 430, 690   % окантовка
GR.RECT button_ok_border, 170, 600, 310, 660   % окантовка
GR.TEXT.DRAW alert1, 240, 520, "МОЙ ХОД"
GR.TEXT.DRAW alert2, 240, 560, "СТРЕЛЯЮ!"
GR.TEXT.DRAW button_alert_text, 240, 640, "ОК"
GR.GROUP grp_panel_shot, rect_alert, rect_button_ok, rect_alert_border, button_ok_border, alert1, alert2, button_alert_text
RETURN

panel_your_turn:                        % рисуем панель "Ваш ход"
GR.COLOR 255, 255, 255, 255, 1               % непрозрачный белый заполненный
GR.RECT rect_alert, 50, 440, 430, 600         % квадрат
GR.COLOR 255, 0, 0, 0, 0                  % непрозрачный чёрный незаполненный
GR.RECT rect_alert_border, 50, 440, 430, 600   % окантовка
GR.TEXT.DRAW alert, 240, 530, "Ваш ход"
GR.GROUP grp_panel_your_turn, rect_alert, rect_alert_border, alert
RETURN

panel_you_won:                        % панель "Вы выиграли"
PAUSE 500
GR.COLOR 255, 255, 255, 255, 1            % непрозрачный белый заполненный
GR.RECT rect_info, 50, 240, 430, 460      % квадрат
GR.COLOR 255, 0, 0, 0, 0               % непрозрачный чёрный незаполненный
GR.RECT rect_info_border, 50, 240, 430, 460   % окантовка
GR.TEXT.DRAW info1, 240, 330, "ПОЗДРАВЛЯЮ"
GR.TEXT.DRAW info2, 240, 390, "ВЫ ВЫИГРАЛИ!"
GR.GROUP grp_panel_fin, rect_info, rect_info_border, info1, info2
RETURN

panel_you_lost:                        % панель "Вы проиграли"
PAUSE 500
GR.COLOR 255, 255, 255, 255, 1            % непрозрачный белый заполненный
GR.RECT rect_info, 50, 240, 430, 460      % квадрат
GR.COLOR 255, 0, 0, 0, 0               % непрозрачный чёрный незаполненный
GR.RECT rect_info_border, 50, 240, 430, 460   % окантовка
GR.TEXT.DRAW info1, 240, 330, "СОЧУВСТВУЮ"
GR.TEXT.DRAW info2, 240, 390, "ВЫ ПРОИГРАЛИ"
GR.GROUP grp_panel_fin, rect_info, rect_info_border, info1, info2
RETURN

check:                     % выбор квадрата - "выстрел"
GR.COLOR 255, 255, 0, 0, 1      % непрозрачный красный заполненный
GR.CIRCLE check, x1, y1, d/2   % окружность
RETURN

hit:                     % серая точка - "мимо"
GR.COLOR 255, 200, 200, 200, 1   % непрозрачный серый заполненный
GR.CIRCLE hit, x1, y1, d/4      % окружность
RETURN

destroy:                  % крест - "попал", "убил"
GR.COLOR 255, 0, 0, 0, 0      % непрозрачный чёрный незаполненный
GR.LINE destroy1, x1 - d/2 + 4, y1 - d/2 + 4, x1 + d/2 - 4, y1 + d/2 - 4
GR.LINE destroy2, x1 - d/2 + 4, y1 + d/2 - 4, x1 + d/2 - 4, y1 - d/2 + 4
RETURN


Здесь сам файл (кому лень копи-пастить):
battle v1.0b.bas
(23.04 КБ) 132 скачивания

1961uvg
Сообщения: 533
Зарегистрирован: 14 ноя 2015, 09:17

Re: Игра "Морской бой!

Сообщение 1961uvg » 01 дек 2016, 18:48

bk99
Я уже поместил сообщение на форумах , думаю людей заинтерисует и будут отзывы!
А я пока начну ее изучать!
Так что жди комментарии и советы!
А так с первого взгляда - прикольно!

1961uvg
Сообщения: 533
Зарегистрирован: 14 ноя 2015, 09:17

Re: Игра "Морской бой!

Сообщение 1961uvg » 01 дек 2016, 19:25

Я бы сказал отлично!
Я ещё листинг не смотрел, но в самой игре
на нервы действует подтверждение "Мой ход"!
Нужно просто надпись " Мой ход'" командой Popup и далее ход.
Зачем подтверждать очевидное!
Второе - если корабль уничтожен , его надо зачеркнуть!
А то приходиться лишний раз бомбить!
Буду дальше смотреть!

bk99
Сообщения: 6
Зарегистрирован: 01 дек 2016, 08:37

Re: Игра "Морской бой!

Сообщение bk99 » 02 дек 2016, 08:47

1961uvg писал(а):на нервы действует подтверждение "Мой ход"!
Нужно просто надпись " Мой ход'" командой Popup и далее ход.


Ну, тогда как-то так:

Код: Выделить всё

GR.OPEN , , , , , 1
PAUSE 500

GR.COLOR 255, 200, 200, 200, 1               % непрозрачный серый заполненный
GR.RECT button_info, 130, 650, 350, 710         % кнопка
GR.COLOR 255, 0, 0, 0, 0                  % непрозрачный чёрный незаполненный
GR.RECT info_border, 20, 20, 460, 780         % окантовка экрана
GR.RECT button_info_border, 130, 650, 350, 710   % окантовка кнопки

GR.TEXT.SIZE 50
GR.TEXT.ALIGN 2
GR.TEXT.DRAW info, 240, 70, "игра"
GR.TEXT.DRAW info, 240, 130, "\"МОРСКОЙ БОЙ\""

GR.TEXT.SIZE 30
GR.TEXT.DRAW button_info_text, 240, 690, "Я ВСЁ ПОНЯЛ"
GR.TEXT.DRAW info, 240, 760, "v.1.0b - bk99(c) - 2016"

GR.TEXT.ALIGN 1
GR.TEXT.DRAW info, 40, 190, "Расставьте свои корабли:"
GR.TEXT.DRAW info, 40, 230, " - один четырёхпалубный;"
GR.TEXT.DRAW info, 40, 260, " - два трёхпалубных;"
GR.TEXT.DRAW info, 40, 290, " - три двухпалубных;"
GR.TEXT.DRAW info, 40, 320, " - и четыре однопалубных."
GR.TEXT.DRAW info, 40, 360, "Всего должно быть десять"
GR.TEXT.DRAW info, 40, 390, "кораблей. Корабли не дол-"
GR.TEXT.DRAW info, 40, 420, "жны изгибаться и соприка-"
GR.TEXT.DRAW info, 40, 450, "саться."
GR.TEXT.DRAW info, 40, 490, "Подтверждайте свои выст-"
GR.TEXT.DRAW info, 40, 520, "релы нажатием на зелёную"
GR.TEXT.DRAW info, 40, 550, "кнопку. Можно отмечать"
GR.TEXT.DRAW info, 40, 580, "заведомо пустые поля -"
GR.TEXT.DRAW info, 40, 610, "кнопка с серой точкой."

GR.RENDER

DO
 GR.BOUNDED.TOUCH button_info, 130, 650, 350, 710   % определяем зону кнопки button_info для тапа
UNTIL button_info

start:
GR.CLS

!!
i - горизонталь (буквы)
j - вертикаль (цифры)
rect[2,4,k,n] - клетка "Б4"
k - 1:противник, 2:мы
n - 1:белый, 2:каёмка
!!

destroy_boat1_num = 0      % подсчёт количества крестов в первом поле
destroy_boat2_num = 0      % подсчёт количества крестов во втором поле
x = 40                  % от левого края до поля
d = 34                  % размер клетки
ARRAY.LOAD y[], 55, 454      % от верха до поля
ARRAY.LOAD title$[], "противник", "наша армада"
ARRAY.LOAD l$[], "а", "б", "в", "г", "д", "е", "ж", "з", "и", "к"

GR.TEXT.SIZE 30
GR.TEXT.ALIGN 2

! рисуем серый и красный квадраты и окантовку в фоне во втором поле
GR.COLOR 255, 200, 200, 200, 1                     % непрозрачный серый заполненный
GR.RECT rect_grey_bg, x, y[2], x + 10*d, y[2] + 10*d   % квадрат во втором поле
GR.COLOR 255, 255, 0, 0, 1                        % непрозрачный красный заполненный
GR.RECT rect_red_bg2, x, y[2], x + 10*d, y[2] + 10*d   % квадрат во втором поле
GR.COLOR 255, 0, 0, 0, 0                        % непрозрачный чёрный незаполненный
GR.RECT rect_border_bg2, x, y[2], x + 10*d, y[2] + 10*d   % окантовка во втором поле

!---------------------------!
!рисуем два поля с подписями!
!---------------------------!
DIM rect[10,10,2,2]
FOR k = 1 TO 2
 FOR i = 1 TO 10
  FOR j = 1 TO 10
   x1 = x + (i-1)*d
   y1 = y[k] + (j-1)*d
   x2 = x + i * d
   y2 = y[k] + j * d
   GR.COLOR 255, 255, 255, 255, 1         % непрозрачный белый заполненный
   GR.RECT rect[i,j,k,1], x1, y1, x2, y2   % квадрат
   GR.COLOR 255, 0, 0, 0, 0               % непрозрачный чёрный незаполненный
   GR.RECT rect[i,j,k,2], x1, y1, x2, y2   % окантовка
  NEXT j
  GR.TEXT.DRAW l, x - d/2 + i * d, y[k] - 4, l$[i]
  GR.TEXT.DRAW n, x - 20, y[k] - 5 + i * d, INT$(i)
 NEXT i
 GR.TEXT.DRAW title, x + 156, y[k] - 28, title$[k]
NEXT k

x1 = x + 11.5 * d

! рисуем боковые кнопки
GR.CIRCLE toggle11, x1, y[1] + 1.5 * d, d
GR.CIRCLE toggle13, x1, y[1] + 8.5 * d, d

! рисуем hit во второй боковой кнопке
y1 = y[1] + 8.5 * d
GOSUB hit

!---------------------------------------------------------!
!маркируем все клетки первого поля, 0 - пустая, 1 - палуба!
!---------------------------------------------------------!
DIM cell_ship1[10,10]
FOR i = 1 TO 10
 FOR j = 1 TO 10
  cell_ship1[i,j] = 0
 NEXT j
NEXT i

!---------------------------------!
!расставляем корабли в первом поле!
!---------------------------------!
!один четырёхпалубный
! z=1 горизонтально
! z=2 вертикально
z = INT(2*RND() + 1)
IF z = 1
 i = INT(7*RND() + 1)
 j = INT(10*RND() + 1)
 cell_ship1[i+1,j] = 1
 cell_ship1[i+2,j] = 1
 cell_ship1[i+3,j] = 1
ELSE
 i = INT(10*RND() + 1)
 j = INT(7*RND() + 1)
 cell_ship1[i,j+1] = 1
 cell_ship1[i,j+2] = 1
 cell_ship1[i,j+3] = 1
ENDIF
cell_ship1[i,j] = 1

!два трёхпалубных
! z=1 горизонтально
! z=2 вертикально
FOR m = 1 TO 2
repeat2:
z = INT(2*RND() + 1)
IF z = 1
 i = INT(8*RND() + 1)
 j = INT(10*RND() + 1)
 IF cell_ship1[i,j] = 1 | cell_ship1[i+1,j] = 1 | cell_ship1[i+2,j] = 1 THEN GOTO repeat2
 IF i > 1 THEN IF cell_ship1[i-1,j] = 1 THEN GOTO repeat2
 IF i < 8 THEN IF cell_ship1[i+3,j] = 1 THEN GOTO repeat2
 IF j > 1 THEN IF cell_ship1[i,j-1] = 1 | cell_ship1[i+1,j-1] = 1 |cell_ship1[i+2,j-1] = 1 THEN GOTO repeat2
 IF j < 10 THEN IF cell_ship1[i,j+1] = 1 | cell_ship1[i+1,j+1] = 1 |cell_ship1[i+2,j+1] = 1 THEN GOTO repeat2
 IF i > 1 & j > 1 THEN IF cell_ship1[i-1,j-1] = 1 THEN GOTO repeat2
 IF i < 8 & j > 1 THEN IF cell_ship1[i+3,j-1] = 1 THEN GOTO repeat2
 IF i > 1 & j < 10 THEN IF cell_ship1[i-1,j+1] = 1 THEN GOTO repeat2
 IF i < 8 & j < 10 THEN IF cell_ship1[i+3,j+1] = 1 THEN GOTO repeat2
 cell_ship1[i+1,j] = 1
 cell_ship1[i+2,j] = 1
ELSE
 i = INT(10*RND() + 1)
 j = INT(8*RND() + 1)
 IF cell_ship1[i,j] = 1 | cell_ship1[i,j+1] = 1 | cell_ship1[i,j+2] = 1 THEN GOTO repeat2
 IF j > 1 THEN IF cell_ship1[i,j-1] = 1 THEN GOTO repeat2
 IF j < 8 THEN IF cell_ship1[i,j+3] = 1 THEN GOTO repeat2
 IF i > 1 THEN IF cell_ship1[i-1,j] = 1 | cell_ship1[i-1,j+1] = 1 | cell_ship1[i-1,j+2] = 1 THEN GOTO repeat2
 IF i < 10 THEN IF cell_ship1[i+1,j] = 1 | cell_ship1[i+1,j+1] = 1 | cell_ship1[i+1,j+2] = 1 THEN GOTO repeat2
 IF i > 1 & j > 1 THEN IF cell_ship1[i-1,j-1] = 1 THEN GOTO repeat2
 IF i < 10 & j > 1 THEN IF cell_ship1[i+1,j-1] = 1 THEN GOTO repeat2
 IF i > 1 & j < 8 THEN IF cell_ship1[i-1,j+3] = 1 THEN GOTO repeat2
 IF i < 10 & j < 8 THEN IF cell_ship1[i+1,j+3] = 1 THEN GOTO repeat2
 cell_ship1[i,j+1] = 1
 cell_ship1[i,j+2] = 1
ENDIF
cell_ship1[i,j] = 1
NEXT m

!три двухпалубных
! z=1 горизонтально
! z=2 вертикально
FOR m = 1 TO 3
repeat3:
z = INT(2*RND() + 1)
IF z = 1
 i = INT(9*RND() + 1)
 j = INT(10*RND() + 1)
 IF cell_ship1[i,j] = 1 | cell_ship1[i+1,j] = 1 THEN GOTO repeat3
 IF i > 1 THEN IF cell_ship1[i-1,j] = 1 THEN GOTO repeat3
 IF i < 9 THEN IF cell_ship1[i+2,j] = 1 THEN GOTO repeat3
 IF j > 1 THEN IF cell_ship1[i,j-1] = 1 | cell_ship1[i+1,j-1] = 1 THEN GOTO repeat3
 IF j < 10 THEN IF cell_ship1[i,j+1] = 1 | cell_ship1[i+1,j+1] = 1 THEN GOTO repeat3
 IF i > 1 & j > 1 THEN IF cell_ship1[i-1,j-1] = 1 THEN GOTO repeat3
 IF i < 9 & j > 1 THEN IF cell_ship1[i+2,j-1] = 1 THEN GOTO repeat3
 IF i > 1 & j < 10 THEN IF cell_ship1[i-1,j+1] = 1 THEN GOTO repeat3
 IF i < 9 & j < 10 THEN IF cell_ship1[i+2,j+1] = 1 THEN GOTO repeat3
 cell_ship1[i+1,j] = 1
ELSE
 i = INT(10*RND() + 1)
 j = INT(9*RND() + 1)
 IF cell_ship1[i,j] = 1 | cell_ship1[i,j+1] = 1 THEN GOTO repeat3
 IF j > 1 THEN IF cell_ship1[i,j-1] = 1 THEN GOTO repeat3
 IF j < 9 THEN IF cell_ship1[i,j+2] = 1 THEN GOTO repeat3
 IF i > 1 THEN IF cell_ship1[i-1,j] = 1 | cell_ship1[i-1,j+1] = 1 THEN GOTO repeat3
 IF i < 10 THEN IF cell_ship1[i+1,j] = 1 | cell_ship1[i+1,j+1] = 1 THEN GOTO repeat3
 IF i > 1 & j > 1 THEN IF cell_ship1[i-1,j-1] = 1 THEN GOTO repeat3
 IF i < 10 & j > 1 THEN IF cell_ship1[i+1,j-1] = 1 THEN GOTO repeat3
 IF i > 1 & j < 9 THEN IF cell_ship1[i-1,j+2] = 1 THEN GOTO repeat3
 IF i < 10 & j < 9 THEN IF cell_ship1[i+1,j+2] = 1 THEN GOTO repeat3
 cell_ship1[i,j+1] = 1
ENDIF
cell_ship1[i,j] = 1
NEXT m

!четыре однопалубных
! z=1 горизонтально
! z=2 вертикально
FOR m = 1 TO 4
repeat4:
i = INT(10*RND() + 1)
j = INT(10*RND() + 1)
IF cell_ship1[i,j] = 1 THEN GOTO repeat4
IF i > 1 THEN IF cell_ship1[i-1,j] = 1 THEN GOTO repeat4
IF i < 10 THEN IF cell_ship1[i+1,j] = 1 THEN GOTO repeat4
IF j > 1 THEN IF cell_ship1[i,j-1] = 1 THEN GOTO repeat4
IF j < 10 THEN IF cell_ship1[i,j+1] = 1 THEN GOTO repeat4
IF i > 1 & j > 1 THEN IF cell_ship1[i-1,j-1] = 1 THEN GOTO repeat4
IF i < 10 & j > 1 THEN IF cell_ship1[i+1,j-1] = 1 THEN GOTO repeat4
IF i > 1 & j < 10 THEN IF cell_ship1[i-1,j+1] = 1 THEN GOTO repeat4
IF i < 10 & j < 10 THEN IF cell_ship1[i+1,j+1] = 1 THEN GOTO repeat4
cell_ship1[i,j] = 1
NEXT m

!-------------------------------------------!
!закончили расставлять корабли в первом поле!
!-------------------------------------------!
!----------------------------------!
!расставляем корабли во втором поле!
!----------------------------------!
!----------------------------------------------------------------------------------------------------------------------!
!маркируем все клетки второго поля                                                                                     !
!-2 - непроверена-палуба, -1 - непроверена-пусто, 0 - непроверена-неизвестно, 1 - проверена-пусто, 2 - проверена-палуба!
!----------------------------------------------------------------------------------------------------------------------!
DIM cell_ship2[10,10]
FOR i = 1 TO 10
 FOR j = 1 TO 10
  cell_ship2[i,j] = -1
 NEXT j
NEXT i

GR.RENDER
ship:
boat2 = 0               % подсчёт количества палуб во втором поле
PAUSE 200

GOSUB panel_start_info
GR.RENDER

DO
 GR.BOUNDED.TOUCH button_touch, 170, 270, 310, 330         % определяем зону кнопки panel_start_info для тапа
 GR.BOUNDED.TOUCH flag, x, y[2], x + 10 * d, y[2] + 10 * d   % определяем зону расстановки кораблей для тапа
 IF flag
  DO
   GR.TOUCH touched, a, b            % запоминаем координаты тапа (a,b)
  UNTIL !touched
  GR.GET.PIXEL a, b, ax, rx, gx, bx      % определяем цвет квадрата где тап
  i = INT((a-x)/d) + 1               % определяем квадрат по x, в котором был тап
  j = INT((b-y[2])/d) + 1            % определяем квадрат по y, в котором был тап
  IF gx = 255                     % если не красный (незанят), то:
   GR.HIDE rect[i,j,2,1]
   GR.HIDE rect[i,j,2,2]
   cell_ship2[i,j] = -2               % - занимаем ("непроверена-палуба")
  ELSE                           % если красный (занят), то:
   GR.SHOW rect[i,j,2,1]
   GR.SHOW rect[i,j,2,2]
   cell_ship2[i,j] = -1               % - отмечаем "непроверен-пусто" (снимаем "занато")
  ENDIF
 ENDIF
 GR.RENDER
UNTIL button_touch

GR.HIDE grp_panel_start_info      % скрываем инфо-панель
!!
!-----------------------------------------!
!проверяем количество палуб во втором поле!
!-----------------------------------------!
FOR i = 1 TO 10
 FOR j = 1 TO 10
  boat2 = boat2 + cell_ship2[i,j]
 NEXT j
NEXT i
IF boat2 <> -120
 GOSUB panel_ship_alert            % рисуем panel_ship_alert
 GR.RENDER
  DO
   GR.BOUNDED.TOUCH button_alert_touch, 170, 600, 310, 660   % определяем зону кнопки rect_button_ok для тапа
   IF button_alert_touch
    GR.HIDE grp_panel_ship_alert   % скрываем panel_ship_alert
    GR.RENDER
   ENDIF
  UNTIL button_alert_touch
 GOTO ship
ENDIF
!!
!--------------------------------------------!
!закончили расставлять корабли во втором поле!
!--------------------------------------------!

GR.HIDE grp_panel_start_info   % скрываем инфо-панель
GR.HIDE rect_red_bg2         % скрываем красный квадрат под полем 2
GR.RENDER

!-------------------------------------------!
!корабли расставлены, вперёд в бой          !
!стреляем в случайный квадрат во втором поле!
!-------------------------------------------!
shot2:
i = INT(10*RND() + 1)
j = INT(10*RND() + 1)
IF cell_ship2[i,j] > 0 THEN GOTO shot2      % если проверенная, то стреляем опять
shot2_after_destroy:
PAUSE 500
GOSUB panel_shot                     % рисуем на 1 сек и прячем панель "Мой ход. Стреляю."
GR.RENDER
PAUSE 1000
GR.HIDE grp_panel_shot                  % прячем предупреждающую панель
GR.RENDER

PAUSE 500

x1 = x + i * d - d/2                  % координаты центра квадрата
y1 = y[2] + j * d - d/2

FOR m = 1 TO 2                        % два раза мигаем check в выбранном поле
 GOSUB check
 GR.RENDER
 PAUSE 200
 GR.HIDE check
 GR.RENDER
 PAUSE 300
NEXT m

IF cell_ship2[i,j] = -2                  % если попал, то:
 cell_ship2[i,j] = 2                  % - отмечаем "проверена-палуба"
 GOSUB destroy                         % - отмечаем крестом
 GR.RENDER
 destroy_boat2_num = destroy_boat2_num + 1   % - считаем количество попаданий во втором поле
 IF destroy_boat2_num = 20
  GOSUB panel_you_lost
  GOTO finish
 ENDIF
 IF i > 1 & j > 1 THEN cell_ship2[i-1,j-1]=1   % помечаем как "пустая" угловые клетки
 IF i < 10 & j > 1 THEN cell_ship2[i+1,j-1]=1
 IF i > 1 & j < 10 THEN cell_ship2[i-1,j+1]=1
 IF i < 10 & j < 10 THEN cell_ship2[i+1,j+1]=1
 
    % стреляем в соседнюю клетку
 IF i > 1
  IF cell_ship2[i-1,j]<0
   i=i-1
   GOTO shot2_after_destroy
  ENDIF
 ENDIF
 IF i < 10
  IF cell_ship2[i+1,j]<0
   i=i+1
   GOTO shot2_after_destroy
  ENDIF
 ENDIF
 IF j > 1
  IF cell_ship2[i,j-1]<0
   j=j-1
   GOTO shot2_after_destroy
  ENDIF
 ENDIF
 IF j < 10
  IF cell_ship2[i,j+1]<0
   j=j+1
   GOTO shot2_after_destroy
  ENDIF
 ENDIF
 
 GOTO shot2                           % - стреляем опять
ENDIF                              % если непроверенная пустая, то:
cell_ship2[i,j] = 1                     % - помечаем, что пустая проверенная
GOSUB hit                            % - рисуем серую точку
GR.RENDER
PAUSE 1000

!---------------------------------!
!наш ход, стреляем по первому полю!
!---------------------------------!
! переключатель панелей красим в зелёный - переход хода
GR.COLOR 255, 0, 255, 0, 1                           % непрозрачный зелёный заполненный
GR.CIRCLE panel_switch1, x + 11.5 * d, y[1] + 1.5 * d, d   % окружность

shot1:
GOSUB panel_your_turn                  % рисуем на 1 сек и прячем панель "Ваш ход"
GR.RENDER
PAUSE 1000
GR.HIDE grp_panel_your_turn
hit1:
GR.RENDER

check = 0

DO
 GR.BOUNDED.TOUCH confirm_check, x + 10.5 * d, y[1] + 0.5 * d, x + 12.5 * d, y[1] + 2.5 * d   % определяем зону зелёной кнопки для подтверждения выстрела
 GR.BOUNDED.TOUCH confirm_hit, x + 10.5 * d, y[1] + 7.5 * d, x + 12.5 * d, y[1] + 9.5 * d      % определяем зону кнопки "проверено-пусто"
 GR.BOUNDED.TOUCH flag, x, y[1], x + 10 * d, y[1] + 10 * d                           % определяем зону первого поля для тапа
 IF flag
  DO
   GR.TOUCH touched, a, b            % запоминаем координаты тапа (a,b)
  UNTIL !touched
  GR.HIDE check                     % скрываем предыдущий красный check
  i = INT((a-x)/d) + 1               % определяем квадрат по x, в котором был тап
  j = INT((b-y[1])/d) + 1            % определяем квадрат по y, в котором был тап
  x1 = x + i * d - d/2
  y1 = y[1] + j * d - d/2
  GOSUB check                     % рисуем красный check
  x1_prev = x1
  y1_prev = y1
  GR.RENDER
 ENDIF
UNTIL check & confirm_check | confirm_hit

GR.HIDE check                        % скрываем красный check

DO
 GR.TOUCH touched, a, b
UNTIL !touched

IF confirm_hit
 GOSUB hit                           % - рисуем серую точку
 GOTO hit1                           % - стреляем по первому полю снова
ENDIF

IF cell_ship1[i,j] = 1                  % если попал, то:
 GOSUB destroy                        % - рисуем крест
 destroy_boat1_num = destroy_boat1_num + 1   % - считаем количество попаданий в первом поле
 IF destroy_boat1_num = 20
  GOSUB panel_you_won
  GOTO finish
 ENDIF
 GOTO shot1                           % - стреляем по первому полю снова
ENDIF

GOSUB hit            % рисуем серую точку
GR.HIDE panel_switch1   % переключатель панелей красим из зелёного в белый - переход хода
GR.RENDER
GOTO shot2            % стреляем по второму полю

finish:

! рисуем кнопку и вопрос в ней
GR.CIRCLE ask, x + 11.5 * d, y[2] + 8.5 * d, d
GR.TEXT.DRAW ask, x + 11.5 * d, y[2] + 8.8 * d, "?"
GR.RENDER

PAUSE 1000
GR.HIDE grp_panel_fin
GR.RENDER

count = 0
count:
DO
 GR.BOUNDED.TOUCH main_info, x + 10.5 * d, y[2] + 7.5 * d, x + 12.5 * d, y[2] + 9.5 * d      % определяем зону кнопки основного меню
IF main_info THEN DIALOG.MESSAGE "", "ИГРА ОКОНЧЕНА", count, "выйти", "играть", "отмена"
IF count = 1 THEN EXIT
IF count = 2 THEN GOTO start
IF count = 3 THEN GOTO count
UNTIL main_info

DO
UNTIL 0

panel_start_info:                     % рисуем инфо-панель и кнопку
GR.COLOR 255, 255, 255, 255, 1            % непрозрачный белый заполненный
GR.RECT rect_info, 50, 100, 430, 370      % квадрат
GR.COLOR 255, 200, 200, 200, 1            % непрозрачный серый заполненный
GR.RECT rect_button, 170, 270, 310, 330      % квадрат
GR.COLOR 255, 0, 0, 0, 0               % непрозрачный чёрный незаполненный
GR.RECT rect_info_border, 50, 100, 430, 370   % окантовка
GR.RECT button_border, 170, 270, 310, 330   % окантовка
GR.TEXT.DRAW info1, 240, 150, "Расставьте свои"
GR.TEXT.DRAW info2, 240, 190, "корабли, затем"
GR.TEXT.DRAW info3, 240, 230, "нажмите \"ГОТОВО\""
GR.TEXT.DRAW button_text, 240, 310, "ГОТОВО"
GR.GROUP grp_panel_start_info, rect_info, rect_button, rect_info_border, button_border, info1, info2, info3, button_text
RETURN

panel_ship_alert:                        % рисуем алерт-панель и кнопку
GR.COLOR 255, 255, 255, 255, 1               % непрозрачный белый заполненный
GR.RECT rect_alert, 50, 440, 430, 690         % квадрат
GR.COLOR 255, 200, 200, 200, 1               % непрозрачный серый заполненный
GR.RECT rect_button_ok, 170, 600, 310, 660      % квадрат
GR.COLOR 255, 0, 0, 0, 0                  % непрозрачный чёрный незаполненный
GR.RECT rect_alert_border, 50, 440, 430, 690   % окантовка
GR.RECT button_ok_border, 170, 600, 310, 660   % окантовка
GR.TEXT.DRAW alert1, 240, 490, "Проверьте количество"
GR.TEXT.DRAW alert2, 240, 530, "и правильность"
GR.TEXT.DRAW alert3, 240, 570, "расстановки кораблей"
GR.TEXT.DRAW button_alert_text, 240, 640, "ОК"
GR.GROUP grp_panel_ship_alert, rect_alert, rect_button_ok, rect_alert_border, button_ok_border, alert1, alert2, alert3, button_alert_text
RETURN

panel_shot:                              % рисуем панель "Стреляю!"
GR.COLOR 255, 255, 255, 255, 1               % непрозрачный белый заполненный
GR.RECT rect_alert, 50, 530, 430, 690         % квадрат
GR.COLOR 255, 0, 0, 0, 0                  % непрозрачный чёрный незаполненный
GR.RECT rect_alert_border, 50, 530, 430, 690   % окантовка
GR.TEXT.DRAW alert1, 240, 600, "МОЙ ХОД"
GR.TEXT.DRAW alert2, 240, 640, "СТРЕЛЯЮ!"
GR.GROUP grp_panel_shot, rect_alert, rect_alert_border, alert1, alert2
RETURN

panel_your_turn:                        % рисуем панель "Ваш ход"
GR.COLOR 255, 255, 255, 255, 1               % непрозрачный белый заполненный
GR.RECT rect_alert, 50, 440, 430, 600         % квадрат
GR.COLOR 255, 0, 0, 0, 0                  % непрозрачный чёрный незаполненный
GR.RECT rect_alert_border, 50, 440, 430, 600   % окантовка
GR.TEXT.DRAW alert, 240, 530, "Ваш ход"
GR.GROUP grp_panel_your_turn, rect_alert, rect_alert_border, alert
RETURN

panel_you_won:                        % панель "Вы выиграли"
PAUSE 500
GR.COLOR 255, 255, 255, 255, 1            % непрозрачный белый заполненный
GR.RECT rect_info, 50, 240, 430, 460      % квадрат
GR.COLOR 255, 0, 0, 0, 0               % непрозрачный чёрный незаполненный
GR.RECT rect_info_border, 50, 240, 430, 460   % окантовка
GR.TEXT.DRAW info1, 240, 330, "ПОЗДРАВЛЯЮ"
GR.TEXT.DRAW info2, 240, 390, "ВЫ ВЫИГРАЛИ!"
GR.GROUP grp_panel_fin, rect_info, rect_info_border, info1, info2
RETURN

panel_you_lost:                        % панель "Вы проиграли"
PAUSE 500
GR.COLOR 255, 255, 255, 255, 1            % непрозрачный белый заполненный
GR.RECT rect_info, 50, 240, 430, 460      % квадрат
GR.COLOR 255, 0, 0, 0, 0               % непрозрачный чёрный незаполненный
GR.RECT rect_info_border, 50, 240, 430, 460   % окантовка
GR.TEXT.DRAW info1, 240, 330, "СОЧУВСТВУЮ"
GR.TEXT.DRAW info2, 240, 390, "ВЫ ПРОИГРАЛИ"
GR.GROUP grp_panel_fin, rect_info, rect_info_border, info1, info2
RETURN

check:                     % выбор квадрата - "выстрел"
GR.COLOR 255, 255, 0, 0, 1      % непрозрачный красный заполненный
GR.CIRCLE check, x1, y1, d/2   % окружность
RETURN

hit:                     % серая точка - "мимо"
GR.COLOR 255, 200, 200, 200, 1   % непрозрачный серый заполненный
GR.CIRCLE hit, x1, y1, d/4      % окружность
RETURN

destroy:                  % крест - "попал", "убил"
GR.COLOR 255, 0, 0, 0, 0      % непрозрачный чёрный незаполненный
GR.LINE destroy1, x1 - d/2 + 4, y1 - d/2 + 4, x1 + d/2 - 4, y1 + d/2 - 4
GR.LINE destroy2, x1 - d/2 + 4, y1 + d/2 - 4, x1 + d/2 - 4, y1 - d/2 + 4
RETURN


По поводу "если корабль уничтожен , его надо зачеркнут" - такого пока нет, это верно.

1961uvg
Сообщения: 533
Зарегистрирован: 14 ноя 2015, 09:17

Re: Игра "Морской бой!

Сообщение 1961uvg » 02 дек 2016, 13:52

Ну как то так.
Хотя командой POPUP то же самое, но элементарно проще - на экране в заданном месте появляется нужный текст
в рамочке и через заданные секунды исчезает, то есть для этого всего одна команда!

bk99
Сообщения: 6
Зарегистрирован: 01 дек 2016, 08:37

Re: Игра "Морской бой!

Сообщение bk99 » 03 дек 2016, 10:04

1961uvg писал(а):командой POPUP то же самое, но элементарно проще

Да, действительно, так гораздо лучше. Спасибо.

battle v1.0b-popup.bas
(21.44 КБ) 95 скачиваний

(на этом форуме нельзя текст под спойлер прятать?)

Замеченные баги в игре:
1. Выбираем квадрат для удара по противнику. Касаемся поля противника и, не отрываясь от экрана, уводим палец с поля противника в любое место экрана. Отрываем палец от экрана - появляется красная точка. А не должна!
2. Игра заканчивается. В правом нижнем углу появляется кнопка "?". Тапаем по этой кнопке - выскакивает:

Код: Выделить всё

DIALOG.MESSAGE "", "ИГРА ОКОНЧЕНА", count, "выйти", "играть", "отмена"

Если жмём "отмена", то диалоговое окно пропадает, но его можно вызвать опять тапом по этой же кнопке. Но если убрать диалоговое окно, тапнув в любом месте экрана вне этого диалогового окна, то вызвать это окно опять не получится.
Как поправить эти баги я не знаю.

1961uvg
Сообщения: 533
Зарегистрирован: 14 ноя 2015, 09:17

Re: Игра "Морской бой!

Сообщение 1961uvg » 06 дек 2016, 10:35

На эти вопросы и помочь лучше справляется Валера на его сайте : http://rfobasic.ru/
Заходишь , регистрируешься и на форуме выбираешь тему или на почте и задаешь вопрос.
К стати он спрашивал : ты в конкурсе на aNNIMONE на лучшую программу не участвуешь?
Это здесь : http://annimon.com/forum/id477179

bk99
Сообщения: 6
Зарегистрирован: 01 дек 2016, 08:37

Re: Игра "Морской бой!

Сообщение bk99 » 07 дек 2016, 07:51

Не, в консурсах не учавствую...
А Валера сюда не заглядывает?

upd
Немного подтесал код:
battle v1.0d.bas
(21.17 КБ) 92 скачивания

upd
Типа, "релиз" :)
Теперь осталось полировать логику: сделать, чтобы:
- обстрел корабля прекращался после его "потопления";
- корабль "добивался" до конца, пока не будет потоплен полностью.
Те два замеченных бага так и остались.
battle v1.0.bas
(22.09 КБ) 89 скачиваний

upd
- Адаптировал код под BASIC! v.1.91.
- Пофиксил баг с диалоговым окном (см. пост). Баг с выбором квадрата противника пока остался.
battle v1.1.bas
(21.99 КБ) 89 скачиваний

upd
- Пофиксил второй баг с выбором квадрата противника (см. пост).
battle v1.2.bas
(20.59 КБ) 89 скачиваний

upd
- Пофиксил баг, позволяющий пользователю нечестно выиграть (смошенничать).
- Пофиксил баг (появившийся в v1.2), не позволявший, в некоторых случаях, выйти из игры.
- Перелопатил код.
battle v1.3.bas
(20.42 КБ) 99 скачиваний

upd
- Пофиксил небольшой косметический баг, позволяющий отмечать серой точкой уже подбитую клетку.
- Немного подправил код.
battle v1.31.bas
(20.35 КБ) 153 скачивания
Последний раз редактировалось bk99 02 мар 2018, 07:54, всего редактировалось 19 раз.

1961uvg
Сообщения: 533
Зарегистрирован: 14 ноя 2015, 09:17

Re: Игра "Морской бой!

Сообщение 1961uvg » 07 дек 2016, 15:55

Обещал зайти.
Он заходит но редко, но я попросил.


Вернуться в «RFO Basic for Android»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей