Розробка гри "Lines" в середовищі С++

Сутність та характерні особливості системного програмування. Історія розвитку комп'ютерних ігор. Створення програми, що реалізує гру "Lines" в середовищі С++ за допомогою автоматного підходу, її правила. Розробка і опис структурної і функціональної схем.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 12.02.2014
Размер файла 610,4 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

ЗМІСТ

ВСТУП

1. ЗАГАЛЬНА ЧАСТИНА

1.1 Огляд існуючих рішень

1.2 Перспективи застосування

2. СПЕЦІАЛЬНА ЧАСТИНА

2.1 Розробка і опис структурної і функціональної схем

2.2 Вибір і обґрунтування окремих вузлів

2.3 Проектування алгоритму розв'язання задачі

3. ЧАСТИНА РОЗРОБКИ ПРОГРАМНОГО КОДУ

3.1 Опис створеної програми

ВИСНОВОК

ЛІТЕРАТУРА

ДОДАТОК А

ВСТУП

Системне програмування - це вид програмування, який полягає у розробці програм, які взаємодіють з системним програмним забезпеченням (операційною системою), або апаратним забезпеченням комп'ютера.

В загальному для системного програмування характерні такі особливості (одна або кілька):

· програміст повинен враховувати особливості операційної системи та/або апаратного забезпечення, на яких передбачається запуск програми, та використовувати ці особливості (наприклад, застосовуючи оптимізовані алгоритми для певної архітектури)

· зазвичай використовуються низькорівневі мови програмування або діалекти які:

· можуть працювати у ресурсо-обмеженому середовищі

· максимально раціональні та мають мінімальні затримки за часом виконання

· мають малі бібліотеки періоду виконання (RTL), або взагалі їх не мають

· дозволяють виконувати прямий доступ до пам'яті та керуючої логіки

· дозволяють програмісту писати частини програми на асемблері

· налагодження може бути складним, якщо неможливо запустити програму у режимі налагодження через обмеження у ресурсах. Виконання програми у імітованому середовищі може зняти цю проблему. [1]

Перші комп'ютери створювалися виключно для обчислень (що відображено в назвах «комп'ютер» і «ЕОМ»). Навіть найпримітивніші комп'ютери в цій галузі у багато разів перевершують людей (якщо не брати до уваги можливості деяких унікальних "людей-лічильників"). Не випадково першою високорівневою мовою програмування був Фортран, призначений виключно для виконання математичних розрахунків.

Іншою сферою застосування комп'ютерів стали бази даних. Перш за все вони були потрібні урядам і банкам, які вимагають вже складніших комп'ютерів з розвиненими системами введення-виведення та зберігання інформації. Для цих цілей був розроблено мову Кобол. Пізніше з'явилися СКБД зі своїми власними мовами програмування.

Комп'ютери розвинулися настільки, що стали головним інформаційним інструментом як в офісі, так і вдома. Тепер майже будь-яка робота з інформацією найчастіше здійснюється через комп'ютер - набір тексту.

1. ЗАГАЛЬНА ЧАСТИНА

1.1 Огляд існуючих рішень для системи

Мета цієї роботи полягає у створенні програми, що реалізує за допомогою автоматного підходу [2] гру "Lines", правила якої описані нижче. Зовнішній вигляд програми наведено на рисунку - 1.

Рисунок 1- Фрагмент гри

Опишемо правила "класичної" гри "Lines".

1. Ігрове поле являє собою квадратну сітку осередків, в яких розташовуються кулі, але не більше одного в кожній з них.

2. На кожному ходу в обраних випадковим чином осередках з'являються нові кулі.

3. Гравець за допомогою "миші" має перемістити одна з куль у вільну комірку, намагаючись вибудовувати з однакових куль безперервні горизонтальні, вертикальні або діагональні лінії.

4. Якщо після переміщення або появи кулі лінія досягне заданої довжини, то все кулі, що входять до неї, видаляються. При цьому гравець набирає певну кількість очок.

5. Переміщення кулі з вихідної комірки в "осередок призначення" допускається, якщо існує шлях, що проходить за вільними осередкам, розташованим поруч один з одним по вертикалі або по горизонталі.

6. Якщо після переміщення кулі була видалена лінія, то на наступному ходу нові кулі, які повинні були б з'явитися відповідно до п.2, не з'являються.

7. Гра закінчується, коли на ігровому полі не залишається вільних комірок - вони всі заповнені кулями.

8. Мета гри - набрати якомога більше очок, які запам'ятовуються у відповідній таблиці.

9. У грі використовується "шкала цінностей". При цьому кількість очок, які отримує гравець при складанні лінії куль, обчислюється (при n і k) за формулою

q = n Ч (n - k 1)

N - кількість збудованих в лінію куль,

k мінімальна кількість видаляються куль,

q - одержувані очки

10. У будь-який момент гри на екран виводиться підказка про кулях, які з'являться на наступному кроці. Ці підказки відображаються на поле у вигляді зменшених зображень куль.

Для розробки програми використав MicrosoftVisualStudio 2010 та бібліотеки NETFramework та мові програмування C#.

C # (вимовляється сі шарп) - об'єктно-орієнтована мова програмування. Розроблена в 1998-2001 роках групою інженерів під керівництвом Андерса Хейлсберг в компанії Microsoft як мова розробки додатків для платформи Microsoft. NET Framework і згодом була стандартизована як ECMA-334 і ISO/IEC 23270.

C # відноситься до сім'ї мов з C-подібним синтаксисом, з них його синтаксис найбільш близький до C + + і Java. [3]

Microsoft Visual Studio - лінійка продуктів компанії Майкрософт, що включають інтегроване середовище розробки програмного забезпечення і ряд інших інструментальних засобів. Дані продукти дозволяють розробляти як консольні додатки, так і додатки з графічним інтерфейсом, в тому числі з підтримкою технології Windows Forms, а також веб-сайти, веб-додатки, веб-служби як у рідному, так і в керованому кодах для всіх платформ, підтримуваних Microsoft Windows, Windows Mobile, Windows CE,. NET Framework,. NET Compact Framework і Microsoft Silverlight. [4]

NET Framework - програмна платформа, випущена компанією Microsoft в 2002 році. Основою платформи є виконуюче середовище CommonLanguageRuntime (CLR), здатна виконувати як звичайні програми, так і серверні веб-додатки. NET Framework підтримує створення програм, написаних на різних мовах програмування. [5]

Для реалізації графічної частини була використана технологія Windows Form, яка має достатній вибір властивостей і методів для реалізації графічного інтерфейсу.

1.2 Перспективи застосування

Lines - логічна гра, в якій необхідно очищати ігрове поле від кульок. Поле являє собою квадрат, що складається з клітин. На початку гри на нього виставляється три кульки різних кольорів. Як правило, використовується сім (класично) різних кольорів. За хід гравець може пересунути одну кульку, виділивши його і вказавши його нове місце розташування. При цьому для здійснення ходу необхідно, щоб між початковою і кінцевою клітинами існував шлях з вільних клітин. При вибудовуванні лінії з чотирьох і більше кульок одного кольору (по горизонталі, вертикалі або діагоналі) вона зникає. Після кожного ходу виставляються нові три кульки, але при зникненні лінії цього не відбувається.

Комп'ютерні ігри - це окрема галузь людської діяльності, не менш значуща, ніж живопис, кіно або музика. Більше того, комп'ютерні ігри включають в себе і живопис, і музику, і багато іншого. Історія розвитку комп'ютерних ігор почалася порівняно недавно, але ігри вже досягли певних технологічних висот. Важко сказати яка комп'ютерна гра була першою.

Швидше за все, це була якась логічна або настільна гра, просто перенесена на комп'ютер. Можливо, це була розрахункова гра, начебто посадки ракети на Місяць, але зараз це вже не має особливого значення.

2. СПЕЦІАЛЬНА ЧАСТИНА

2.1 Розробка і опис структурної і функціональної схем програмного рішення

Згідно поставлених вимог розробив функціональну схему розв'язання задачі.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Рисунок 2 - Функціональна схема

1. Це блок, який відповідає за обробку даних в програмі.

2. Блок відповідає за вивід результатів на екран. Цей блок виводить головне вікно на екран.

3. Блок відповідає за те,щоб при натисканні на кнопки,які знаходяться у вікні додатку,сигнал надходив до блоку обробки даних.

2.2 Вибір і обґрунтування окремих вузлів

Виконання програми можна поділити на два рівні:

1. На першому рівні проводиться обробка даних в програмі та вивід результатів на екран (головне вікно).

2. Проводиться перевірка на наявність ходу та розташування кульок

2.3 Проектування алгоритму розв'язання задачі

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Рисунок 3 - Алгоритм роботи додатку

3. РОЗРОБКА ПРОГРАМНОГО КОДУ

3.1 Опис створеної програми

Для демонстрації готової програми, необхідно запустити Lines.exe. У результаті з`явиться вікно, зображене на малюнку.

Рисунок 4 - Загальний вигляд додатку

На цьому малюнку зображено загальний вигляд гри.

У головному меню гри, міститься два пункти: «Game (грати)» та «Help (допомога)»

Рисунок 5 - Головне меню додатку

В пункті «Game», знаходяться наступні підпункти:

1. «New game»(нова гра)

2. Вибір тяжкості гри

3. «Custom game»(пристосування гри)

4. Таблиця результатів

5. «Exit»(вихід)

Рисунок 6 - Функції додатку

Знизу головного меню, знаходиться цифрове табло на якому відображається кількість очок набраних користувачем, та час, з початку гри.

Рисунок 7 - Цифрове табло

Після запуску ігрового процесу на ігровому полі в довільних місцях з'являються шість кульок випадкового кольору. Три з них за розміром збігаються з клітинами ігрового поля. Вони позначають виставлені на ігрове поле кульки. Три інших мають менший розмір і показують місця, в які будуть виставлені кульки відповідного кольору після ходу гравця.

ВИСНОВОК

В ході роботи над курсовим проектом, була розроблена в середовищі С++ гра «Lines». Додаток має графічний інтерфейс та достатньо низькі системні вимоги. У разі перспектив розвитку проекту, можливе додавання музичного супроводу, таблиці рекордів, таймера, налаштування рівня складності, анімації при переміщені та видалені кульок.

Для нормального функціонування програми технічна система повинна задовольняти наступним вимогам: процесор Celeron 266 МГц, оперативна пам`ять 64 Мб, вільне місце на жорсткому диску не менше 1 Мб.

Програма є вільно розповсюдженою, на відміну від деяких аналогів. Програма не має зайвих функцій, має інтуїтивно зрозумілий інтерфейс. Для роботи не потребує зайвих пристроїв та програм, лише середовище, під яке скомпільовано код.

ЛІТЕРАТУРА

1. Шалыто А.А. SWITCH-технология. Алгоритмизация и программирование задач логического управления. СПб.: Наука, 1998.

2. Системне програмування

3. Microsoft Visual Studio

4. NET Framework

програма комп'ютерний гра lines

ДОДАТОК А

lines.cpp:

#include "windows.h"

#include "resource.h"

#include "random.h"

#include <list>

#include <queue>

#include <stack>

#include <strstrea.h>

#define MENU_HEIGHT 45

#define TOP_HEIGHT 46 // Высота табло (где отображаются очки) в

пикселах

#define CELL_SIZE 45 //Размер стороны ячейки в пикселах (они все

квадратные)

#define N1 4 //Количество картинок для появления шарика

#define N2 12 //Количество картинок для прыжка шарика

#define N3 9 //Количество картинок для удаления шарика

#define MAX_MAP_X 20 //Максимальный размер поля по x

#define MAX_MAP_Y 12 //Максимальный размер поля по y

struct

{ int y;

int color;

int pre_color;

int num_pic;}

map[MAX_MAP_X][MAX_MAP_Y];

int ball_color;

struct info

{int score;

int time;

char name[30];}

leaders[3];

const info null_leader={100,3600,"noname"};

int y_lines;

int gametime;

int gamescore;

int gametype;

int max_x; // по x

int max_y; // по y

int app_balls;

int del_balls;

#define LOGGING //Включаем логирование

#ifdef LOGGING

FILE *log;

const char* aCell_states[6] =

{"Отсутствие шара",

"Подсказка",

"Появление шара",

"Шар стоит",

"Шар прыгает",

"Удаление шара"};

const char* aLines_states[5] =

{"Поиск игрового шара",

"Поиск куда послать игровой шар",

"Передвижение игрового шара",

"Удаление линий",

"Появление новых шаров"};

#endif

HANDLE bmp_0,bmp_prestand, bmp_stand, bmp_jump[N2],

bmp_explode[N3], bmp_appear[N1], bmp_numbers,

bmp_points;

HANDLE *bmp[6];

HDC hDC;

HDC hCompatibleDC;

HWND hWnd;

HINSTANCE hInst;

TCHAR szTitle[] = "Lines";

TCHAR szWindowClass[] = "LINES";

RECT clRect;

class cell

{public:

int posx; // Позиция ячейки на поле (слева направо от 0)

int posy; // Позиция ячейки на поле (сверху вниз от 0)

bool operator ==(const cell & b) const

{return (b.posx == posx && b.posy == posy);}

bool operator !=(const cell & b) const

{return (!(*this == b));}

int & State() const

{return map[posx][posy].y;}

int & Color() const

{return map[posx][posy].color;}

int & PreColor() const

{return map[posx][posy].pre_color;}

int & NumPic() const

{return map[posx][posy].num_pic;}

void ACell(int e) const

{int &y=State();

#ifdef LOGGING

int y_old = y;

#endif

switch(y)

{case 0:

if (e==1) {z0(); y=3;}

if (e==2 && x0()) {z4(); y=1;}

else if (e==2) {z1(); y=1;}

break;

case 1:

if (e==1) {z2(); y=3;}

if (e==3) y=2;

break;

case 2:

if (e==3 && x1()) {z6(); y=3;}

else if (e==3) {z5();}

break;

case 3:

if (e==0 && x0() ) {z4(); y=1;}

else if (e==0) {z3(); y=0;}

if (e==4) y=5;

if (e==5) y=4;

break;

case 4:

if (e==0) {z6();z3(); y=0;}

if (e==6) {z6(); y=3;}

if (e==5 && x2()) {z6();}

else if (e==5) {z5();}

break;

case 5:

if (e==4 && x3() && x0()) {z6();z4(); y=1;}

else if (e==4 && x3()) {z6();z3(); y=0;}

else if (e==4) {z5();}

break;}

#ifdef LOGGING

if (y!=y_old)

{char s[30];

time_t t;

time(&t);

strftime(s,30,"%X", gmtime(&t));

fprintf(log,"[%s] => Ячейка (%d,%d) из состояния \"%s\" перешла в

состояние

\"%s\".\n",s,posx+1,posy+1,aCell_states[y_old],aCell_states[y]);}

#endif

DrawState();}

void DrawState() const

{SelectObject(hCompatibleDC, bmp[State()][NumPic()]);

BitBlt(hDC,posx*CELL_SIZE, TOP_HEIGHT+posy*CELL_SIZE,

CELL_SIZE+1, CELL_SIZE+1,

hCompatibleDC, Color()*CELL_SIZE, 0, SRCCOPY);}

private:

bool x0() const

{return PreColor()!=-1;}

bool x1() const

{return (NumPic()==N1-1);}

bool x2() const

{return (NumPic()==N2-1);}

bool x3() const

{return (NumPic()==N3-1);}

void z0() const

{Color()=ball_color;}

void z1() const

{Color()=random(7);}

void z2() const

{PreColor()=Color();Color()=ball_color;}

void z3() const

{Color()=0;}

void z4() const

{Color()=PreColor();PreColor()=-1;}

void z5() const

{++NumPic();}

void z6() const

{NumPic()=0;}};

cell ball;

cell click_ball;

std::list<cell> appear_list;

std::list<cell> explode_list;

std::stack<cell> path;

std::list<cell>::iterator itr;

void ALines(int);

void z0();

void z1_1();

void z1_2();

void z1_3();

void z2_1();

void z2_2();

void z2_3();

void z2_4();

void z3_1();

void z3_2();

void z4_1();

void z4_2();

bool xk0();

bool xk1();

bool xk2();

bool x0();

bool x1();

bool x2();

bool x3();

bool x4();

bool x5();

bool FindEmptyCell(cell &);

void GenerateAppearList();

void CheckAppearList();

bool FindPath(const cell &, const cell &);

bool CheckLines(const cell &);

bool Valid(const cell &);

void GameOver();

void NewGame();

void DrawTime();

void DrawScore();

void DrawTop();

void CheckCustomParameters();

void GetInfo();

void WriteInfo();

ATOM MyRegisterClass(HINSTANCE);

BOOL InitInstance(HINSTANCE,int);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);

LRESULT CALLBACK Custom(HWND, UINT, WPARAM, LPARAM);

LRESULT CALLBACK BestResults(HWND, UINT, WPARAM,

LPARAM);

LRESULT CALLBACK GetName(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow)

{MSG msg;

HACCEL hAccelTable;

randomize();

hInst=hInstance;

MyRegisterClass(hInstance);

if (!InitInstance (hInstance,nCmdShow))

{return FALSE;}

hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_LINES);

while (GetMessage(&msg, NULL, 0, 0))

{if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

{TranslateMessage(&msg);

DispatchMessage(&msg);}}

return msg.wParam;}

ATOM MyRegisterClass(HINSTANCE hInstance)

{WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc = (WNDPROC)WndProc;

wcex.cbClsExtra = 0;

wcex.cbWndExtra = 0;

wcex.hInstance = hInstance;

wcex.hIcon = LoadIcon(hInst, (LPCTSTR)IDI_LINES);

wcex.hCursor = LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

wcex.lpszMenuName = (LPCSTR)IDC_LINES;

wcex.lpszClassName = szWindowClass;

wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

return RegisterClassEx(&wcex);}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{hWnd = CreateWindow(szWindowClass, szTitle,

WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBO

X,// WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance,

NULL);

if (!hWnd)

{return FALSE;}

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

return TRUE;}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message,

WPARAM wParam, LPARAM lParam)

{static PAINTSTRUCT ps;

static RECT Rect;

static HMENU hMenu;

static HKEY hKey;

static cell l;

static int temp;

static FILE *f;

switch (message)

{case WM_CREATE:

randomize();

bmp[0] = &bmp_0;

bmp[1] = &bmp_prestand;

bmp[2] = &bmp_appear[0];

bmp[3] = &bmp_stand;

bmp[4] = &bmp_jump[0];

bmp[5] = &bmp_explode[0];

bmp_0 = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_0));

bmp_prestand =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_PRESTAND));

bmp_appear[0] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_APPEAR_1));

bmp_appear[1] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_APPEAR_2));

bmp_appear[2] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_APPEAR_3));

bmp_appear[3] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_APPEAR_4));

bmp_stand = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_STAND));

bmp_jump[0] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_JUMP_3));

bmp_jump[1] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_JUMP_2));

bmp_jump[2] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_JUMP_1));

bmp_jump[3] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_JUMP_2));

bmp_jump[4] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_JUMP_3));

bmp_jump[5] = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_STAND));

bmp_jump[6] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_JUMP_4));

bmp_jump[7] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_JUMP_5));

bmp_jump[8] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_JUMP_6));

bmp_jump[9] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_JUMP_5));

bmp_jump[10] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_JUMP_4));

bmp_jump[11] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_STAND));

bmp_explode[0] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_EXPLODE_1));

bmp_explode[1] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_EXPLODE_2));

bmp_explode[2] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_EXPLODE_3));

bmp_explode[3] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_EXPLODE_4));

bmp_explode[4] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_EXPLODE_5));

bmp_explode[5] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_EXPLODE_6));

bmp_explode[6] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_EXPLODE_7));

bmp_explode[7] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_EXPLODE_8));

bmp_explode[8] =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_EXPLODE_9));

bmp_numbers =

LoadBitmap(hInst,MAKEINTRESOURCE(IDB_NUMBERS));

bmp_points = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_POINTS));

hDC = GetDC(hWnd);

hCompatibleDC = CreateCompatibleDC(hDC);

#ifdef LOGGING

log = fopen("lines.log","wt");

#endif

GetInfo();

hMenu = GetSubMenu(GetMenu(hWnd),0);

CheckMenuItem(hMenu, gametype+IDM_EASY, MF_CHECKED);

GetWindowRect(hWnd,&Rect);

MoveWindow(hWnd,Rect.left,Rect.top,CELL_SIZE*max_x+7,TOP_HEIG

HT+CELL_SIZE*max_y+MENU_

HEIGHT, TRUE);

NewGame();

SetTimer(hWnd,0,1000,NULL);

break;

case WM_LBUTTONDOWN:

click_ball.posx = LOWORD(lParam)/CELL_SIZE;

click_ball.posy = (HIWORD(lParam)-TOP_HEIGHT)/45;

ALines(0);

break;

case WM_TIMER:

switch (LOWORD(wParam))

{case 0:

gametime++;

DrawTime();

break;

case 1:

ALines(1);

break;}

break;

case WM_COMMAND:

switch (LOWORD(wParam))

{case IDM_EASY:

max_x=9;

max_y=6;

app_balls = 2;

del_balls = 4;

break;

case IDM_NORMAL:

max_x=9;

max_y=9;

app_balls = 3;

del_balls = 5;

break;

case IDM_HARD:

max_x=20;

max_y=12;

app_balls = 10;

del_balls = 4;

break;

case IDM_CUSTOM:

DialogBox(hInst, (LPCTSTR)IDD_CUSTOMBOX, hWnd,

(DLGPROC)Custom);

CheckCustomParameters();

break;}

switch (LOWORD(wParam))

{case IDM_ABOUT:

DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd,

(DLGPROC)About);

break;

case IDM_EXIT:

DestroyWindow(hWnd);

break;

case IDM_EASY:

case IDM_NORMAL:

case IDM_HARD:

case IDM_CUSTOM:

CheckMenuItem(hMenu, gametype+IDM_EASY, MF_UNCHECKED);

CheckMenuItem(hMenu,LOWORD(wParam), MF_CHECKED);

gametype=LOWORD(wParam)-IDM_EASY;

GetWindowRect(hWnd,&Rect);

MoveWindow(hWnd,Rect.left,Rect.top,CELL_SIZE*max_x+7,TOP_HEIG

HT+CELL_SIZE*max_

y+MENU_HEIGHT, TRUE);

case IDM_NEW:

NewGame();

InvalidateRect(hWnd,NULL,FALSE);

break;

case IDM_BESTRESULTS:

DialogBox(hInst, (LPCTSTR)IDD_BESTRESULTSBOX, hWnd,

(DLGPROC)BestResults);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);}

break;

case WM_PAINT:

BeginPaint(hWnd, &ps);

DrawTop();

for (l.posx=0;l.posx<max_x;l.posx++)

for(l.posy=0;l.posy<max_y;l.posy++)

l.DrawState();

EndPaint(hWnd, &ps);

break;

#ifdef LOGGING

fclose(log);

#endif

PostQuitMessage(0);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);}

return 0;}

LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM

wParam, LPARAM lParam)

{switch (message)

{case WM_INITDIALOG:

return TRUE;

case WM_COMMAND:

if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)

{EndDialog(hDlg, LOWORD(wParam));

return TRUE;}

break;}

LRESULT CALLBACK BestResults(HWND hDlg, UINT message,

WPARAM wParam, LPARAM lParam)

{static char szVal[50];

static int i, h ,m1,m2,s1,s2;

switch (message)

{case WM_INITDIALOG:

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

{h=leaders[i].time;

s2=h%60; h/=60;

s1=s2%10; s2/=10;

m2=h%60; h/=60;

m1=m2%10; m2/=10;

ostrstream(szVal,sizeof(szVal)) << leaders[i].name<< ends;;

SendDlgItemMessage(hDlg, IDC_EDIT1+i, WM_SETTEXT,

(WPARAM)0,(LPARAM)szVal);

ostrstream(szVal,sizeof(szVal))<< leaders[i].score<<"

"<<h<<':'<<m2<<m1<<':'<<s2<<s1<< ends;

SendDlgItemMessage(hDlg, IDC_EDIT4+i, WM_SETTEXT,

(WPARAM)0,(LPARAM)szVal);}

return TRUE;

case WM_COMMAND:

if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)

{EndDialog(hDlg, LOWORD(wParam));

return TRUE;}

break;}

return FALSE;}

LRESULT CALLBACK GetName(HWND hDlg, UINT message,

WPARAM wParam, LPARAM lParam)

{static char szVal[30];

switch (message)

{case WM_INITDIALOG:

return TRUE;

case WM_COMMAND:

if (LOWORD(wParam) == IDOK)

{SendDlgItemMessage(hDlg, IDC_EDIT1, WM_GETTEXT,

(WPARAM)sizeof(szVal),

(LPARAM)szVal);

ostrstream(leaders[gametype].name,sizeof(leaders[gametype].name)) <<

szVal << ends;}

if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)

{EndDialog(hDlg, LOWORD(wParam));

return TRUE;}

break;}

return FALSE;}

void ALines(int e)

{int y_old = y_lines;

switch(y_lines)

{return (click_ball.State()==0 || click_ball.State()==1);}

bool xk1()

{return (click_ball.State()==3);}

bool xk2()

{return (click_ball.State()==4);}

bool x0()

{return FindPath(ball,click_ball);}

bool x1()

{return path.empty();}

bool x2()

{return CheckLines(ball);}

bool x3()

{itr=explode_list.begin();

return (itr->State()==0);//N3}

bool x4()

{itr=appear_list.begin();

return (itr->State()==3);//N1}

bool FindPath(const cell &from, const cell &in){

struct{

cell pred;

int mark;}

v[MAX_MAP_X][MAX_MAP_Y];

cell k,l;

std::queue<cell> q;

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

for(int j=0;j<max_y;j++)

v[i][j].mark = 0;

v[from.posx][from.posy].mark=1;

q.push(from);

while (!q.empty()){

k=q.front();

for (int i=0;i<4;i++){

l=k;

switch(i){

case 0:

l.posx--;

break;

case 1:

l.posx++;

break;

case 2:

l.posy--;

break;

case 3:

l.posy++;

break;}

if (Valid(l) && !v[l.posx][l.posy].mark){

v[l.posx][l.posy].mark=1;

v[l.posx][l.posy].pred=k;

q.push(l);

if (l==in){

do{

path.push(l);

l = v[l.posx][l.posy].pred;

} while (l!=from);

return true;}

}}

q.pop();}

return false;}

void CheckAppearList(){

int tmp;

itr=appear_list.begin();

while (itr!=appear_list.end()){

if (itr->State()==3){

tmp=itr->PreColor();

itr->PreColor()=-1;

FindEmptyCell(*itr);

itr->PreColor()=tmp;

(*itr).ACell(2);}

++itr;}}

void GenerateAppearList(){

appear_list.clear();

cell l;

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

if (FindEmptyCell(l)){

appear_list.push_back(l);

l.ACell(2);}

else return;}

bool FindEmptyCell(cell &in){

cell l;

l.posx=random(max_x);

l.posy=random(max_y);

if (l.State()==0){

in=l;

return true;}

for (int i=0;i<max_x*max_y;i++){

if (l.posx!=max_x-1) l.posx++;

else if (l.posy!=max_y-1) {l.posy++;l.posx=0;}

else {l.posx=0;l.posy=0;};

if (l.State()==0){

in=l;

return true;}}

GameOver();

return false;}

bool Valid(const cell &in){

return (in.posx >= 0) && (in.posx < max_x) && (in.posy >= 0) && (in.posy

< max_y) &&

(in.State() == 0 || in.State() == 1);}

void NewGame(){

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

for(int j=0;j<max_y;j++){

map[i][j].y=0;

map[i][j].color=0;

map[i][j].pre_color=-1;

map[i][j].num_pic=0;}

y_lines =0;

gamescore = 0;

gametime = 0;

#ifdef LOGGING

char s[30];

time_t t;

time(&t);

strftime(s,30,"%X", gmtime(&t));

fprintf(log,"[%s] Новая игра\n",s);

#endif

SetTimer(hWnd,0,1000,NULL);

cell l;

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

FindEmptyCell(l);

ball_color=random(7);

l.ACell(1);}

GenerateAppearList();}

void GameOver(){

KillTimer(hWnd,0);

#ifdef LOGGING

char s[30];

time_t t;

time(&t);

strftime(s,30,"%X", gmtime(&t));

fprintf(log,"[%s] Конец игры\n",s);

#endif

if (gametype<3){

if (leaders[gametype].score<gamescore ||

(leaders[gametype].score==gamescore &&

leaders[gametype].time>gametime)){

DialogBox(hInst, (LPCTSTR)IDD_GETNAMEBOX, hWnd,

(DLGPROC)GetName);

leaders[gametype].score=gamescore;

leaders[gametype].time=gametime;}

else DialogBox(hInst, (LPCTSTR)IDD_BESTRESULTSBOX, hWnd,

(DLGPROC)BestResults);

} else MessageBox(hWnd,"Your custom game is over...",

"Condolences",MB_OK);

NewGame();

InvalidateRect(hWnd,NULL,FALSE);}

void DrawTime(){

SelectObject(hCompatibleDC, bmp_numbers);

int h=gametime;

int s2=h%60; h/=60;

int s1=s2%10; s2/=10;

int m2=h%60; h/=60;

int m1=m2%10; m2/=10;

BitBlt(hDC,max_x*CELL_SIZE-

29,5,20,37,hCompatibleDC,s1*19,0,SRCCOPY);

BitBlt(hDC,max_x*CELL_SIZE-

50,5,20,37,hCompatibleDC,s2*19,0,SRCCOPY);

BitBlt(hDC,max_x*CELL_SIZE-

77,5,20,37,hCompatibleDC,m1*19,0,SRCCOPY);

BitBlt(hDC,max_x*CELL_SIZE-

98,5,20,37,hCompatibleDC,m2*19,0,SRCCOPY);

BitBlt(hDC,max_x*CELL_SIZE-

125,5,20,37,hCompatibleDC,h*19,0,SRCCOPY);

SelectObject(hCompatibleDC, bmp_points);

BitBlt(hDC,max_x*CELL_SIZE-56,

5,5,37,hCompatibleDC,0,0,SRCCOPY);

BitBlt(hDC,max_x*CELL_SIZE-104,

5,5,37,hCompatibleDC,0,0,SRCCOPY);}

void DrawScore(){

SelectObject(hCompatibleDC, bmp_numbers);

int t=gamescore;

for (int i=0; i<5; i++){

BitBlt(hDC,100-21*i,5, 20, 37, hCompatibleDC, (t%10)*19, 0, SRCCOPY);

t /=10;}}

void DrawTop(){

PatBlt(hDC,0, 0, 46*max_x, 46, BLACKNESS);

DrawScore();

DrawTime();}

void CheckCustomParameters(){

if (max_x<6) max_x=6;

if (max_x>20) max_x=20;

if (max_y<2) max_y=2;

if (max_y>12) max_y=12;

if (del_balls<2) del_balls=2;

if (del_balls>(max_x>max_y?max_x:max_y)) del_balls =

(max_x>max_y?max_x:max_y);

if (app_balls+del_balls > max_x*max_y){

app_balls=max_x*max_y-del_balls;}}

void GetInfo(){

FILE *in;

if (in = fopen("leaders.dat","rb")){

fread(&gametype,sizeof(int),1,in);

fread(&max_x,sizeof(int),1,in);

fread(&max_y,sizeof(int),1,in);

fread(&app_balls,sizeof(int),1,in);

fread(&del_balls,sizeof(int),1,in);

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

fread(&leaders[i],sizeof(info),1,in);

fclose(in);}

else{

gametype=0;

max_x=9;max_y=9;

app_balls=3;del_balls=5;

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

leaders[i]=null_leader;}}

void WriteInfo(){

FILE *out;

if (out = fopen("leaders.dat","wb")){

fwrite(&gametype,sizeof(int),1,out);

fwrite(&max_x,sizeof(int),1,out);

fwrite(&max_y,sizeof(int),1,out);

fwrite(&app_balls,sizeof(int),1,out);

fwrite(&del_balls,sizeof(int),1,out);

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

fwrite(&leaders[i],sizeof(info),1,out);

fclose(out);}}

Размещено на Allbest.ru


Подобные документы

  • Розробка таблиці для збереження даних у текстовому файлі про фільми в середовищі програмування Visual Studio C++ та їх сортування за країною виробництва. Реалізація таблиці за допомогою компонента dataGridView. Опис і контрольний приклад роботи програми.

    курсовая работа [1,4 M], добавлен 02.11.2016

  • Створення баз даних для автоматизування роботи торгового представника в середовищі програмування Delрhі. Опис вхідної та результуючої інформації, формалізований опис задачі. Розробка технічного та робочого проекту, опис та обґрунтування вибору структури.

    курсовая работа [135,8 K], добавлен 11.10.2010

  • Розробка програми в візуальному середовищі С++. Визначення значення функцій в середовищі Builder мовою програмування С++. Обчислення елементів квадратної матриці згідно заданного алгоритму. Бібліотека візуальних компонентів і середовище програмування.

    курсовая работа [451,5 K], добавлен 15.01.2012

  • Широкі можливості по використанню комп'ютерних навчальних систем. Розробка навчальної системи мультимедійного посібника з дисципліни "Інформатика і ОТ" на тему "Особливості мови програмування С++. Вказівники". Вимоги до розробки навчальної програми.

    курсовая работа [2,9 M], добавлен 23.11.2010

  • Поняття та класифікація комп’ютерних ігор. Відтворення гри "Морський бій" у вигляді комп’ютерної програми. Компоненти програмного середовища Delphi, що були використані під час її створення. Алгоритм реалізації ігрового процесу та скріншоти з програми.

    дипломная работа [418,2 K], добавлен 12.07.2013

  • Створення програми для роботи з веб-камерою з автоматичним визначенням встановленої камери на комп'ютері. Характеристика апаратної конфігурації програми. Опис мови і середовища програмування. Розробка алгоритму, інструкції для програміста та користувача.

    курсовая работа [1,2 M], добавлен 26.07.2013

  • Розробка програми для вирішення графічної задачі. При вирішенні задачі необхідно cтворювати програму у середовищі програмування Turbo Pascal. Розробка алгоритму функціонування програми і надання блок-схеми алгоритму. Демонстрація роботи програми.

    курсовая работа [1,3 M], добавлен 23.06.2010

  • Проектування програми керування мікропроцесорним пристроєм світлової індикації на мові С та Assembler. Розробка алгоритму роботи програми, структурної та електричної принципових схем. Здійснення комп’ютерного моделювання для перевірки розроблених програм.

    курсовая работа [710,7 K], добавлен 04.12.2014

  • Історія розвитку Delphi (Object Pascal). Інтегроване середовище розробки Delphi. Ознайомлення з історією створення і використання логічної гри "Пазли". Реалізування ігрової комп’ютерної програми "Конструктор пазлів" в середовищі програмування Delphi 7.

    курсовая работа [2,2 M], добавлен 10.11.2015

  • Класифікація існуючих інформаційних систем. Особливості створення інформаційної системи роботи меблевого магазину. Розробка програми, що забезпечує роботу торгівельної организації, в середовищі Microsoft Visual Studio 2008 на мові програмування Vb.NEt.

    курсовая работа [829,5 K], добавлен 12.12.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.