Разработка программы на языке С++ с использованием функций WinAPI: < Игра Сима >



министерство образования и  науки украины

 

ХАРЬКОВСКИЙ НАЦИОНАЛЬНЫЙ УНИВЕРСИТЕТ 

РАДИОЭЛЕКТРОНИКИ

 

 

Факультет КИУ

Кафедра ЭВМ

 

Курсовая   работа

по курсу  системное  программирование

 

 

 

Пояснительная записка

 

 

Тема: “Разработка программы на языке С++ с использованием функций WinAPI:

< Игра Сима >”.

 

 

 

 

 

Руководитель    ……………………………………………………..                                            

                                  (подпись, дата, должность, фамилия и инициалы)

 

 

Студент  …………………………………………………………….

(подпись, дата, группа, фамилия и инициалы)

 

 

Харьков 2010

РЕФЕРАТ

 

Пояснительная записка к курсовой работе: 28 с., 7 рис., 4 раздела, 1 приложение, 3 источника.

Основной целью  курсового проектирования по курсу "Системное программирование" является систематизация, углубление и активное применение знаний по системному программированию, закрепление знаний, полученных в лекционном курсе, а также на практических и лабораторных занятиях.

Метод исследования – изучение литературы, написания и отладки программ на компьютере. Объектом исследования является системное программирование в операционных системах.

В процессе курсового  проектирования мной были изучены основные  способы взаимодействия приложений с операционной системой, представления объектов и операции над ними.

Программа была реализована на языке С++ в среде Microsoft Visual Studio 2008.

Перечень ключевых слов: игра Сима, системное программирование, операционная система, игровое поле, алгоритм, пользователь.

СОДЕРЖАНИЕ

 

Введение ……………………………………………………....………

5

Основная часть…..………………........................................................

6

 1 Анализ предметной области и постановка задач …………………

6

2 Разработка структуры программы  и алгоритмов …………………

10

3 Разработка программы ………………………………….………….

14

4 Тестирование программы и инструкция пользователя …………..

23

      4.1 Тестирование программы……………………………………..

23

      4.2 Инструкция пользователя ………..…………………………..

23

Выводы……………………………………………………..……….…

27

Перечень ссылок………………………………………………………

28

Приложение …………………………………………………………...

39


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ВВЕДЕНИЕ

 

Сима - это логическая игра между двумя противниками на произвольном поле, которое бы допускало визуальное расположение некоторого числа точек (размер поля не имеет практически никакого значения). Один из игроков играет синим цветом, другой игрок – красным.

Перед началом игры, двое игроков  договариваются о количестве точек, которое будет расположено на поле. При количестве точек на поле, меньшее 6ти игра оказывается не столь  увлекательной, т.к. количество комбинаций игроков представляется не слишком обильным и игра вскоре завершается чьей-то победой.

Если же количество точек превышает 6, то игра становится более увлекательной, т.к. количество комбинаций, которое  может сделать игрок, прилично увеличится. Также большое значение имеет месторасположение точек, чем более хаотично расположены точки, тем более запутанной и продолжительней будет игра.

Целью данной курсовой работы  является реализовать данную игру («Сима», при победной комбинации сбора треугольника противником его же цветом) с помощью использования процедур и функций операционной системы. А также цель данного проекта систематизация, углубление и активное применение знаний по системному программированию, закрепление полученных знаний.

Данная курсовая работа является актуальной, т.к. в ней реализуется основные возможности операционной системы Windows, которая считается самой распространенной операционной системой на ПК.

 

 

 

 

 

 

 

 

1 АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ  И ПОСТАНОВКА ЗАДАЧИ

 

Трудно назвать другую сферу человеческой деятельности, которая развивалась бы столь стремительно и порождала бы такое разнообразие проблем, как информатизация и компьютеризация общества. История развития информационных технологий характеризуется быстрым изменением концептуальных представлений, технических средств, методов и сфер их применения. В современных реалиях весьма актуальным для большинства людей стало умение пользоваться промышленными информационными технологиями.

На сегодняшний момент операционная система Windows фирмы Microsoft во всех ее проявлениях, бесспорно, считается самой распространенной операционной системой на ПК. Однако, несмотря на то, что это ОС для ПК, она содержит в себе большинство особенностей, характерных для современных программных систем, например, многозадачность, сетевую поддержку.

Операционная система (ОС) – это комплекс взаимосвязанных системных программ, функциями которого является контроль использования и распределения ресурсов вычислительной системы и организация взаимодействия пользователя с компьютером.

Основные характеристики ОС Windows:

1. Графический интерфейс. В отличие  от предыдущей ОС (MS DOS), Windows является полностью графической оболочкой. Все элементы, которые пользователь видит на экране (окна, кнопки, полосы скроллинга), поддерживаются на уровне ОС. В ее состав входит множество библиотек, которые содержат функции по управлению этими элементами, что позволяет прикладному программисту не отвлекаться на создание интерфейса программы и стандартизует внешний вид приложений.

2. Многозадачность. Windows поддерживает многозадачность (параллельное исполнение программ) на уровнях процессов (программ) и потоков (внутри программный параллелизм), обеспечение которых происходит с участием аппаратного уровня. ОС содержит большое количество функций, обеспечивающих управление параллельно исполняемыми программами, синхронизацию, разделение адресного пространства памяти между приложениями и т.п.

3. Аппаратно-независимое программирование. Использование в прикладной программе  функций операционной системы обеспечивает возможность для программиста не заботиться о совместимости программы с аппаратурой (видео- и аудио- карты, принтер, винчестер). ОС сама (с помощью драйверов, устанавливаемых внутри) выполняет согласование ввода-вывода. Таким образом, программа, созданная на одной конфигурации, будет работать на другой.

4. События и механизм сообщений.  Очень важной особенностью современного  программирования является то, что  в большинстве случаев программа  начинает работать только при  совершении какого либо события в системе (запуск программы, необходимость перерисовки окна приложения, сигнал от таймера и т.п.). В остальное время, программа либо вообще не выполняется, либо выполняет небольшой код в фоновом режиме.

5. Оконная среда. В девяноста  процентах случаев каждой программе соответствует одно или несколько окон, которые имеют стандартный вид и содержат обязательные элементы (например, иконку, строку заголовка, схожее меню, кнопки закрытия, минимизации и максимизации). Стандартизация окон помогает при освоении новых приложений.

Системное программирование есть одно из наиболее приоритетных областей современного программирования. В системное программирование основное внимание уделяется изучению современных операционных систем, способов проектирования приложений, объектно-ориентированному программированию.

Понятие "Системное программирование" существует со времен появления компьютерной техники. И с самого его появления  считалось, что "Системщик" – это  программист, который работает на самом  "нижнем" уровне программного обеспечения и пишет программы на машинном языке (команды процессора или язык Ассемблер). Это содержание сохранилось и сегодня. Однако оно расширилось и включило в себя новые области.

Граница между системным программированием  и прикладным программированием зависит от обстоятельств. Например, с точки зрения программиста, который занимается ядром операционной системы, человек, создающий компилятор, является пользователем системы (т.е. прикладным программистом). Этот же человек будет, вероятно, рассматриваться как системный программист тем лицом, которое занимается написанием подпрограмм отыскания минимума функции. Вместе с тем, человек, который будет использовать программу минимизации, может считать всех трех вышеупомянутых программистов системными программистами.

Системное программирование – это создание системного программного обеспечения, то есть написание таких программ, которые в совокупности составляют некоторую программную систему либо набор элементов для построения программных систем.

В настоящий момент трудно представить персональный компьютер без операционной системы и прикладную программу, не использующую функции операционной системы, а содержащую только команды процессора. Таким образом, если говорить о системном программировании для персонального компьютера, необходимо рассматривать его как неразрывное сочетание ОС и аппаратуры.

Следует также сказать несколько  слов о языке, который выбран в  качестве базового в системном программировании. По большому счету, все, что связано с системным программированием, можно исполнить на любом языке программирования (Delphi, C++, Assembler). Однако, наиболее популярный среди программистов есть язык низкого уровня С++. Его популярность связана со следующими причинами:

Во-первых, язык С общепризнанно  считается языком системного программирования и является наиболее близким к аппаратуре из языков высокого уровня. Во-вторых, большинство документации по системному программированию (включая наиболее полную документацию - MSDN) написано с его использованием. И, наконец, среда Microsoft Visual C++ (которая лежит в основе практической части курса) и ОС Windows разработаны одной фирмой (Microsoft) и имеют очень хорошую интеграцию.

В данной курсовой работе необходимо написать программу, которая реализует основные возможности игры «Сима» на безграничном поле. Программа должна использовать базовый набор функций Windows API (Application Programming Interfaces). В игру могут играть два человека, которые по очереди проводят линии от одной точки к другой. Необходимо реализовать алгоритм расчета победы одного из игроков, также алгоритм возможности соединения некоторых точек. Выполнить интерфейс взаимодействия с пользователем, при помощи которого пользователь имеет возможность выбора количества точек на игровом поле. Программа должна проверять введенные пользователем данные (проверять некоторую карту точек, на наличие того, что треугольник реализован соответствующим цветом), и в случае победы одного из игроков  выводить соответствующие сообщение.

 

2 РАЗРАБОТКА СТРУКТУРЫ ПРОГРАММЫ  И АЛГОРИТМОВ

 

В данном разделе проводится разработка алгоритма работы программы.

Алгоритм работы программы тривиальный  и состоит в следующем:

После запуска  программы, для начала игры, пользователь должен нажать пункт меню «File -> Start». После этого пользователь должен ввести количество точек на игровом поле, после чего пункт меню «Start» становится неактивным, одновременно с этим инициализируется так называемая «карта точек», которая представляет собой двухмерный квадратный массив, вертикаль и горизонталь которых соответствует точкам на пересечение которых стоит цифра, определяющая отношение этих точек друг к другу (0 – линия не проведена; 1 – линия проведена 1м игроком (красная); 2 – линия проведена вторым игроком (синяя)).

Пользователь кликает по точкам игрового поля левой кнопкой мыши. При этом программа снимает координаты, где была нажата левая кнопка мыши (х,у) и с помощью снятых координат цикл ищет равенство этих координат с равенством координат массива точек. Так узнается номер точки на «карте точек», которая была нажата, чтобы в следующий момент проверить возможность перехода в другую точку.

Затем игрок кликает на следующую  точку поля, при этом сразу же выполняется проверка по «карте точек», не была ли ранее проведена линия  из данной точки в последующую и наоборот. В случае истины алгоритм игнорирует данный ход игрока и не рисует линию и не изменяет «карту точек», игроку придется повторить ход. В случае же лжи, в силу входит следующая проверка.

Следующий алгоритм состоит в том, чтобы проверить присутствие какой-либо мешающей линии на соединение двух точек. Для этого я использовал основы аналитической геометрии, суть которой состоит в определении координат точки пересечения линии, что проводится и всех существующих уже линий. Для этого нужны координаты начала и конца отрезка.

 

Уравнение прямой, проходящей через  две точки: A(x1, y1) и B(x2, y2), записывается так:

Исходя из этого можем составить  систему уравнений данной прямой и поочередно прямых, которые существуют на данном поле:

 Решением данной системы уравнения и будет пересечение этих прямых. Проверяя попадания точки пересечения в пределы крайних точек прямых можем определить, будут ли они пересекаться.

В случае проверки всех прямых с данной прямой на наличие точки пересечения  будет возвращена ложь, то предполагаем, что прямые не пересекаются и тогда уже проводится непосредственно линия через 2 точки соответствующего текущему игроку цвета. В случае же истины игроку будет отказано в проведении линии и ему предстоит повторить попытку.

Затем необходимо проверить, нет ли выигрышной комбинации. Данное действие определяется с помощью «карты точек». Суть состоит в проверке каждой строки «карты точек» на наличие одинаковых значений, а также проверки на одинаковость соответствующих одинаковых значений индексов столбцов.

В случае если такая комбинация существует у игрока, то считается, что он проиграл. В противном случае игра продолжается.

После того, как игра сыграна, игрокам  предоставляется возможность повторить  состязание, начав все заново с  установки количества точек на поле или выйти из игры.

 

Структурная схема алгоритма  программы:

 

 

 

 

 

 

 

 

 

3 РАЗРАБОТКА ПРОГРАММЫ

 

Данная программа состоит из двух модулей: основной (Sima_08.cpp) и модуль функций (funcs.cpp). Основные фрагменты кода этих модулей представлены ниже.

 

/*funcs.cpp*/

 

#include "stdafx.h"

#include "funcs.h"

 

struct Pointers

{

public:

bool marked;

POINT point;

};

 

struct Manager

{

int pointCount;

HWND pHWnd;

int **map;

Pointers *points;

};

 

struct Line

{

int x1;

int x2;

int y1;

int y2;

};

 

 

void crossLine(Manager& tm, Line& line1, Line& line2, bool& isFail, int* mas1, int* mas2, LPARAM lParam)

{

////////////////////

//mas[0] = A;

//mas[1] = B;

//mas[2] = C;

 

int x,y,z;

isFail = false;

line1.x2 = LOWORD(lParam);

line1.y2 = HIWORD(lParam);

 

mas1[0] = line1.y2 - line1.y1;

mas1[1] = line1.x1 - line1.x2;

mas1[2] = (line1.x2 - line1.x1)*line1.y1 - (line1.y2 - line1.y1)*line1.x1;

 

for(int i=0; i<tm.pointCount; i++)

for(int j=0; j<tm.pointCount; j++)

{

if(tm.map[i][j])

{

line2.x1 = tm.points[i].point.x;

line2.y1 = tm.points[i].point.y;

line2.x2 = tm.points[j].point.x;

line2.y2 = tm.points[j].point.y;

 

mas2[0] = line2.y2 - line2.y1;

mas2[1] = -1*(line2.x2 - line2.x1);

mas2[2] = (line2.x2 - line2.x1)*line2.y1 - (line2.y2 - line2.y1)*line2.x1;

 

x = (mas2[2]*mas1[1] - mas1[2]*mas2[1])/(mas1[0]*mas2[1] - mas2[0]*mas1[1]);

y = (mas2[2]*mas1[0] - mas1[2]*mas2[0])/(mas1[1]*mas2[0] - mas2[1]*mas1[0]);

 

if (line1.x2 < line1.x1)

{

z = line1.x1;

line1.x1 = line1.x2;

line1.x2 = z;

}

 

if (line2.x2 < line2.x1)

{

z = line2.x1;

line2.x1 = line2.x2;

line2.x2 = z;

}

 

 

if((x > line1.x1) && (x < line1.x2) &&

(x > line2.x1) && (x < line2.x2))

{

isFail = true;

return;

}

else

{

continue;

}

}

}

}

 

void RandomInit(Pointers* mas, Manager* tm)

{

srand(time(NULL));

for(int i = 0; i < tm->pointCount; i++){

mas[i].point.x = 25 + rand() % 425;

mas[i].point.y = 25 + rand() % 425;

 

}

 

}

 

void MapInit(Manager &tm)

{

int count = tm.pointCount;

tm.map = new int*[count];

 

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

tm.map[i] = new int[count];

 

 

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

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

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

}

/*Sima_08.cpp */

 

#include "stdafx.h"

#include "Sima_08.h"

#include "funcs.h"

 

#define MAX_LOADSTRING 100

#define BLUE false

#define RED true

#define FIRST 1000

#define SECOND 2000

 

struct Pointers

{

public:

bool marked;

POINT point;

};

 

struct Manager

{

int pointCount;

HWND pHWnd;

int **map;

Pointers *points;

};

 

struct Line

{

int x1;

int x2;

int y1;

int y2;

};

 

static int trans;

 

 

// Global Variables:

HINSTANCE hInst;        // current instance

TCHAR szTitle[MAX_LOADSTRING];     // The title bar text

TCHAR szWindowClass[MAX_LOADSTRING];   // the main window class name

INT_PTR CALLBACK InputParam(HWND, UINT, WPARAM, LPARAM);

INT_PTR CALLBACK AgainDialog(HWND, UINT, WPARAM, LPARAM);

void    crossLine(Manager& tm, Line& line1, Line& line2, bool& isFail, int* mas1, int* mas2, LPARAM);

void    RandomInit(Pointers *, Manager*);

void    MapInit(Manager&);

 

// Forward declarations of functions included in this code module:

ATOM    MyRegisterClass(HINSTANCE hInstance);

BOOL    InitInstance(HINSTANCE, int);

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

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

 

int APIENTRY _tWinMain(HINSTANCE hInstance,

                     HINSTANCE hPrevInstance,

                     LPTSTR    lpCmdLine,

                     int       nCmdShow)

{

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

 

  // TODO: Place code here.

MSG msg;

HACCEL hAccelTable;

 

// Initialize global strings

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

LoadString(hInstance, IDC_SIMA_08, szWindowClass, MAX_LOADSTRING);

MyRegisterClass(hInstance);

 

// Perform application initialization:

if (!InitInstance (hInstance, nCmdShow))

{

return FALSE;

}

 

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SIMA_08));

 

// Main message loop:

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

{

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

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

 

return (int) msg.wParam;

}

 

ATOM MyRegisterClass(HINSTANCE hInstance)

{

WNDCLASSEX wcex;

 

wcex.cbSize = sizeof(WNDCLASSEX);

 

wcex.style   = CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc = WndProc;

wcex.cbClsExtra  = 0;

wcex.cbWndExtra  = 0;

wcex.hInstance  = hInstance;

wcex.hIcon   = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SIMA_08));

wcex.hCursor  = LoadCursor(NULL, IDC_ARROW);

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

wcex.lpszMenuName = MAKEINTRESOURCE(IDC_SIMA_08);

wcex.lpszClassName = szWindowClass;

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

 

return RegisterClassEx(&wcex);

}

 

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

   HWND hWnd;

 

   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU, 100, 100, 500, 500, 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)

{

int wmId, wmEvent;

PAINTSTRUCT ps;

HDC hdc, temphdc;

static Manager tm;

static char text[20];

static bool temp = false;

static HBRUSH redBrush, blueBrush;

static HPEN redPen, bluePen, hLinePen, hOldPen, hElPen;

static POINT startPoint, endPoint;

static int index, rad = 5, changePlayer;;

static int mas1[3], mas2[3];

static int x1, x2, y1, y2;

static Line line1, line2;

static bool isFail;

 

 

switch (message)

{

case WM_COMMAND:

wmId    = LOWORD(wParam);

wmEvent = HIWORD(wParam);

// Parse the menu selections:

switch (wmId)

{

case IDM_ABOUT:

DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

break;

 

case ID_FILE_START:

xxx:

////////////////////////////////// params inputing

DialogBox(hInst, MAKEINTRESOURCE(IDD_INPUTPARAM), hWnd, InputParam);

tm.pointCount = ::trans;

 

////////////////////////////////// points initializating

tm.points = new Pointers[tm.pointCount];

RandomInit(tm.points, &tm);

InvalidateRect(hWnd, NULL, true);

 

////////////////////////////////// map creating

MapInit(tm);

changePlayer = FIRST;

EnableMenuItem(GetMenu(hWnd), ID_FILE_START, true);

break;

 

case IDM_EXIT:

DestroyWindow(hWnd);

break;

 

default:

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

}

break;

 

 

case WM_CREATE:

tm.pHWnd = hWnd;

redPen = (HPEN)CreatePen(PS_SOLID, 3, RGB(255,0,0));

bluePen = (HPEN)CreatePen(PS_SOLID, 3, RGB(0,0,255));

hElPen = (HPEN)CreatePen(PS_SOLID, 4, RGB(0,255,0));

 

break;

 

 

case WM_LBUTTONDOWN:

 

for(int i=0; i<::trans; i++)

{

if((abs(tm.points[i].point.x - LOWORD(lParam)) <= rad) &&

(abs(tm.points[i].point.y - HIWORD(lParam))) <= rad &&

!temp)

{

temp = !temp;

index = i;

line1.x1 = LOWORD(lParam);

line1.y1 = HIWORD(lParam);

 

// selection (green Ellipse)

temphdc = GetDC(hWnd);

SelectObject(temphdc, hElPen);

Ellipse(temphdc, LOWORD(lParam)-rad, HIWORD(lParam)-rad, LOWORD(lParam)+rad, HIWORD(lParam)+rad);

ReleaseDC(hWnd, temphdc);

 

}

 

else if((abs(tm.points[index].point.x - rad) <= LOWORD(lParam)) &&

(abs(tm.points[index].point.x + rad) >= LOWORD(lParam)) &&

(abs(tm.points[index].point.y - rad)) <= HIWORD(lParam) &&

(abs(tm.points[index].point.y + rad)) >= HIWORD(lParam) &&

temp)

{

temp = !temp;

//MessageBox(NULL, NULL, NULL, NULL);

InvalidateRect(hWnd, NULL, true);   

break;

}

 

else if((abs(tm.points[i].point.x - LOWORD(lParam)) <= rad) &&

(abs(tm.points[i].point.y - HIWORD(lParam))) <= rad &&

temp)

{

 

crossLine(tm, line1, line2, isFail, mas1, mas2, lParam);

 

if(!isFail && tm.map[index][i] != 0)

isFail = true;

 

 

if(!isFail){

temp = !temp;

 

////////////////// map recording

if(changePlayer == FIRST){

tm.map[index][i] = FIRST;

tm.map[i][index] = FIRST;

}

else if(changePlayer == SECOND)

{

tm.map[index][i] = SECOND;

tm.map[i][index] = SECOND;

}

 

for(int i=0; i<::trans; i++)

if(tm.map[index][i] == changePlayer)

for(int j=i; j<::trans; j++)

if((tm.map[index][i] == tm.map[index][j]) && tm.map[i][j] == changePlayer){

changePlayer == FIRST ? (wsprintf(text, "Blue Player is winner!")) :

wsprintf(text, "Red Player is winner!");

MessageBox(hWnd, text, "Winner!", MB_OK);

DialogBox(hInst, MAKEINTRESOURCE(IDD_AGAIN), hWnd, AgainDialog);

if(!trans)

DestroyWindow(hWnd);

if(trans)

goto xxx;

}

 

/////////////////// changePlayer

if(changePlayer == FIRST)

changePlayer = SECOND;

else

changePlayer = FIRST;

 

InvalidateRect(hWnd, NULL, true);

}

}

}  

break;

 

case WM_MOUSEMOVE:

break;

 

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

if(changePlayer == FIRST)

hOldPen = (HPEN)SelectObject(hdc, redPen);

else if(changePlayer == SECOND)

hOldPen = (HPEN)SelectObject(hdc, bluePen);   

 

if(temp)

{

MoveToEx(hdc, startPoint.x, startPoint.y, NULL);

LineTo(hdc, endPoint.x, endPoint.y);

}

 

SelectObject(hdc, hOldPen);

 

///////////////////////////////// PointDraw

for(int i = 0; i < tm.pointCount; i++)

{

Ellipse(hdc, tm.points[i].point.x - rad, tm.points[i].point.y - rad,

tm.points[i].point.x + rad, tm.points[i].point.y + rad);

SetPixel(hdc, tm.points[i].point.x, tm.points[i].point.y, NULL);

}

 

///////////////////////////////// LineDraw

for(int i=0; i<::trans; i++)

for(int j=0; j<::trans; j++)

{

if(tm.map[i][j]){

 

if(tm.map[i][j] == FIRST)

{

hLinePen = (HPEN)CreatePen(PS_SOLID, 3, RGB(255,0,0));

}

else

{

if(tm.map[i][j] == SECOND)

hLinePen = (HPEN)CreatePen(PS_SOLID, 3, RGB(0,0,255));

}

 

SelectObject(hdc, (HPEN)hLinePen);

MoveToEx(hdc, tm.points[i].point.x, tm.points[i].point.y, NULL);

LineTo(hdc, tm.points[j].point.x, tm.points[j].point.y);

 

}

}

 

 

// TODO: Add any drawing code here...

EndPaint(hWnd, &ps);

break;

 

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

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

}

return 0;

}

 

INT_PTR CALLBACK InputParam(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{

char EditText[10] = "";

 

switch (message)

{

case WM_INITDIALOG:

return (INT_PTR)TRUE;

 

case WM_COMMAND:

if (LOWORD(wParam) == IDOK)

{

GetDlgItemText(hDlg, IDC_PARAM, EditText, sizeof(EditText));

::trans = atoi(EditText);

EndDialog(hDlg, LOWORD(wParam));

return (INT_PTR)TRUE;

}

break;

}

return (INT_PTR)FALSE;

}

 

INT_PTR CALLBACK AgainDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{

switch (message)

{

case WM_INITDIALOG:

return (INT_PTR)TRUE;

 

case WM_COMMAND:

if (LOWORD(wParam) == IDC_BYES)

{

::trans = 1;

EndDialog(hDlg, LOWORD(wParam));

return (INT_PTR)TRUE;

}

else if (LOWORD(wParam) == IDC_BNO)

{

::trans = 0;

EndDialog(hDlg, LOWORD(wParam));

return (INT_PTR)TRUE;

}

break;

}

 

return (INT_PTR)FALSE;

}

 

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{

UNREFERENCED_PARAMETER(lParam);

switch (message)

{

case WM_INITDIALOG:

return (INT_PTR)TRUE;

 

case WM_COMMAND:

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

{

EndDialog(hDlg, LOWORD(wParam));

return (INT_PTR)TRUE;

}

break;

}

return (INT_PTR)FALSE;

}

 

 

 

 

 

 

4 ТЕСТИРОВАНИЕ ПРОГРАММЫ И ИНСТРУКЦИЯ ПОЛЬЗОВАТЕЛЯ

 

4.1 Тестирование программы

Функциональное тестирование данного  программного обеспечения показало соответствие его пользовательским требованиям, так как набор изначально поставленных пользовательских задач выполняется на необходимом уровне. Модульное тестирование показало что отдельные функции, модули полностью работоспособны и не приводят к регрессии программы.

Разработанная в рамках курсовой работы программа не чувствительна к техническим характеристикам современных ПК, т.к. для её работы требуется 300 Кб свободной памяти на жестком диске и минимальный размер оперативной памяти 4 Мб. Требование к операционной системе:  Windows XP, Windows Vista, Windows 7.

 

4.2 Инструкция пользователя

После запуска приложения вы увидите  перед собой следующие окно:

Рис. 4.1 – Начальное окно

Для того чтобы начать игру, следует  в меню выбрать пункт «File -> Start» . После этого вы увидите диалоговое окно, которое попросит вас ввести количество точек в игре:

Рис. 4.2 – Ввод количества точек

 

После этого вы увидите хаотично расположенные точки внутри поля:

Рис. 4.3 – Начальное положение  точек в игре

 

После нажатия на какую-либо точку, она становится активной:

Рис. 4.4 – Активация точки

 

После этого игрок должен соединить  данную точку с какой-либо другой:

Рис. 4.5 – Соединение

 

Игрок проигрывает тогда, когда  он соберет треугольник из своих  цветов:

 

Рис. 4.6 – Победа красного игрока

После этого предлагается продолжить игру или покинуть:

Рис. 4.7 – Снова?

 

ВЫВОД

 

В процессе выполнения курсовой работы была разработана программа, реализующая игру Сима с безграничным числом точек. Программа была написана при помощи интегрированной среды разработки Visual C++. Программа соответствует всем функциональным требованиям, заданным на курсовое проектирование.

Тестирование программы показало соответствие её пользовательским требованиям, т.к. набор изначально поставленных пользовательских задач выполняется на необходимом уровне. Модульное тестирование показало что отдельные функции, модули полностью работоспособны и не приводят к регрессии программы.

Проект не содержит недоработок  и полностью отвечает требованиям, заданным на курсовое проектирование. Но, несмотря на это, всегда есть место для усовершенствования. В дальнейшем можно будет разработать алгоритм игры против ИИ,  создать звуковое сопровождение во время игры.

Исходя из выше сказанного, можно  сделать вывод, что задание на курсовое проектирование было полностью выполнено.

 

СПИСОК ИСПОЛЬЗОВАНЫХ  ИСТОЧНИКОВ

 

1. Келецкий Я. Энциклопедия языка  Си/ Пер. с англ. - М.: Мир, 1992. - 687с.

2. Керниган Б., Ричи Д., Фьюер А. Язык программирования Си. Задачи по языку С / Пер. с англ. - М.: Финансы и статистика, 1985. - 279с.

3. Петзольд Ч. Программирование  под Windows 95. В двух книгах: BHV - Санкт - Петербург, 1997, silt.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ПРИЛОЖЕНИЕ


Разработка программы на языке С++ с использованием функций WinAPI: < Игра Сима >