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

Глава 1


Функция получает координаты точки. Вызывает функцию NetStep(x, y) с этими координатами.
NetStep() возвращает одно из трех значений. Соответственно у вызывающей функции есть
три ветви выполнения. В каждой ветви заполняются структуры NET_DATA и LISTDATA,
и посылаются соответствующие сообщения ::SendMessage.


void CField::RecvNetData(int x, int y) {
char buf[2];
NET_DATA data;
LISTDATA listdata;

buf[0] = N_MESSAGE;
buf[1] = NetStep(x, y);
listdata.x = x;
listdata.y = y;
listdata.str = "СОП";
listdata.state = SHIPWOUND;
m_Steps++;

if(buf[1] == N_SHIPKILLED) {

m_GoodSteps++;
KilledShips++;
::SendMessage(m_Parent->m_hWnd, WM_STATIC_TO_DLG, WM_KILL, 0);
if(KilledShips == 10) {
m_Operation = NONE;
::SendMessage(m_Parent->m_hWnd, WM_STATIC_TO_DLG, WM_WIN_NET, 0);
buf[0] = N_WIN_YOU;
data.buf = &buf[0];
data.lenght = 1;
::SendMessage(m_Parent->m_hWnd, WM_STATIC_TO_DLG, WM_SEND_DATA, (LPARAM)&data);
}
listdata.state = SHIPKILLED;
}
if(buf[1] == N_SHIPWOUND)
m_GoodSteps++;
data.buf = buf;
data.lenght = 2;
::SendMessage(m_Parent->m_hWnd, WM_STATIC_TO_DLG, WM_SEND_DATA, (LPARAM)&data);
if(buf[1] == N_EMPTY) {
::SendMessage(m_Parent->m_hWnd, WM_STATIC_TO_DLG, WM_OWN_STEP, 0);
listdata.state = EMPTY;
}
Invalidate();
::SendMessage(m_Parent->m_hWnd, WM_STATIC_TO_DLG, WM_SET_MOVE, (LPARAM)&listdata);
}

Анализ:

В функцию передаются координаты точки.

void CField::RecvNetData(int x, int y) {

Организуется массив символов char buf[2];

NET_DATA data;
LISTDATA listdata;

В массив символов помещается символ, обозначающий сообщение N_MESSAGE
buf[0] = N_MESSAGE;

для того, чтобы можно было вывести нужное сообщение

В массив символов помещается символ, возвращенный функцией NetStep(),
а мы помним, что эта функция возвращает одно из трех чисел, означающих
корабль убит, корабль ранен, ячейка пуста (мимо)

buf[1] = NetStep(x, y);

listdata.x = x;
listdata.y = y;
listdata.str = "СОП";
listdata.state = SHIPWOUND;
m_Steps++;

//-----------
Если корабль убит:
if(buf[1] == N_SHIPKILLED) {

m_GoodSteps++; //хороший шаг
KilledShips++; //убитые корабли

Пошлем сообщение, что корабль убит
::SendMessage(m_Parent->m_hWnd, WM_STATIC_TO_DLG, WM_KILL, 0);

Если убито уже 10 кораблей
if(KilledShips == 10) {
m_Operation = NONE;
Пошлем сообщение о победе
::SendMessage(m_Parent->m_hWnd, WM_STATIC_TO_DLG, WM_WIN_NET, 0);

Поместим в ячейку массива символ, означающий сообщение о победе и поместим в NET_DATA data
эту же информацию:
buf[0] = N_WIN_YOU;
data.buf = &buf[0];
data.lenght = 1;

NET_DATA data - это переменная сетки.
Пошлем еще сообщение о победе:
::SendMessage(m_Parent->m_hWnd, WM_STATIC_TO_DLG, WM_SEND_DATA, (LPARAM)&data);
}
Поместим в list значение, что корабль убит:
listdata.state = SHIPKILLED;
}

//-------------
Если корабль ранен:
if(buf[1] == N_SHIPWOUND)
m_GoodSteps++;//хороший шаг

Поместим в NET_DATA data сообщение, что корабль ранен
data.buf = buf;
data.lenght = 2;

Пошлем еще сообщение что корабль ранен:
::SendMessage(m_Parent->m_hWnd, WM_STATIC_TO_DLG, WM_SEND_DATA, (LPARAM)&data);

//------------
Если клетка пуста

if(buf[1] == N_EMPTY) {

Пошлем соответствующее сообщение
::SendMessage(m_Parent->m_hWnd, WM_STATIC_TO_DLG, WM_OWN_STEP, 0);

Поместим в list значение, что клетка пуста:
listdata.state = EMPTY;
}

Обновить(перерисовать) окно и послать сообщение:
Invalidate();
::SendMessage(m_Parent->m_hWnd, WM_STATIC_TO_DLG, WM_SET_MOVE, (LPARAM)&listdata);

}

Найти структуры LISTDATA и NET_DATA о познакомиться с ними.


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

Hosted by uCoz