Bukhtik
16.10.2001, 03:37
Написал шашки
users.i.com.ua/~bukhtik/checkers/checkers.html (http://users.i.com.ua/~bukhtik/checkers/checkers.html) и вроде как все должно быть хорошо т.к. ничего в них сложного нет, ан не тут то было :(.
10 раз проверил алгоритм т.к. в определенный момент почему то не хочет убирать шашку с поля и виновник был найден - при проверке всех возможных ходов шашек
(Цель =
1. Найти может ли еще человек ходить или все шашки заперты
2. Проверить ситуацию "Бить обязан")
используется цикл вида (8*8 - всего 64 :( ):
RedMustJump = new Array();
BlueMustJump = new Array();
BlueCanMove = false;
RedCanMove = false;
for (i = 0; i<8; i++) {
for (j = 0; j<8; j++) {
name2=getname(i, j);
if (name2<>0) {
MustJump(i, j, 0);
MustJump(i, j, 1);
MustJump(i, j, 2);
MustJump(i, j, 3);
}
}
}
Масивы хранят после отработки функции MustJump инстансы шашек которые могут бить.
Функция MustJump:
function MustJump (x, y, direction) {
checkPoint = new Array();
secondcheckPoint = new Array();
checkPoint[0] = x;
secondcheckPoint[0] = x;
checkPoint[1] = y;
secondcheckPoint[1] = y;
if (direction == 0) {
// blue
checkPoint[1]++;
checkPoint[0]++;
secondCheckPoint[1] += 2;
secondCheckPoint[0] += 2;
} else if (direction == 1) {
// blue
checkPoint[0]++;
checkPoint[1]--;
secondCheckPoint[0] += 2;
secondCheckPoint[1] -= 2;
} else if (direction == 2) {
// red
checkPoint[0]--;
checkPoint[1]--;
secondCheckPoint[0] -= 2;
secondCheckPoint[1] -= 2;
} else if (direction == 3) {
// red
checkPoint[0]--;
checkPoint[1]++;
secondCheckPoint[0] -= 2;
secondCheckPoint[1] += 2;
}
_level0.MustJump = 1;
name1=getname(x, y, true);
if ((checkPoint[0]>7) || (checkPoint[0]<0) || (checkPoint[1]>7) || (checkPoint[1]<0)) {
_level0.MustJump = 0;
}
if (eval(name1+".crown._visible") == false) {
if (name2 == -1) {
if (direction == 0 || direction == 1) {
_level0.MustJump = 0;
}
} else if (direction == 2 || direction == 3) {
_level0.MustJump = 0;
}
}
if (_level0.MustJump<>0) {
if ((secondcheckPoint[0]<7) || (secondcheckPoint[0]>0) || (secondcheckPoint[1]<7) || (secondcheckPoint[1]>0)) {
if ((name2<>getname(checkPoint[0], checkPoint[1])) && (getname(checkPoint[0], checkPoint[1])<>0)) {
if (getname(secondcheckPoint[0], secondcheckPoint[1]) == 0) {
if (name2 == -1) {
RedCanMove = true;
RedMustJump[RedMustJump.length] = name1;
} else {
BlueCanMove = true;
BlueMustJump[BlueMustJump.length] = name1;
}
}
}
}
if ((getname(checkPoint[0], checkPoint[1]) == 0) && ((RedCanMove == false) || (BlueCanMove == false))) {
if (name2 == -1) {
RedCanMove = true;
} else {
BlueCanMove = true;
}
}
}
}
Пояснения: getname() - функция возвращает с заданным 3 параметром true имя инстанса с false - тип клетки поля: 1 - синяя шашка, -1 - красная, 0 - не занята. Переменные name2 и name1 можно и не использовать, но опыты показали что с их помощью тормозит чуть меньше (вызывается getname() один раз, а не несколько)
Проблемма приведенный выше цикл дает задержку 3-5 сек (Celeron-466), + иногда таки перегружает (как мне кажется) флеш и он не убирает убитую шашку с поля.
Проверялось:
1. Убирал цикл => нет задержки
2. Повторял по ходам с трейсом ситуацию когда шашка не убирается с поля 1 раз не убирает, при повторе 10 раз ситуации убирает... (т.е. не убирает "случайным" образом)
3. Пробовал зациклить функцию, которая убирает шашку с поля путем проверки в конце ее а убрана ли шашка с последующим вызовом самой себя при отрицательном ответе - безрезультатно, флеш упорно выдает что все ок и шашка убрана :(.
ЗЫ сорри за столь длинный пост, но хотелось обьяснить все подробно.
users.i.com.ua/~bukhtik/checkers/checkers.html (http://users.i.com.ua/~bukhtik/checkers/checkers.html) и вроде как все должно быть хорошо т.к. ничего в них сложного нет, ан не тут то было :(.
10 раз проверил алгоритм т.к. в определенный момент почему то не хочет убирать шашку с поля и виновник был найден - при проверке всех возможных ходов шашек
(Цель =
1. Найти может ли еще человек ходить или все шашки заперты
2. Проверить ситуацию "Бить обязан")
используется цикл вида (8*8 - всего 64 :( ):
RedMustJump = new Array();
BlueMustJump = new Array();
BlueCanMove = false;
RedCanMove = false;
for (i = 0; i<8; i++) {
for (j = 0; j<8; j++) {
name2=getname(i, j);
if (name2<>0) {
MustJump(i, j, 0);
MustJump(i, j, 1);
MustJump(i, j, 2);
MustJump(i, j, 3);
}
}
}
Масивы хранят после отработки функции MustJump инстансы шашек которые могут бить.
Функция MustJump:
function MustJump (x, y, direction) {
checkPoint = new Array();
secondcheckPoint = new Array();
checkPoint[0] = x;
secondcheckPoint[0] = x;
checkPoint[1] = y;
secondcheckPoint[1] = y;
if (direction == 0) {
// blue
checkPoint[1]++;
checkPoint[0]++;
secondCheckPoint[1] += 2;
secondCheckPoint[0] += 2;
} else if (direction == 1) {
// blue
checkPoint[0]++;
checkPoint[1]--;
secondCheckPoint[0] += 2;
secondCheckPoint[1] -= 2;
} else if (direction == 2) {
// red
checkPoint[0]--;
checkPoint[1]--;
secondCheckPoint[0] -= 2;
secondCheckPoint[1] -= 2;
} else if (direction == 3) {
// red
checkPoint[0]--;
checkPoint[1]++;
secondCheckPoint[0] -= 2;
secondCheckPoint[1] += 2;
}
_level0.MustJump = 1;
name1=getname(x, y, true);
if ((checkPoint[0]>7) || (checkPoint[0]<0) || (checkPoint[1]>7) || (checkPoint[1]<0)) {
_level0.MustJump = 0;
}
if (eval(name1+".crown._visible") == false) {
if (name2 == -1) {
if (direction == 0 || direction == 1) {
_level0.MustJump = 0;
}
} else if (direction == 2 || direction == 3) {
_level0.MustJump = 0;
}
}
if (_level0.MustJump<>0) {
if ((secondcheckPoint[0]<7) || (secondcheckPoint[0]>0) || (secondcheckPoint[1]<7) || (secondcheckPoint[1]>0)) {
if ((name2<>getname(checkPoint[0], checkPoint[1])) && (getname(checkPoint[0], checkPoint[1])<>0)) {
if (getname(secondcheckPoint[0], secondcheckPoint[1]) == 0) {
if (name2 == -1) {
RedCanMove = true;
RedMustJump[RedMustJump.length] = name1;
} else {
BlueCanMove = true;
BlueMustJump[BlueMustJump.length] = name1;
}
}
}
}
if ((getname(checkPoint[0], checkPoint[1]) == 0) && ((RedCanMove == false) || (BlueCanMove == false))) {
if (name2 == -1) {
RedCanMove = true;
} else {
BlueCanMove = true;
}
}
}
}
Пояснения: getname() - функция возвращает с заданным 3 параметром true имя инстанса с false - тип клетки поля: 1 - синяя шашка, -1 - красная, 0 - не занята. Переменные name2 и name1 можно и не использовать, но опыты показали что с их помощью тормозит чуть меньше (вызывается getname() один раз, а не несколько)
Проблемма приведенный выше цикл дает задержку 3-5 сек (Celeron-466), + иногда таки перегружает (как мне кажется) флеш и он не убирает убитую шашку с поля.
Проверялось:
1. Убирал цикл => нет задержки
2. Повторял по ходам с трейсом ситуацию когда шашка не убирается с поля 1 раз не убирает, при повторе 10 раз ситуации убирает... (т.е. не убирает "случайным" образом)
3. Пробовал зациклить функцию, которая убирает шашку с поля путем проверки в конце ее а убрана ли шашка с последующим вызовом самой себя при отрицательном ответе - безрезультатно, флеш упорно выдает что все ок и шашка убрана :(.
ЗЫ сорри за столь длинный пост, но хотелось обьяснить все подробно.