Кибор » Кибор - Интегрированная среда разработки ботов » Вопросы и решение проблем » Игра 3 в ряд

Страниц (10): В начало « ... 2 3 4 5 [6] 7 8 9 10 »
 

51. Kibor - 27 Сентября, 2018 - 10:23:54 - перейти к сообщению
Но там в принципе главное это функции
perebor и proverka
массив в котором записано должен называться
new int t[X][Y];
а каким образом он заполнится не важно.
можно и по поиску изображений.
52. konctantin777 - 27 Сентября, 2018 - 10:53:03 - перейти к сообщению
Значит так и сделаю. Но почему тест распознавания одно показывает, а файл другое...
53. Kibor - 27 Сентября, 2018 - 11:15:46 - перейти к сообщению
Не знаю. Настройки или зона не та. Или плохо обучена что другие фигуры не распознает.
54. konctantin777 - 27 Сентября, 2018 - 12:06:26 - перейти к сообщению
Вот как вы это понимаете ??? У меня уже мозг вспух пытаясь совместить )
(Добавление)
Подскажите, что то не получается заполнить массив... Ща взорвусь!
function coord(int aa, int ii, int #zz)
{
for(int j=0;j<aa;j++)
{
if(zz<size_field)
{
arr[zz][0]=posX[j]; // координата X
arr[zz][1]=posY[j]; // координата Y
arr[zz][2]=ii; // номер картинки
zz++;
t[posX[j]][posY[j]]=ii;
}
}
}
55. Kibor - 27 Сентября, 2018 - 14:29:29 - перейти к сообщению
Короче вот готовая функция нахождения лучшего хода.
А как уже сканируют экран не важно.


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

Это надо сохранить в файл и назвать как угодно. К примеру Лучший_ход.txt
CODE:
function perebor(int #t, int X, int Y, int #kx1, int #ky1, int #kx2, int #ky2)//Перебирает все возможные комбинации меняя соседнте фишки
{
int adr=address(#t[0][0]);
int tp;
int Max=-1;
int tMax=-1;
int x, y;
for (y=1; y<Y-1; y++)
{
for (x=1; x<X-1; x++)
{
//Делаем ход меняя x на x-1
tp=t[x][y];
t[x][y]=t[x-1][y];
t[x-1][y]=tp;
Max=proverka(X, Y, adr);//Оцениваем полученную ситуацию
if (Max>=tMax){tMax=Max; kx1=x; ky1=y; kx2=x-1; ky2=y;}//Если оценка больше предыдущей, записываем координаты и оценку сохраняем.
//Меняем назад на исходную.
tp=t[x][y];
t[x][y]=t[x-1][y];
t[x-1][y]=tp;

tp=t[x][y];
t[x][y]=t[x+1][y];
t[x+1][y]=tp;
Max=proverka(X, Y, adr);
if (Max>=tMax){tMax=Max; kx1=x; ky1=y; kx2=x+1; ky2=y;}
tp=t[x][y];
t[x][y]=t[x+1][y];
t[x+1][y]=tp;

tp=t[x][y];
t[x][y]=t[x][y-1];
t[x][y-1]=tp;
Max=proverka(X, Y, adr);
if (Max>=tMax){tMax=Max; kx1=x; ky1=y; kx2=x; ky2=y-1;}
tp=t[x][y];
t[x][y]=t[x][y-1];
t[x][y-1]=tp;

tp=t[x][y];
t[x][y]=t[x][y+1];
t[x][y+1]=tp;
Max=proverka(X, Y, adr);
if (Max>=tMax){tMax=Max; kx1=x; ky1=y; kx2=x; ky2=y+1;}
tp=t[x][y];
t[x][y]=t[x][y+1];
t[x][y+1]=tp;
}
}
return tMax;
}


function proverka(int X, int Y, int mas)//Оценивает после замены ситуацию. Находит все совпавшие линии ровные присваивая им оценку равную кол фишек.
{
int Ocenka;
int tOcenka=-1;
int x, y;
for (x=0; x<X; x++)
{
Ocenka=1;
for (y=0; y<Y-1; y++)
{
if (addressi(mas+(x*Y+y)*4)==addressi(mas+(x*Y+y+1)*4))Ocenka++;
else Ocenka=1;
if (Ocenka>tOcenka)tOcenka=Ocenka;
}
}

for (y=0; y<Y; y++)
{
Ocenka=1;
for (x=0; x<X-1; x++)
{
if (addressi(mas+(x*Y+y)*4)==addressi(mas+((x+1)*Y+y)*4))Ocenka++;
else Ocenka=1;
if (Ocenka>tOcenka)tOcenka=Ocenka;
}
}
return tOcenka;
}


Это его использование в своем скрипте
CODE:
#include "C:\Лучший_ход.txt"//В начале скрипта

int X=7, Y=8;//Размерность поля


/*
Массив с типами фигур. Заполнить любыми числами по типу и любым способом
Координаты фишек надо хранить так же в двухмерных массивах. Пример:
new int fX[X][Y];//Координаты X фишек
new int fY[X][Y];//Координаты Y фишек
*/
new int mas[X][Y];



/*
Индексы заменяемых массивов. kx1 ky1 меняется на kx2 ky2
то есть фишки с координатами fX[kx1][ky1] fY[kx1][ky1] и fX[kx2][ky2] fY[kx2][ky2] поменяются местами
*/
int kx1, ky1, kx2, ky2;


/*
//Использование
if (perebor(#mas[0][0], X, Y, #kx1, #ky1, #kx2, #ky2)>2)//Есть замена
{
//Тут поменять местами фишки.
messagebox ("Есть замена "+format(kx1)+" " +format(ky1)+" -" +format(mas[kx1][ky1])+" на "+format(kx2)+" " +format(ky2)+" -" +format(mas[kx2][ky2]));
}
*/






//Тест с файла (убрать после весь ниже код)
if (fopen ("c:\Исходник.txt", "r")!=0)//В этом файле массив 7 на 8 заполнен цифрами которые соответствуют фишкам
{
for(int n1=0; n1<Y; n1++)
{
for(int n=0; n<X; n++)
{ fread(mas[n][n1]);
}
}
fclose();//закрываем файл
}

int L=perebor(#mas[0][0], X, Y, #kx1, #ky1, #kx2, #ky2);
//Покажет лучший результат замены
messagebox ("Лучший ход на "+format(L)+" Заменить "+format(kx1)+" " +format(ky1)+" -" +format(mas[kx1][ky1])+" на "+format(kx2)+" " +format(ky2)+" -" +format(mas[kx2][ky2]));



Сам файл теста примерно такой
CODE:
0 1 2 3 4 5 2
2 3 1 1 2 5 3
1 5 1 7 5 9 2
5 5 2 1 5 5 2
4 3 2 5 2 0 5
0 6 1 4 5 6 1
5 5 5 2 5 5 5
0 5 4 5 5 1 5





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






А это быстрее, но с глобальной одной переменной.
mas_pole. Такое имя должно быть массива в котором хранятся фишки.

Это надо сохранить в файл и назвать как угодно. К примеру Лучший_ход.txt
CODE:
function perebor(int X, int Y, int #kx1, int #ky1, int #kx2, int #ky2)//Перебирает все возможные комбинации меняя соседнте фишки
{
int tp;
int Max=-1;
int tMax=-1;
int x, y;
for (y=1; y<Y-1; y++)
{
for (x=1; x<X-1; x++)
{
//Делаем ход меняя x на x-1
tp=mas_pole[x][y];
mas_pole[x][y]=mas_pole[x-1][y];
mas_pole[x-1][y]=tp;
Max=proverka(X, Y);//Оцениваем полученную ситуацию
if (Max>=tMax){tMax=Max; kx1=x; ky1=y; kx2=x-1; ky2=y;}//Если оценка больше предыдущей, записываем координаты и оценку сохраняем.
//Меняем назад на исходную.
tp=mas_pole[x][y];
mas_pole[x][y]=mas_pole[x-1][y];
mas_pole[x-1][y]=tp;

tp=mas_pole[x][y];
mas_pole[x][y]=mas_pole[x+1][y];
mas_pole[x+1][y]=tp;
Max=proverka(X, Y);
if (Max>=tMax){tMax=Max; kx1=x; ky1=y; kx2=x+1; ky2=y;}
tp=mas_pole[x][y];
mas_pole[x][y]=mas_pole[x+1][y];
mas_pole[x+1][y]=tp;

tp=mas_pole[x][y];
mas_pole[x][y]=mas_pole[x][y-1];
mas_pole[x][y-1]=tp;
Max=proverka(X, Y);
if (Max>=tMax){tMax=Max; kx1=x; ky1=y; kx2=x; ky2=y-1;}
tp=mas_pole[x][y];
mas_pole[x][y]=mas_pole[x][y-1];
mas_pole[x][y-1]=tp;

tp=mas_pole[x][y];
mas_pole[x][y]=mas_pole[x][y+1];
mas_pole[x][y+1]=tp;
Max=proverka(X, Y);
if (Max>=tMax){tMax=Max; kx1=x; ky1=y; kx2=x; ky2=y+1;}
tp=mas_pole[x][y];
mas_pole[x][y]=mas_pole[x][y+1];
mas_pole[x][y+1]=tp;
}
}
return tMax;
}


function proverka(int X, int Y)//Оценивает после замены ситуацию. Находит все совпавшие линии ровные присваивая им оценку равную кол фишек.
{
int Ocenka;
int tOcenka=-1;
int x, y;
for (y=0; y<Y; y++)
{
Ocenka=1;
for (x=0; x<X-1; x++)
{
if (mas_pole[x][y]==mas_pole[x+1][y])Ocenka++;
else Ocenka=1;
if (Ocenka>tOcenka)tOcenka=Ocenka;
}
}

for (x=0; x<X; x++)
{
Ocenka=1;
for (y=0; y<Y-1; y++)
{
if (mas_pole[x][y]==mas_pole[x][y+1])Ocenka++;
else Ocenka=1;
if (Ocenka>tOcenka)tOcenka=Ocenka;
}
}
return tOcenka;
}







Это его использование в своем скрипте
CODE:
#include "C:\Лучший_ход.txt"//В начале скрипта

int X=7, Y=8;//Размерность поля


/*
Массив с типами фигур. Заполнить любыми числами по типу и любым способом
Координаты фишек надо хранить так же в двухмерных массивах. Пример:
new int fX[X][Y];//Координаты X фишек
new int fY[X][Y];//Координаты Y фишек
*/
new int mas_pole[X][Y];//ОБЯЗАТЕЛЬНО с ТАКИМ ИМЕНЕМ, так как тут она используется глобально в коде нахождения лучшего хода



/*
Индексы заменяемых массивов. kx1 ky1 меняется на kx2 ky2
то есть фишки с координатами fX[kx1][ky1] fY[kx1][ky1] и fX[kx2][ky2] fY[kx2][ky2] поменяются местами
*/
int kx1, ky1, kx2, ky2;






/*
//Использование
if (perebor(X, Y, #kx1, #ky1, #kx2, #ky2)>2)//Есть замена
{
//Тут поменять местами фишки.
messagebox ("Есть замена "+format(kx1)+" " +format(ky1)+" -" +format(mas[kx1][ky1])+" на "+format(kx2)+" " +format(ky2)+" -" +format(mas[kx2][ky2]));
}
*/






//Тест с файла (убрать после весь ниже код)
if (fopen ("c:\Исходник.txt", "r")!=0)//В этом файле массив 7 на 8 заполнен цифрами которые соответствуют фишкам
{
for(int n1=0; n1<Y; n1++)
{
for(int n=0; n<X; n++)
{
fread(mas_pole[n][n1]);
}
}
fclose();//закрываем файл
}

int L=perebor(X, Y, #kx1, #ky1, #kx2, #ky2);
//Покажет лучший результат замены
messagebox ("Лучший ход на "+format(L)+" Заменить "+format(kx1)+" " +format(ky1)+" -" +format(mas_pole[kx1][ky1])+" на "+format(kx2)+" " +format(ky2)+" -" +format(mas_pole[kx2][ky2]));
56. konctantin777 - 28 Сентября, 2018 - 12:31:51 - перейти к сообщению
Zireael , У меня только твой код (по скученности) всё находит и в файл ок записывает. Подскажи как заполнить int mas_pole[X][Y]; ? Почему то добавление mas_pole[posX[j]][posY[j]]==ii; не работает....



function coord(int aa, int ii, int #zz)
{
for(int j=0;j<aa;j++)
{
if(zz<size_field)
{
arr[zz][0]=posX[j]; // координата X
arr[zz][1]=posY[j]; // координата Y
arr[zz][2]=ii; // номер картинки
mas[posX[j]][posY[j]]==ii;
zz++;

}
}
}
57. Zireael - 28 Сентября, 2018 - 13:01:30 - перейти к сообщению
 Цитата:
Почему то добавление mas_pole[posX[j]][posY[j]]==ii; не работает....

CODE:
new int field[row][col]; // поле

Во всем скрипте переименовать массив field в mas_pole.
58. Zireael - 29 Сентября, 2018 - 11:30:00 - перейти к сообщению
 Цитата:
совместить Ваш код с кодом от Кибора

code (Отобразить)
59. konctantin777 - 29 Сентября, 2018 - 11:43:28 - перейти к сообщению
Спасибище !
60. Zireael - 29 Сентября, 2018 - 16:17:40 - перейти к сообщению
 Цитата:
function proverka(int X, int Y, int mas)//Оценивает после замены ситуацию. Находит все совпавшие линии ровные присваивая им оценку равную кол фишек.

Тоже самое в 1.5 раза быстрее (Отобразить)

Powered by ExBB FM 1.0 Final