Назад | Начало урока | Вперед
Содержание

Глава 1 (продолжение 1)

Этой функции передается точка (ячейка), которая является частью подбитого корабля.
Причем это уже последняя точка на корабле, которая ранее еще не была ранена.
Теперь весь корабль РАНЕН, а следовательно должен быть помечен как УБИТ.
Эта функция по одной переданной точке, вычисляет весь корабль, помечается все точки
корабля как УБИТЫЕ, а все точки смежные с кораблем - как РЯДОМ_С_УБИТОЙ.


void CField::SetShipKilled(POINT pt) {
int i, sumx, sumy, razx, razy, x, y, cx, cy, j;
POINT pos;
pos = pt;
sumx = razx = sumy = razy = 0;
for(i=1; i<4; i++) {
if(m_Event[pos.y][pos.x+i] == SHIPWOUND && pos.x+i<10) {
m_Event[pos.y][pos.x+i] = SHIPKILLED;
sumx++;
}
if(m_Event[pos.y][pos.x-i] == SHIPWOUND && pos.x-i>=0) {
m_Event[pos.y][pos.x-i] = SHIPKILLED;
razx++;
}
if(m_Event[pos.y+i][pos.x] == SHIPWOUND && pos.y+i<10) {
m_Event[pos.y+i][pos.x] = SHIPKILLED;
sumy++;
}
if(m_Event[pos.y-i][pos.x] == SHIPWOUND && pos.y-i>=0) {
m_Event[pos.y-i][pos.x] = SHIPKILLED;
razy++;
}
}
m_Event[pos.y][pos.x] = SHIPKILLED;

if(pos.x-razx-1>=0) x = pos.x-razx-1;
else x = pos.x-razx;
if(pos.x+sumx+1<10) cx = pos.x+sumx+1;
else cx = pos.x+sumx;
if(pos.y-razy-1>=0) y = pos.y-razy-1;
else y = pos.y-razy;
if(pos.y+sumy+1<10) cy = pos.y+sumy+1;
else cy = pos.y+sumy;
for(i=y; i<=cy; i++)

for(j=x; j<=cx; j++)
if(m_Event[i][j] != SHIPKILLED)
m_Event[i][j] = NEARKILLEDSHIP;

}

Анализ:

В параметр функции передается точка. Ее значение присваивается временной переменной pos.

POINT pos;
pos = pt;

Затем цикл for

for(i=1; i<4; i++) {

if(m_Event[pos.y][pos.x+i] == SHIPWOUND && pos.x+i<10){
m_Event[pos.y][pos.x+i] = SHIPKILLED;
sumx++;
}
if(m_Event[pos.y][pos.x-i] == SHIPWOUND && pos.x-i>=0) {
m_Event[pos.y][pos.x-i] = SHIPKILLED;
razx++;
}
if(m_Event[pos.y+i][pos.x] == SHIPWOUND && pos.y+i<10){
m_Event[pos.y+i][pos.x] = SHIPKILLED;
sumy++;
}
if(m_Event[pos.y-i][pos.x] == SHIPWOUND && pos.y-i>=0){
m_Event[pos.y-i][pos.x] = SHIPKILLED;
razy++;
}
}

Смысл этого цикла в том, чтобы в каждую ячейку отстоящую на 1,2,3 позиции
от переданной в параметре, если в ней было значение SHIPWOUND (ранен) и если она находится
на поле, поместить значение SHIPKILLED. Получается вокруг переданной
в параметре клетки своеобразный крест из клеток, помеченных как убитые.
Но помечаются убитыми только те кнопки, которые были ранее помечены как "ранен".

Таким образом исследуется пространство в виде креста в центре которого переданная в параметре точка. Если в этом пространстве находятся раненные клетки, то они помечаются как убитые.

Далее сама переданная в параметре точка помечается как убитая:

m_Event[pos.y][pos.x] = SHIPKILLED;

Наконец оставшийся код помечает все клетки смежные с убитым кораблем как NEARKILLEDSHIP.
Клетки отмеченные таким образом будут окрашены в темный цвет на экране.

if(pos.x-razx-1>=0) x = pos.x-razx-1;
else x = pos.x-razx;
if(pos.x+sumx+1<10) cx = pos.x+sumx+1;
else cx = pos.x+sumx;
if(pos.y-razy-1>=0) y = pos.y-razy-1;
else y = pos.y-razy;
if(pos.y+sumy+1<10) cy = pos.y+sumy+1;
else cy = pos.y+sumy;

for(i=y; i<=cy; i++)

for(j=x; j<=cx; j++)
if(m_Event[i][j] != SHIPKILLED)
m_Event[i][j] = NEARKILLEDSHIP;

Хорошая функция!

Этой функции передается точка (ячейка), которая является частью подбитого корабля.
Причем это уже последняя точка на корабле, которая ранее еще не была ранена.
Теперь весь корабль РАНЕН, а следовательно должен быть помечен как УБИТ.
Эта функция по одной переданной точке, вычисляет весь корабль, помечается все точки
корабля как УБИТЫЕ, а все точки смежные с кораблем - как РЯДОМ_С_УБИТОЙ.


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz