Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для _Schokk_
3 / 3 / 2
Регистрация: 13.04.2013
Сообщений: 51

Морской бой. Проверка убитых кораблей

28.09.2016, 18:09. Показов 2453. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Задача такова: дана матрица, в ней надо подсчитать сколько кораблей каждого типа было убито. Для обозначения 0 - ячейка пуста, 1 - нетронутый корабль и -1 - подбитый кораблей.
Пытаюсь как это решить, но что-то не выходит
Пока что проверяет только корабли, которые располагаются горизонтально и то, не очень-то и работает. Может кто-то подскажет как лучше это реализовать?
C#
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication2
{
    class Program
    {
 
        static bool[,] newPoint; //Копия матриы field. True - если уже был в этой клетке
        static int count = 0; //Какой тип корабля. Соотвествено 1 - однопалубный
        static int[] palub = { 0, 0, 0, 0 }; //Количество кораблей каждого типа(1 палоубного, 2-х и тд)
 
 
        //Рекурсивно проверяю следеющию клетку от заданной
        static bool CheckRight(int[,] field, int i, int j) 
        {
            if (field[i, j] == 0)
                return true;
            if (field[i, j] == 1)
                return false;
            if (j == field.GetLength(1))
                return true;
 
            newPoint[i, j] = true;
            count++;
 
            return CheckRight(field, i, j + 1);
        }
 
        static void Main(string[] args)
        {
            int[,] field = {
                                {-1, 1, 0, 0,-1, 0, 0, 1, 0, 0, },
                                { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, },
                                { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, },
                                { 0, 0,-1, 0, 0, 0, 1,-1,-1, 1, },
                                { 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, },
                                {-1, 0, 0, 0,-1, 0, 0, 0, 0, 0, },
                                { 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, },
                                { 0, 0, 0, 0,-1, 0, 0,-1, 0, 0, },
                                { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
                                { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
                            };
 
            newPoint = new bool[field.GetLength(0), field.GetLength(1)];
           
            for(int i = 0; i < field.GetLength(0) - 1; i++)
                for (int j = 0; j < field.GetLength(1) - 1; j++)
                {
                    //Если попалась ячейка с подбитым кораблем
                    //Проверяем не было ли до нее ячейки с 1
                    //Проверяем, что снизу и сверху 0
                    if (field[i, j] == -1)
                    {
                        if (j != 0 && i != 0 && i != field.GetLength(1))
                            if (field[i, j - 1] != 1 && field[i + 1, j] == 0 && field[i - 1, j] == 0)
                                if (CheckRight(field, i, j))
                                {
                                    palub[count - 1] += 1;
                                    count = 0;
                                }
 
                        if (i == 0 && j == 0)
                            if (field[i + 1, j] == 0)
                                if (CheckRight(field, i, j))
                                {
                                    palub[count - 1] += 1;
                                    count = 0;
                                }
 
                        if (i == field.GetLength(0) && j == 0)
                            if (field[i - 1, j] == 0)
                                if (CheckRight(field, i, j))
                                {
                                    palub[count - 1] += 1;
                                    count = 0;
                                }
 
                        if (i != 0 && j == 0)
                            if (field[i - 1, j] == 0 && field[i + 1, j] == 0 && field[i - 1, j] == 0)
                                if (CheckRight(field, i, j))
                                {
                                    palub[count - 1] += 1;
                                    count = 0;
                                }
 
                        if(i == 0 && j != 0)
                            if (field[i, j - 1] != 1 && field[i + 1, j] == 0)
                                if (CheckRight(field, i, j))
                                {
                                    palub[count - 1] += 1;
                                    count = 0;
                                }
                    }
 
                    
                }
        
        Console.ReadKey();
        
        }
    }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.09.2016, 18:09
Ответы с готовыми решениями:

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

Расстановка кораблей: Морской бой
Нужна помощь в написании функции(ий) для расстановки кораблей по правилам морского боя в матрице 10х10. Пытался найти готовую функцию, но...

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

4
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
28.09.2016, 19:30
Лучший ответ Сообщение было отмечено _Schokk_ как решение

Решение

_Schokk_,
Кликните здесь для просмотра всего текста
C#
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
66
67
68
69
class Program
{
    static void Main()
    {
        int[,] Field = {
            {-1, 1, 0, 0,-1, 0, 0, 1, 0, 0, },
            { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, },
            { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, },
            { 0, 0,-1, 0, 0, 0, 1,-1,-1, 1, },
            { 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, },
            {-1, 0, 0, 0,-1, 0, 0, 0, 0, 0, },
            { 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, },
            { 0, 0, 0, 0,-1, 0, 0,-1, 0, 0, },
            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
        };
 
        var Ships = Ship.TakeAll(Field).ToList();
        Console.WriteLine("Число кораблей: " + Ships.Count);
        foreach (var g in Ships.GroupBy(s => s.Length).OrderBy(g => g.Key))
            Console.WriteLine("палубы: {0}, всего: {1}, убитых: {2}, подбитых: {3}",
                g.Key, g.Count(), g.Count(s => s.IsDead), g.Count(s => s.IsBitten));
 
        Console.ReadLine();
    }
}
 
class Ship
{
    public int Length; // Длина корабля
    public int Hits;   // Число выстрелов
    public bool IsDead => Hits == Length; // Если полностью убит
    public bool IsBitten => Hits > 0 && Hits < Length; // Если ранен
 
    // Получает один корабль из заданной позиции
    public static Ship TakeFrom(int[,] Fields, int Row, int Column)
    {
        int Rows = Fields.GetLength(0), Columns = Fields.GetLength(1);
        // вычисляем направление - или вправо или вниз
        int dx = Column + 1 < Columns && Fields[Row, Column + 1] != 0 ? 1 : 0;
        int dy = Row + 1 < Rows && Fields[Row + 1, Column] != 0 ? 1 : 0;
 
        // считаем число 1 и -1 вдоль направления (см выше)
        int len = 0, hits = 0;
        while (Row < Rows && Column < Columns && Fields[Row, Column] !=0)
        {
            if (Fields[Row, Column] == -1) hits++;
            Fields[Row, Column] = 0;
            len++; Row += dy; Column += dx;
        }
 
        return new Ship()
        {
            Length = len,
            Hits = hits
        };
    }
 
    // Получает все корабли
    public static IEnumerable<Ship> TakeAll(int[,] Fields)
    {
        /* матрицу можно скопировать Array.Copy если нужна */
        int Rows = Fields.GetLength(0), Columns = Fields.GetLength(1);
        for (int r = 0; r < Rows; r++)
            for (int c = 0; c < Columns; c++)
                if (Fields[r, c] != 0)
                    yield return TakeFrom(Fields, r, c);
    }
}
2
 Аватар для _Schokk_
3 / 3 / 2
Регистрация: 13.04.2013
Сообщений: 51
29.09.2016, 15:27  [ТС]
Вау! Спасибо большое!

Добавлено через 15 минут
Aael,
Блин, рано обрадовался, вот тут ошибки:
C#
1
2
    public bool IsDead => Hits == Length; // Если полностью убит
    public bool IsBitten => Hits > 0 && Hits < Length; // Если ранен
Что делать?
Кликните здесь для просмотра всего текста

Ошибка 1 Недопустимая лексема "=>" в объявлении класса, структуры или интерфейса
Ошибка 2 Недопустимая лексема "==" в объявлении класса, структуры или интерфейса
Ошибка 3 Недопустимая лексема ";" в объявлении класса, структуры или интерфейса
Ошибка 4 Недопустимая лексема "=>" в объявлении класса, структуры или интерфейса
Ошибка 5 Недопустимая лексема ">" в объявлении класса, структуры или интерфейса
Ошибка 6 Недопустимая лексема ";" в объявлении класса, структуры или интерфейса
Ошибка 7 Синтаксическая ошибка, требуется ">"
Ошибка 8 "ConsoleApplication2.Program.Ship.Hi ts" является "поле", но используется как "тип"
Ошибка 9 "ConsoleApplication2.Program.Ship.Length " является "поле", но используется как "тип"
Ошибка 10 "ConsoleApplication2.Program.Ship.Hi ts" является "поле", но используется как "тип"
Ошибка 11 "ConsoleApplication2.Program.Ship.Length " является "поле", но используется как "тип"
Ошибка 12 "ConsoleApplication2.Program.Ship.Hi ts" является "поле", но используется как "тип"

0
.NET senior
 Аватар для bax_tang
441 / 359 / 137
Регистрация: 23.09.2016
Сообщений: 980
29.09.2016, 15:31
_Schokk_, переписать вот так:

C#
1
2
3
public bool IsDead { get { return Hits == Length; } }
 
public bool IsBitten { get { return Hits > 0 && Hits < Length; } }
Добавлено через 1 минуту

Не по теме:


Не все ещё на C# 6 перешли...

1
 Аватар для _Schokk_
3 / 3 / 2
Регистрация: 13.04.2013
Сообщений: 51
29.09.2016, 15:45  [ТС]
bax_tang, Спасибо))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.09.2016, 15:45
Помогаю со студенческими работами здесь

Морской бой: генератор кораблей работает нелогично
Проблема такая, не строит корабли так как надо. Либо консоль зависает, либо пропускает некоторые корабли. Где ошибка ? Скинул генератор...

Морской бой: проблема с расстановкой кораблей на своем поле и сам алгоритм выстрелов
Помогите кто может. Скину свое начало и задание. возможно вознаграждение. очень срочно. проблема с расстановкой кораблей на своем поле и...

Морской бой
Скажите - каким образом лучше написать морской бой (т.е. как лучше сделать форму). у меня есть несколько идей: 1)набросать 200...

Морской бой
Помогите пожалуйста, срочно надо написать курсовую работу: &quot;Создание игры морской бой&quot;. Я студент первого курса. Я еще не в...

Морской бой
Здравствуйте! В вузе задали домашку, которую я сам не могу решить, а в интернете решения не совсем те, которые нужны. Это всё надо...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru