Kibor |
Отправлено: 27 Сентября, 2018 - 14:12:38
|
Эксперт
Просматривает форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
konctantin777 пишет: Надо просто придумать как оптимизировать...
Это придумано еще до нас. Называется минимакс.
Используется в шахматных и подобных программах.
Принцип - делаем ход за себя и за противника. Оцениваем ситуацию.
Делаем ход еще за себя и за противника - оцениваем. И так перебираем все дерево ходов на нную величину. Выбираем первый ход с лучшей оценкой в конце.
Смысл перебрать все полностью ходы (если без оптимизации) за себя и за противника.
При оценке наши преимущества дают нам+, преимущества противника дают нам -. Тут вариации как будет идти оценка.
Набросал примитивный код с похожим принципом. Ну конечно за противника не ходит)
function perebor()//Перебирает все возможные комбинации меняя соседние фишки
При каждом ходе на поле появляется новая позиция.
Эта позиция оценивается функцией
function proverka()//Оценивает после замены ситуацию. Находит все совпавшие линии ровные присваивая им оценку равную кол фишек.
которая возвращает тем больше оценку, чем длиннее найдена линия из фишек.
Благодаря сравнению оценок >= в функции perebor в приоритете нижние позиции.
Особо не тестировал и не оптимизировал.
CODE:pause(1000);
int X=7;
int Y=7;
int SX=78, SY=129, FX=243, FY=294;
new int m[X][Y];
new int Xm[X][Y];
new int Ym[X][Y];
new string T[Y];
int kx1, ky1, kx2, ky2;
int x, y;
int x1, y1;
int x2, y2;
new int t[X][Y];
enablerealmouse(10, 0, 0, 0);
loadsymbolbase ("C:\3_v_ryad\Новая база.sib");
int Color_Fon[6];
Color_Fon[0]=102; Color_Fon[1]=11369000; Color_Fon[2]=12352582; Color_Fon[3]=13474616;
Color_Fon[4]=12431005; Color_Fon[5]=6704179;
loop()
{
readtext (NUM, #T[0], 2, -1, -1, -1, -1, -1, #Color_Fon[0], 14, -1, SX, SY, FX, FY, -1);
raschet();
perebor();
//messagebox (perebor());
/////
mousedown(LEFT, Xm[kx1][ky1], Ym[kx1][ky1]);
pause(1000);
mouseup(LEFT, Xm[kx2][ky2], Ym[kx2][ky2]);
sleep(200);
mousemove(10, 10);
/////
/*
/////
if (fopen ("c:\5.txt", "w")!=0)
{
for (y=0; y<Y; y++)
{
for (x=0; x<X; x++)
{
fwrite(m[x][y]);fwrite(" ");
}
fwrite(ENDL);
}
fclose();
}
/////
*/
pause(3000);
}
//01 23 5 2 1
function raschet()
{
int x1=0, y1=0;
char C[50];
int siz;
for (y=0; y<Y; y++)
{
strcpy(#C[0], T[y]);
siz=size(#C[0]);
for (x=0; x<siz; x++)
{
if (C[x]!=' ' && symbolcorrect(y, x)>0.5)
{
m[x1][y1]=formatsn(C[x]);
Xm[x1][y1]=SX+symbolxpos(y, x)+symbolwidth(y, x)/2;
Ym[x1][y1]=SY+symbolypos(y, x)-symbolheight(y, x)/2;
x1++;
if (x1>X-1)
{
x1=0;
y1++;
}
}
}
}
}
function perebor()//Перебирает все возможные комбинации меняя соседнте фишки
{
int tp;
int Max=-1;
int tMax=-1;
for (y=1; y<Y-1; y++)
{
for (x=1; x<X-1; x++)
{
//for (y1=0; y1<Y; y1++){for (x1=0; x1<X; x1++){t[x1][y1]=m[x1][y1];}}//Возвращаем массив t в исходную позицию фишек
//Делаем ход меняя x на x-1
tp=t[x][y];
t[x][y]=t[x-1][y];
t[x-1][y]=tp;
Max=proverka();//Оцениваем полученную ситуацию
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;
//for (y1=0; y1<Y; y1++){for (x1=0; x1<X; x1++){t[x1][y1]=m[x1][y1];}}
tp=t[x][y];
t[x][y]=t[x+1][y];
t[x+1][y]=tp;
Max=proverka();
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;
//for (y1=0; y1<Y; y1++){for (x1=0; x1<X; x1++){t[x1][y1]=m[x1][y1];}}
tp=t[x][y];
t[x][y]=t[x][y-1];
t[x][y-1]=tp;
Max=proverka();
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;
//for (y1=0; y1<Y; y1++){for (x1=0; x1<X; x1++){t[x1][y1]=m[x1][y1];}}
tp=t[x][y];
t[x][y]=t[x][y+1];
t[x][y+1]=tp;
Max=proverka();
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;
}
}
//textout(0, 100, 50, format(tMax), 0);
return tMax;
}
function proverka()//Оценивает после замены ситуацию. Находит все совпавшие линии ровные присваивая им оценку равную кол фишек.
{
int Ocenka;
int tOcenka=-1;
for (y2=0; y2<Y; y2++)
{
Ocenka=1;
for (x2=0; x2<X-1; x2++)
{
if (t[x2][y2]==t[x2+1][y2])Ocenka++;
else Ocenka=1;
if (Ocenka>tOcenka)tOcenka=Ocenka;
}
}
for (x2=0; x2<X; x2++)
{
Ocenka=1;
for (y2=0; y2<Y-1; y2++)
{
if (t[x2][y2]==t[x2][y2+1])Ocenka++;
else Ocenka=1;
if (Ocenka>tOcenka)tOcenka=Ocenka;
}
}
return tOcenka;
}
(Добавление)
Подредактировал perebor. Чуть оптимизировал
CODE:function perebor()//Перебирает все возможные комбинации меняя соседнте фишки
{
int tp;
int Max=-1;
int tMax=-1;
for (y=1; y<Y-1; y++)
{
for (x=1; x<X-1; x++)
{
//for (y1=0; y1<Y; y1++){for (x1=0; x1<X; x1++){t[x1][y1]=m[x1][y1];}}//Возвращаем массив t в исходную позицию фишек
//Делаем ход меняя x на x-1
tp=t[x][y];
t[x][y]=t[x-1][y];
t[x-1][y]=tp;
Max=proverka();//Оцениваем полученную ситуацию
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;
//for (y1=0; y1<Y; y1++){for (x1=0; x1<X; x1++){t[x1][y1]=m[x1][y1];}}
tp=t[x][y];
t[x][y]=t[x+1][y];
t[x+1][y]=tp;
Max=proverka();
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;
//for (y1=0; y1<Y; y1++){for (x1=0; x1<X; x1++){t[x1][y1]=m[x1][y1];}}
tp=t[x][y];
t[x][y]=t[x][y-1];
t[x][y-1]=tp;
Max=proverka();
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;
//for (y1=0; y1<Y; y1++){for (x1=0; x1<X; x1++){t[x1][y1]=m[x1][y1];}}
tp=t[x][y];
t[x][y]=t[x][y+1];
t[x][y+1]=tp;
Max=proverka();
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;
}
}
textout(0, 100, 50, format(tMax), 0);
return tMax;
} |
|
|
konctantin777 |
Отправлено: 27 Сентября, 2018 - 16:56:00
|
Эксперт
Покинул форум
Сообщений всего: 1152
Дата рег-ции: Окт. 2017
Откуда: Архангельск
Репутация: 6
|
Я уже говорил, что кибор The Best ? )) Только у меня, наверное, карма испорчена.. Опять ошибается.. Тест распознавания 100%. Вручную ходил- скрин экрана- тест распознавания- всё сходится... А в файл уже неправильно записывает... Изменил только начало кода
pause(1000);
int X=8;
int Y=8;
int SX=173, SY=325, FX=639, FY=791;
new int m[X][Y];
new int Xm[X][Y];
new int Ym[X][Y];
new string T[Y];
int kx1, ky1, kx2, ky2;
int x, y;
int x1, y1;
int x2, y2;
new int t[X][Y];
//
enablerealmouse(10, 0, 0, 0);
string Text;
loadsymbolbase ("C:\3_v_ryad\1.sib"
int Color_Text[17];
Color_Text[0]=3757551; Color_Text[1]=2891195; Color_Text[2]=3289550; Color_Text[3]=1643670; Color_Text[4]=6778768; Color_Text[5]=8688568; Color_Text[6]=10618712; Color_Text[7]=14072866; Color_Text[8]=13336625; Color_Text[9]=12984410; Color_Text[10]=4726964; Color_Text[11]=1481543; Color_Text[12]=1081383; Color_Text[13]=3062241; Color_Text[14]=12392841; Color_Text[15]=5058532; Color_Text[16]=460974;
int Color_Fon[4];
Color_Fon[0]=7367537; Color_Fon[1]=5525842; Color_Fon[2]=13547140; Color_Fon[3]=12695965;
loop()
{
readtext (NUM, #T[0], 2, -1, -1, -1, -1, #Color_Text[0], #Color_Fon[0], 14, -1, 173, 325, 639, 791, -1);
raschet();
perebor();
//messagebox (perebor());
/////
mousedown(LEFT, Xm[kx1][ky1], Ym[kx1][ky1]);
pause(1000);
mouseup(LEFT, Xm[kx2][ky2], Ym[kx2][ky2]);
sleep(200);
mousemove(10, 10);
/////
(Добавление)
(Добавление)
https://yadi.sk/i/5S_uc_oQk9GU1Q(Отредактировано автором: 27 Сентября, 2018 - 17:07:38) |
|
|
konctantin777 |
Отправлено: 27 Сентября, 2018 - 17:59:38
|
Эксперт
Покинул форум
Сообщений всего: 1152
Дата рег-ции: Окт. 2017
Откуда: Архангельск
Репутация: 6
|
Из распознавания текста брал. Потом ещё шпионом проверил
(Добавление)
readtext (NUM, #T[0], 2, -1, -1, -1, -1, #Color_Text[0], #Color_Fon[0], 14, -1, 173, 325, 639, 791, -1);
Отсюда брал координаты. Галочка стояла "экран"(Отредактировано автором: 27 Сентября, 2018 - 17:59:53) |
|
|
|