Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
 Аватар для N-e-O
2 / 2 / 1
Регистрация: 26.07.2013
Сообщений: 49

Морской бой: написать проверку для расстановки последнего корабля

12.09.2014, 12:07. Показов 2498. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
program morskoi_boy ;
 
var
  m, n: integer; 
  a: array [1..100, 1..100] of char;
  f1, f2: text ;
 
procedure  vvod(n, m: integer );
var
  i, j: integer ;
begin
  for i := 1 to n do 
  begin
    for j := 1 to m do 
    begin
      readln(a[i, j]);
      write(f1, a[i, j] ); 
    end; 
    writeln(f1); 
  end; 
  
end;
 
procedure proverka(x: integer) ;
var
  c: array [1..100, 1..100] of boolean; 
  i, j: integer;
  f: real; 
  b: char ;
begin
  f := 0; 
  for i := 1 to n do 
  begin
    for j := 1 to m do 
    begin
      if (a[i, j] = '.' ) then c[i, j] := true
      else c[i, j] := false;  // создал новый массив .Где свободная ячейка там true где ячейка занята false
      
    end;
  end;
  for i := 1 to n do 
  begin
    for j := 1 to m do 
    begin // от сюда начинается проверка .Вот подскажите каким способом проверить массив ? 
      
      if c[i, j] = true  and c[i, j + 1] = true  and c[i + 1, j] = true  and c[i - 1, j] = true 
        then f := f + 1;  // корявая проверка
    end;
  end; 
  write(f2, f);
end;
 
begin
  assign(f1, 'D:\vod.txt '); 
  assign(f2, 'D:\vivid.txt');
  rewrite(f1 );
  rewrite(f2);
  writeln('введите размер карты m*n , где  m < 100 > n'); 
  readln( n, m ); 
  vvod(n, m); 
  close(f1); 
  proverka(1);
  close(f2); 
  
end.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.09.2014, 12:07
Ответы с готовыми решениями:

Алгоритм расстановки кораблей (морской бой)
Нужен алгоритм (написанный на паскале) расстановки кораблей на поле 10x10, как в морском бою. Нужно что бы корабли при каждом вызове...

Морской бой. Форма для расстановки кораблей
Добрый день! Нужна помощь в реализации Морского боя на формах. Помогите пожалуйста сделать форму для полей двух участников и расстановки...

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

8
2511 / 1132 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
12.09.2014, 13:47
N-e-O, может бредятину скажу, но хочу спросить, ты не смотрел на алгоритмы расстановки кораблей для игры морской бой? Я в интернете видел такие статьи...


p.s. код твой не смотрел, извини, если там уже всё сделано как надо, а я тут учёного учить пытаюсь..
0
 Аватар для N-e-O
2 / 2 / 1
Регистрация: 26.07.2013
Сообщений: 49
12.09.2014, 17:57  [ТС]
Sergio Leone, да я видел такие алгоритмы но там рандомно они ставятся , а у меня уже задана расстановка кораблей ( она вводиться в массив ) И нужно перебрать весь массив и найти сколько можно поставить там одно палубных кораблей.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
13.09.2014, 08:56
Лучший ответ Сообщение было отмечено N-e-O как решение

Решение

Если речь всё ещё вот про эту задачу: Вложенный цикл: найти ошибку в коде
то мудрить не нужно, достаточно по простому, по рабоче-крестьянски:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const
  MaxN=100;
  Ship='*';
type
  TField = array [0..MaxN+1,0..MaxN+1] of Char;
 
function Count(const f: TField; n, m: Integer): Integer;
var r, t, i, j, ii, jj: Integer;
begin
  r:=0;
  for i:=1 to n do for j:=1 to m do begin
    t:=0;
    for ii:=i-1 to i+1 do for jj:=j-1 to j+1 do
      if f[ii,jj]=Ship then Inc(t);
    if t=0 then Inc(r);
  end;
  Count:=r;
end;
Добавлено через 3 минуты
Идея тривиальна -- считаем количество кораблей в клетке и её соседях, если кораблей там нет, однопалубник там может быть поставлен, увеличиваем счётчик. Чтобы не проверять специально достижение края поля, к нему добавлены с каждой стороны фиктивные строки/столбцы с индексами 0 и MaxN+1.
1
 Аватар для N-e-O
2 / 2 / 1
Регистрация: 26.07.2013
Сообщений: 49
13.09.2014, 13:02  [ТС]
bormant, Спасибо ,я слишком еще мало программирую по этому не могу разобраться каким способ было лучше проверять.
0
 Аватар для N-e-O
2 / 2 / 1
Регистрация: 26.07.2013
Сообщений: 49
15.09.2014, 18:57  [ТС]
bormant, Возможно я туплю , но если в программу ввести вот эти данные она выдает не верный ответ .Поле 4х4
Расстановка
****
**..
*...
*...

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
program morskoi_boy ;
const
  MaxN = 100;
  Ship = '*';
 
type
  TField = array [0..MaxN + 1, 0..MaxN + 1] of Char;
 
var
  m, n: integer; 
  a: tfield ;
  f1, f2: text ;
 
procedure  vvod(n, m: integer );
var
  i, j: integer ;
begin
  for i := 1 to n do 
  begin
    for j := 1 to m do 
    begin
      readln(a[i, j]);
      write(f1, a[i, j] ); 
    end; 
    writeln(f1); 
  end; 
  
end;
 
 
 
function Count(const f: TField; n, m: Integer): Integer;
var
  r, t, i, j, ii, jj: Integer;
begin
  r := 0;
  for i := 1 to n do 
    for j := 1 to m do 
    begin
      t := 0;
      for ii := i - 1 to i + 1 do 
        for jj := j - 1 to j + 1 do
          if f[ii, jj] = Ship then Inc(t);
      if t = 0 then Inc(r);
    end;
  Count := r;
  writeln (r ) ; 
end;
 
begin
  assign(f1, 'D:\vod.txt '); 
  assign(f2, 'D:\vivid.txt');
  rewrite(f1 );
  rewrite(f2);
  writeln('введите размер карты m*n , где  m < 100 > n'); 
  readln( n, m ); 
  vvod(n, m); 
  close(f1); 
  count(a,n,m);
  close(f2); 
  
  
end.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
16.09.2014, 00:30
N-e-O,
Программа:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
const
  MaxN = 100;
  Ship = '*';
type
  TField = array [0..MaxN + 1, 0..MaxN + 1] of Char;
function Count(var f: TField; n, m: Integer): Integer;
var
  r, t, i, j, ii, jj: Integer;
begin
  r := 0;
  for i := 1 to n do for j := 1 to m do begin
    t := 0;
    for ii := i - 1 to i + 1 do for jj := j - 1 to j + 1 do
      if f[ii, jj] = Ship then Inc(t);
    if t = 0 then begin Inc(r); f[i, j] := 'O'; end;
  end;
  Count := r;
end;
 
var
  m, n, i, j: Integer; 
  a: TField;
  f: Text;
begin
  Assign(f, 'input.txt '); Reset(f);
  ReadLn(f, n, m );
  for i := 1 to n do begin
    for j := 1 to m do Read(f, a[i, j]); ReadLn(f);
  end;
  Close(f);
  WriteLn('Способов: ', Count(a, n, m));
  for i := 1 to n do begin
    for j := 1 to m do Write(a[i, j]); WriteLn;
  end;
end.
Делаем файл input.txt
Code
1
2
3
4
5
4 4
****
**..
*...
*...
Прогон:
Code
1
2
3
4
5
Способов: 3
****
**..
*..O
*.OO
Что не так?
0
 Аватар для N-e-O
2 / 2 / 1
Регистрация: 26.07.2013
Сообщений: 49
16.09.2014, 17:53  [ТС]
bormant,
****
**..
*.00
*.00
Все я понял , в задаче указано "В этой задаче соседними считаются клетки ,имеющие общую сторону ".То есть условие не соответствует правилам игры и ваша программа работает абсолютно правильно .
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
16.09.2014, 18:06
Цитата Сообщение от N-e-O Посмотреть сообщение
соседними считаются клетки ,имеющие общую сторону
Тут тоже несложно поправить, в сообщении №7 строки 13-14 заменяем на:
Pascal
1
2
for ii:=i-1 to i+1 do if f[ii,  j] = Ship then Inc(t);
for jj:=j-1 to j+1 do if f[i,  jj] = Ship then Inc(t);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.09.2014, 18:06
Помогаю со студенческими работами здесь

Морской бой, последний рывок расстановки
Очевидно, что на поле может быть только 1 4-х-палубный корабль и т.д. Как сделать так, чтоб, если на поле уже стоит, допустим, тот же...

Проверить правильность расстановки кораблей. Морской бой
Есть матрица NxM, где расставлены корабли. Корабли не стоят на краю матрицы, кол-во 4-х клеточных кораблей - 1, 3-х клет. - 2, 2-х...

Написать программу для игры в морской бой
Помогите с заданием на курсовую, проболел, времени совсем не хватает... 1-курс..

Морской бой: написать логику для стрельбы компьютера
помогите написать логику для стрельбы компьютера ! :cry:

Написать игру: морской бой
Помогите написать игру, вернее подскажите как писать сам буду)) С чего вообще надо начинать писать такие игры?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru