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

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

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

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

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

kursova.doc

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

bool gameboard::MachinCommand(HDC hdc)

{

   int i, j, k;

   int sI, sJ;

 

   /* Обробити всі клітинки які містять три палички */

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

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

         if(sq[i][j].GetFrame() == 3) {

            sI = i * 2;

            sJ = j * 2;

            if(!st[sI + 1][sJ].flag())

               sI++;

            else

               if(!st[sI][sJ + 1].flag())

                  sJ++;

               else

                  if(!st[sI + 1][sJ + 2].flag()) {

                     sI++; sJ += 2;

                  }

                  else

                     if(!st[sI + 2][sJ + 1].flag()) {

                        sI += 2; sJ++;

                     }

            SetStSq(hdc, sI, sJ);

            return false;

         }

  /* Обробити всі клітини які не містять жодної палички */

   for(k = 0; k < 3; k++)

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

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

            if(sq[i][j].GetFrame() == 0) {

               if(sq[i-1][j].GetFrame() == k) {

                  SetStSq(hdc, i * 2, j * 2 + 1);

                  return true;

               }

               if(sq[i][j + 1].GetFrame() == k) {

                  SetStSq(hdc, i * 2 + 1, j * 2 + 2);

                  return true;

               }

               if(sq[i + 1][j].GetFrame() == k) {

                  SetStSq(hdc, i * 2 + 2, j * 2 + 1);

                  return true;

               }

               if(sq[i][j - 1].GetFrame() == k) {

                  SetStSq(hdc, i * 2 + 1, j * 2);

                  return true;

               }

         }

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

   for(k = 0; k < 3; k++)

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

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

            if(sq[i][j].GetFrame() == 1) {

               if(i - 1 >= 0)

                  if(sq[i-1][j].GetFrame() == k)

                     if(!st[i * 2][j * 2 + 1].flag()) {

                        SetStSq(hdc, i * 2, j * 2 + 1);

                        return true;

                     }

               if(j + 1 < Width)

                  if(sq[i][j + 1].GetFrame() == k)

                     if(!st[i * 2 + 1][j * 2 + 2].flag()) {

                        SetStSq(hdc, i * 2 + 1, j * 2 + 2);

                        return true;

                     }

               if(i + 1 < Height)

                  if(sq[i + 1][j].GetFrame() == k)

                     if(!st[i * 2 + 2][j * 2 + 1].flag()) {

                        SetStSq(hdc, i * 2 + 2, j * 2 + 1);

                        return true;

                     }

               if(j - 1 >= 0)

                  if(sq[i][j - 1].GetFrame() == k)

                     if(!st[i * 2 + 1][j * 2].flag()) {

                        SetStSq(hdc, i * 2 + 1, j * 2);

                        return true;

                     }

            }

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

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

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

         if(sq[i][j].GetFrame() == 2) {

            if(!st[i * 2][j * 2 + 1].flag()) {

               SetStSq(hdc, i * 2, j * 2 + 1);

               return true;

            }

            if(!st[i * 2 + 1][j * 2 + 2].flag()) {

               SetStSq(hdc, i * 2 + 1, j * 2 + 2);

               return true;

            }

            if(!st[i * 2 + 2][j * 2 + 1].flag()) {

               SetStSq(hdc, i * 2 + 2, j * 2 + 1);

               return true;

            }

            if(!st[i * 2 + 1][j * 2].flag()) {

               SetStSq(hdc, i * 2 + 1, j * 2);

               return true;

            }

         }

}

 

/* Функція малювання ігрового поля */

void gameboard::Draw(HDC hdc)

{

   int i, j;

 

   /* Намалювати сітку */

   SelectObject(hdc, (HGDIOBJ)CreatePen(PS_SOLID, 1,

                RGB(200, 200, 200)));

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

      MoveToEx(hdc, i * Scale, 0, NULL);

      LineTo(hdc, i * Scale, PhysHeight);

   }

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

      MoveToEx(hdc, 0, i * Scale, NULL);

      LineTo(hdc, PhysWidth, i * Scale);

   }

   /* Намалювати задіяння палички */

   SelectObject(hdc, (HGDIOBJ)CreatePen(PS_SOLID, 2, 0));

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

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

         if(st[i][j].flag())

            st[i][j].Draw(hdc);

   /* Намалювати задіяння клітинки */

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

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

         sq[i][j].Draw(hdc);

}

/* Операторна функція установки  параметрів класу "gameboard" */

void gameboard::operator () (int aWidth, int aHeight)

{

   Width = aWidth;

   Height = aHeight;

   PhysWidth = Width * Scale;

   PhysHeight = Height * Scale;

   cross = zero = 0;

   FreeMem();

   if(!SetMem())

      PostQuitMessage(0);

}

                                    /* Класс "window" */

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

window::window()

{

   /* Получить системні  метрики для:

      - ширини  рамки вікна

      - висота  рамки вікна

      - висота  заголовка вікна

      - висота  однієї стрічкив меню

      - дозвіл  екрана по X и Y */

   WidthFrame = (int)GetSystemMetrics(SM_CXDLGFRAME);

   HeightMenuString = (int)GetSystemMetrics(SM_CYMENU);

   HeightFrame = (int)GetSystemMetrics(SM_CYDLGFRAME);

   HeightHeader = (int)GetSystemMetrics(SM_CYCAPTION);

   Width = (int)GetSystemMetrics(SM_CXSCREEN);

   Height = (int)GetSystemMetrics(SM_CYSCREEN);

}

 

/* Функція розташування вікна */

void window::PutWindow(HWND hwnd, int aWidth, int aHeight)

{

   int X, Y;

   int W, H;

 

   W = aWidth + WidthFrame * 2 + 5;

   H = aHeight + HeightHeader + HeightMenuString + WidthFrame * 2 + 20;

   X = Width / 2 - W / 2;

   Y = Height / 2 - H / 2;

   if(W < 190)

      W = 190;

   MoveWindow(hwnd, X, Y, W, H, TRUE);

}

                                /* Клас "player" */

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

player::player()

{

   ifstream fin("config.cfg");

   char buf[50];

   int ibuf;

 

   if(!fin) {

      opponent = user2; trn = user1; FirstTurn = trn;

      return;

   }

   while(fin) {

      fin >> buf;

      if(strcmp(buf, "Opponent=") == 0) {

         fin >> ibuf;

         opponent = (TURN)ibuf;

      }

      if(strcmp(buf, "Turn=") == 0) {

         fin >> ibuf;

         trn = (TURN)ibuf;

      }

   }

   FirstTurn = trn;

   fin.close();

}

 

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

player::~player()

{

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

 

   fout << "Opponent= " << (int)opponent << endl

        << "Turn= " << (int)FirstTurn << endl;

 

   fout.close();

}

 

/* Функція взаємодії гравців */

void player::Play(HWND hwnd, gameboard &gb, HDC hdc, int X, int Y)

{

   /* Грає перший користувач */

   if(trn == user1) {

      if(!gb.PlayerCommand(hdc, 'X', X, Y))

         return;

      if(opponent == user2)

         trn = user2;

      if(opponent == ECM) {

         trn = ECM;

         SendMessage(hwnd, WM_LBUTTONDOWN, 0L, 0L);

      }

      return;

   }

   /* Грає другий користувач */

   if(trn == user2) {

      if(!gb.PlayerCommand(hdc, 'O', X, Y))

         return;

      trn = user1;

   }

   /* Грає комп'ютер */

   if(trn == ECM) {

      if(!gb.MachinCommand(hdc)) {

         SendMessage(hwnd, WM_LBUTTONDOWN, 0L, 0L);

         return;

      }

      trn = user1;

   }

}

                               /* Класс "statusbar" */

/* Фукции введення даних  в стрічку стану */

void statusbar::SetStatus(int X, int O, TURN trn)

{

   char t = trn == user1 ? 'X' : 'O';

 

   sprintf(status, "X = [%i] O = [%i] Ходить [%c]", X, O, t);

}

 

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

void statusbar::Draw(HDC hdc, int Height)

{

   SelectFont(hdc, GetStockObject(DEFAULT_GUI_FONT));

   TextOut(hdc, 0, Height + 1, status, strlen(status));

}

 

                               /* Клас "menu" */

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

menu::menu()

{

   MainMenu = CreateGame();

   MainMenuGame = CreatePopupGame();

   GameRegim = CreatePopupGame();

   MainMenuHelp = CreatePopupGame();

 

   /* Реєстрація меню */

   AppendMenu(MainMenu, MF_ENABLED|

                        MF_POPUP,

                        (UINT)MainMenuGame, "&Гра");

   AppendMenu(MainMenu, MF_ENABLED|

                        MF_POPUP,

                        (UINT)MainMenuHelp, "&Справка");

   AppendMenu(MainMenuGame, MF_ENABLED|

                            MF_STRING,

                            MM_GAME_NEW, "&Нова гра\tF2");

   AppendMenu(MainMenuGame, MF_ENABLED|

                            MF_POPUP,

                            (UINT)GameRegim, "&Режим гри");

   AppendMenu(GameRegim, MF_ENABLED|

                         MF_STRING,

                         MM_GAME_REGIM_DUEL, "&Дуель");

   AppendMenu(GameRegim, MF_ENABLED|

                         MF_STRING,

                         MM_GAME_REGIM_COMP, "Гра з комп'ютером");

   AppendMenu(MainMenuGame, MF_ENABLED|

                            MF_STRING,

                            MM_GAME_FIRST, "Перший хрестик");

   AppendMenu(MainMenuGame, MF_ENABLED|

                            MF_STRING,

                            MM_GAME_PARAM, "Параметри поля...\tF3");

   AppendMenu(MainMenuGame, MF_SEPARATOR,

                            0, NULL);

   AppendMenu(MainMenuGame, MF_ENABLED|

                            MF_STRING,

                            MM_GAME_EXIT, "Вихід\tAlt+F4");

   AppendMenu(MainMenuHelp, MF_ENABLED|

                            MF_STRING,

                            MM_HELP_ABOUT, "Довідка про програму...");

}

 

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

Game::~Game()

{

   DestroyGame(Field);

   DestroyGaMe(Player);

   DestroyGame(GameStatus);

   DestroyGame(MoveResult);

}

 

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

void menu::PutMenu(HWND hwnd, player &pl)

{

   if(pl.GetOpponent() == user2)

      CheckMenuItem(GameRegim, MM_GAME_REGIM_DUEL,

                               MF_BYCOMMAND | MF_CHECKED);

   else

      CheckMenuItem(GameRegim, MM_GAME_REGIM_COMP,

                               MF_BYCOMMAND | MF_CHECKED);

   if(pl.GetTurn() == user1)

      CheckMenuItem(MainMenuGame, MM_GAME_FIRST,

                                  MF_BYCOMMAND | MF_CHECKED);

   SetMenu(hwnd, MainMenu);

   DrawMenuBar(hwnd);

}

 

/* Функція оновлення гри */

void menu::NewGame(HWND hwnd, gameboard &gb, player &pl, statusbar &sb)

{

   gb(gb.GetWidth(), gb.GetHeight());

   pl.SetTurn(pl.GetFirstTurn());

   if(pl.GetFirstTurn() == ECM)

      SendMessage(hwnd, WM_LBUTTONDOWN, 0L, 0L);

   sb.SetStatus(gb.GetCross(), gb.GetZero(), pl.GetTurn());

}

 

/* Функція завдання режиму  гри "Дуель" */

void menu::RegimDuel(player &pl)

{

   CheckMenuItem(GameRegim, MM_GAME_REGIM_DUEL,

                            MF_BYCOMMAND | MF_CHECKED);

   CheckMenuItem(GameRegim, MM_GAME_REGIM_COMP,

                            MF_BYCOMMAND | MF_UNCHECKED);

   pl.SetOpponent(user2);

   if(pl.GetFirstTurn() == ECM)

      pl.SetFirstTurn(user2);

}

 

/* Функція завдання режиму  гри "Грати з комп'ютером"*/

void menu::Game:Comp(player &pl)

{

   CheckMenuItem(GameRegim, MM_GAME_REGIM_COMP,

                            MF_BYCOMMAND | MF_CHECKED);

   CheckMenuItem(GameRegim, MM_GAME_REGIM_DUEL,

                            MF_BYCOMMAND | MF_UNCHECKED);

   pl.SetOpponent(ECM);

   if(pl.GetFirstTurn() == user2)

      pl.SetFirstTurn(ECM);

}

 

/* Опції завдання права  першого ходу */

void Game::Player1(player &pl)

{

   if(pl.GetFirstTurn() == user1) {

      CheckMenuItem(MainMenuGame, MM_GAME_FIRST,

                                  MF_BYCOMMAND | MF_UNCHECKED);

      if(pl.GetOpponent() == user2)

         pl.SetTurn(user2);

      if(pl.GetOpponent() == ECM)

         pl.SetTurn(ECM);

   }

   else {

      CheckMenuItem(MainMenuGame, MM_GAME_FIRST,

                                  MF_BYCOMMAND | MF_CHECKED);

      pl.SetTurn(user1);

   }

}

 

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

void menu::Param(HWND hwnd)

{

   ParamWnd = CreateWindowEx(

              0,

              ParamWinName,

              "Розмір поля для гри",

              WS_POPUP|

              WS_VISIBLE|

              WS_CAPTION,

              300, 300,

              260, 130,

              hwnd,

              NULL,

              hTI,

              NULL);

}

 

void menu::About()

{

   Field (NULL, "Програма: гра «Хрестики-Нулики"\n"

                     "Курсова робота з дисципліни «Об`єктно-орієнтоване програмування.\n"

                     "Автор: Журавська Ю.О. \n"

                     "Група: 2КН-10" , "Про програму", MB_OK|

                     MB_ICONASTERISK);

}

 

 

 

 

 

 

 

 

 

 

 

ДОДАТОК Г – Графічні додатки

Рис. А – UML діаграма

 

 

 

Рис. Б – Скріншоти програми

 

 

 


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