Автор работы: Пользователь скрыл имя, 13 Апреля 2014 в 02:42, реферат
Робота присвячена розробці нескладної комп’ютерної гри. Таким чином, повинна бути обрана мова програмування, що є зручною для виконання та інші технічні засоби, що будуть враховані при розробці.
В даній курсовій роботі автор ставить перед собою наступні задачі:
1. Розробити інтерфейс Меню, в якому можна передивлятись дані розробника та гру.
2. В програмі повинні бути різні режими гри та різна складність.
3. Повинна бути присутня можливість збереження результатів та їх вивід на екран при наступному запуску програми.
4. Програма повинна бути зручною для користувача та нескладною для використання.
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()
{
/* Получить системні метрики для:
- ширини рамки вікна
- висота рамки вікна
- висота заголовка вікна
- висота однієї стрічкив меню
- дозвіл екрана по X и Y */
WidthFrame = (int)GetSystemMetrics(SM_
HeightMenuString = (int)GetSystemMetrics(SM_
HeightFrame = (int)GetSystemMetrics(SM_
HeightHeader = (int)GetSystemMetrics(SM_
Width = (int)GetSystemMetrics(SM_
Height = (int)GetSystemMetrics(SM_
}
/* Функція розташування вікна */
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()
{
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_
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,
if(pl.GetOpponent() == user2)
pl.SetTurn(user2);
if(pl.GetOpponent() == ECM)
pl.SetTurn(ECM);
}
else {
CheckMenuItem(MainMenuGame, MM_GAME_FIRST,
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 діаграма
Рис. Б – Скріншоти програми
Информация о работе Аналіз предметної області, постановка задачі дослідження з обраної області