close

Вход

Забыли?

вход по аккаунту

?

Отчет (6)

код для вставкиСкачать
Министерство образования и науки Российской Федерации
Южно-Уральский государственный университет
Кафедра "Прикладная математика"
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовой работе по дисциплине "Компьютерная графика"
Тема: "Шашки"
Выполнил: Костин К. К.
Направление:230100.62
Группа: ММ - 444
Проверила: Сартасова М.Ю.
старший преподаватель кафедры ПРИМА
_______________________
"___"___________2012 г.
Челябинск - 2012
Аннотация
Данная работа является пояснительной запиской к компьютерной программе, реализующей игру "Шашки". В пояснительной записке содержится постановка задачи, математическая модель, описание алгоритма и приложение с текстом программы.
ОГЛАВЛЕНИЕ
ВВЕДЕНИЕ4
1. ПОСТАНОВКА ЗАДАЧИ5
2. МАТЕМАТИЧЕСКАЯ МОДЕЛЬ9
3. ОПИСАНИЕ АЛГОРИТМА РЕШЕНИЯ12
3.1 ПАРАМЕТРЫ СЦЕНЫ И ОБЪЕКТОВ12
3.2 АЛГОРИТМ РАБОТЫ ПРОГРАММЫ13
3.3 ОПИСАНИЕ МОДУЛЕЙ19
3.4 ИНСТРУКЦИЯ ПО ПРИМЕНЕНИЮ ПРОГРАММЫ.21
ЗАКЛЮЧЕНИЕ22
ЛИТЕРАТУРА23
ПРИЛОЖЕНИЕ 124
Введение
Цель данной курсовой работы - создать программу, реализующую игру "Шашки" для двух игроков.
Основными задачами, решаемыми в ходе выполнения курсовой работы являются освоение приемов программирования на языке С++ с использованием средств OpenGL, разбор структуры и логики игры, приобретение навыков работы с 3D графикой.
1. Постановка задачи
Необходимо разработать компьютерную программу, реализующую игру "Шашки" на языке программирования C++ в среде разработки Builder 10.0 Turbo C++ с использованием средств OpenGL.
После запуска приложения, на экране появляется главное окно программы (рис.1). Рис. 1 Главное окно программы
В верхней части окна находится строка меню. Меню "Файл" содержит следующие пункты:
"Новая игра". При выборе этого пункта меню открывается окно "Новая игра" (рис. 2). В этом окне игроки должны вписать свои имена и выбрать, кто будет играть белыми шашками. После нажатия на кнопку "ОК", начинается новая игра (рис. 3). При нажатии на кнопку "Отмена" окно "Новая игра" закрывается.
"Выход". При выборе этого пункта меню программа закрывается. Рис. 2 Окно "Новая игра"
Рис. 3 Начало игры
Если в окне "Новая игра" одно из полей для ввода имени не будет заполнено, то при нажатии на кнопку "ОК" появится сообщение (рис. 4).
Рис. 4 Сообщение об ошибке
Меню Справка содержит следующие пункты:
"О программе". В этом пункте меню содержится информация о программе: название, версия и автор программы (рис. 5).
Рис. 5 О программе
"Правила". При выборе этого пункта меня открывается HTML-документ, в котором описаны правила игры.
В правой части экрана находится информация о текущей игре. Здесь указаны имена игроков, количество шашек и время.
В центральной части экрана расположено игровое поле. Оно представляет собой стандартную доску размером 8 х 8 клеток и по 12 черных и белых шашек. Игра предназначена для двух человек. Право первого хода предоставляется игроку, играющему белыми шашками. Для перемещения по игровому полю используется мышь. Что бы сходить шашкой, нужно навести на клетку и щелкнуть левой кнопкой мыши. Выбранное поле с шашкой будет выделено цветом. При этом возможные ходы для выбранной шашки будут также выделены цветом (рис. 6).
Рис. 6 Выбор шашки для хода
Что бы сделать ход, нужно выбрать с помощью мышки разрешенную для хода позицию и нажать левую клавишу мыши. Разрешается ходить только вперед. Рубить назад нельзя. Можно рубить несколько шашек. Когда шашка достигает противоположной стороны доски, она становится дамкой. Дамка может перемещаться и рубить в любом направлении. Победителем считается тот, кто первым срубит все шашки соперника. После чего игроки могут начать новую игру или закрыть программу. Поворот игрового поля осуществляется с помощью клавиатуры. Чтобы повернуть доску: вокруг оси X нужно нажать клавишу Up или Down; вокруг оси Y нужно нажать клавишу Right или Left в сочетании с клавишей Ctrl; вокруг оси Z нужно нажать клавишу Right или Left. 2. Математическая модель
В работе используется перспективная проекция. Охват перспективы - 45 градусов. Таким образом, пространство сцены определено усеченной пирамидой (рис.7).
рис. 7
Игровое поле состоит из 6 прямоугольников, образующих параллелепипед (рис. 8). Четыре боковые грани имеют длину w и ширину H. Верхняя и нижняя грани параллелепипеда являются квадратами со сторонами равными w. Над верхней гранью располагаются в шахматном порядке 64 квадрата черных и белых цветов. Сторона каждого квадрата равна w/8. рис. 8
Каждая фигура (рис. 9) состоит из стандартных примитивов: цилиндра с высотой h и радиусом R красного или белого цвета; диска с внешним радиусом R и внутренним r (R>r) такого же цвета; диска с внешним радиусом r, цвет которого может быть либо желтым, если шашка является дамкой, либо бледно розовым в противном случае; двух окантовочных дисков с радиусом R и одного диска с радиусом r.
рис. 9
Каждая шашка имеет собственную систему координат, начало которой совпадает с центром клетки поля, на котором она находится.
Для того что бы развернуть игровое поле на угол α вокруг одной из осей относительно центра, необходимо умножить координаты поля на соответствующую матрицу поворота.
Матрица поворота игрового поля относительно оси ОХ на угол α:
Mx(α)= (■(■(1&0&0&0@0&cos⁡(α)&sin⁡(α)&0@0&-sin⁡(α)&cos⁡(α)&0@0&0&0&1)))
Матрица поворота игрового поля относительно оси ОY на угол α:
My(α)= (■(■(cos⁡(α)&sin⁡(α)&0&0@0&1&0&0@-sin⁡(α)&cos⁡(α)&0&0@0&0&0&1)))
Матрица поворота игрового поля вокруг оси ОZ на угол α:
Mz(α)= (■(■(cos⁡(α)&sin⁡(α)&0&0@-sin⁡(α)&cos⁡(α)&0&0@0&0&1&0@0&0&0&1)))
Игровое поле можно увеличить или уменьшить в S раз (сжатие или растяжение) умножив координаты на матрицу масштабирования. Матрица масштабирования:
Scale(S) = Для описания шашек используется класс Sabre. Этот класс имеет следующие поля: color - цвет шашка; x, y - координаты центра шашки относительно доски; damka - параметр, принимающий значение true, если шашка является дамкой, и false в противном случае; visible - принимает значение false, если шашка срублена и true в противном случае. Метод DrawSabre предназначен для прорисовки шашки.
С помощью матрицы 8х8 будем хранить информацию об игровом поле. Черной клетки соответствует значение 0, белой - (-1). В начале игры матрица заполняется, начиная с левой нижней черной клетки. Количество белых и черных шашек равно 12. Когда в клетке находится белая шашка, то соответствующий элемент матрицы принимает значение White, равное 50. Если в клетке черная шашка, то соответствующий элемент принимает значение Dark, равное 60.
Перед каждым ходом проходит проверка, можно ли срубить шашку противника. В случае, когда такая возможность есть, ход без сруба не возможен.
После каждого хода определяем, была ли срублена шашка. Для этого проверяем, есть ли на пути хода шашки фигура соперника или нет. В первом случае, шашка соперника считается срубленной и параметр visible принимает значение false. Затем проходит проверка, можно ли срубить еще шашки. Если нет, то ход передается сопернику. В противном случае игрок должен срубить еще одну шашку противника той же самой фигурой и после этого снова проходит проверка на сруб.
Во втором случае (шашка соперника не встретилась на пути), ход передается сопернику.
Перед переходом хода проходит проверка на победу (у соперника не осталось шашек) и проверка на переход в дамки (шашка достигла противоположной стороны доски). 3. Описание алгоритма решения
3.1 Параметры сцены и объектов
Размеры окна данного приложения постоянны, поэтому высота и ширина сцены так же неизменны. В качестве фона используется изображения формата BMP. Размер изображения соответствует размеру окна и хранится в папке с приложением
Для прорисовки игровой доски используется матрица вершин и текстуры дерева для боковых сторон. Текстуры хранятся в папке с приложением
Для прорисовки фигур-шашек используется примитивы цилиндра и дисков, параметры которых задаются в программе.
В правой части главного окна находится панель с элементами, которые отображают дополнительную информацию об игре: имена игроков, количество шашек и текущее время.
3.2 Алгоритм работы программы
Алгоритм работы программы
Вспомогательный алгоритм обработки сообщений
Вспомогательный алгоритм. Обработка нажатия левой клавиши мыши.
Вспомогательный алгоритм. "Сделать ход".
3.3 Описание модулей Модуль "Project1.cpp"
В этом модуле заключены операторы инициализации компонентов приложения, создания главного окна приложения и дочерних окон, а так же выполнения приложения.
Модуль "Unit 1"
В этом модуле реализуется основной алгоритм работы программы. Модуль "Unit2"
В этом модуле реализуется работа диалогового окна "Новая игра".
Описание функций:
void NewGames(bool x) - функция начала новой игры. В качестве параметра передается информация о том, начинается новая игра впервые или нет. В этой функции инициализируются все необходимые начальные параметры.
bool Check(float fx, float fy) - функция, в которой проверяются ходы для простой шашки, кроме хода на сруб. В качестве параметров передаются координаты поля, в котором находится дамка.
bool CheckRubit(float fx, float fy) - функция, в которой проверяются ходы для простой шашки, в которых она рубит шашку противника. В случае если такой ход есть, то функция возвращает true. В противном случае - false.
bool DamkaXod (float fx, float fy) - функция, в которой проверяются ходы для дамки, кроме хода на сруб. В качестве параметров передаются координаты поля, в котором находится дамка.
bool DamkaRubit(float fx, float fy) - функция, в которой проверяются ходы для дамки, в которых она рубит шашку противника. В случае если такой ход есть, то функция возвращает true. В противном случае - false. bool CheckBan() - функция, которая проверяет, можно ли после сруба сделать еще одни ход, в котором будет срублена шашка соперника. Если функция возвращает значение true, то игроку необходимо сделать еще один ход той же шашкой.
void Move() - функция хода. Здесь происходит изменение положения шашек в результате хода.
GLvoid LoadGLTextures() - функция загрузки картинки и конвертирования в текстуру. void TForm1::Draw() - функция прорисовки игрового поля и фигур-шашек.
void TForm1::DrawFon() - функция прорисовки фона.
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) - обработка нажатия клавиши на клавиатуре. Параметр Key содержит код нажатой клавиши. Параметр Shift указывает, какая из клавиш (Shift, Ctrl или Alt) была нажата, когда пользователь нажал кнопку мыши. Параметр Button определяет какую кнопку мыши нажал пользователь.
void __fastcall TForm1::Timer1Timer(TObject *Sender) - функция обработки сообщения таймера. Обновляет время.
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) - обработка нажатия левой клавши мыши. Параметры X, Y - координаты курсора мыши. Параметр Sender указывает на объект, вызвавший событие.
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) - обработка движения мышки.
void __fastcall TForm1::FormMouseWheelUp(TObject *Sender, TShiftState Shift, TPoint &MousePos, bool &Handled) - обработка движения колесика мышки.
void __fastcall TForm1::NewGameClick(TObject *Sender) - обработка выбора пункта меню "Новая игра". void __fastcall TForm1::ExitClick(TObject *Sender) - обработка выбора пункта меню "Выход".
void __fastcall TForm1::N3Click(TObject *Sender) - обработка выбора пункта меню "О программе".
void __fastcall TForm1::N4Click(TObject *Sender) - обработка выбора пункта меню "Правила".
Описание классов:
class Sabre - описывает шашку.
Поля класса Sabre:
int color - параметр, определяющий цвет шашки
float x - параметр, определяющий х координату шашки
float y - параметр, определяющий y координату шашки
bool visible - параметр, определяющий видима шашка или нет (участвует в игре или срублена).
bool damka - параметр, определяющий является ли шашка дамкой.
Методы класса Sabre:
void DrawSabre() - прорисовка шашки. Sabre() - конструктор класса. ~Sabre() - деструктор класса.
3.4 Инструкция по применению программы.
После запуска приложения "Шашки-3D" открывается главное окно программы, представляющее собой игровую доску без фигур. Для начало новой игры нужно выбрать пункт меню "Файл" "Новая игра". После этого, отроется диалоговое окно, в котором игроки должны вписать свои имена и выбрать, кто из них будет играть белыми шашками. Начать новую игру можно в любой момент.
Право первого хода предоставляется игроку, играющему белыми шашками. Выбрать шашку для хода можно с помощью мыши, щелкнув левой клавишей по нужной клетке. Выбранное поле будет выделено цветом. Возможные для хода поля будут обозначены зеленым цветом. Сделать ход можно так же с помощью нажатия левой клавишей мыши по нужной позиции. Рубить можно одну или несколько шашек за ход, но только вперед. Назад рубить нельзя. Когда шашка достигает противоположной стороны доски, она становится дамкой. Центральный диск шашки окрашивается в желтый цвет.
Если у одного из игроков после хода соперника не остается ни одной шашки, то этот игрок проигрывает. Появляется сообщение о результатах игры.
В правой части экрана на специальной панели расположена информация об игре. Там указаны имена игроков, количество оставшихся шашек у каждого игрока и текущее время.
С помощью пункта меню "Файл" "Выход", игроки могут закрыть приложение. При выборе пункта меню "Справка" "О программе" появится сообщение, в котором будет представлена информация о разработчике, названии и версии игры. При выборе пункта "Правила" этого же меню откроется html-документ, в котором будут описаны правила игры.
Заключение
В результате проделанной работы был получен готовый, рабочий программный продукт. В нем были реализованы все требования, установленные в постановке задачи. В ходе выполнения курсовой работы были решены все задачи, поставленные ранее.
Стоит отметить, что в дальнейшем программа может быть улучшена. Например, можно добавить бота, который будет играть с игроком или сделать на основе программы клиент-серверное приложения для игры по локальной или глобальной сети.
ЛИТЕРАТУРА
М. ВУ, Т. Девис, Дж. Нейдер, Д. Шрайнер OpenGL: руководство по программированию. - СПб.: ПИТЕР, 2006. - 624 с.: ил. А.Я. Архангельский Программирование в C++ Builder 5. - М.: ЗАО "Издательство БИНОМ", 2000 г. с.: ил.
Г. Шилдт С++ Базовый курс. - М.: Вильямс, 2010. - 624 с.: ил.
Приложение 1
Исходный текст программы.
В файле Project1.cpp:
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
USEFORM("Unit2.cpp", Form2);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->Title = "Шашаки 3D";
Application->CreateForm(__classid(TForm1), &Form1);
Application->CreateForm(__classid(TForm2), &Form2);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------
В файле Unit1.h:
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Menus.hpp>
#include <Graphics.hpp>
#include <GL/gl.h>
#include <GL/glu.h>
#include <gl\glaux.h> // Заголовочный файл для библиотеки #include"Unit2.h"
#define White 50
#define Dark 60
//прототипы функций
void NewGames(bool x);
GLvoid LoadGLTextures();
bool DamkaXod (float fx, float fy);
bool DamkaRubit(float fx, float fy);
bool CheckRubit(float fx, float fy);
bool Check(float fx, float fy);
bool CheckBan();
void Move();
float w=8, H=1;
float board[8][3]={{-w/2, -w/2, -H}, {-w/2,w/2,-H}, {w/2,w/2,-1}, {w/2,-w/2,-H},
{-w/2, -w/2, 0}, {-w/2,w/2,0}, {w/2,w/2,0}, {w/2,-w/2,0}}//матрица вершин доски int tiltX2; //для поворота
int tiltY2;
float tiltZ2;
float tiltZ1;
bool game; //переменные игры
int XOD=White;
int curXOD;
int indexXOD; //индекс шашки, выбранной для хода
int posXred; //позиция курсора
int posYred;
int posXblue;
int posYblue;
GLuinttexture[4];// Место для текстуры
float p[4]={0,10,10,1}; //освещение
int numberW; //количество шашек
int numberD;
bool ban; //запретить снимание выделение шашки
bool rush;
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:// IDE-managed Components
TPanel *Panel1;
TLabel *Label1;
TMainMenu *MainMenu1;
TMenuItem *N1;
TMenuItem *NewGame;
TMenuItem *Exit;
TMenuItem *N2;
TMenuItem *N3;
TMenuItem *N4;
TTimer *Timer1;
TLabel *Label2;
TLabel *Label3;
TLabel *Label4;
TLabel *Label5;
TImage *Image1;
TImage *Image2;
void __fastcall FormCreate(TObject *Sender);
void __fastcall FormDestroy(TObject *Sender);
void __fastcall FormResize(TObject *Sender);
void __fastcall FormPaint(TObject *Sender);
void __fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y);
void __fastcall FormMouseMove(TObject *Sender, TShiftState Shift, int X,
int Y);
void __fastcall NewGameClick(TObject *Sender);
void __fastcall N3Click(TObject *Sender);
void __fastcall ExitClick(TObject *Sender);
void __fastcall FormMouseWheelDown(TObject *Sender, TShiftState Shift,
TPoint &MousePos, bool &Handled);
void __fastcall FormMouseWheelUp(TObject *Sender, TShiftState Shift,
TPoint &MousePos, bool &Handled);
void __fastcall N4Click(TObject *Sender);
private:// User declarations
HGLRC ghRC; // указатель на контекст воспроизведения (Rendering Context)
HDC hDC; // дескриптор (контекст) устройства
public:// User declarations
__fastcall TForm1(TComponent* Owner);
BOOL bSetupPixelFormat(HDC hDC);
void Draw();
void DrawFon();
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
class Sabre {
public:
int color;
float x;
float y;
bool visible;
bool damka;
void DrawSabre();
} ;
void Sabre::DrawSabre(){
float x=this->x;
float y=this->y;
float color=this->color;
float damla=this->damka;
glTranslated(-3.5+x,-3.5+y,0.0);
float dz1=0.2;
glPushMatrix();
GLUquadricObj *quadObj;
quadObj = gluNewQuadric();
if(color==50)
glColor3f(1.0f,1.0f,1.0f);
if(color==60)
glColor3f(1.0f,0.0f,0.0f);
gluQuadricDrawStyle(quadObj, GLU_FILL);
gluCylinder(quadObj, 0.4, 0.4, 0.21, 15, 15);
glTranslated(0.0,0.0,dz1);
gluDisk(quadObj, 0.25, 0.39, 15, 15);
glTranslated(0.0,0.0,0.01);
glColor3ub(0, 0, 0);
gluDisk(quadObj, 0.34, 0.4, 32, 32);
glColor3ub(0, 0, 0);
gluDisk(quadObj, 0.20, 0.25, 32, 32);
glTranslated(0.0,0.0,-0.01);
if(damka==false){
glColor3ub(185, 122, 87);
}
else{
glColor3ub(255, 255, 0);
}
gluDisk(quadObj, 0.0, 0.24, 32, 32);
glTranslated(0.0,0.0,-0.19);
glColor3ub(0, 0, 0);
gluDisk(quadObj, 0.0, 0.42, 32, 32);
glPopMatrix();
gluDeleteQuadric(quadObj);
}
Sabre sabre[24]; //шашки
//---------------------------------------------------------------------------
#endif
В файле Unit1.cpp:
//---------------------------------------------------------------------------
#include <windows.h>// Заголовочный файл для Windows
#include <gl\gl.h>// Заголовочный файл для OpenGL32 библиотеки
#include <gl\glu.h>// Заголовочный файл для GLu32 библиотеки
#include <gl\glaux.h>
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")
TForm1 *Form1;
void NewGames(bool x){
tiltX2=-34; //для поворота
tiltY2=0;
tiltZ2=0.61;
tiltZ1=90;
int z=1;
for(int i=0;i<8;i++){
z=!z;
for(int j=0;j<8;j++){
if(z==0)
place[i][j]=-1;
else
place[i][j]=0;
z=!z;
}
}
game=x;
curXOD=0;
indexXOD=-1; //индекс шашки, выбранной для хода
XOD=White;
if(game){
numberW=12; //количество шашек
numberD=12;
}
else {
numberW=0; //количество шашек
numberD=0;
}
ban=false; //запретить снимание выделение шашки
rush=false;
//заполнение классов доски и шашек
z=0;
for(int i = 0;i<8;i++) {
if(z>numberW-1)
break;
for(int j=0;j<8;j++)
if(place[j][i]==0){
float i1=i;
float j1=j;
sabre[z].x = j1;
sabre[z].y = i1;
sabre[z].color=White;
sabre[z].visible=true;
sabre[z].damka=false;
place[j][i]=White;
z++;
}
}
for(int k = 7; k>=0; k--) {
if(z>numberW+numberD-1)
break;
for(int j=7; j>=0; j--)
if(place[j][k]==0){
float i1=k;
float j1=j;
sabre[z].x = j1;
sabre[z].y = i1;
sabre[z].color=Dark;
sabre[z].visible=true;
sabre[z].damka=false;
place[j][k]=Dark;
z++;
}
}
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
hDC = GetDC(Handle); //Handle - дескриптор окна (hwnd в WinAPI)
if (!bSetupPixelFormat(hDC)) //Устанавливаем формат пикселей
return;
ghRC = wglCreateContext(hDC); //Создаем контекст воспроизведения
wglMakeCurrent(hDC, ghRC); //Делаем его текущим
glClearColor(0.9f,0.9f,0.9f, 1.0); //Цвет экрана при очищении
glEnable(GL_COLOR_MATERIAL); //Разрешаем задавать цвет объектам
glEnable(GL_DEPTH_TEST); //Тест глубины для объемности изображения
LoadGLTextures();// Загрузка текстур
glEnable(GL_LIGHTING); //Разрешаем освещение
glEnable(GL_LIGHT0); //Включили освещение 0
glLightfv(GL_LIGHT5,GL_POSITION,p); //Установка позиции освещения
NewGames(false);
}
//---------------------------------------------------------------------------
BOOL TForm1::bSetupPixelFormat(HDC hDC)
{
PIXELFORMATDESCRIPTOR pfd; //Создаем структуру
int pixelformat;
pfd.nSize = sizeof (PIXELFORMATDESCRIPTOR); //Размер структуры
pfd.nVersion = 1; //Версия структуры
pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
pfd.iLayerType = PFD_MAIN_PLANE; //Тип поверхности
pfd.iPixelType = PFD_TYPE_RGBA; //Формат указания цвета
pfd.cColorBits = 16; //Глубина цвета
pfd.cDepthBits = 16; //Размер буфера глубины
pfd.cAccumBits = 0; //Общее число битовых плоскостей в буфере аккумулятора
pfd.cStencilBits = 0; //Размер буфера трафарета
if (!(pixelformat=ChoosePixelFormat(hDC, &pfd))) {
MessageBox(NULL, "Невозможно выбрать формат пикселей", "Error", MB_OK);
return false;
}
if (!SetPixelFormat (hDC, pixelformat, &pfd)) {
MessageBox(NULL, "Невозможно установить формат пикселей", "Error", MB_OK);
return false;
}
return true;
}
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
if(ghRC)
{
wglMakeCurrent(hDC,0);
wglDeleteContext(ghRC);
}
if(hDC) ReleaseDC(Handle, hDC);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
int x, y, dx, dy;
x = Form1->Left;
y = Form1->Top;
dx = Form1->Width-160;
dy = Form1->Height;
glViewport(0, 0, dx, dy);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0,(dx+160)/dy,1,100);
gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);
glMatrixMode(GL_MODELVIEW);
}
//---------------------------------------------------------------------------
bool DamkaXod (float fx, float fy){
int x=fx;
int y=fy;
int k=0;
///вправо вверх(для белых)
for(int i=1;i<7;i++){
if(place[x+i][y+i] == 0 && sabre[indexXOD].x+i-1!=7 && sabre[indexXOD].y+i-1!=7){
place[x+i][y+i] = 1;
k++;
}
else
break;
}
///для влево вниз
for(int i=1;i<7;i++){
if(place[x-i][y-i] == 0 && sabre[indexXOD].x-i+1!=0 && sabre[indexXOD].y-i+1!=0){
k++;
place[x-i][y-i] = 1;
}
else
break;
}
//для влево вверх
for(int i=1;i<7;i++){
if(place[x-i][y+i] == 0 && sabre[indexXOD].x-i+1!=0 && sabre[indexXOD].y+i-1!=7){
k++;
place[x-i][y+i] = 1;
}
else
break;
}
//для вправо вниз
for(int i=1;i<7;i++){
if(place[x+i][y-i] == 0 && sabre[indexXOD].x+i-1!=7 && sabre[indexXOD].y-i+1!=0){
k++;
place[x+i][y-i] = 1;
}
else
break;
}
if(k==0)
return false;
else
return true;
}
bool DamkaRubit(float fx, float fy){
int x=fx;
int y=fy;
int k=0;
if(XOD==White){
///вправо вверх(для белых)
for(int i=1;i<7;i++){
if(place[x+i][y+i] == White)
break;
if(place[x+i][y+i] == Dark && sabre[indexXOD].x+i!=7 && sabre[indexXOD].y+i!=7){
if(place[x+i+1][y+i+1]==0 || place[x+i+1][y+i+1]==1){
k++;
for(int j=i;j<7;j++){
if(place[x+j+1][y+j+1] == 0 && sabre[indexXOD].x+j-1!=7 && sabre[indexXOD].y+j-1!=7){
place[x+j+1][y+j+1] = 1;
}
else
break;
}
break;
}
else
break;
}
}
///для влево вниз
for(int i=1;i<7;i++){
if(place[x-i][y-i] == White)
break;
if(place[x-i][y-i] == Dark && sabre[indexXOD].x-i!=0 && sabre[indexXOD].y-i!=0){
if(place[x-i-1][y-i-1]== 0 || place[x-i-1][y-i-1]== 1){
k++;
for(int j=i;j<7;j++){
if(place[x-j-1][y-j-1] == 0 && sabre[indexXOD].x-j+1!=0 && sabre[indexXOD].y-j+1!=0){
place[x-j-1][y-j-1] = 1;
}
else
break;
}
break;
}
else
break;
}
}
//для влево вверх
for(int i=1;i<7;i++){
if(place[x-i][y+i] == White)
break;
if(place[x-i][y+i] ==Dark && sabre[indexXOD].x-i!=0 && sabre[indexXOD].y+i!=7){
if(place[x-i-1][y+i+1] == 0 || place[x-i-1][y+i+1] == 1){
k++;
for(int j=i;j<7;j++){
if(place[x-j-1][y+j+1] == 0 && sabre[indexXOD].x-j+1!=0 && sabre[indexXOD].y+j-1!=7){
place[x-j-1][y+j+1] = 1;
}
else
break;
}
break;
}
else
break;
}
}
//для вправо вниз
for(int i=1;i<7;i++){
if(place[x+i][y-i] == White)
break;
if(place[x+i][y-i] == Dark && sabre[indexXOD].x+i!=7 && sabre[indexXOD].y-i!=0){
if(place[x+i+1][y-i-1] == 0 || place[x+i+1][y-i-1] == 1){
k++;
for(int j=i;j<7;j++){
if(place[x+j+1][y-j-1] == 0 && sabre[indexXOD].x+j-1!=7 && sabre[indexXOD].y-j+1!=0){
place[x+j+1][y-j-1] = 1;
}
else
break;
}
break;
}
else
break;
}
}
}
if(XOD==Dark){
///вправо вверх(для белых)
for(int i=1;i<7;i++){
if(place[x+i][y+i] == Dark)
break;
if(place[x+i][y+i] == White && sabre[indexXOD].x+i!=7 && sabre[indexXOD].y+i!=7){
if(place[x+i+1][y+i+1]==0 || place[x+i+1][y+i+1]==1){
k++;
for(int j=i;j<7;j++){
if(place[x+j+1][y+j+1] == 0 && sabre[indexXOD].x+j-1!=7 && sabre[indexXOD].y+j-1!=7){
place[x+j+1][y+j+1] = 1;
}
else
break;
}
break;
}
else
break;
}
}
///для влево вниз
for(int i=1;i<7;i++){
if(place[x-i][y-i] == Dark)
break;
if(place[x-i][y-i] == White && sabre[indexXOD].x-i!=0 && sabre[indexXOD].y-i!=0){
if(place[x-i-1][y-i-1]== 0 || place[x-i-1][y-i-1]== 1){
k++;
for(int j=i;j<7;j++){
if(place[x-j-1][y-j-1] == 0 && sabre[indexXOD].x-j+1!=0 && sabre[indexXOD].y-j+1!=0){
place[x-j-1][y-j-1] = 1;
}
else
break;
}
break;
}
else
break;
}
}
//для влево вверх
for(int i=1;i<7;i++){
if(place[x-i][y+i] == Dark)
break;
if(place[x-i][y+i] ==White && sabre[indexXOD].x-i!=0 && sabre[indexXOD].y+i!=7){
if(place[x-i-1][y+i+1] == 0 || place[x-i-1][y+i+1] == 1){
k++;
for(int j=i;j<7;j++){
if(place[x-j-1][y+j+1] == 0 && sabre[indexXOD].x-j+1!=0 && sabre[indexXOD].y+j-1!=7){
place[x-j-1][y+j+1] = 1;
}
else
break;
}
break;
}
else
break;
}
}
//для вправо вниз
for(int i=1;i<7;i++){
if(place[x+i][y-i] == Dark)
break;
if(place[x+i][y-i] == White && sabre[indexXOD].x+i!=7 && sabre[indexXOD].y-i!=0){
if(place[x+i+1][y-i-1] == 0 || place[x+i+1][y-i-1] == 1){
k++;
for(int j=i;j<7;j++){
if(place[x+j+1][y-j-1] == 0 && sabre[indexXOD].x+j-1!=7 && sabre[indexXOD].y-j+1!=0){
place[x+j+1][y-j-1] = 1;
}
else
break;
}
break;
}
else break;
}
}
}
if(k>0)
return true;
else
return false;
}
bool CheckRubit(float fx, float fy){
int x=fx;
int y=fy;
int k=0;
if(XOD==White){
if(place[x+1][y+1]==Dark && place[x+2][y+2]==0 && (y+1)!=7 && (x+1)!=7){
place[x+2][y+2]=1;
k++;
}
if(place[x-1][y+1]==Dark && place[x-2][y+2]==0 && (y+1)!=7 && (x-1)!=0){
place[x-2][y+2]=1;
k++;
}
if(k!=0)
return true;
else
return false;
}
if(XOD==Dark){
if(place[x+1][y-1]==White && place[x+2][y-2]==0 && (y-1)!=0 && (x+1)!=7){
place[x+2][y-2]=1;
k++;
}
if(place[x-1][y-1]==White && place[x-2][y-2]==0 && (y-1)!=0 && (x-1)!=0){
place[x-2][y-2]=1;
k++;
}
if(k!=0)
return true;
else
return false;
}
}
bool Check(float fx, float fy){
int x=fx;
int y=fy;
int k=0;
if(XOD==White){
if(place[x+1][y+1]==0 && y!=7){
place[x+1][y+1]=1; k++;}
if(place[x-1][y+1]==0 && y!=7){
place[x-1][y+1]=1; k++;}
}
if(XOD==Dark){
if(place[x+1][y-1]==0 && y!=0){
place[x+1][y-1]=1; k++;}
if(place[x-1][y-1]==0 && y!=0){
place[x-1][y-1]=1; k++;}
}
if(k>0)
return true;
else return false;
}
bool CheckBan(){
ban=false;
if(rush==true){
if(sabre[indexXOD].damka==true && DamkaRubit(sabre[indexXOD].x,sabre[indexXOD].y))
{
ban=true;
}
if(sabre[indexXOD].damka==false && CheckRubit(sabre[indexXOD].x,sabre[indexXOD].y))
{
ban=true;
}
}
return ban;
}
void Move(){
if(XOD==White){
if(place[posXred][posYred]==1){
int x=sabre[indexXOD].x;
int y=sabre[indexXOD].y;
place[x][y]=0;
place[posXred][posYred]=White;
////если срубили////////////
//если не дамка
if(sabre[indexXOD].damka==false){
if(abs(y-posYred)==2 && (posXred-x)<0)
for(int i=12;i<24;i++)
if(sabre[i].x==x-1 && sabre[i].y==posYred-1){
sabre[i].visible=false;
sabre[i].x=-2;
sabre[i].y=-2;
numberD--;
place[x-1][posYred-1]=0;
rush=true;
break;
}
if(abs(y-posYred)==2 && (posXred-x)>0)
for(int i=12;i<24;i++)
if(sabre[i].x==x+1 && sabre[i].y==posYred-1){
sabre[i].visible=false;
sabre[i].x=-2;
sabre[i].y=-2;
numberD--;
place[x+1][posYred-1]=0;
rush=true;
break;
}
}
//если дамка
if(sabre[indexXOD].damka==true){
///1
if(x<posXred && y<posYred){
for(int i=1;i<posXred-x;i++){
for(int j=12;j<24;j++){
if(sabre[j].x==x+i && sabre[j].y==y+i && sabre[j].color==Dark && sabre[j].visible==true){
sabre[j].visible=false;
sabre[j].x=-2;
sabre[j].y=-2;
numberD--;
place[x+i][y+i]=0;
rush=true;
break;
}
}
}
}
//2
if(x>posXred && y>posYred){
for(int i=1;i<x-posXred;i++){
for(int j=12;j<24;j++){
if(sabre[j].x==x-i && sabre[j].y==y-i && sabre[j].color==Dark && sabre[j].visible==true){
sabre[j].visible=false;
sabre[j].x=-2;
sabre[j].y=-2;
numberD--;
place[x-i][y-i]=0;
rush=true;
break;
}
}
}
}
//3
if(x>posXred && y<posYred){
for(int i=1;i<x-posXred;i++){
for(int j=12;j<24;j++){
if(sabre[j].x==x-i && sabre[j].y==y+i && sabre[j].color==Dark && sabre[j].visible==true){
sabre[j].visible=false;
sabre[j].x=-2;
sabre[j].y=-2;
numberD--;
place[x-i][y+i]=0;
rush=true;
break;
}
}
}
}
//4
if(x<posXred && y>posYred){
for(int i=1;i<posXred-x;i++){
for(int j=12;j<24;j++){
if(sabre[j].x==x+i && sabre[j].y==y-i && sabre[j].color==Dark && sabre[j].visible==true){
sabre[j].visible=false;
sabre[j].x=-2;
sabre[j].y=-2;
numberD--;
place[x+i][y-i]=0;
rush=true;
break;
}
}
}
}
}
/////////////////////////
sabre[indexXOD].x=posXred;
sabre[indexXOD].y=posYred;
//очищение "зелных квадратиков"
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
if(place[i][j]==1)
place[i][j]=0;
//рубим еще
CheckBan();
//переход хода
if(ban==false){
curXOD=0;
//проверка на дамку
if(sabre[indexXOD].y==7){
sabre[indexXOD].damka=true;
}
//переход хода
XOD=Dark;
indexXOD=-1;
ban=false;
rush=false;
//очищение "зелных квадратиков"
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
if(place[i][j]==1)
place[i][j]=0;
///проверка на победу
if(numberD==0){
char befer[50] = "Победил игрок ";
AnsiString ansi_string=Form1->Label4->Caption;
char * str1 = ansi_string.c_str();
strcat(befer,str1);
MessageBox(NULL, strcat(befer,"!"), "Конец игры", MB_OK | MB_ICONINFORMATION);
}
}
}
}
if(XOD==Dark){
if(place[posXblue][posYblue]==1){
int x=sabre[indexXOD].x;
int y=sabre[indexXOD].y;
place[x][y]=0;
place[posXblue][posYblue]=Dark;
////////////////////////////////////////
////если срубили
//если не дамка
if(sabre[indexXOD].damka==false){
if(abs(y-posYblue)==2 && (posXblue-x)<0)
for(int i=0;i<12;i++)
if(sabre[i].x==posXblue+1 && sabre[i].y==posYblue+1){
sabre[i].visible=false;
sabre[i].x=-2;
sabre[i].y=-2;
numberW--;
place[posXblue+1][posYblue+1]=0;
rush=true;
break;
}
if(abs(y-posYblue)==2 && (posXblue-x)>0)
for(int i=0;i<12;i++)
if(sabre[i].x==posXblue-1 && sabre[i].y==posYblue+1){
sabre[i].visible=false;
sabre[i].x=-2;
sabre[i].y=-2;
numberW--;
place[posXblue-1][posYblue+1]=0;
rush=true;
break;
}
}
//если дамка
if(sabre[indexXOD].damka==true){
///1
if(x<posXblue && y<posYblue){
for(int i=1;i<posXblue-x;i++){
for(int j=0;j<12;j++){
if(sabre[j].x==x+i && sabre[j].y==y+i && sabre[j].color==White && sabre[j].visible==true){
sabre[j].visible=false;
sabre[j].x=-2;
sabre[j].y=-2;
numberW--;
place[x+i][y+i]=0;
rush=true;
break;
}
}
}
}
//2
if(x>posXblue && y>posYblue){
for(int i=1;i<x-posXblue;i++){
for(int j=0;j<12;j++){
if(sabre[j].x==x-i && sabre[j].y==y-i && sabre[j].color==White && sabre[j].visible==true){
sabre[j].visible=false;
sabre[j].x=-2;
sabre[j].y=-2;
numberW--;
place[x-i][y-i]=0;
rush=true;
break;
}
}
}
}
//3
if(x>posXblue && y<posYblue){
for(int i=1;i<x-posXblue;i++){
for(int j=0;j<12;j++){
if(sabre[j].x==x-i && sabre[j].y==y+i && sabre[j].color==White && sabre[j].visible==true){
sabre[j].visible=false;
sabre[j].x=-2;
sabre[j].y=-2;
numberW--;
place[x-i][y+i]=0;
rush=true;
break;
}
}
}
}
//4
if(x<posXblue && y>posYblue){
for(int i=1;i<posXblue-x;i++){
for(int j=0;j<12;j++){
if(sabre[j].x==x+i && sabre[j].y==y-i && sabre[j].color==White && sabre[j].visible==true){
sabre[j].visible=false;
sabre[j].x=-2;
sabre[j].y=-2;
numberW--;
place[x+i][y-i]=0;
rush=true;
break;
}
}
}
}
}
sabre[indexXOD].x=posXblue;
sabre[indexXOD].y=posYblue;
//очищение "зелных квадратиков"
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
if(place[i][j]==1)
place[i][j]=0;
CheckBan();
if(ban==false)
{
curXOD=0;
//проверка на дамку
if(sabre[indexXOD].y==0){
sabre[indexXOD].damka=true;
}
XOD=White;
indexXOD=-1;
rush=false;
ban=false;
//очищение "зелных квадратиков"
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
if(place[i][j]==1)
place[i][j]=0;
//проверка на победу
if(numberW==0){
char buft[50] = "Победил игрок ";
AnsiString ansi_string=Form1->Label5->Caption;
char * str1 = ansi_string.c_str();
strcat(buft,str1);
MessageBox(NULL, strcat(buft,"!"), "Конец игры", MB_OK | MB_ICONINFORMATION);
}
}
}
}
}
void TForm1::Draw()
{
glEnable(GL_DEPTH_TEST);
glScalef(tiltZ2,tiltZ2,tiltZ2);
glRotatef(tiltX2,1.0f,0.0f,0.0f);
glRotatef(tiltY2,0.0f,1.0f,0.0f);
glRotatef(tiltZ1,0.0f,0.0f,1.0f);
int k=1;
float dx=4.0;
float dy=4.0;
float dz=0;
//квадраты на доске черно-белые
glNormal3f(0,-0.0,1.0);
for(int i=1;i<=8; i++){
k++;
for(int j=0;j<=7;j++){
if(indexXOD>-1 && sabre[indexXOD].x==i-1 && sabre[indexXOD].y==j){
k++;
continue; }
if(XOD==White && posXred==i-1 && posYred==j && game){
k++;
continue; }
if(XOD==Dark && posXblue==i-1 && posYblue==j && game){
k++;continue; }
if(place[i-1][j]==1){
k++;continue;
}
glBegin(GL_QUADS);
if(k%2==0)
glColor3ub(255, 255, 255);
else
glColor3f(0.0,0.0,0.0);
glVertex3f(i-dx, j-dy, dz+0.0f);
glVertex3f(i-1-dx, j-dy, dz+0.0f);
glVertex3f(i-1-dx, j+1-dy, dz+0.0f);
glVertex3f(i-dx, j+1-dy, dz+0.0f);
glEnd();
k++;
}
}
//коробка
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(board[0][0], board[0][1], board[0][2]);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(board[1][0], board[1][1], board[1][2]);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(board[2][0], board[2][1], board[2][2]);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(board[3][0], board[3][1], board[3][2]);
glEnd();
glNormal3f(0,-1,0.5);
///////бока 1 длинный
glBindTexture(GL_TEXTURE_2D, texture[1]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(board[0][0], board[0][1], board[0][2]);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(board[4][0], board[4][1], board[4][2]);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(board[7][0], board[7][1], board[7][2]);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(board[3][0], board[3][1], board[3][2]);
glNormal3f(0,1,0.5);
///////бока 2 длинный
glTexCoord2f(0.0f, 0.0f);
glVertex3f(board[1][0], board[1][1], board[1][2]);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(board[5][0], board[5][1], board[5][2]);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(board[6][0], board[6][1], board[6][2]);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(board[2][0], board[2][1], board[2][2]);
glNormal3f(-1,0,1);
///////бока 1 широкий
glTexCoord2f(0.0f, 0.0f);
glVertex3f(board[0][0], board[0][1], board[0][2]);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(board[4][0], board[4][1], board[4][2]);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(board[5][0], board[5][1], board[5][2]);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(board[1][0], board[1][1], board[1][2]);
glNormal3f(1,0,1);
///////бока 2 широкий
glTexCoord2f(0.0f, 0.0f);
glVertex3f(board[3][0], board[3][1], board[3][2]);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(board[7][0], board[7][1], board[7][2]);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(board[6][0], board[6][1], board[6][2]);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(board[2][0], board[2][1], board[2][2]);
glEnd(); glDisable(GL_TEXTURE_2D);
glNormal3f(0,0.0,1.0);
//квадратик для хода
if(game){
if(indexXOD>-1){
glBegin(GL_QUADS);
glColor3ub(255, 255, 64);
glVertex3f(sabre[indexXOD].x-dx, sabre[indexXOD].y-dy, 0.001f);
glVertex3f(sabre[indexXOD].x+1-dx, sabre[indexXOD].y-dy,0.001f);
glVertex3f(sabre[indexXOD].x+1-dx, sabre[indexXOD].y+1-dy, 0.001f);
glVertex3f(sabre[indexXOD].x-dx, sabre[indexXOD].y+1-dy, 0.001f);
glEnd();
}
if(XOD==White){
glBegin(GL_QUADS);
glColor3ub(255, 70, 70);
glVertex3f(posXred-dx, posYred-dy, 0.001f);
glVertex3f(posXred+1-dx, posYred-dy, 0.001f);
glVertex3f(posXred+1-dx, posYred+1-dy, 0.001f);
glVertex3f(posXred-dx, posYred+1-dy, 0.001f);
glEnd();
}
if(XOD==Dark){
glBegin(GL_QUADS);
glColor3ub(70, 70, 255);
glVertex3f(posXblue-dx, posYblue-dy, 0.001f);
glVertex3f(posXblue+1-dx, posYblue-dy,0.001f);
glVertex3f(posXblue+1-dx, posYblue+1-dy, 0.001f);
glVertex3f(posXblue-dx, posYblue+1-dy, 0.001f);
glEnd();
}
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
if(place[i][j]==1){
glBegin(GL_QUADS);
glColor3ub(70, 255, 70);
glVertex3f(i-dx, j-dy, 0.001f);
glVertex3f(i+1-dx, j-dy,0.001f);
glVertex3f(i+1-dx, j+1-dy, 0.001f);
glVertex3f(i-dx, j+1-dy, 0.001f);
glEnd();
}
//шашки
for(int i=0;i<24;i++){
if(sabre[i].visible){
glPushMatrix();
sabre[i].DrawSabre();
glPopMatrix();
}
}
}
Form1->Label1->Caption=Time();
Form1->Label2->Caption=numberW;
Form1->Label3->Caption=numberD;
}
void TForm1::DrawFon(){
float dx=9.0;
float dy=9.0;
float dz=-7;
glColor3f(1, 1, 1);
glLightfv(GL_LIGHT5,GL_POSITION,p);
glNormal3f(0.0,0.0,1.0);
glDisable(GL_DEPTH_TEST);
//фон
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture[2]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(0-dx, 0-dy, dz-4.0f);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(0-dx, 20-dy, dz-4.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(20-dx, 20-dy, dz-4.0f);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(20-dx, 0-dy, dz-4.0f);
glEnd();
glDisable(GL_TEXTURE_2D);
}
void __fastcall TForm1::FormPaint(TObject *Sender)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glLightfv(GL_LIGHT5,GL_POSITION,p);
Form1->DrawFon();
Form1->Draw();
SwapBuffers(hDC);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(!(Shift.Contains(ssCtrl)))
switch(Key){
case(VK_RIGHT):{
if(tiltY2==60)
break;
tiltY2=tiltY2+2;
Form1->Paint();
break;
}
case(VK_LEFT):{
if(tiltY2==-60)
break;
tiltY2=tiltY2-2;
Form1->Paint();
break;
}
case(VK_DOWN):{
if(tiltX2==0)
break;
tiltX2=tiltX2+2;
Form1->Paint();
break;
}
case(VK_UP):{
if(tiltX2==-74)
break;
tiltX2=tiltX2-2;
Form1->Paint();
break;
}
}
else
switch(Key){
case(VK_LEFT):{
tiltZ1=tiltZ1+2;
Form1->Paint();
break;
}
case(VK_RIGHT):{
tiltZ1=tiltZ1-2;
Form1->Paint();
break;
}
}
}
//---------------------------------------------------------------------------
// Загрузка картинки и конвертирование в текстуру
GLvoid LoadGLTextures()
{
AUX_RGBImageRec *texture1;
texture1 = auxDIBImageLoad("texture\\text1.bmp");
glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,
GL_RGB, GL_UNSIGNED_BYTE, texture1->data);
texture1 = auxDIBImageLoad("texture\\text2.bmp");
glGenTextures(1, &texture[1]);
glBindTexture(GL_TEXTURE_2D, texture[1]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,
GL_RGB, GL_UNSIGNED_BYTE, texture1->data);
texture1 = auxDIBImageLoad("texture\\fon.bmp");
glGenTextures(1, &texture[2]);
glBindTexture(GL_TEXTURE_2D, texture[2]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,
GL_RGB, GL_UNSIGNED_BYTE, texture1->data);
texture1 = auxDIBImageLoad("texture\\king.bmp");
glGenTextures(1, &texture[3]);
glBindTexture(GL_TEXTURE_2D, texture[3]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,
GL_RGB, GL_UNSIGNED_BYTE, texture1->data);
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Form1->Label1->Caption=Time();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if(curXOD==1){
if(XOD==White){
////снять выделение //////////////////
if(sabre[indexXOD].x==posXred && sabre[indexXOD].y==posYred && !ban)
{
indexXOD=-1;
curXOD=0;
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
if(place[i][j]==1)
place[i][j]=0;
Form1->Paint();
return;
}
//////////////////////////// ход
Move();
Form1->Paint();
return;
}
if(XOD==Dark){
if(sabre[indexXOD].x==posXblue && sabre[indexXOD].y==posYblue && !ban)
{
indexXOD=-1;
curXOD=0;
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
if(place[i][j]==1)
place[i][j]=0;
Form1->Paint();
return;
}
Move();
Form1->Paint();
}
return;
}
//первый Ентер
if(curXOD==0){
bool SabreRatle=false;
///проверка есть ли ход на сруб
if(XOD==White)
for(int i=0;i<12;i++){
indexXOD=i;
if(sabre[i].damka==false && sabre[i].visible==true && CheckRubit(sabre[i].x,sabre[i].y)){
SabreRatle=true;
break;
}
if(sabre[i].damka==true && sabre[i].visible==true && DamkaRubit(sabre[i].x,sabre[i].y)){
SabreRatle=true;
break;
}
}
if(XOD==Dark)
for(int i=12;i<24;i++) {
indexXOD=i;
if(sabre[i].damka==false && sabre[i].visible==true && CheckRubit(sabre[i].x,sabre[i].y)){
SabreRatle=true;
break;
}
if(sabre[i].damka==true && sabre[i].visible==true && DamkaRubit(sabre[i].x,sabre[i].y)){
SabreRatle=true;
break;
}
}
indexXOD=-1;
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
if(place[i][j]==1)
place[i][j]=0;
for(int i=0;i<24;i++){
if(sabre[i].x==posXred && sabre[i].y==posYred && XOD==White && sabre[i].color==White && sabre[i].visible||
sabre[i].x==posXblue && sabre[i].y==posYblue && XOD==Dark && sabre[i].color==Dark && sabre[i].visible)
{
indexXOD=i;
curXOD++;
if(sabre[indexXOD].damka==false){
if(SabreRatle){
if(CheckRubit(sabre[indexXOD].x,sabre[indexXOD].y))
break;
}
else{
Check(sabre[i].x,sabre[i].y);
break;
}
}
if(sabre[indexXOD].damka==true){
if(SabreRatle){
if(DamkaRubit(sabre[indexXOD].x,sabre[indexXOD].y))
break;
}
else{
DamkaXod(sabre[i].x,sabre[i].y);
break;
}
}
}
}
Form1->Paint();
}
return;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X,
int Y)
{
GLint viewport[4]; // параметры viewport-a.
GLdouble projection[16]; // матрица проекции.
GLdouble modelview[16]; // видовая матрица.
GLdouble x1, y1, z1, x2, y2, z2;
GLfloat z;
glGetIntegerv(GL_VIEWPORT, viewport); // узнаём параметры viewport-a.
glGetDoublev(GL_PROJECTION_MATRIX, projection); // узнаём матрицу проекции.
glGetDoublev(GL_MODELVIEW_MATRIX, modelview); // узнаём видовую матрицу.
glReadPixels(X, ClientHeight-Y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z);
gluUnProject(X, ClientHeight-Y, z, modelview, projection, viewport, &x1, &y1, &z1);
if(y1>4 || x1>4 || Y==0 || x1>3 && y1>3)
return;
if(XOD==White && game){
posXred=x1+4;
posYred=y1+4;
}
if(XOD==Dark && game){
posXblue=x1+4;
posYblue=y1+4;
}
Form1->Paint();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NewGameClick(TObject *Sender)
{
Form2->ShowModal();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N3Click(TObject *Sender)
{
MessageBox(Handle, "Компьютерная игра Шашки-3D \nВерсия 1.0 \nАвтор: Костин Кирилл \n\n ЮУрГУ, 2012 год", "О программе", MB_OK);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ExitClick(TObject *Sender)
{
Form1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseWheelDown(TObject *Sender, TShiftState Shift,
TPoint &MousePos, bool &Handled)
{
tiltZ2+=0.01;
Form1->Paint();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseWheelUp(TObject *Sender, TShiftState Shift,
TPoint &MousePos, bool &Handled)
{
if(tiltZ2<0.01)
return;
tiltZ2-=0.01;
Form1->Paint();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N4Click(TObject *Sender)
{
ShellExecute(Handle, "open", "rules.htm", NULL, NULL, SW_SHOW);
}
//---------------------------------------------------------------------------
В файле Unit2.h:
//---------------------------------------------------------------------------
#include"Unit1.h"
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm2 : public TForm
{
__published:// IDE-managed Components
TLabel *Label1;
TLabel *Label2;
TButton *Button1;
TButton *Button2;
TEdit *Edit1;
TEdit *Edit2;
TRadioButton *RadioButton1;
TRadioButton *RadioButton3;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private:// User declarations
public:// User declarations
__fastcall TForm2(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm2 *Form2;
//---------------------------------------------------------------------------
#endif
В файле Unit2.cpp:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
if(Form2->Edit1->Text.Length()==0 || Form2->Edit2->Text.Length()==0){
MessageBox(Handle, "Заполнены не все поля!", "Ошибка", MB_OK | MB_ICONERROR);
return;
}
if(Form2->RadioButton1->Checked==true){
Form1->Label4->Caption=Form2->Edit1->Text;
Form1->Label5->Caption=Form2->Edit2->Text;
}
else{
Form1->Label5->Caption=Form2->Edit1->Text;
Form1->Label4->Caption=Form2->Edit2->Text;
}
NewGames(true);
Form1->FormPaint(Sender);
Form2->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button2Click(TObject *Sender)
{
Form2->Close();
}
//---------------------------------------------------------------------------
1
Документ
Категория
Рефераты
Просмотров
59
Размер файла
1 402 Кб
Теги
отчет
1/--страниц
Пожаловаться на содержимое документа