Ищу Бот 3 в ряд.
Рыцари и принцессы
В игре присутствуе вторичная игра ферма в которой 3 в ряд горит неймоверно.
Перепробовал кликерман бот на его основе оказался кривоват и горы танцев с бубном.
Кибор тоже самое.
Брал за основу и начал переделывать на с++ но нервов не хватило очень много платформо зависимого кода 32 бита.
[Ссылки могут видеть только зарегистрированные пользователи. ]
Если тут не помогут сяду буду штурмовать js и делать что то более гибкое.
Можно лс если у кого есть готовое что то но боитесь фикса.
Что не получилось?)
Там даже есть готовый скрипт для игры 3 в ряд. Так же его можно и протестировать прямо там.
Переделать просто под свою игру..
[Ссылки могут видеть только зарегистрированные пользователи. ]
[Ссылки могут видеть только зарегистрированные пользователи. ]
Набросал скрипт для Кибор, который определяет лучший ход не поиском забитых позиций, а путем перебора всех ходов и определения лучшей оценки (примерно как минимакс, только с одним шагом и без ответа противника)).
Скрипт подходит для любой игры и не зависит от количества клеток.
В скрипте только определение хода.
Это надо сохранить в файл и назвать как угодно. К примеру Лучший_ход.txt
Код:
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;
}
Это его использование в своем скрипте
Код:
#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]));
А это побыстрее, но с одной глобальной переменной, которая должна обязательно называться так как в скрипте
mas_pole. Такое имя должно быть массива в котором хранятся фишки.
Это надо сохранить в файл и назвать как угодно. К примеру Лучший_ход.txt
Код:
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;
}
Это его использование в своем скрипте
Код:
#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]));
Для теста надо создать файл c:\Исходник.txt и заполнить его числами по типу фишек 7 на 8 (или другими и поменять размер в скрипте)