Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Архив Flasher.ru > Flash > ActionScript

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 16.10.2001, 03:37
Bukhtik вне форума Посмотреть профиль Отправить личное сообщение для Bukhtik Найти все сообщения от Bukhtik
  № 1  
Bukhtik

Регистрация: Oct 2001
Адрес: Kiev
Сообщений: 8
Отправить сообщение для Bukhtik с помощью ICQ
Question Вложенный цикл который все испортил :(

Написал шашки
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. Пробовал зациклить функцию, которая убирает шашку с поля путем проверки в конце ее а убрана ли шашка с последующим вызовом самой себя при отрицательном ответе - безрезультатно, флеш упорно выдает что все ок и шашка убрана .

ЗЫ сорри за столь длинный пост, но хотелось обьяснить все подробно.

Создать новую тему   Часовой пояс GMT +4, время: 11:12.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 11:12.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.