а где тот скрипт кликермана который все уже просчитывает?
покажите.
41. Kibor - 27 Сентября, 2018 - 04:01:49 - перейти к сообщению
42. konctantin777 - 27 Сентября, 2018 - 04:04:54 - перейти к сообщению
(для просмотра ссылки Вам необходимо авторизоваться)
43. Kibor - 27 Сентября, 2018 - 04:59:32 - перейти к сообщению
Нет уж.
Ок. Чуть позже освобожусь и набросаю как вообще надо делать логику для таких задач.
А то что случится если вдруг мы перебором вручную решим делать бот для шахмат))
Ок. Чуть позже освобожусь и набросаю как вообще надо делать логику для таких задач.
А то что случится если вдруг мы перебором вручную решим делать бот для шахмат))
44. konctantin777 - 27 Сентября, 2018 - 05:41:21 - перейти к сообщению
Ну... Надо просто придумать как оптимизировать...
Ну... И человека который сможет это придумать
Ну... И человека который сможет это придумать
45. Kibor - 27 Сентября, 2018 - 06:12:38 - перейти к сообщению
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;
}
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;
}
{
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;
}
46. konctantin777 - 27 Сентября, 2018 - 08:56:00 - перейти к сообщению
Я уже говорил, что кибор 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);
/////
(Добавление)
(Добавление)(для просмотра ссылки Вам необходимо авторизоваться)
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);
/////
(Добавление)
(Добавление)(для просмотра ссылки Вам необходимо авторизоваться)
47. Kibor - 27 Сентября, 2018 - 09:55:03 - перейти к сообщению
Зона правильная?
48. konctantin777 - 27 Сентября, 2018 - 09:59:38 - перейти к сообщению
Из распознавания текста брал. Потом ещё шпионом проверил
(Добавление)
readtext (NUM, #T[0], 2, -1, -1, -1, -1, #Color_Text[0], #Color_Fon[0], 14, -1, 173, 325, 639, 791, -1);
Отсюда брал координаты. Галочка стояла "экран"
(Добавление)
readtext (NUM, #T[0], 2, -1, -1, -1, -1, #Color_Text[0], #Color_Fon[0], 14, -1, 173, 325, 639, 791, -1);
Отсюда брал координаты. Галочка стояла "экран"
49. Kibor - 27 Сентября, 2018 - 10:07:46 - перейти к сообщению
int X=8;
int Y=8;
там вообще то 7.
(Добавление)
Просто скопируйте код и измените зону.
int Y=8;
там вообще то 7.
(Добавление)
Просто скопируйте код и измените зону.
50. konctantin777 - 27 Сентября, 2018 - 10:12:57 - перейти к сообщению
Уже. Как не заработало,- сменил на 7 и зону сделал 7 на 7 клеток.