Программный комплекс для лабораторных работ по курсу "Интеллектуальные системы"
Разработка приложения для лабораторных работ по курсу "интеллектуальные системы". Поиск по первому наилучшему совпадению. Использование алгоритма поиска в пространстве состояний на примере программ: крестики-нолики, задача о расстановке ферзей, пятнашки.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 21.03.2019 |
Размер файла | 874,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
staticinttrassa[16];//массивточекмаршрута
static Cell open_list[16];//массив открытых при трассировке элементов
char log_str[256] ="";
int Delay_time =400;//задержкамс
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
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), HWND_DESKTOP,DFunc);
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
INT_PTR CALLBACK DFunc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent,a,nBt,p1;//идентификаторы
static HDC hDc;
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
WriteLog(0);
sprintf(log_str,"Start Programm ********************************************************************************\n"); //влогфайл
WriteLog(1);
hDc = GetDC(hDlg);
for(a=0;a<16;a++)
{
hBut[a] = GetDlgItem(hDlg,1000+a);
}
srand(time(NULL));
Mass_Init();
Trasser_Init();
Mass_Log();
return (INT_PTR)TRUE;
case WM_SHOWWINDOW://при выводе окна заполнить случайными числами
//RanddomMass();
ShowButton(hBut,mas);
break;
case WM_COMMAND:
wmId = LOWORD(wParam); //Получение идентификатора ресурса с которым мы работаем
wmEvent = HIWORD(wParam);//Получение события ресурса с которым производится работа
switch (wmId)
{
case ID_MAIN_NEW://обработка нажатия кнопки меню "New" диаловогоокна
sprintf(log_str,"-------------------------Start ID_MAIN_NEW -----------------------\n"); //влогфайл
WriteLog(1);
RanddomMass();
Mass_Init();
Trasser_Init();
ShowButton(hBut,mas);
Mass_Log();
sprintf(log_str,"----------------------------End ID_MAIN_NEW -----------------------\n"); //влогфайл
WriteLog(1);
break;
case ID_MAIN_GO://обработканажатиякнопкименю "Go!!!" диаловогоокна
sprintf(log_str,"Start ID_MAIN_GO ----------------------------------------------------\n"); //влогфайл
Trasser_Init();
WriteLog(1);
if(Make_Line_1())// Собрать 1-йряд
{
Trasser_Init();
if(Make_Line_2())// Собрать 2-йряд
{
Trasser_Init();
if(Make_Line_End())//остальные 2 ряда
{
MessageBoxA (NULL,(LPCSTR)"ПОЗДРАВЛЯЕМ!", (LPCSTR)"Цельдостигнута!", MB_OK|MB_ICONINFORMATION);
sprintf(log_str,"\n------------>>>> SUCSESS !!!!!! <<<<<<<<<---------------------\n"); //в лог файл
WriteLog(1);
}
else //остальные 2 ряда
{
MessageBoxA (NULL,(LPCSTR)"Несобираемая комбинация", (LPCSTR)"Окончание сборки", MB_OK|MB_ICONWARNING);
sprintf(log_str,"\n------------>>>> not decided situation <<<<<<<<<---------------------\n"); //влогфайл
WriteLog(1);
}
}
else // Собрать 2-йряд
{
MessageBoxA (NULL,(LPCSTR)"ГЛЮК", (LPCSTR)"Ошибкаряд 2 !",MB_OK|MB_ICONERROR);
sprintf(log_str,"\n------------>>>> ERROR !!!!!! <<<<<<<<<---------------------\n"); //в лог файл
WriteLog(1);
}
}
else // Собрать 1-й ряд
{
MessageBoxA (NULL,(LPCSTR)"ГЛЮК", (LPCSTR)"Ошибка ряд 1!",MB_OK|MB_ICONERROR);
sprintf(log_str,"\n------------>>>> ERROR !!!!!! <<<<<<<<<---------------------\n"); //в лог файл
WriteLog(1);
}
Mass_Log();//записать в лог состояния массивов
sprintf(log_str,"End ID_MAIN_GO ----------------------------------------------------\n"); //влогфайл
WriteLog(1);
break;
case ID_MAIN_TEST://обработканажатиякнопкименю "test!!!" диаловогоокна
WriteLog(0);
Mass_Log();
/*ZeroPositions(15);
SwapElements(15);*/
map_15[0]=0; map_15[1]=1;map_15[2]=2;map_15[3]=3;//map_15[4]=4;map_15[5]=5;map_15[6]=6;map_15[7]=7;//map_15[8]=8;map_15[12]=12;//map_15[13]=13;
Trasser_Init();
/*Set_ElementPosition(4,11);
Mass_Log();
Set_ElementPosition(3,3);*/
// Make_Line_1();
Make_Line_2();
Make_Line_End();
break;
default:
nBt = CheckButton(GetDlgItem(hDlg,wmId));
if(nBt!=-1) //проверяем нажатый ресурс кнопка?
{
SwapElements(nBt);//вызываем функцию обмена элемента с пустой ячейкой
}
break;
}
// break;
break;
case WM_CLOSE:
//EndDialog(hDlg,LOWORD(wParam));
DestroyWindow(hDlg);
sprintf(log_str,"Finish Programm ********************************************************************************\n"); //влогфайл
WriteLog(1);
break;
case WM_DESTROY:
EndDialog(hDlg,LOWORD(wParam));
PostQuitMessage(0);
break;
}
return (INT_PTR)FALSE;
}
int CheckButton(HWND hResurs)
{
sprintf(log_str,"Start CheckButton \n"); //влогфайл
WriteLog(1);
int N_But = -1;
for(int i=0;i<16;i++)
{
if(hResurs==hBut[i])
N_But = i;
}
sprintf(log_str,"Finish CheckButton \n"); //влогфайл
WriteLog(1);
return N_But;
}
voidSwapElements(intnum) //функцияобменместамиэлементовеслипустаяячейкарядом
{
sprintf(log_str,"Start SwapElements num=%d \n",num); //влогфайл
WriteLog(1);
int zero;
for(int _i=0;_i<16;_i++)
{
if(mas[_i]==0)
zero = _i;
}
if(num==zero+1||num==zero-1||num==zero-4||num==zero+4)//еслирядомсэлементомпоадресу num находитсяпробел
{
mas[zero]=mas[num];//записываем значение элемента в ячейку где был 0
mas[num]=0;//записываем 0 в ячейку где был элемент
}
ShowButton(hBut,mas);
sprintf(log_str,"Finish SwapElements \n"); //влогфайл
WriteLog(1);
return;
}
void RanddomMass(void) //функция заполнения массива случайными числами
{
sprintf(log_str,"Start RanddomMass \n"); //влогфайл
WriteLog(1);
int i,j,element;
bool flag = true;
for(i=0;i<16;i++)
{
while(flag)
{
flag=false;
element = rand()%16;
for(j=0;j<i;j++)
{
if(mas[j]==element)
{
flag=true;
break;
}
}
}
mas[i]=element;
flag=true;
}
sprintf(log_str,"Finish RanddomMass \n"); //влогфайл
WriteLog(1);
return;
}
voidZeroPositions(intn) //функциясдвинутьпустуюячейкувлюбуюнужнуюпозицию
{
sprintf(log_str,"!!!--------Start ZeroPositions %d\n",n); //влогфайл
WriteLog(1);
int p_zero=FindElements(0);//находимадрес "0" втаблице
int _i;
/*static int patch[16];*/
if(p_zero==n)//если ноль уже в нужной позиции то возврат
return;
Trasser_patch(p_zero,n);//создаем маршрут от положения 0 к указанной точке
for (_i=0;_i<16;_i++)//переборточекмаршрута
{
if(trassa[_i]!=-1)//если есть точка (число не равное -1)
{
SwapElements(trassa[_i]);//меняем 0 с элементом маршрута
Sleep(Delay_time);//задержка
}
}
Trasser_Init();
sprintf(log_str,"!!!--------Finish ZeroPositions %d\n",n); //влогфайл
WriteLog(1);
return;
}
intFindElements(intD) //функцияпоискпозициичисла
{
sprintf(log_str,"####### Start FindElements %d\n",D); //влогфайл
WriteLog(1);
int poz;
for(int _i=0;_i<16;_i++)
{
if(mas[_i]==D)
poz = _i;
}
sprintf(log_str,"####### Finish FindElements %d\n",D); //влогфайл
WriteLog(1);
return poz;
}
voidTrasser_patch(intstart, intfinish)//создаеммашрутизточкиАвточкуВ (алгоритмА*)***********************************************
{
sprintf(log_str,"<---->Start Trasser A=%d B=%d\n",start,finish); //влогфайл
WriteLog(1);
int rod = start; //начальный родитель - стартовая точка
int old_rod = start;//предыдущий родитель - стартовая точка
int count_rod =0;
int _i;
int direct =0; //количесво разрешенных направлений из данной точки
intcount_point=0;//счетчикточекмаршрута
int count_err=0;//счетчик зацикливания для ошибок;
int n_step; //кол-во перемещений в данную точку из стартовой
open_list[start].Poz =start; //позицияэлемента
open_list[start].G =0;//G = стоимость передвижения из стартовой точки A к данной клетке, следуя найденному пути к этой клетке.
//(будем считать что стоимость передвижения на 1 позицию =10)
open_list[start].H =Steps(start,finish)*10;//H = примерная стоимость передвижения от данной клетки до целевой, то есть точки B. Она обычно является эвристической функцией.
//Стоимость H посчитана с помощью вычисления Манхеттенского расстояния к точке В,
//двигаясь только по горизонтали и вертикали, игнорируя все препятствия на пути.
open_list[start].F = open_list[start].G + open_list[start].H; //Стоимость F для каждой клетки вычисляется простым суммированием G и H.
//open_list[start].Dst = abs(finish-start); //разность между начальной точкой и конечной
for(_i=0;_i<16;_i++)//добавление в закрытый список элементов из списка блокировки
{
if(n_block[_i]==_i)//если позиция списка блокировки содержит номер позиции (-1 значит не блокирован)
close_list[_i]=_i;//добавляем его в закрытый список
}
open_list[finish].Poz =finish;//добавим в открытый список конечную точку
open_list[finish].H =-1;//инициализация финишной точки, чтобы мы могли войти в цикл
while(open_list[finish].H!=0) //строим маршрут пока не достигли конечной точки т.е при H=0 мы находимся в кон. точке
{
direct =Trasser_Area(rod);//формируем масив mass_a окружения родительской точки и определяем число направлений из родительской точки
close_list[rod] =rod; //заносим стартовую точку в закрытый список
for(_i=0;_i<4;_i++)//заполняем open_list исходя из массива окружения родителя
{
n_step =10;//инициализация стомости перехода на 1 шаг
int _ar = mass_a[_i];//сохраняем элемент окружения в open_list (в этом массиве [0] -точка справа [1]-точка слева [2]-точка сверху [3]-точка снизу)
if( _ar!=-1)//если элемент = -1 то соседней точки с какой либо стороны нет либо она заблокирована в close_list
{
open_list[_ar].Poz =_ar; //позиция элемента
for(int _c=0;_c<16;_c++) //сканируем уже созданную часть маршрута и считаем сколько ячеек мы уже прошли
{
if(trassa[_c]!=-1)
n_step=n_step+10;//определим стоимость передвижения из одной ячейки =10 и будем ее накапливать
}
open_list[_ar].G =n_step; //заносим стоимость перемещения из стартовой в эту ячейку
open_list[_ar].H =((Steps(_ar,finish))*10);//заносим стоимость перемещения из данной ячейки в конечную
open_list[_ar].F = open_list[_ar].G + open_list[_ar].H;//вычисляем F=G+H;
open_list[_ar].Direct = direct;//записываем кол-во разрешенных направлений из родительской точки;
}
}
old_rod = rod;
rod = Trass_Parent(rod);//получаемродителя
if(count_point<16&&old_rod!=rod)//если счетчик циклов не превышает размер массива маршрута и старый и новый родители не совпадают
{
trassa[count_point]=rod;//записываем точку маршрута в массив
count_point=count_point+1;//увеличиваем счетчик точек маршрута
Min_F=100;
}
if(old_rod==rod)//если старый и новый родители совпадают будем их подсчитывать
count_rod=count_rod+1;
if(count_rod==10)
{
sprintf(log_str,"<!!!!!!!!>Trable Parent=%d Trasser A=%d B=%d\n",rod,start,finish); //влогфайл
WriteLog(1);
Mass_Log();//сохраняеммассивы
//Trasser_Init();//сбрасываеммассивы
//sprintf(log_str,"<\n--------Restart Mass--------Блок Trasser---\n"); //влогфайл
// WriteLog(1);
//Mass_Log();//сохраняеммассивы
//MessageBoxA (NULL,(LPCSTR)"Тупикпородителю", (LPCSTR)"Блок Trasser", MB_OK|MB_ICONERROR);
break;
}
if(count_err==100)//блокконтроляошибок
{
MessageBoxA (NULL,(LPCSTR)"Зацикливание", (LPCSTR)"Блок Trasser", MB_OK|MB_ICONERROR);
break;
}
if(count_point>=16)//блокконтроляошибок
{
MessageBoxA (NULL,(LPCSTR)"Переполнение trassa", (LPCSTR)"Блок Trasser", MB_OK|MB_ICONERROR);
break;
}
}//End while
sprintf(log_str,"<----> End Trasser A=%d B=%d\n",start,finish); //влогфайл
WriteLog(1);
return;
}
intTrass_Parent(intparent) //функцияустановкиновойточкиродителя *************************************************************
{
sprintf(log_str,"+++++Start Trasser_Parent =%d \n",parent); //влогфайл
WriteLog(1);
int _i,el;
//int Min_dist = 16;//номер элемента с минимальным F (инициализация вне области)
for(_i=0;_i<4;_i++)
{
el = mass_a[_i];
if(el!=-1)
{
sprintf(log_str,"<--------------------open_list___---------------->open_list poz=%d Direct=%d F =%d G =%d H=%d \n",open_list[el].Poz,open_list[el].Direct,open_list[el].F,open_list[el].G,open_list[el].H); //влогфайл
WriteLog(1);
if (Min_F >=open_list[el].F)
{
/*if(Min_H >=open_list[el].H)
Min_H = open_list[el].H;*/
if(open_list[el].Direct!=0)//исключаем напрвления с тупиками
{
Min_F = open_list[el].F;
parent = open_list[el].Poz;
}
}
}
}
sprintf(log_str,"+++++End Trasser_Parent =%d \n",parent); //влогфайл
WriteLog(1);
return parent;
}
boolCheck_Block_Position(intp)//проверказаблокированалиданнаяпозициявмассивеблокированныхэлементовn_block
{
bool result=false;//неблокирован
for(int _i=0;_i<16;_i++)
{
if(p==_i&&p==close_list[_i])//проверяем значение в закрытом списке (если заблокирован то элемен массива содержит этот индекс=р)
result=true;//блокирован
}
return result;
}
int Trasser_Area(static int aa)
{
sprintf(log_str,">>>>>>>>>>>>>>>>>>>>>>>Start Trasser_Area =%d \n",aa); //влогфайл
WriteLog(1);
int d=0;//кол-во направлений из этой точки
int _r;
if((aa-1)/4==(aa/4))//есть ли рядом слева элемент на той же строке
{
if(!Check_Block_Position(aa-1))//если элемент слева не блокирован
mass_a[0]=aa-1; //записываем он не блокирован
else
mass_a[0]=-1; //не записываем, он блокирован
}
else
mass_a[0] =-1;//елемента слева нет он за левой границей
if((aa+1)<=15&&(aa+1)/4==aa/4)//есть ли рядом справа элемент на той же строке
{
if(!Check_Block_Position(aa+1))//если элемент справа не блокирован
mass_a[1]=aa+1; //записываем он не блокирован
else
mass_a[1]=-1; //не записываем, он блокирован
}
else
mass_a[1] =-1;//елемента справа нет он за правой границей
if((aa-4)>=0)//есть ли над этим элементом элемент выше
{
if(!Check_Block_Position(aa-4))//если элемент сверху не блокирован
mass_a[2]=aa-4;//записываем он не блокирован
else
mass_a[2]=-1; //не записываем, он блокирован
}
else
mass_a[2] =-1;//елемента сверху нет он за верхней границей
if((aa+4)<=15)//есть ли над этим элементом элемент ниже
{
if(!Check_Block_Position(aa+4))//если элемент снизу не блокирован
mass_a[3]=aa+4;//записываем он не блокирован
else
mass_a[3]=-1; //не записываем, он блокирован
}
else
mass_a[3] =-1;//елемента снизу нет он за нижней границей
for(_r=0;_r<4;_r++)//подсчет числа направлений
{
if(mass_a[_r]!=-1)
d=d+1;
}
sprintf(log_str,"<<<<<<<<<<<<<<<<<<<End Trasser_Area Direct=%d \n",d); //влогфайл
WriteLog(1);
return d;
}
int Steps(int a1, int a2)//подсчет числа шагов к от одной точки к другой
{
sprintf(log_str,"____Start Steps a1=%d a2=%d \n",a1,a2); //влогфайл
WriteLog(1);
int step=0, tmp;
int count_err=0; //счетчикзацикливаниядляошибок
if (a2<a1)
{
tmp=a2;
a2=a1;
a1 =tmp;
}
while(a1!=a2)
{
if(a2>a1&&a1/4!=a2/4) //если а2 больше а1 и они в разных строках
{
a1=a1+4;//переходим на другую строку
step=step+1;//делаем шаг
}
if(a2>a1&&a1/4==a2/4) //если а2 больше а1 и они в одной строке
{
a1=a1+1;//переходим на другую ячейку
step=step+1;//делаемшаг
}
if(a2<a1)
{
a1=a1-1;
step=step+1;
}
if(count_err==1000)//блокконтроляошибок
{
MessageBoxA (NULL,(LPCSTR)"Зацикливание", (LPCSTR)"Блок Steps", MB_OK|MB_ICONERROR);
break;
}
count_err=count_err+1;
}
sprintf(log_str,"____End Steps step=%d \n",step); //влогфайл
WriteLog(1);
return step;
}
voidTrasser_Init(void) //инициализациямассивовдлятрассера
{
sprintf(log_str,"******Start Trasser_Init \n"); //влогфайл
WriteLog(1);
for(int _i=0;_i<16;_i++)//инициализациямассивов (-1)
{
close_list[_i]=-1;
if(map_15[_i]==_i)//если в массиве собр элементов уже есть элемент то переносим его в в закрытый лист
close_list[_i]=_i;//переносим элемент из массива сборки в массив закрытых при трассировке элементов
if(n_block[_i]==_i)//если в массиве блокировок уже есть элемент то переносим его в закрытый лист
close_list[_i]=_i;//переносим элемент из массива блокировки в массив закрытых при трассировке элементов
trassa[_i] =-1;//массив точек маршрута
//обнуляем массив открытый список точек
open_list[_i].F =0;
open_list[_i].G =0;
open_list[_i].H =0;
open_list[_i].Poz =0;
}
Min_F =100;
//mass_a{0};//массив окружения элемента
sprintf(log_str,"*******End Trasser_Init \n"); //влогфайл
WriteLog(1);
return;
}
voidMass_Init(void) //инициализацияосновныхмассивов
{
sprintf(log_str,"*******Start Mass_Init \n"); //влогфайл
WriteLog(1);
for(int _i=0;_i<16;_i++)//инициализациямассивов (-1)
{
map_15[_i] =-1; //массив сборки элементов
n_block[_i]=-1; //массив блокированных элементов
}
sprintf(log_str,"********End Mass_Init \n"); //влогфайл
WriteLog(1);
return;
}
void Set_ElementPosition(int number,int ni) //Поставитьчисловнужнуюпозицию
{
sprintf(log_str,">>>>Start Set_ElementPosition Element=%d on position =%d \n", number,ni); //влогфайл
WriteLog(1);
int poz_munber;
int n_column = ni%4;//вычисляемномерколонкидляпозиции
int n_line = ni/4;//вычисляем номер строки для позиции
int el_column;//номер колонки для элемента
int el_line;//номер строки для элемента
int count_err=0; //счетчик зацикливания для ошибок
poz_munber = FindElements(number);
if (ni==poz_munber)//если элемент на месте то возврат
return;
while(ni!=poz_munber)//выполняем пока не достигли нужной позиции
{
el_column = poz_munber%4;//вычисляем номер колонки для элемента
el_line = poz_munber/4;//вычисляем номер строки для элемента
if(el_column<n_column)//если позиция элемента слева от нужной колонки
{
close_list[poz_munber]=poz_munber;//блокируем эту точку перед позиционированием пробела
ZeroPositions(int(poz_munber+1));//устанавливаем пустую клетку справа
SwapElements(poz_munber); //меняем местами с пустой клеткой
Sleep(Delay_time);//задержка
close_list[poz_munber]=-1;//снимаем блокировку точки после позиционирования пробела
}
if(el_column>n_column)//если позиция элемента справа от нужной колонки
{
close_list[poz_munber]=poz_munber;//блокируем эту точку перед позиционированием пробела
ZeroPositions(int(poz_munber-1));//устанавливаем пустую клетку слева
SwapElements(poz_munber); //меняем местами с пустой клеткой
Sleep(Delay_time);//задержка
close_list[poz_munber]=-1;//снимаем блокировку точки после позиционирования пробела
}
if((el_column==n_column)&&(el_line>n_line))//если элемент находится в колонке но его позиция ниже нужной строки
{
close_list[poz_munber]=poz_munber;//блокируем эту точку перед позиционированием пробела
ZeroPositions(int(poz_munber-4));//устанавливаем пустую клетку сверху
SwapElements(poz_munber); //меняем местами с пустой клеткой
Sleep(Delay_time);//задержка
close_list[poz_munber]=-1;//снимаем блокировку точки после позиционирования пробела
}
if((el_column==n_column)&&(el_line<n_line))//если элемент находится в колонке но его позиция выше нужной строки
{
close_list[poz_munber]=poz_munber;//блокируем эту точку перед позиционированием пробела
ZeroPositions(int(poz_munber+4));//устанавливаем пустую клетку снизу
SwapElements(poz_munber); //меняем местами с пустой клеткой
Sleep(Delay_time);//задержка
close_list[poz_munber]=-1;//снимаем блокировку точки после позиционирования пробела
}
if(count_err==1000)//блок контроля ошибок
{
MessageBoxA (NULL,(LPCSTR)"Зацикливание", (LPCSTR)"Блок Set_ElementPosition", MB_OK|MB_ICONERROR);
break;
}
Trasser_Init();//инициализация массивов трассировки
poz_munber = FindElements(number);
count_err=count_err+1;
}
sprintf(log_str,"<<<<<Finish Set_ElementPosition Element=%d on position =%d \n", number,ni); //влогфайл
WriteLog(1);
return;
}
void WriteLog(int r)
{
FILE *file;
char* file_name = "log_15.log";
char load_string[50] = "none";
if(r==0)
{
file = fopen( file_name, "w" );
fputs( "", file );
}
if(r==1)
{
file = fopen( file_name, "a" );
fputs( log_str, file );
}
fclose( file );
return;
}
voidMass_Log(void)//сохранениемассивоввлогфайле
{
int _i;
sprintf(log_str,"------->mas------------------------------------\n"); //влогфайл
WriteLog(1);
for(_i=0;_i<16;_i++)
{
sprintf(log_str,"[%d]=%d ",_i,mas[_i]); //влогфайл
WriteLog(1);
}
sprintf(log_str,"\n------->n_block-------------------------------\n"); //влогфайл
WriteLog(1);
for(_i=0;_i<16;_i++)
{
sprintf(log_str,"[%d]=%d ",_i,n_block[_i]); //влогфайл
WriteLog(1);
}
sprintf(log_str,"\n------->map15----------------------------------\n"); //влогфайл
WriteLog(1);
for(_i=0;_i<16;_i++)
{
sprintf(log_str,"[%d]=%d ",_i, map_15[_i]); //влогфайл
WriteLog(1);
}
sprintf(log_str,"\n------->trassa----------------------------------\n"); //влогфайл
WriteLog(1);
for(_i=0;_i<16;_i++)
{
sprintf(log_str,"[%d]=%d ",_i,trassa[_i]); //влогфайл
WriteLog(1);
}
sprintf(log_str,"\n------->close_list------------------------------\n"); //влогфайл
WriteLog(1);
for(_i=0;_i<16;_i++)
{
sprintf(log_str,"[%d]=%d ",_i,close_list[_i]); //влогфайл
WriteLog(1);
}
sprintf(log_str,"\n------->open_list-------------------------------\n"); //влогфайл
WriteLog(1);
for(_i=0;_i<16;_i++)
{
sprintf(log_str,"[%d]=(Direct=%d, F=%d, G=%d, H=%d) ",_i,open_list[_i].Direct, open_list[_i].F,open_list[_i].G,open_list[_i].H ); //влогфайл
WriteLog(1);
}
return;
}
bool Make_Line_1(void)
{
static int coun_er=0;
static bool result = false;
Trasser_Init();//инициализация массивов
if(mas[0]==1 && mas[1]==2 && mas[2]==3 && mas[3]==4)//если 1,2,3,4 на свойх местах то нам повезло
{
map_15[0]=0;map_15[1]=1;map_15[2]=2;map_15[3]=3;//блокируем весь ряд он сложен
return true; //возвращаемся нам повезло!!!!
}
//сборка 1-горяда **************************************************************************************
Set_ElementPosition(1,0);
if(mas[0]==1)
map_15[0]=0; //блокируем ячейку 0 (с цифрой 1)
Trasser_Init();
Set_ElementPosition(2,1);
if(mas[1]==2)
map_15[1]=1; //блокируем ячейку 1 (с цифрой 2)
Trasser_Init();
if(mas[0]==1&&mas[1]==2)//Если первая и вторя ячейка на месте
{
L1:if(mas[2]==4)//Если цифра 4 случайно была установлена на позицию 2 тогда сдвигаем ее впоз 11, если этого не сделать, то она заблокируется в ряду и ее невозможно будет вынуть
Trasser_Init();
Set_ElementPosition(4,11);
Set_ElementPosition(3,3);
if(mas[3]==3)//Если ячейка 3 на месте
map_15[3]=3; //блокируем ячейку 3 (с цифрой 3)
Trasser_Init();
Set_ElementPosition(4,7);//ставим 4 вячейку 7
if(mas[7]==4)
map_15[7]=7; //блокируем ячейку 7 (с цифрой 4)
Trasser_Init();
if((mas[3]==3)&&(mas[7]==4))
{
ZeroPositions(2);//ставим пустую ячейку на ячейку 2
map_15[3]=-1; //снимаем блокировку с ячейки 3 (с цифрой 3)
map_15[7]=-1; //снимаем блокировку с ячейки 7 (с цифрой 4)
Trasser_Init();
SwapElements(3);//ставим 3 вячейку 2
Sleep(Delay_time);//задержка
SwapElements(7);//ставим 4 вячейку 3
Sleep(Delay_time);//задержка
if((mas[2]==3)&&(mas[3]==4))//если 3 и 4 всвоихячейках
{
map_15[2]=2; //блокируем ячейку 2 (с цифрой 3)
map_15[3]=3; //блокируем ячейку 3 (с цифрой 4)
Trasser_Init();
}
else
{
map_15[2]=-1; //разблокируем ячейку 2 (с цифрой 3)
map_15[3]=-1; //разблокируем ячейку 3 (с цифрой 4)
Trasser_Init();
goto L1;
}
}
}
Trasser_Init();
result=true;
sprintf(log_str,"\n------------>>>> 1-st row is built ! <<<<<<<<<---------------------\n"); //в лог файл
WriteLog(1);
return result;
}
bool Make_Line_2(void)
{
static int coun_er=0;//счетчикзацикливания
static bool result=false;
L0:if(mas[4]==5 && mas[5]==6 && mas[6]==7 && mas[7]==8)//еслиэлементы 5,6,7,8 насвойхместах
{
map_15[4]=4;map_15[5]=5;map_15[6]=6;map_15[7]=7;//блокируем весь ряд, он сложен
return true; //возвращаемся нам повезло!!!!
}
Trasser_Init();//инициализация массивов
//сборка 2-го ряда *******************************************************
//
//while(mas[4]!=5 && mas[5]!=6 && mas[6]!=7 && mas[7]!=8)//выполняем пока элементы 5,6,7,8 не будут на свойх местах
//{
L2:Set_ElementPosition(5,4);
if(mas[4]==5)
map_15[4]=4; //блокируем ячейку 4 (с цифрой 5)
Trasser_Init();
Set_ElementPosition(6,5);
if(mas[5]==6)
map_15[5]=5;//блокируем ячейку 5 (с цифрой 6)
Trasser_Init();
if(mas[4]==5 && mas[5]==6)//Если цифра 5 и 6 на месте то далее
{
L3:Set_ElementPosition(7,7);
if(mas[7]==7)
map_15[7]=7;//блокируем ячейку 7 (с цифрой 7)
Trasser_Init();
if(mas[6]==8)//Если цифра 8 случайно была установлена на позицию 6 тогда сдвигаем ее впоз 8, если этого не сделать, то она заблокируется в ряду и ее невозможно будет вынуть
{
map_15[6]=-1;
map_15[7]=-1;
Trasser_Init();
Set_ElementPosition(8,14);
goto L3;//переход на позиционирование цифры 7 в ячейку 7
}
Set_ElementPosition(8,11);//ставим 8 вячейку 11
if(mas[11]==8)
map_15[11]=11;//блокируем ячейку 11 (с цифрой 8)
Trasser_Init();
ZeroPositions(6);//ставим пустую ячейку на ячейку 6 //потом будем менять местами соседние ячейки
map_15[7]=-1; //снимаем блокировку с ячейки 7 (с цифрой 7)
map_15[11]=-1; //снимаем блокировку с ячейки 11 (с цифрой 8)
Trasser_Init();
SwapElements(7);//ставим 7 вячейку 6
Sleep(Delay_time);//задержка
SwapElements(11);//ставим 8 вячейку 7
Sleep(Delay_time);//задержка
if((mas[6]==7)&&(mas[7]==8))//если 7 и 8 всвоихячейках
{
map_15[6]=6; //блокируем ячейку 6 (с цифрой 7)
map_15[7]=7; //блокируем ячейку 7 (с цифрой 8)
}
Trasser_Init();
}
if(mas[4]==5&& mas[5]==6&& mas[6]==7&& mas[7]==8)// есливсеэлементынаместе
result =true;
else
{
Mass_Log();//запись состояния массивов в лог
map_15[4]=-1;map_15[5]=-1;map_15[6]=-1;map_15[7]=-1;//снимаем блокировку с элементов строки
Trasser_Init();
goto L2;//переход на начало сборки
}
coun_er=coun_er+1;//увеличиваем счетчик ошибок
if(coun_er>=10)
{
if(coun_er>=100)//если серьезная проблема то выход
{
Mass_Log();//запись состояния массивов в лог
MessageBoxA (NULL,(LPCSTR)"Зацикливание строка 2", (LPCSTR)"Блок Make_Line_2", MB_OK|MB_ICONERROR);
result =false;
}
goto L0;//пытаемся пройти снова
}
//}//end while
sprintf(log_str,"\n------------>>>> 2-st row is built ! <<<<<<<<<---------------------\n"); //в лог файл
WriteLog(1);
return result;
}
bool Make_Line_End(void)//Функциясборкиэлементов
{
bool result=false;
//map_15[8]=-1; map_15[12]=-1;map_15[9]=-1; map_15[10]=-1;map_15[11]=-1; map_15[13]=-1;map_15[14]=-1; map_15[15]=-1; //снимаемблокировкусобласти
int count_err1=0;//счетчикзацикливания
int count_err2=0;//счетчикзацикливания
//сборка остальных позиций *******************************************************
L4: if(mas[8]==9&&mas[9]==10&&mas[10]==11&&mas[11]==12&&mas[12]==13&&mas[13]==14&&mas[14]==15)// Если в раскладке числа 8-15 в ячейках 9-15 т.е не на своих местах
return true; //если все цифры на местах возвращаемся
if(mas[8]==9&&mas[9]==10&&mas[10]==11&&mas[11]==12&&mas[12]==13&&mas[13]==15&&mas[14]==14)// Если в раскладке числа 8-15 в ячейках 9-15 т.е не на своих местах
return false; //нерешаемаякомбинация
Trasser_Init();
if(!(mas[8]==9&&mas[12]==13))// Если в раскладке числа 9 и 13 в ячейках 8 и 12 т.е не на своих местах
{
if(!(mas[15]==9&&(mas[10]==13||mas[11]==13)))//проверка на блокированную расстановку
{
Set_ElementPosition(9,15);//ставим 9 в ячейку 15 (правый нижний угол)
map_15[15]=15; // блокируем ячейку 15 (с цифрой 9)
Trasser_Init();
if(mas[15]==9&&(mas[10]==13||mas[11]==13))//проверка на блокированную расстановку после позиционирования 9 в ячейку 15
goto L4;
Set_ElementPosition(13,8);//ставим 13 вячейку 8 (место 9)
map_15[8]=8; // блокируем ячейку 8 (с цифрой 13)
Trasser_Init();
Set_ElementPosition(9,9);//ставим 9 вячейку 9 (место 10)
map_15[15]=-1; // разблокируем ячейку 15
map_15[8]=-1; // разблокируем ячейку 8 (с цифрой 13)
Trasser_Init();
ZeroPositions(12);
SwapElements(8);
Sleep(Delay_time);//задержка
SwapElements(9);
Sleep(Delay_time);//задержка
map_15[8]=8; //блокируемячейку 8 (сцифрой 9)
map_15[12]=12; //блокируем ячейку 12 (с цифрой 13)
Trasser_Init();
}
else
{
map_15[15]=-1; //разблокируем ячейку 15 (с цифрой 9)
Trasser_Init();
Set_ElementPosition(13,8);//ставим 13 вячейку 8 (место 9)
map_15[8]=8; //блокируем ячейку 8 (с цифрой 13)
Set_ElementPosition(9,9);//ставим 9 в ячейку 9 (место 10)
map_15[9]=9; // блокируем ячейку 15 (с цифрой 9)
ZeroPositions(12);
map_15[8]=-1;map_15[9]=-1;
Trasser_Init();
SwapElements(8);
Sleep(Delay_time);//задержка
SwapElements(9);
Sleep(Delay_time);//задержка
map_15[8]=8; //блокируемячейку 8 (сцифрой 9)
map_15[12]=12; //блокируем ячейку 12 (с цифрой 13)
Trasser_Init();
}
}// Конец Если в раскладке числа 9 и 13 в ячейках 8 и 12 т.е не на своих местах
if(!(mas[8]==9&&mas[12]==13)) //если ячейки не попали на свои места то делаем все снова
goto L4;
//обрабатываем ячейки 9,10,11,13,14,15
L5:Set_ElementPosition(10,13);//ставим 10 в ячейку 13 (место числа 14) Загоняем "10" сначала на место "14"
Set_ElementPosition(10,15);//ставим 10 в ячейку 15 затем ее в правый нижний угол, чтобы выстроить правильную последовательность
Set_ElementPosition(11,15);//ставим 11 в ячейку 15 (там где стоит число 10)
Set_ElementPosition(10,15);//ставим 10 в ячейку 15 (в правый нижний угол)
Set_ElementPosition(11,14);//ставим 11 в ячейку 14 (место числа 15)
Set_ElementPosition(10,11);//поднимаем 10 вячейку 11
Set_ElementPosition(11,15);//под 10 ставим 11 вячейку 15
Set_ElementPosition(12,14);//12 ставимвячейку 14
SwapElements(11);
Sleep(Delay_time);//задержка
SwapElements(15);
Sleep(Delay_time);//задержка
SwapElements(14);
Sleep(Delay_time);//задержка
SwapElements(13);
Sleep(Delay_time);//задержка
SwapElements(9);
Sleep(Delay_time);//задержка
SwapElements(10);
Sleep(Delay_time);//задержка
SwapElements(11);
Sleep(Delay_time);//задержка
SwapElements(15);
Sleep(Delay_time);//задержка
count_err2=count_err2+1;
if (count_err2>4)
{
//MessageBoxA (NULL,(LPCSTR)"Зацикливаниеячейкимассива 9,10,11,13,14,15", (LPCSTR)"Блок Make_Line_End", MB_OK|MB_ICONERROR);
// goto L4; //переход обрабатываем ячейки 9,10,11,13,14,15
return false; //значит это нерешаемая ситуация
}
if(!(mas[8]==9&&mas[9]==10&&mas[10]==11&&mas[11]==12&&mas[12]==13))
goto L5;
//if(mas[14]==15||mas[13]==15)//если в конце комбинация 14,15 или 15,14 то все сложено
if(mas[8]==9&&mas[9]==10&&mas[10]==11&&mas[11]==12&&mas[12]==13&&mas[13]==14&&mas[14]==15)// Если в раскладке числа 8-15 в ячейках 9-15 т.е не на своих местах
result=true; //если все OK возвращаем истина
else
result=false; //нерешаемаякомбинация
return result;
}
Размещено на Allbest.ru
...Подобные документы
Технология дополненной реальности в обучении. Разработка информационной системы для выполнения практикумов по курсу "Электротехника". Приложения-помощники, использующие дополненную реальность. Моделирование информационной системы, обзор фреймворков.
дипломная работа [4,2 M], добавлен 18.11.2017Разработка лабораторных работ, организованных как программный продукт – электронный учебник. Обзор компаний-лидеров в производстве и поставке систем управления бизнесом, их основные продукты. Установка и конфигурирование SAP Business Intelligence.
дипломная работа [8,4 M], добавлен 20.03.2011Разработка алгоритма, выполняющего поиск наилучшего решения на каждый ход в игре "крестики-нолики" (используя минимальный алгоритм). Обоснование выбора программных средств для решения задачи. Блок-схема интеллектуального алгоритма реализации программы.
контрольная работа [380,0 K], добавлен 28.04.2014Изучение структуры информатики; основные понятия информационных процессов, их применение. Разработка методов и приемов выполнения лабораторных работ: тематическое содержание и цель, теоретические сведения по теме, перечень заданий и контрольных вопросов.
лабораторная работа [4,0 M], добавлен 12.02.2012Разработка программы, включающей все программы предыдущих лабораторных работ, информацию об авторе. Группировка программ, используя оператор вывода switch и созданные функции из программ лабораторных работ. Анализ реакции программы на сообщение об ошибке.
лабораторная работа [221,4 K], добавлен 23.11.2014Особенности и классификация обучающих программных средств обучения. Обзор методов обработки экспертной информации. Требования к программному комплексу лабораторных работ. Построение логической модели данных. Описание компьютерной реализации для студента.
дипломная работа [2,0 M], добавлен 19.01.2017Разработка популярной развлекательной игры крестики-нолики. Возможность играть с компьютером, который играет согласно созданному алгоритму. Новые возможности Visual Studio. Легкое усвоение программы. Удобный интерфейс - "визитная карточка" приложения.
курсовая работа [74,6 K], добавлен 20.12.2009Проект программы "Крестики-нолики". Блок-схема алгоритма. Описание работы программного продукта. Инструкция по инсталляции. Инструкция программисту, возможность доработки с целью упрощения исполняемых кодов. Инструкция по проверке и тестированию.
курсовая работа [235,8 K], добавлен 05.12.2009Обоснование необходимости разработки данных лабораторных работ. Основные средства измерения затухания методами светопропускания. Методы измерения оптической мощности. Разработка оболочки пакета программ. Оценка эффективности разработанных интерфейсов.
дипломная работа [3,8 M], добавлен 20.10.2013Алгоритм поиска по первому наилучшему совпадению на графе. Основные классы для поиска пути в лабиринте. Тестирование нахождения кратчайшего пути в лабиринте. Порядок обхода вершин. Тестирование поведения программы при отсутствии пути в лабиринте.
курсовая работа [888,7 K], добавлен 19.12.2013Возможность поиска информации в режиме продвинутого диалога на естественном языке. Системы с интеллектуальным интерфейсом. Экспертные, самообучающиеся и адаптивные системы. Интеллектуальные базы данных. Системы контекстной и когнитивной помощи.
презентация [224,2 K], добавлен 16.10.2013Разработка методического пособия по программному продукту GroupWise: инсталляции службы, возможности; лабораторные работы с GroupWise. Рекомендации по физиологии и охране труда в вычислительных центрах. Расчет затрат на проведение лабораторных работ.
дипломная работа [673,3 K], добавлен 06.07.2011Разработка консольного приложения: описание и сценарий использования программы, интерфейс пользователя. Поэтапное описание создание кода компьютерной игры "Крестики нолики". Функциональные и нефункциональные требования, описание исключительных ситуаций.
методичка [819,6 K], добавлен 12.05.2013Типы кластеров и анализ кластерных технологий. Принципы работы среды MPICH. Разработка рабочих заданий для лабораторных работ, программного обеспечения для лабораторного комплекса. Подготовка рабочих мест и описание хода выполнения лабораторных работ.
дипломная работа [3,7 M], добавлен 13.02.2016Разработка программы логической игры в "крестики-нолики" пять в ряд на поле размера 15х15 клеток с применением графики на языке Pascal с использованием объектно-ориентированного программирования. Структура алгоритма программы и описание ее работы.
курсовая работа [821,5 K], добавлен 13.02.2012Анализ и математическая постановка задачи. Описание алгоритма действий, структурной организации программы и ее программной реализации. Текст основной программы, модулей вывода текстовых файлов на экран, извлечения ехе-файлов и подсчёта лабораторных работ.
курсовая работа [28,1 K], добавлен 28.02.2011Создание программного обеспечения для моделирования компьютерных сетей, анализ задачи и формализация технического задания. Обоснование выбора симулятора для выполнения лабораторных работ "Знакомство со средой Cisco Packet Tracer", описание интерфейса.
дипломная работа [3,3 M], добавлен 16.07.2013Знакомство с интерфейсом пользователя и сценарием использования программы игры в крестики и нолики. Функциональные и нефункциональные требования для персонального компьютера. Исключительные ситуации и реакция программы. Пример кода игры и комментарии.
курсовая работа [236,5 K], добавлен 27.01.2014Программный продукт для игры "Крестики-нолики". Описание пользовательского интерфейса. Факт базы данных, определяющий состояние счёта. Предикат изменяющий состояние игрового процесса и подсчитывающий количество занятых ячеек поля. Исходный код программы.
курсовая работа [34,6 K], добавлен 19.05.2014Общая характеристика языков программирования. Краткий обзор C, C++, Java, PHP, Python, Delphi и Visual Basic. Процесс разработки программы игра "Крестики и нолики" с помощью AppWizard. Компиляция и компоновка модулей, определение интерфейса приложения.
курсовая работа [2,5 M], добавлен 27.05.2014