Аналіз предметної області, постановка задачі дослідження з обраної області

Автор работы: Пользователь скрыл имя, 13 Апреля 2014 в 02:42, реферат

Краткое описание

Робота присвячена розробці нескладної комп’ютерної гри. Таким чином, повинна бути обрана мова програмування, що є зручною для виконання та інші технічні засоби, що будуть враховані при розробці.
В даній курсовій роботі автор ставить перед собою наступні задачі:
1. Розробити інтерфейс Меню, в якому можна передивлятись дані розробника та гру.
2. В програмі повинні бути різні режими гри та різна складність.
3. Повинна бути присутня можливість збереження результатів та їх вивід на екран при наступному запуску програми.
4. Програма повинна бути зручною для користувача та нескладною для використання.

Вложенные файлы: 1 файл

kursova.doc

— 588.50 Кб (Скачать файл)

      case WM_PAINT:

         BeginPaint(hwnd, &ps);

         gb.Draw(ps.hdc);

         sb.Draw(ps.hdc, gb.GetPhysHeight());

         EndPaint(hwnd, &ps);

         break;

      /* Вікно отримало фокус вводу */

      case GameRunner:

         w.PutWindow(hwnd, gb.GetPhysWidth(), gb.GetPhysHeight());

         InvalidateRect(hwnd, NULL, TRUE);

         break;

      /* Повідомлення від меню */

      case WM_COMMAND:

         switch(wParam) {

            /* Скинути гру в початковий  стан */

            case GameStatus:Runner_Player2:

               m.NewGame(hwnd, gb, pl, sb);

               InvalidateRect(hwnd, NULL, TRUE);

               break;

            /* Вибрати режим "Дуель" */

            case GameStatus:Runner_Comp:

               m.RegimDuel(pl);

               m.NewGame(hwnd, gb, pl, sb);

               InvalidateRect(hwnd, NULL, TRUE);

               break;

            /* Грати з комп’ютером */

            case GameStatus:Runner_Player1:

               m.RegimComp(pl);

               m.NewGame(hwnd, gb, pl, sb);

               InvalidateRect(hwnd, NULL, TRUE);

               break;

           /* Вибрати початкового гравця */

            case GameRunner:Field:

               m.First(pl);

               m.NewGame(hwnd, gb, pl, sb);

               InvalidateRect(hwnd, NULL, TRUE);

               break;

            /* Вибрати параметри поля для гри*/

            case MM_GAME_PARAM:

               m.Param(hwnd);

               break;

            /* Викликати справку */

            case GameRunner:Help:

               m.About();

               break;

            /* Вийти з гри */

            case GameRunner:Exit:

               PostMessage(hwnd, WM_DESTROY, 0L, 0L);

               break;

         }

         break;

      /* Повідомлення від клавіатури */

      case Field:

         switch(wParam) {

            case VK_F2:

               PostMessage(hwnd, WM_COMMAND, MM_GAME_NEW, 0L);

               break;

            case VK_F3:

               PostMessage(hwnd, WM_COMMAND, MM_GAME_PARAM, 0L);

               break;

         }

         break;

      /* Завершення роботи */

      case WM_DESTROY:

         ReleaseDC(hwnd, chdc);

         PostQuitMessage(0);

         break;

      /* Необроблені повідомлення повернути Windows */

      default:

         return DefWindowProc(hwnd, message, wParam, lParam);

   }

   return 0;

}

 

/* Функція вікна параметрів */

LRESULT CALLBACK ParamWinFunc(

                 HWND hwnd,

                 UINT message,

                 WPARAM wParam,

                 LPARAM lParam)

{

   PAINTSTRUCT ps;

   char param[50];

  static HWND EditWidth, EditHeight,

               ButOK, ButCancel;

   switch(message) {

      /* Створення органів управління*/

      case WM_CREATE:

         /* Кнопка "OK" */

         ButOK = CreateWindowEx(

                 0,

                 "button",

                 "OK",

                 WS_CHILD|

                 BS_DEFPUSHBUTTON|

                 WS_VISIBLE,

                 170, 13,

                 60, 25,

                 hwnd,

                 (HMENU)BUT_OK,

                 hTI,

                 NULL);

         /* Кнопка "Cancel" */

         ButCancel = CreateWindowEx(

                     0,

                     "button",

                     "Cancel",

                     WS_CHILD|

                     WS_VISIBLE,

                     170, 53,

                     60, 25,

                     hwnd,

                     (HMENU)BUT_CANCEL,

                     hTI,

                     NULL);

         /* Текстовий редактор для вводу  ширини поля */

         EditWidth = CreateWindowEx(

                     WS_EX_CLIENTEDGE,

                     "edit",

                     NULL,

                     WS_CHILD|

                     ES_AUTOHSCROLL|

                     WS_VISIBLE,

                     80, 13,

                     70, 20,

                     hwnd,

                     (HMENU)15,

                     hTI,

                     NULL);

         /* Текстовий редактор для вводу  висоти поля */

         EditHeight = CreateWindowEx(

                      WS_EX_CLIENTEDGE,

                      "edit",

                      NULL,

                      WS_CHILD|

                      ES_AUTOHSCROLL|

                      WS_VISIBLE,

                      80, 43,

                      70, 20,

                      hwnd,

                      (HMENU)13,

                      hTI,

                      NULL);

         SendMessage(ButOK, WM_SETFONT,

                     (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0l);

         SendMessage(ButCancel, WM_SETFONT,

                     (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0l);

         SendMessage(EditWidth, WM_SETFONT,

                     (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0l);

         SendMessage(EditHeight, WM_SETFONT,

                     (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0l);

         sprintf(param, "%i", gb.GetWidth());

         SendMessage(EditWidth, EM_REPLACESEL, 0L,

                     (LPARAM)(LPCSTR)param);

         sprintf(param, "%i", gb.GetHeight());

         SendMessage(EditHeight, EM_REPLACESEL, 0L,

                     (LPARAM)(LPCSTR)param);

         break;

      /* Послати  фокус вводу першого текстового  редактору */

      case WM_SETFOCUS:

         SetFocus(EditWidth);

         break;

      /* Перемальовування вікна */

      case WM_PAINT:

         BeginPaint(hwnd, &ps);

         SetBkMode(ps.hdc, TRANSPARENT);

         SelectFont(ps.hdc, GetStockObject(DEFAULT_GUI_FONT));

         TextOut(ps.hdc, 25, 15, "Ширина:", 7);

         TextOut(ps.hdc, 25, 45, "Висота:", 7);

         EndPaint(hwnd, &ps);

         break;

      /* Приймати повідомлення від органів управління */

      case WM_COMMAND:

         switch(wParam) {

            /* "OK" */

            case BUT_OK:

               int size;

               int W, H;

 

               *(unsigned int *)param = sizeof(param) - 1;

               size = SendMessage(EditWidth, EM_GETLINE, 0L,

                                             (LPARAM)(LPSTR)param);

               param[size] = '\0';

               sscanf(param, "%i", &W);

               for(int i = 0; param[i] != '\0'; i++)

                  if(!isdigit(param[i]))

                     W = gb.GetWidth();

               if(W < 3)

                 W = 3;

               if(W > w.GetWidth() / gb.GetScale() - 1)

                  W = w.GetWidth() / gb.GetScale() - 1;

 

               *(unsigned int *)param = sizeof(param) - 1;

               size = SendMessage(EditHeight, EM_GETLINE, 0L,

                                             (LPARAM)(LPSTR)param);

               param[size] = '\0';

               sscanf(param, "%i", &H);

               for(int i = 0; param[i] != '\0'; i++)

                  if(!isdigit(param[i]))

                     H = gb.GetHeight();

               if(H < 3)

                  H = 3;

               if(H > w.GetHeight() / gb.GetScale() - 5)

                  H = w.GetHeight() / gb.GetScale() - 5;

 

               gb(W, H);

 

               m.NewGame(::hwnd, gb, pl, sb);

            /* "Cancel" */

            case BUT_CANCEL:

               PostMessage(hwnd, WM_CLOSE, 0L, 0L);

               break;

         }

         break;

      /* При закритті знищити всі органи управління і тимчасове вікно*/

      case Player:Exit:

         DestroyWindow(EditWidth);

         DestroyWindow(EditHeight);

         DestroyWindow(ButOK);

         DestroyWindow(ButCancel);

         DestroyWindow(hwnd);

         break;

      default:

         return DefWindowProc(hwnd, message, wParam, lParam);

   }

   return 0;

}

                                     /* Клас "stick" */

/* Функція малювання палички */

void stick::Draw(HDC hdc)

{

   MoveToEx(hdc, GetD().BeginX, GetD().BeginY, NULL);

   LineTo(hdc, GetD().EndX, GetD().EndY);

}

                                     /* Клас "square" */

/* Конструктор класу "square" */

square::square()

{

   symbol = '\0';

   Frame = 0;

}

 

/* Функція прийомі параметрів  для клітинки від палички */

bool square::StickCommand(HDC hdc, char s)

{

   symbol = s;

   Frame++;

   if(Frame == 4) {

      Draw(hdc);

      return true;

   }

 

   return false;

}

 

/* Функція малювання символу в клітинці */

void square::Draw(HDC hdc)

{

   if(Frame == 4) {

      if(symbol == 'X') {

         MoveToEx(hdc, GetD().BeginX + 6, GetD().BeginY + 6, NULL);

         LineTo(hdc, GetD().EndX - 6, GetD().EndY - 6);

         MoveToEx(hdc, GetD().EndX - 6, GetD().BeginY + 6, NULL);

         LineTo(hdc, GetD().BeginX + 6, GetD().EndY - 6);

      }

      if(symbol == 'O')

         Ellipse(hdc, GetD().BeginX + 4, GetD().BeginY + 4,

                      GetD().EndX - 4, GetD().EndY - 4);

  }

}

                                    /* Клас "gameboard" */

/* Функція виділення пам'яті для масивів об’єктів */

bool gameboard::SetMem()

{

   DIAGDATA dd = {0, 0, 0, 0};

   SQRID qd;

   int i, j;

 

   /* Виділення пам'яті під масиви */

   try {

      st = new stick *[Height * 2 + 1];

      for(i = 0; i <= Height * 2; i++)

         st[i] = new stick[Width * 2 + 1];

      sq = new square *[Height];

      for(i = 0; i < Height; i++)

         sq[i] = new square[Width];

   } catch(bad_alloc err) {

        MessageBox (NULL, "Помилка виділення пам'яті",

                   "Error!", MB_OK | MB_ICONHAND);

        return false;

     }

                             /* Ініціалізація масивів даних */

   /* Ініціалізація паличок */

   for(i = 0; i <= Height * 2; i++)

      for(j = 0; j <= Width * 2; j++)

         st[i][j].SetD(dd);

   for(i = 0; i <= Height * 2; i += 2)

      for(j = 1; j < Width * 2; j += 2) {

         dd.BeginX = j * Scale / 2 - Scale / 2;

         dd.BeginY = i * Scale / 2;

         dd.EndX = dd.BeginX + Scale;

         dd.EndY = dd.BeginY;

         qd.LeftOrUpI = i / 2 - 1;

         qd.RightOrDownI = i / 2;

         qd.LeftOrUpJ = j / 2;

         qd.RightOrDownJ = j / 2;

         st[i][j].SetD(dd);

         st[i][j].SetS(qd);

         if(i == 0 || i == Height * 2)

            st[i][j].flag(true);

         else

            st[i][j].flag(false);

      }

   for(i = 1; i < Height * 2; i += 2)

      for(j = 0; j <= Width * 2; j += 2) {

         dd.BeginX = j * Scale / 2;

         dd.BeginY = i * Scale / 2 - Scale / 2;

         dd.EndX = dd.BeginX;

         dd.EndY = dd.BeginY + Scale;

         qd.LeftOrUpI = i / 2;

         qd.RightOrDownI = i / 2;

         qd.LeftOrUpJ = j / 2 - 1;

         qd.RightOrDownJ = j / 2;

         st[i][j].SetD(dd);

         st[i][j].SetS(qd);

         if(j == 0 || j == Width * 2)

            st[i][j].flag(true);

         else

            st[i][j].flag(false);

      }

    /* Ініціалізація клітинок */

    for(i = 0; i < Height; i++)

       for(j = 0; j < Width; j++) {

          dd.BeginX = j * Scale;

          dd.BeginY = i * Scale;

          dd.EndX = dd.BeginX + Scale;

          dd.EndY = dd.BeginY + Scale;

          sq[i][j].SetD(dd);

          if(i == 0 || i == Height - 1)

             sq[i][j].SetFrame(1);

          if(j == 0 || j == Width - 1)

             sq[i][j].SetFrame(1);

          if((i == 0 && j == 0)||

             (i == Height - 1 && j == Width -1)||

             (i == 0 && j == Width -1)||

             (i == Height - 1 && j == 0))

             sq[i][j].SetFrame(2);

       }

   return true;

}

 

/* Функція звільнення пам'яті */

void gameboard::FreeMem()

{

   for(int i = 0; i < Height; i++)

      delete [] sq[i];

   delete [] sq;

   for(int i = 0; i <= Height * 2; i++)

      delete [] st[i];

   delete [] st;

}

 

/* Конструктор класу "gameboard" */

gameboard::gameboard()

{

   ifstream fin("config.cfg");

   char buf[50];

 

   if(!fin) {

      MessageBox (NULL, "Помилка відкриття файлу конфігурації config.cfg.\n"

                        "Всі значення будуть прийняті за замовчуванням",

                        "Warning", MB_OK | MB_ICONEXCLAMATION);

      Scale = 25; Width = 10; Height = 10;

   }

   else {

      while(fin) {

         fin >> buf;

         if(strcmp(buf, "Scale=") == 0)

            fin >> Scale;

         if(strcmp(buf, "Width=") == 0)

            fin >> Width;

         if(strcmp(buf, "Height=") == 0)

            fin >> Height;

      }

      fin.close();

   }

   cross = zero = 0;

   PhysWidth = Width * Scale;

   PhysHeight = Height * Scale;

   if(!SetMem())

      PostQuitMessage(0);

}

 

/* Деструктор класу "gameboard" */

gameboard::~gameboard()

{

   ofstream fout("config.cfg", ios::out | ios::trunc);

 

   fout << "Scale= " << Scale << endl

        << "Width= " << Width << endl

        << "Height= " << Height << endl;

   fout.close();

  FreeMem();

}

 

/* Функція перевірки на  завершення гри */

void gameboard::EndGame()

{

   if((cross + zero) == Width * Height) {

      if(cross > zero)

         MessageBox (NULL, "Переміг \"хрестик\"", "Кінець гри", MB_OK);

      else

        if(zero > cross)

           MessageBox (NULL, "Переміг \"нулик\"", "Кінець гри", MB_OK);

        else

           MessageBox (NULL, "Нічия", "Кінець гри", MB_OK);

      cross = 0; zero = 0;

   }

}

 

/* Функція обробки повідомлень  заданих гравцем */

bool gameboard::PlayerCommand(HDC hdc, char s, int X, int Y)

{

   int dX = X % Scale;

   int dY = Y % Scale;

   int I = Y / Scale * 2;

   int J = X / Scale * 2;

   int d = 0;

   bool result;

   SQRID qd;

 

   /* Визначення індексу палички виходячи з координат курсору миші */

   if(dX < Scale / 2) {

      if(dY >= dX)

         d = 1;

      if(dY >= Scale - dX)

         d = 2;

   }

   if(dX >= Scale / 2) {

      if(dY >= Scale - dX)

              d = 1;

      if(dY >= dX)

         d = 2;

   }

   I += d; d = 0;

   if(dY < Scale / 2) {

      if(dX > dY)

         d = 1;

      if(dX >= Scale - dY)

         d = 2;

   }

 

   if(dY >= Scale / 2) {

      if(dX >= Scale - dY)

         d = 1;

      if(dX > dY)

         d = 2;

   }

   J += d;

   /* Обмежити стрічку стану */

   if(I > Height * 2 || J > Width * 2)

      return false;

   if(st[I][J].flag())

      return false;

   /* Обробити паличку по отриманому індексу */

   st[I][J].flag(true);

   st[I][J].Draw(hdc);

   /* Отримати дані для клітини від палички */

   qd = st[I][J].GetS();

   /* Послати дані клітці за індексом отриманого від палички */

   result = sq[qd.LeftOrUpI][qd.LeftOrUpJ].StickCommand(hdc, s);

   if(result) {

      if(s == 'X')

         cross++;

      if(s == 'O')

         zero++;

   }

   if(sq[qd.RightOrDownI][qd.RightOrDownJ].StickCommand(hdc, s)) {

      if(s == 'X')

         cross++;

      if(s == 'O')

         zero++;

      return false;

   }

   if(result)

      return false;

   return true;

}

 

/* Функція встановлення параметрів для паличок клітин встановлені

* комп’ютером */

void gameboard::SetStSq(HDC hdc, int sI, int sJ)

{

   SQRID qd;

 

   qd = st[sI][sJ].GetS();

   st[sI][sJ].flag(true);

   st[sI][sJ].Draw(hdc);

 

   if(sq[qd.LeftOrUpI][qd.LeftOrUpJ].StickCommand(hdc, 'O'))

      zero++;

   if(sq[qd.RightOrDownI][qd.RightOrDownJ].StickCommand(hdc, 'O'))

      zero++;

}

 

/* Функція обробки даних  комп'ютером */

Информация о работе Аналіз предметної області, постановка задачі дослідження з обраної області