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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

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

Регистрация: Jul 2010
Сообщений: 13
По умолчанию Оптимизация поиска совпадений

Пишу игру со словами.
Она выглядит примерно так: внизу поле 5х5 букв. Надо поочерёдно выбрать буквы и собрать из них слово. Пролема в том, что база слов БОЛЬШАЯ, и из-за этого после каждого щелчка на букве игра подвисает. А ещё я не могу понять, почему при этом слова не опознаются
Кто-нибудь сможет помочь?
Код основного класса ниже:
Код AS3:
package {
 
	import flash.display.*;
	import flash.text.*;
	import flash.events.*;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
 
	public class WordGame extends MovieClip {
 
		private var lettersCages:Array=new Array();
		private var lettersStartX:Array=new Array();
		private var lettersStartY:Array=new Array();
		private var lettersSelected:Array=new Array();
		private var letterX:int=50;
		private var theWord:String=new String();
		private var myDictionary:Array=new Array();
		private var myXML:XML;
 
		public function WordGame() {
			iniDict();
			buildCages();
		}
 
		private function iniDict() {
			var xmlURL:URLRequest=new URLRequest("1.xml");
			var xmlLoader:URLLoader=new URLLoader(xmlURL);
			xmlLoader.addEventListener(Event.COMPLETE, buildDict);
		}
 
		private function buildDict(event:Event) {
			myXML=XML(event.target.data);
			var tempString:String;
			tempString=myXML;
			myDictionary=tempString.split("\r");
		}
 
		private function buildCages() {
			for (var y:int=0; y<5; y++) {
				for (var x:int=0; x<5; x++) {
					var cage:Cage=new Cage  ;
					cage.x=150+x*50;
					cage.y=150+y*50;
					addChild(cage);
					lettersCages.push(cage);
					lettersStartX.push(cage.x);
					lettersStartY.push(cage.y);
					cage.addEventListener(MouseEvent.CLICK, clickCage);
					cage.Litera.text=String.fromCharCode(1039+Math.floor(Math.random()*26));
				}
			}
		}
 
		private function clickCage(event:MouseEvent) {
			event.currentTarget.removeEventListener(MouseEvent.CLICK, clickCage);
			event.currentTarget.addEventListener(MouseEvent.CLICK, clickReturn);
			event.currentTarget.x=letterX;
			event.currentTarget.y=50;
			letterX+=50;
			lettersSelected.push(event.currentTarget);
			if (lettersSelected.length!=1) {
				lettersSelected[lettersSelected.length-2].removeEventListener(MouseEvent.CLICK, clickReturn);
			}
			searchWord();
			checkWord();
		}
 
		private function clickReturn(event:MouseEvent) {
			var a:int;
			event.currentTarget.x=20;
			a=lettersCages.indexOf(event.currentTarget);
			event.currentTarget.x=lettersStartX[a];
			event.currentTarget.y=lettersStartY[a];
			letterX-=50;
			if (lettersSelected.length!=1) {
			lettersSelected[lettersSelected.length-2].addEventListener(MouseEvent.CLICK, clickReturn);
			}
			lettersSelected.pop();
			event.currentTarget.removeEventListener(MouseEvent.CLICK, clickReturn);
			event.currentTarget.addEventListener(MouseEvent.CLICK, clickCage);
 
		}
 
		private function checkWord() {
			for (var i:int=0;i<myDictionary.length;i+=10) {
			if (theWord==myDictionary[i]) {
				trace("Yes!");
				Hit.text="Попадание!";
			} else {
				Hit.text="Промах!";
			}
			}
 
		}
 
		private function searchWord() {
			theWord="";
			for (var d:int=0; d<lettersSelected.length; d++) {
				theWord=theWord.concat(lettersSelected[d].Litera.text);
			}
			trace(theWord);
		}
 
	}
 
}

Старый 05.08.2010, 21:10
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 2  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Для скорости используйте ассоциативный массив, который на флэше называется Object. Почему не находит трейсте сами, код-то не компилится)
Код AS3:
private var myDictionary:Object=new Object();
...
Код AS3:
private function buildDict(event:Event) {
		var tmpDictionary = event.target.data.split("\r");
		for each(var word:String in tmpDictionary) {
			myDictionary[word] = true;
		}
}
...
Код AS3:
private function checkWord() {
			if (myDictionary[theWord]) {
				trace("Yes!");
				Hit.text="Попадание!";
			} else {
				Hit.text="Промах!";
			}
		}
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 06.08.2010, 07:19
Sphinx_Rider вне форума Посмотреть профиль Отправить личное сообщение для Sphinx_Rider Найти все сообщения от Sphinx_Rider
  № 3  
Ответить с цитированием
Sphinx_Rider

Регистрация: Jul 2010
Сообщений: 13
Спасибо! =)
Теперь работает намного быстрее.
И, кстати, у меня код компилится - просто нужны объекты в flv файле =)

Добавлено через 54 минуты
Теперь ещё одна проблема. Как заставить компилятор адекватно сравнивать русский текс с русским текстом?
Код AS3:
private function checkWord() {
			if (myDictionary[theWord]) {
				trace("Yes!");
				Hit.text="Попадание!";
			} else {
				Hit.text="Промах!";
			}
		}
Этот код прекрасно подходит для латиницы, но с русскими словами ничего не делает...Как это обойти?

Старый 06.08.2010, 10:49
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 4  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Цитата:
Сообщение от Sphinx_Rider Посмотреть сообщение
нужны объекты в flv файле =)
Отош =)
Цитата:
Сообщение от Sphinx_Rider Посмотреть сообщение
Этот код прекрасно подходит для латиницы, но с русскими словами ничего не делает...Как это обойти?
Понять, почему, для начала. Вообще оно должно для русского работать и не жужжать. Думаю, что-то с кодировками. Попробовать сохранить текстовик в utf-8. В цикле for each(var word:String in tmpDictionary) вывести word и его длину. При проверке тоже вівести слово и длину его итд.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 06.08.2010, 11:23
Sphinx_Rider вне форума Посмотреть профиль Отправить личное сообщение для Sphinx_Rider Найти все сообщения от Sphinx_Rider
  № 5  
Ответить с цитированием
Sphinx_Rider

Регистрация: Jul 2010
Сообщений: 13
Заработало!!! =))))
Проблема была в том, что в объект помещались слова вместе с то ли пробелами, то ли другими невидимыми символами =)
Теперь всё прекрасно работает. =)
Большое спасибо, -De- =)

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

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

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


 


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


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