Глава 1 (продолжение 1)
int GetReport();
void SetShipKilled(POINT pt);
int NetStep(int x, int y);
void RecvNetData(int x, int y);
void DrawObject(RECT rect, CDC *dc, HBITMAP hbm);
void CompMove();
GENDATA GenerateMove(int x=-1, int y=-1);
bool ConvertPropertiesToMassive(POINT pos, int decks, int dir);
void CountPlacement();
void DrawShip(RECT rect, CDC *dc);
RECT GetRect();
int ReceiveMessage(int wParam, long lParam);
void SetMode(int mode);
int GenerateNumber(int a);
virtual ~CField();
protected:
void OnMouseMove(UINT nFlags, CPoint point);
void OnLButtonDown(UINT nFlags, CPoint point) ;
void OnRButtonDown(UINT nFlags, CPoint point);
void OnPaint();
void OnPaint() (Анализ);
int OnCreate(LPCREATESTRUCT lpCreateStruct);
void SetParent(CWnd *wnd)
--------------------------
void CField::SetShipKilled(POINT pt)
Этой функции передается точка (координаты ячейки), которая является частью подбитого корабля. Причем это уже последняя точка на корабле, которая ранее еще не была ранена.
Теперь весь корабль РАНЕН, а следовательно должен быть помечен как УБИТ.
Эта функция по одной переданной точке, вычисляет весь корабль, помечается все точки
корабля как УБИТЫЕ, а все точки смежные с кораблем - как РЯДОМ_С_УБИТОЙ.
Вызывается в функции:
if(lParam == N_SHIPKILLED)
{
int CField::ReceiveMessage(int wParam, long lParam)
{
LISTDATA listdata;
switch(wParam)
{
...
m_Event[NetPoint.y][NetPoint.x] = SHIPWOUND;
SetShipKilled(NetPoint);
Вообще функция ReceiveMessage() была и в функции главного окна!
Точка NetPoint в конструкторе Field() инициирована так:
NetPoint.x = NetPoint.y = -1;
-------------------------
int NetStep(int x, int y);
Шаг по сетке. Эта функция получает координаты ячейки (клетки). Если кординаты ячейки попали в корабль, то функция сообщает убит корабль или ранен. В противном случае сообщает, что ячейка пуста.
Эта функция по одной переданной точке, вычисляет весь корабль, помечает все точки
корабля как УБИТЫЕ, а все точки смежные с кораблем - как РЯДОМ_С_УБИТОЙ.
Вызывается в функции:
void CField::RecvNetData(int x, int y)
{
----------------------
void RecvNetData(int x, int y);
Функция получает координаты точки. Вызывает функцию NetStep(x, y) с этими координатами.
NetStep() возвращает одно из трех значений. Соответственно у вызывающей функции есть
три ветви выполнения. В каждой ветви заполняются структуры NET_DATA и LISTDATA,
и посылаются соответствующие сообщения ::SendMessage.
Не знаю где вызывается эта функция.
------------------------
void DrawObject(RECT rect, CDC *dc, HBITMAP hbm)
Функции передается холст, контекст для рисования и рисунок:
Вызывается в гигантской функции void CField::OnPaint() один раз. В конце функции.
----------------------------
GENDATA GenerateMove(int x=-1, int y=-1);
возвращает структуру data, которая содержит:
координаты точки и переменную с одним из трех значений
data.IsKilled = SHIPWOUND;
data.IsKilled = SHIPKILLED;
data.IsKilled = SHIPNOKILLED;
data.IsKilled = EMPTY;
Вызывается три раза в функции:
void CField::CompMove()
-------------------
void CField::CompMove()
Вызывается в функции:
void CSeaBattleDlg::SetBtDown(int but)
HRESULT CSeaBattleDlg::ReceiveMessage(WPARAM wParam, LPARAM lParam)
объектом CField m_OwnField.CompMove();
-------------------
bool ConvertPropertiesToMassive(POINT pos, int decks, int dir);
Вызывается в функции:
void CField::CountPlacement()
----------------
bool CField::ConvertPropertiesToMassive()
Вызывается в функции:
void CField::OnLButtonDown(UINT nFlags, CPoint point)
----------------------
void CField::CountPlacement()
высчитывает местоположение и направление случайным образом.
Вызывается в функции:
int CField::ReceiveMessage(int wParam, long lParam)
----------------
void CField::DrawShip(RECT rect, CDC *dc)
Рисует корабль на переданном холсте и контексте для рисования.
Вызывается в гигантской функции void CField::OnPaint() много раз.
-------------------------
RECT CField::GetRect()
(получить четырехугольник для рисования - холст).
Это служебная функция, которая работает без параметров,
она работает с private переменными. Она берет две private переменные:
m_Position типа Point и m_Direction типа int и возвращает объект RECT(холст)
Передается в параметр функции DrawShip(GetRect(), &dc) в огромной
функции void CField::OnPaint() один раз.
/////////////////////
Вверх
Маленькие служебные функции:
void CField::SetMode(int mode)
{ int CField::GenerateNumber(int a)
{ /////////////////////
Переменная
LISTDATA вероятно это переменная языка С++
Эта переменная имеет координаты X, Y, строку и статус.
----------------------
int m_Operation; //тип операции
CWnd* m_Parent; родительское окно (главное окно приложения)
В частности в конструкторе класса мы видим:
CField::CField()
{
Кроме того, в программе используются константы означающие:
//objects
//directions
//operations
//messages
//properties
//timer
Назад |
Начало урока |
Вверх |
Вперед
int CField::GetReport()
{
struct GENDATA
{
int IsKilled;
listdata.x = NetPoint.x;
listdata.y = NetPoint.y;
listdata.str = "ВЫ";
listdata.state = EMPTY;
Открытые переменные класса:
public:
POINT NetPoint;
bool IsNet;
CWnd* m_Parent;
int KilledShips;
int Alpha;
int m_Operation;
private:
int m_GoodSteps, m_Steps;
int m_Draw;
CBitmap bmp, *pOld;
CDC WaterDC;
HBITMAP m_Bmp[8], m_bFire, m_bMonoFire;
int m_Mode;
int m_Decks, m_Direction;
POINT m_Position;
short m_Event[10][10];//двумерный массив поля боя
bool ConvertPropertiesToMassive();
short m_Count;
HCURSOR m_cFire;
-----------------------
Часто в этом классе поля боя используются следующие переменные
POINT m_Position //позиция (корабля)
int m_Direction //направление расположения
int m_Decks //число ячеек в корабле
int m_Draw
short m_Event[10][10];//двумерный массив поля боя
short m_Count; число кораблей
m_Direction = RIGHT;
m_Decks = 4;
m_Position.x = m_Position.y = -1;
m_Draw = false;
m_Operation = NONE;
m_Parent = NULL;
for(int i=0; i<10; i++)
for(int j=0; j<10; j++)
m_Event[i][j] = EMPTY;
m_Count = 0;
KilledShips = 0;
IsNet = 0;
NetPoint.x = NetPoint.y = -1;
m_GoodSteps = m_Steps = 0;
Как видим в конструкторе все переменные инициализируются начальными значениями
объекты (например - наше поле, чужое поле), направления (лево, право, вверх и тд - например это в расположении корабля), операции (поставить на поле (PLACEMENT), огонь, ожидай, нет_
операций), сообщения (сообщение, что поставлен корабль, сообщение, что произведен выстрел, сообщение об очистке поля), некоторые константы сообщают свойства ( свойства ячеек такие как - это корабль, рядом с кораблем, мимо, корабль ранен и тд).
#define OWN_FIELD 1
#define FOREIGN_FIELD 2
#define LETTERS 3
#define NUMBERS 4
#define RIGHT 3000
#define BOTTOM 3001
#define LEFT 3002
#define TOP 3003
#define HOR 3004
#define VERT 3005
#define ONLYONE 3006
#define PLACEMENT 10000
#define NONE 10001
#define FIRE 10002
#define WAIT 10003
#define WM_PLACEMENT 11000
#define WM_NONE 11001
#define WM_SET_TIMER 11002
#define WM_IS_OK 11003
#define WM_COUNT_PLACEMENT 11004
#define WM_FIRE 11005
#define WM_CLEARFIELD 11006
#define WM_FINISH 11007
#define WM_IS_PLACEMENT 11008
#define EMPTY 1000
#define SHIP 1001
#define NEARSHIP 1002
#define SHIPWOUND 1003
#define SHIPKILLED 1004
#define CANNOT 1005
#define SHIPNOTKILLED 1006
#define NEARKILLEDSHIP 1007
#define ACT_SHIP 14000
Содержание