Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Оптимизация поиска совпадений (http://www.flasher.ru/forum/showthread.php?t=143031)

Sphinx_Rider 05.08.2010 15:02

Оптимизация поиска совпадений
 
Пишу игру со словами.
Она выглядит примерно так: внизу поле 5х5 букв. Надо поочерёдно выбрать буквы и собрать из них слово. Пролема в том, что база слов БОЛЬШАЯ, и из-за этого после каждого щелчка на букве игра подвисает. А ещё я не могу понять, почему при этом слова не опознаются :eek:
Кто-нибудь сможет помочь?
Код основного класса ниже:
Код 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);
                }
 
        }
 
}


-De- 05.08.2010 21:10

Для скорости используйте ассоциативный массив, который на флэше называется 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="Промах!";
                        }
                }


Sphinx_Rider 06.08.2010 07:19

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

Добавлено через 54 минуты
Теперь ещё одна проблема. Как заставить компилятор адекватно сравнивать русский текс с русским текстом?
Код AS3:

private function checkWord() {
                        if (myDictionary[theWord]) {
                                trace("Yes!");
                                Hit.text="Попадание!";
                        } else {
                                Hit.text="Промах!";
                        }
                }

Этот код прекрасно подходит для латиницы, но с русскими словами ничего не делает...Как это обойти?

-De- 06.08.2010 10:49

Цитата:

Сообщение от Sphinx_Rider (Сообщение 927414)
нужны объекты в flv файле =)

Отош =)
Цитата:

Сообщение от Sphinx_Rider (Сообщение 927414)
Этот код прекрасно подходит для латиницы, но с русскими словами ничего не делает...Как это обойти?

Понять, почему, для начала. Вообще оно должно для русского работать и не жужжать. Думаю, что-то с кодировками. Попробовать сохранить текстовик в utf-8. В цикле for each(var word:String in tmpDictionary) вывести word и его длину. При проверке тоже вівести слово и длину его итд.

Sphinx_Rider 06.08.2010 11:23

Заработало!!! =))))
Проблема была в том, что в объект помещались слова вместе с то ли пробелами, то ли другими невидимыми символами =)
Теперь всё прекрасно работает. =)
Большое спасибо, -De- =)


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

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