Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/64: Рейтинг темы: голосов - 64, средняя оценка - 4.92
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
1

Реализация игры морской бой

28.05.2014, 01:54. Показов 12297. Ответов 52
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
подскажите плз алгоритм написания морского боя и основные аспекты ...
мои мысли :
поле
Кликните здесь для просмотра всего текста

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

корабли
Кликните здесь для просмотра всего текста

Как сделать корабли ? что из себя представляют корабли различного размера ? если четырехпалубник, это 4 картинки однопалубных или одна большая картинка ? если одна большая картинка, как на ней фиксировать выстрелы ? если эту большую картинку распихать по гриду (можно ли вообще так, поместить 1 картинку в 4 ячейки ?), то какой событие будет срабатывать, клик на картинку или на ячейку грида ?

немного важного для меня оффтопа
Кликните здесь для просмотра всего текста

После того как построим поле с кораблями ( не важно каким способом ), стоит ли создать массив, в котором будут хранится -1, 0 и 1(не доступен, свободен, занят) ? Когда создаешь вариант игры с игроком и компьютером, как отследить какой вариант принят и как организовать код, чтобы не дублировать процедуры ? Если для этого использовать флаг, то каким его лучше сделать ? Если флаг разместить в классе и тоскать его по процедурам, не нарушает ли это принципов ООП ? Как из кода не получить костыль ?


Не по теме:

Как спойлерам дать заголовок ?

0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2014, 01:54
Ответы с готовыми решениями:

Простейшая реализация игры "Морской бой"
Пожалуйста, если у кого-нибудь есть, нужна игра Морской бой на C# в Windows Forms

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

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

Аналог игры "Морской бой"
Программа состоит из поля 5х5 клеток. При нажатии пользователя на каждую клетку программа фиксирует...

52
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
30.05.2014, 22:10 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
после запоминания предыдущих координат и добавления одного условия, квадраты вообще перестали мерцать
Ура!

Там еще довольно неплохо можно оптимизировать отрисовку — все-таки код делался просто как пример, без заморочек.
Например, в данный момент при каждом вызове Invalidate вся поверхность переотрисовывается полностью, если даже переотрисовать нужно последний ряд (изменение размера формы, например).
Экземпляр Graphics, передаваемый в метод аргументом, "знает", что все подряд отрисовывать не нужно, но действие тем не менее происходит.
1
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
30.05.2014, 23:30  [ТС] 22
kolorotur, после того, как я закончу расстановку кораблей, не могли бы вы глянуть проект, может у вас получится оптимизировать отрисовку поля

Добавлено через 13 минут
kolorotur, как по нажатию кнопки отрисовать всю панель заново с внесенными изменениями ?
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
31.05.2014, 00:11 23
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
после того, как я закончу расстановку кораблей, не могли бы вы глянуть проект, может у вас получится оптимизировать отрисовку поля
Да без проблем, цепляйте.

Цитата Сообщение от Fene4ka_ Посмотреть сообщение
как по нажатию кнопки отрисовать всю панель заново с внесенными изменениями ?
C#
1
panel.Invalidate();
Безо всяких аргументов.
1
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
31.05.2014, 00:53  [ТС] 24
вот что есть на данный момент
Вложения
Тип файла: rar МорскойБой.rar (68.7 Кб, 27 просмотров)
0
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
31.05.2014, 01:29  [ТС] 25
для двухпалубных я разобрался, изменив метод проверки... для остальных не знаю пока-что ...

Добавлено через 28 минут
появилась идея для универсальной проверки для всех размеров, чуть позже напишу
0
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
01.06.2014, 02:17  [ТС] 26
игра в предконечной стадии разработки, и тут появилась новая ошибка не знаю, из-за чего, возникает, когда играешь с компом ...

Не по теме:

для начала игры нажмите автогенирация - готово, дальше клацайте на поле соперника

Вложения
Тип файла: rar МорскойБой.rar (82.7 Кб, 19 просмотров)
0
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
01.06.2014, 02:25  [ТС] 27
видимо, ошибка происходит, когда комп попадает в тебя ...

Добавлено через 6 минут
исправил проблему, убрав рекурсию
0
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
01.06.2014, 02:44  [ТС] 28
kolorotur, вы обещали по окончанию попытаться оптимизировать отрисовку поля, проект уже готов, гляньте плз, так же может у вас получится сделать взрывы корабликов(типо когда взрывается двухпалубный, например, то соседнии от него клетки, закрашиваются в цвет промоха)
Вложения
Тип файла: rar МорскойБой.rar (89.6 Кб, 30 просмотров)
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
01.06.2014, 11:44 29
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
вы обещали по окончанию попытаться оптимизировать отрисовку поля
Я помню
У меня дома проект не открывается, т.к. имеется только 2010-я студия.
Гляну с работы во время перерыва.
1
C#,XNA Game Studio
36 / 36 / 8
Регистрация: 26.04.2014
Сообщений: 195
01.06.2014, 12:04 30
методы проверки по матрице по матрице по-моему достаточно просты скажем каждый элемент матрицы кроме координат икс и игрик имеет поле статуса, 0 -незанято,1- однопалубный,2-двупалубный, и так далее, плюс к этому нужно указать идентификатор корабля чтобы сослаться на него. Параллельно с этим список кораблей должен быть, List<List<Point>>, тоесть у каждого корабля список точек которые обозначают координаты клеток в матрице, но сюда кроме поинтов нужно добавить статус к каждой точке жив/мертв, и еще такой же статус ко всему кораблю, значит нам еще и количество оставшихся в живых клеток нужно каунтить для каждого корабля пр попадании.Помоему так проще..)наверное..)
1
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
01.06.2014, 14:01  [ТС] 31
kolorotur, чтобы с 2010 студии открывалось, нада просто фреймворк 4.5 поставить
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
01.06.2014, 19:44 32
Глянул.
Перво-наперво, оптимизация отрисовки. Вот код обработчика Paint:
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
var canvas = sender as Control;
var clip = e.ClipRectangle;
 
int boardSize = objBattle.ReturnMasSize();
int cellWidth = canvas.Width / boardSize;
int cellHeight = canvas.Height / boardSize;
 
int firstRow = clip.Y / cellWidth;
int firstCol = clip.X / cellHeight;
 
int lastRow  = (clip.Y + clip.Height) / cellHeight;
int lastCol  = (clip.X + clip.Width) / cellWidth;
 
for (int i = firstRow; i <= lastRow; i++)
{
    for (int j = firstCol; j <= lastCol; j++)
    {
        int x = j * cellWidth - 1;
        int y = i * cellHeight - 1;
 
        e.Graphics.FillRectangle(brushes[objBattle[i, j]], x, y, cellWidth, cellHeight);
        e.Graphics.DrawRectangle(Pens.Black, x, y, cellWidth, cellHeight);
    }
}
Отрисовывает только тот регион, который нуждается в отрисовке.
Поставьте панельке свойство BorderStyle на FixedSingle — не придется вручную еще и рамку рисовать.

Я, правда, так и не увидел, где вы сохраняете координаты предыдущего квадрата, чтобы переотрисовывать только при смене ячейки. Нет смысла постоянно рисовать ячейку, если возить мышкой в пределах ее границ.
Добавил такое в класс Battle:
C#
1
2
3
4
5
6
7
8
9
10
int px, py;
//отрисовываем кораблики, когда водим мышкой
public void WatchSheap(int y, int x, int w, int h, int size, Panel panelBattle)
{
    if (x == px && y == py) return;
 
    panelBattle.Invalidate(new Rectangle(px * w, py * h, w, h));
        ...
        px = x; py = y;
}
С выбором ячеек для переотрисовки в методе WatchSheap (корабль — ship, кстати) тоже не совсем понятно: при выборе четырехпалубника на переотрисовку отсылаются все ячейки.

Общие соображения:
1. Не ленитесь давать элементам управления нормальные имена, потому что разбираться во всех этих button1 и checkbox5 очень скучно.
2. Цепляйте один и тот же обработчик на событие Paint обеих панелек — нет смысла копировать один и тот же код.
3. Старайтесь сразу же избавляться от т.н. "китайского" кода — это когда вместо циклов используется дублирование кода, что у вас очень бодренько наблюдается в классе Battle. Потому как вот такой метод читать решительно невозможно, не говоря уже о том, чтобы его понять:
18+
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
public bool CheckSq(int x, int y, int size, int[][] mas)
{
    //левый верхний квадрат
    if (y == 0 && x == 0)
    {
        if (mas[y][x] > 0)
            return false;
        if (_vertical && 
            (mas[y][x + 1] > 0 || mas[y + 1][x] > 0 || mas[y + 1][x + 1] > 0
                || mas[y + size][x + 1] > 0 || mas[y + 1 + size][x] > 0 || mas[y + 1 + size][x + 1] > 0))             
            return false;
        if (size > 2 && (mas[y + size - 1][x] > 0 || mas[y + size - 1][x + 1] > 0))
            return false;
        if (!_vertical &&
            (mas[y][x + 1] > 0 || mas[y + 1][x] > 0 || mas[y + 1][x + 1] > 0
                || mas[y][x + 1 + size] > 0 || mas[y + 1][x + size] > 0 || mas[y + 1][x + 1 + size] > 0
                ))
            return false;
        if (size > 2 && (mas[y][x + size - 1] > 0 || mas[y + 1][x + size - 1] > 0))
            return false;
    }
    //левый нижний квадрат
    if (y == mas.Count() - 1 && x == 0)
    {
        if (mas[y][x] > 0)
            return false;
        if (_vertical &&
            (mas[y][x + 1] > 0 || mas[y - 1][x] > 0 || mas[y - 1][x + 1] > 0
                || mas[y - size][x + 1] > 0 || mas[y - 1 - size][x] > 0 || mas[y - 1 - size][x + 1] > 0))
            return false;
        if (size > 2 && (mas[y - size + 1][x] > 0 || mas[y - size + 1][x + 1] > 0))
            return false;
        if (!_vertical &&
            (mas[y][x + 1] > 0 || mas[y - 1][x] > 0 || mas[y - 1][x + 1] > 0
                || mas[y][x + 1 + size] > 0 || mas[y - 1][x] > 0 || mas[y - 1][x + 1 + size] > 0))
            return false;
        if (size > 2 && (mas[y][x + size - 1] > 0 || mas[y - 1][x + size - 1] > 0))
            return false;
    }
    //правый верхний квадрат
    if (y == 0 && x == mas.Count() - 1)
    {
        if (mas[y][x] > 0)
            return false;
        if (_vertical &&
            (mas[y][x - 1] > 0 || mas[y + 1][x] > 0 || mas[y + 1][x - 1] > 0
                || mas[y + size][x - 1] > 0 || mas[y + 1 + size][x] > 0 || mas[y + 1 + size][x - 1] > 0))
            return false;
        if (size > 2 && (mas[y + size - 1][x] > 0 || mas[y + size - 1][x - 1] > 0))
            return false;
        if (!_vertical &&
            (mas[y][x - 1] > 0 || mas[y + 1][x] > 0 || mas[y + 1][x - 1] > 0
                || mas[y][x - 1 - size] > 0 || mas[y + 1][x - size] > 0 || mas[y + 1][x - 1 - size] > 0))
            return false;
        if (size > 2 && (mas[y][x - size + 1] > 0 || mas[y + 1][x - size + 1] > 0))
            return false;
    }
    //правый нижний квадрат
    if (y == mas.Count() - 1 && x == mas.Count() - 1)
        //if (y == 0 && x == mas.Count() - 1)
        {
            if (mas[y][x] > 0)
                return false;
            if (_vertical &&
                (mas[y][x - 1] > 0 || mas[y - 1][x] > 0 || mas[y - 1][x - 1] > 0 || mas[y - size][x] > 0
                    || mas[y - size][x - 1] > 0 || mas[y - 1 - size][x] > 0 || mas[y - 1 - size][x - 1] > 0))
                return false;
            if (size > 2 && (mas[y - size + 1][x - 1] > 0 || mas[y - size - 1][x] > 0))
                return false;
            if (!_vertical &&
                (mas[y][x - 1] > 0 || mas[y - 1][x] > 0 || mas[y - 1][x - 1] > 0
                    || mas[y][x - 1 - size] > 0 || mas[y - 1][x - size] > 0 || mas[y - 1][x - 1 - size] > 0))
                return false;
            if (size > 2 && (mas[y - size + 1][x] > 0 || mas[y - size + 1][x - 1] > 0))
                return false;
        }
    //верхние не угловые клетки
    if (y == 0 && x > 0 && x != mas.Count() - 1)
    {
        if (mas[y][x] > 0 || mas[y + size][x] > 0)
            return false;
        if (mas[y][x - 1] > 0 || mas[y][x + 1] > 0 || mas[y + 1][x - 1] > 0 || mas[y + 1][x] > 0 ||
            mas[y + 1][x + 1] > 0)
            return false;
        if (_vertical &&
            (mas[y + size][x - 1] > 0 || mas[y + size][x + 1] > 0 || mas[y + 1 + size][x - 1] > 0
                || mas[y + 1 + size][x] > 0 || mas[y + 1 + size][x + 1] > 0))
            return false;
        if (_vertical && size > 2 &&
            (mas[y + size - 1][x - 1] > 0 || mas[y + size - 1][x] > 0 || mas[y + size - 1][x + 1] > 0))
            return false;
        if (!_vertical && x + size == mas.Count() - 1 && mas[y + 1][x + size] > 0)
            return false;
        if (!_vertical && x + size == mas.Count() - 1 && size > 2 && 
            (mas[y][x + size - 1] > 0 || mas[y + 1][x + size - 1] > 0))
            return false;
        if (!_vertical && x + size - 1 == mas.Count() - 1 && size > 2 &&
                    (mas[y][x - 2] > 0 || mas[y][x - 1] > 0 || mas[y][x + 1] > 0 || mas[y][x + 2] > 0 ||
                    mas[y+1][x - 2] > 0 || mas[y+1][x - 1] > 0 || mas[y+1][x] > 0 || mas[y+1][x + 1] > 0 ||
                    mas[y+1][x + 2] > 0))
            return false;
        if (!_vertical && x + size - 2 == mas.Count() - 1 && size > 2 &&
            (mas[y][x - 3] > 0 || mas[y][x - 2] > 0 || mas[y][x - 1] > 0 || mas[y][x + 1] > 0 ||
                mas[y + 1][x - 3] > 0 || mas[y + 1][x - 2] > 0 || mas[y + 1][x - 1] > 0 || mas[y + 1][x] > 0 ||
                mas[y + 1][x + 1] > 0))
            return false;
        if (!_vertical && x + size < mas.Count() - 1 &&
            (mas[y][x + size + 1] > 0 || mas[y + 1][x + size + 1] > 0 || mas[y + 1][x + size] > 0))
            return false;
        if (!_vertical && x + size < mas.Count() - 1 && size > 2 &&
            (mas[y][x + size - 1] > 0 || mas[y + 1][x + size - 1] > 0))
            return false;
    }
    //нижние не угловые клетки
    if (y == mas.Count() - 1 && x != 0 && x != mas.Count() - 1)
    {
        if (mas[y][x] > 0 || mas[y - size][x] > 0)
            return false;
        if (mas[y][x - 1] > 0 || mas[y][x + 1] > 0 || mas[y - 1][x - 1] > 0 || mas[y - 1][x] > 0 ||
                mas[y - 1][x + 1] > 0)
            return false;
        if (_vertical &&
            (mas[y - size][x - 1] > 0 || mas[y - size][x + 1] > 0 || mas[y - 1 - size][x - 1] > 0
                || mas[y - 1 - size][x] > 0 || mas[y - 1 - size][x + 1] > 0))
            return false;
        if (_vertical && size > 2 &&
            (mas[y - size + 1][x - 1] > 0 || mas[y - size + 1][x] > 0 || mas[y - size + 1][x + 1] > 0))
            return false;
        if (!_vertical && x + size == mas.Count() - 1 && mas[y - 1][x + size] > 0)
            return false;
        if (!_vertical && x + size == mas.Count() - 1 && size > 2 &&
            (mas[y][x + size - 1] > 0 || mas[y - 1][x + size - 1] > 0))
            return false;
        if (!_vertical && x + size - 1 == mas.Count() - 1 &&
            (mas[y - 1][x - 2] > 0 || mas[y - 1][x - 1] > 0 || mas[y - 1][x] > 0 || mas[y - 1][x + 1] > 0 ||
                mas[y][x - 2] > 0 || mas[y][x - 1] > 0 || mas[y][x] > 0 || mas[y][x + 1] > 0))
            return false;
        if (!_vertical && x + size - 1 == mas.Count() - 1 && size > 2 &&
                    (mas[y][x - 2] > 0 || mas[y][x - 1] > 0 || mas[y][x + 1] > 0 || mas[y][x + 2] > 0 ||
                    mas[y - 1][x - 2] > 0 || mas[y - 1][x - 1] > 0 || mas[y - 1][x] > 0 || mas[y - 1][x + 1] > 0 ||
                    mas[y - 1][x + 2] > 0))
            return false;
        if (!_vertical && x + size - 2 == mas.Count() - 1 && size > 2 &&
            (mas[y][x - 3] > 0 || mas[y][x - 2] > 0 || mas[y][x - 1] > 0 || mas[y][x + 1] > 0 ||
                mas[y - 1][x - 3] > 0 || mas[y - 1][x - 2] > 0 || mas[y - 1][x - 1] > 0 || mas[y - 1][x] > 0 ||
                mas[y - 1][x + 1] > 0))
            return false;
        if (!_vertical && x + size < mas.Count() - 1 &&
            (mas[y][x + size + 1] > 0 || mas[y - 1][x + size + 1] > 0 || mas[y - 1][x + size] > 0))
            return false;
        if (!_vertical && x + size < mas.Count() - 1 && size > 2 &&
            (mas[y][x + size - 1] > 0 || mas[y - 1][x + size - 1] > 0))
            return false;
    }   
    //левые не угловые клетки
    if (x == 0 && y > 0 && y != mas.Count() - 1)
    {
        if (mas[y][x] > 0 || mas[y][x + size] > 0)
            return false;
        if (mas[y][x + 1] > 0 || mas[y - 1][x + 1] > 0 || mas[y - 1][x] > 0 || mas[y + 1][x] > 0 ||
                mas[y + 1][x + 1] > 0)
            return false;              
        if (_vertical && y + size == mas.Count() - 1 && mas[y + size][x + 1] > 0)
            return false;
        if (_vertical && y + size == mas.Count() - 1 && size > 2 &&
            (mas[y + size - 1][x] > 0 || mas[y + size - 1][x + 1] > 0))
            return false;
        if (_vertical && y + size - 1 == mas.Count() - 1 && size > 2 &&
                    (mas[y - 2][x] > 0 || mas[y - 2][x + 1] > 0 || mas[y - 1][x] > 0 || mas[y - 1][x + 1] > 0 ||
                    mas[y][x + 1] > 0 || mas[y + 1][x] > 0 || mas[y + 1][x + 1] > 0 || mas[y + 2][x] > 0 ||
                    mas[y + 2][x + 1] > 0))
            return false;
        if (_vertical && y + size - 2 == mas.Count() - 1 && size > 2 &&
            (mas[y - 3][x] > 0 || mas[y - 2][x] > 0 || mas[y - 1][x] > 0 || mas[y + 1][x] > 0 ||
                mas[y - 3][x + 1] > 0 || mas[y - 2][x + 1] > 0 || mas[y - 1][x + 1] > 0 || mas[y][x + 1] > 0 ||
                mas[y + 1][x + 1] > 0))
            return false;
        if (_vertical && y + size < mas.Count() - 1 &&
            (mas[y + size][x + 1] > 0 || mas[y + 1 + size][x] > 0 || mas[y + 1 + size][x + 1] > 0))
            return false;
        if (_vertical && y + size < mas.Count() - 1 && size > 2 &&
            (mas[y - 1 + size][x] > 0 || mas[y - 1 + size][x + 1] > 0))
            return false;
        if (!_vertical &&
            (mas[y - 1][x + size] > 0 || mas[y - 1][x + size + 1] > 0 || mas[y][x + size + 1] > 0
            || mas[y + 1][x + size] > 0 || mas[y + 1][x + size + 1] > 0))
            return false;
        if (!_vertical && size > 2 &&
            (mas[y - 1][x + size - 1] > 0 || mas[y][x + size - 1] > 0 || mas[y + 1][x + size - 1] > 0))
            return false;         
    }
    //правые не угловые клетки
    if (x == mas.Count() - 1 && y < mas.Count() - 1 && y != 0)
    {
        if (mas[y][x] > 0 || mas[y][x - size] > 0)
            return false;
        if (mas[y][x - 1] > 0 || mas[y - 1][x - 1] > 0 || mas[y - 1][x] > 0 || mas[y + 1][x] > 0 ||
                mas[y + 1][x - 1] > 0)
            return false;              
        if (_vertical && y + size == mas.Count() - 1 && mas[y + size][x - 1] > 0)
            return false;
        if (_vertical && y + size == mas.Count() - 1 && size > 2 &&
            (mas[y + size - 1][x] > 0 || mas[y + size - 1][x - 1] > 0))
            return false;
        if (_vertical && y + size - 1 == mas.Count() - 1 && size > 2 &&
                    (mas[y - 2][x] > 0 || mas[y - 2][x - 1] > 0 || mas[y - 1][x] > 0 || mas[y - 1][x - 1] > 0 ||
                    mas[y][x - 1] > 0 || mas[y + 1][x] > 0 || mas[y + 1][x - 1] > 0 || mas[y + 2][x] > 0 ||
                    mas[y + 2][x - 1] > 0))
            return false;
        if (_vertical && y + size - 2 == mas.Count() - 1 && size > 2 &&
            (mas[y - 3][x] > 0 || mas[y - 2][x] > 0 || mas[y - 1][x] > 0 || mas[y + 1][x] > 0 ||
                mas[y - 3][x - 1] > 0 || mas[y - 2][x - 1] > 0 || mas[y - 1][x - 1] > 0 || mas[y][x - 1] > 0 ||
                mas[y + 1][x - 1] > 0))
            return false;
        if (_vertical && y + size < mas.Count() - 1 &&
            (mas[y + size][x - 1] > 0 || mas[y + 1 + size][x] > 0 || mas[y + 1 + size][x - 1] > 0))
            return false;
        if (_vertical && y + size < mas.Count() - 1 && size > 2 &&
            (mas[y - 1 + size][x] > 0 || mas[y - 1 + size][x - 1] > 0))
            return false;
        if (!_vertical &&
            (mas[y - 1][x - size] > 0 || mas[y - 1][x - size - 1] > 0 || mas[y][x - size - 1] > 0
            || mas[y + 1][x - size] > 0 || mas[y + 1][x - size - 1] > 0))
            return false;
        if (!_vertical && size > 2 &&
            (mas[y - 1][x - size + 1] > 0 || mas[y][x - size + 1] > 0 || mas[y + 1][x - size + 1] > 0))
            return false;                                   
    }
    //все оставшиеся клетки
    if (x != 0 && y != 0 && x != mas.Count() - 1 && y != mas.Count() - 1)
    {
        if (mas[y][x] > 0)
            return false;
        if (mas[y - 1][x - 1] > 0 || mas[y - 1][x] > 0 || mas[y - 1][x + 1] > 0 ||
            mas[y][x - 1] > 0 || mas[y][x + 1] > 0 ||
            mas[y + 1][x - 1] > 0 || mas[y + 1][x] > 0 || mas[y + 1][x + 1] > 0)
            return false;
        if (_vertical && y + size == mas.Count() - 1 &&
            (mas[y + size][x - 1] > 0 || mas[y + size][x + 1] > 0 || mas[y + size][x] > 0))
            return false;
        if (_vertical && y + size == mas.Count() - 1 && size > 2 &&
            (mas[y + size - 1][x - 1] > 0 || mas[y + size - 1][x] > 0 || mas[y + size - 1][x + 1] > 0
            || mas[y + size][x] > 0))
            return false;
        if (_vertical && y + size - 1 == mas.Count() - 1 &&
            (mas[y - 2][x - 1] > 0 || mas[y - 2][x] > 0 || mas[y - 2][x + 1] > 0))
            return false;
        if (_vertical && y + size - 1 == mas.Count() - 1 && size > 2 &&
            (mas[y + 2][x - 1] > 0 || mas[y + 2][x] > 0 || mas[y + 2][x + 1] > 0 || mas[y + 2][x] > 0))
            return false;
        if (_vertical && y + size - 2 == mas.Count() - 1 && size > 2 &&
            (mas[y - 3][x - 1] > 0 || mas[y - 3][x] > 0 || mas[y - 3][x + 1] > 0 ||
                mas[y - 2][x - 1] > 0 || mas[y - 2][x + 1] > 0 || mas[y - 2][x] > 0))
            return false;
        if (_vertical && y + size != mas.Count() - 1 && y + size - 1 != mas.Count() - 1 &&
            (y + size - 2 != mas.Count() - 1 && size > 2) &&
            (mas[y + size - 1][x - 1] > 0 || mas[y + size - 1][x] > 0 || mas[y + size - 1][x + 1] > 0 ||
                mas[y + size][x - 1] > 0 || mas[y + size][x + 1] > 0 || mas[y+size][x] > 0 ||
                mas[y + size + 1][x - 1] > 0 || mas[y + size + 1][x] > 0 || mas[y + size + 1][x + 1] > 0))
            return false;
        if (_vertical && y + size != mas.Count() - 1 && y + size - 1 != mas.Count() - 1 && size < 3 &&
            (mas[y + size + 1][x - 1] > 0 || mas[y + size + 1][x] > 0 || mas[y + size + 1][x + 1] > 0 ||
                mas[y + size][x - 1] > 0 || mas[y + size][x + 1] > 0 || mas[y + size][x] > 0))
            return false;
        if (!_vertical && x + size == mas.Count() - 1 &&
            (mas[y - 1][x + size] > 0 || mas[y + 1][x + size] > 0 || mas[y][x + size] > 0))
            return false;
        if (!_vertical && x + size == mas.Count() - 1 && size > 2 &&
            (mas[y - 1][x + size - 1] > 0 || mas[y - 1][x + size] > 0 || mas[y][x + size - 1] > 0 
            || mas[y + 1][x + size - 1] > 0 || mas[y + 1][x + size] > 0))
            return false;
        if (!_vertical && x + size - 1 == mas.Count() - 1 &&
            (mas[y - 1][x - 2] > 0 || mas[y][x - 2] > 0 || mas[y + 1][x - 2] > 0))
            return false;
        if (!_vertical && x + size - 1 == mas.Count() - 1 && size > 2 &&
            (mas[y - 1][x + 2] > 0 || mas[y][x + 2] > 0 || mas[y + 1][x + 2] > 0 || mas[y][x + 2] > 0))
            return false;
        if (!_vertical && x + size - 2 == mas.Count() - 1 && size > 2 &&
            (mas[y - 1][x - 3] > 0 || mas[y][x - 3] > 0 || mas[y + 1][x - 3] > 0 ||
                mas[y - 1][x - 2] > 0 || mas[y + 1][x - 2] > 0 || mas[y][x - 2] > 0))
            return false;
        if (!_vertical && x + size != mas.Count() - 1 && x + size - 1 != mas.Count() - 1 &&
            (x + size - 2 != mas.Count() - 1 && size > 2) &&
            (mas[y - 1][x + size - 1] > 0 || mas[y][x + size - 1] > 0 || mas[y + 1][x + size - 1] > 0 ||
                mas[y - 1][x + size] > 0 || mas[y + 1][x + size] > 0 || mas[y][x + size] > 0 ||
                mas[y - 1][x + size + 1] > 0 || mas[y][x + size + 1] > 0 || mas[y + 1][x + size + 1] > 0))
            return false;
        if (!_vertical && x + size != mas.Count() - 1 && x + size - 1 != mas.Count() - 1 && size < 3 &&
            (mas[y - 1][x + size + 1] > 0 || mas[y][x + size + 1] > 0 || mas[y + 1][x + size + 1] > 0 ||
                mas[y - 1][x + size] > 0 || mas[y + 1][x + size] > 0 || mas[y][x + size] > 0))
            return false;
 
    }
    return true;
}
1
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
01.06.2014, 21:12  [ТС] 33
Цитата Сообщение от kolorotur Посмотреть сообщение
3. Старайтесь сразу же избавляться от т.н. "китайского" кода — это когда вместо циклов используется дублирование кода, что у вас очень бодренько наблюдается в классе Battle. Потому как вот такой метод читать решительно невозможно, не говоря уже о том, чтобы его понять:
а можно как-то избежать ошибки, при обращении к несуществующей ячейке и продолжить выполнение следующего кода ?
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
02.06.2014, 00:27 34
Fene4ka_, конечно можно — надо всего лишь проверять, чтобы текущий индекс не выходил за пределы массива.
Вообще проверку же сделать очень просто: корабль — это прямоугольник с определенными длиной и шириной, измеряемыми в ячейках поля. Например, трехпалубник по горизонтали — это прямоугольник в 1х3 ячеек. По вертикали — 3х1. Так как нельзя, чтобы корабли соприкасались, то накиньте еще по две клетки на ширину или высоту, получится 3х5 по горизонтали или 5х3 по вертикали. Если какая-то из координат лежит у границы поля, то с той стороны отнимите единицу, т.е. вертикальный трехпалубник в колонке А будет иметь размер (для проверки) 5х2 ячеек. Он же в колонке Б и в ряду 1 будет 4х3, в колонке А в первом ряду — 4х2.
Разобравшись с этим, достаточно в цикле пробежать по ячейкам, образованным этим кораблем. Если в массиве на этом месте уже есть хотя бы одна занятая ячейка, то корабль там разместить нельзя.
1
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
02.06.2014, 02:57  [ТС] 35
kolorotur, ту страшную процедуру получилось переделать в такую )))
12+

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
public bool CheckSq(int x, int y, int size, int[][] mas)
        {
            int DopPoint = mas.Count() - 1 - y - size;
            if (DopPoint >= 0) DopPoint = 0;
            int iMinLimitV = -1 + DopPoint;
            int iMaxLimitV = 2 + size;
            if (_vertical)
                for (int i = iMinLimitV; i < iMaxLimitV; i++)
                    for (int j = -1; j < 2; j++)
                        if (y + i >= 0 && y + i < 10 && x + j >= 0 && x + j < 10)
                            if (mas[y + i][x + j] > 0)
                                return false;
            DopPoint = mas.Count() - 1 - x - size;
            if (DopPoint >= 0) DopPoint = 0;
            int jMinLimitH = -1 + DopPoint;
            int jMaxLimitH = 2 + size;
            if (!_vertical)
                for (int i = -1; i < 2; i++)
                    for (int j = jMinLimitH; j < jMaxLimitH; j++)
                        if (y + i >= 0 && y + i < 10 && x + j >= 0 && x + j < 10)
                            if (mas[y + i][x + j] > 0)
                                return false;
            return true;
        }


Добавлено через 46 минут
а также упростил 60% кода, исправил отрисовку, чтобы теперь обновлялся только прямоугольник, где кораблик ...

Добавлено через 15 секунд
kolorotur, где вы раньше были с своим советом ...
0
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
02.06.2014, 03:24  [ТС] 36
скидываю, что получилось
Вложения
Тип файла: rar МорскойБой.rar (81.4 Кб, 56 просмотров)
0
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
02.06.2014, 03:31  [ТС] 37
из побочных эффектов, программа стала ощутимо медленнее работать, вопрос о взрывах кораблей остается открытым

Добавлено через 44 секунды

Не по теме:

после переименования кнопок, имена их событий не переименовались, можно их как-то автоматом переименовать ? :)



Добавлено через 3 минуты
WhiteMaster, к сожеление на данный момент, матрица имеет след координаты -
координаты

0 - клетка не занята
1 - клетка временно резервируется для отображения кораблика при формировании поля
2 - клетка занята ячейкой кораблика
3 - попадание
4 - промах


Добавлено через 1 минуту

Не по теме:

возьму уроки создания не костыля :)

0
C#,XNA Game Studio
36 / 36 / 8
Регистрация: 26.04.2014
Сообщений: 195
02.06.2014, 09:36 38
Fene4ka_, есть такая вещь XNA Game Studio, как раз для написания игр на си шарпе http://www.microsoft.com/en-us... x?id=23714
1
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
02.06.2014, 11:46 39
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
ту страшную процедуру получилось переделать в такую
Как насчет такого варианта?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public bool CheckSq(int x, int y, int size, int[][] mas)
{
    var bounds = new Rectangle(x, y, 1, 1);
 
    if (_vertical) bounds.Height += size;
    else bounds.Width += size;
 
    bounds.Inflate(1, 1);
    bounds.Intersect(Rectangle.FromLTRB(0, 0, ReturnMasSize(), ReturnMasSize()));
 
    for (int i = 0; i < bounds.Width; i++)
        for (int j = 0; j < bounds.Height; j++)
            if (mas[j + bounds.Y][i + bounds.X] > 0)
                return false;
    return true;
}
Со всем остальным кодом там поступить можно примерно так же

Цитата Сообщение от Fene4ka_ Посмотреть сообщение
вопрос о взрывах кораблей остается открытым
То же самое что в коде выше, только проверять, что квадрат пустой и вместо возврата его метить как отстрелянный.

Добавлено через 3 минуты
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
имена их событий не переименовались, можно их как-то автоматом переименовать ?
Правым кликом на имени метода, Refactor -> Rename
1
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
02.06.2014, 13:13  [ТС] 40
Цитата Сообщение от kolorotur Посмотреть сообщение
bounds.Inflate(1, 1);
* * bounds.Intersect(Rectangle.FromLTRB(0, 0, ReturnMasSize(), ReturnMasSize()));
что это такое ?

Добавлено через 3 минуты
kolorotur, для того, чтобы это работало со взрывами, туда нада отправить координаты, а также размер отстреляного корабля, из-за этого может быть неоднозначно ...
0
02.06.2014, 13:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.06.2014, 13:13
Помогаю со студенческими работами здесь

Разработка класса "Корабль" для игры "Морской бой"
Всем доброго времени суток! Работаю над курсачом. Моя тема: Реализация игры Морской бой. Мне...

Морской бой
Вопрос решен, можно удалить

Морской бой
Добрый день, форумчане! Такая проблема, на учебной практике резко с консольного c# перескочили на...

Морской бой
Добрый вечер, можете покидать ссылки на проекты игры Морской Бой любой сложности. Спасибо


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru