Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Возможно ли организовать рациональную проверку? (http://www.flasher.ru/forum/showthread.php?t=141250)

winnner 20.06.2010 02:46

Возможно ли организовать рациональную проверку?
 
Вложений: 1
Делаю экзаминационный тест.
Есть клип в который подгружаются картинки.
Картинки грузятся в сгенерированные мувики перемешиваются в случайном порядке и выстраиваются на сцене, с левой стороны друг под другом по оси Y.
Юзер должен перетащить каринки в область сцены справа и расположить их в определённом порядке. Пока ничего сложного для меня не было, прогонял через цикл и проверял расположение по оси Y относительно друг друга.
Но вот заказчик изменил задание и теперь в папке с картинками лежит две пары картинок с разными именами, но абсолютно идентичных. Он просит не изменять их внешне, а при проверке сделать так, чтобы перемена их местоположения не учитывалась. Дело осложняется ещё и тем, что количество картинок мне заранее не известно. Оно прописывается заказчиком в конфигурационном файле ( текстовой файл).
Вопрос - можно ли осуществить такую проверку используя цикл? Если да, то подскажите как.
Чтобы было понятнее прикладываю изображение. http://picasaweb.google.com/tierex33...03893567905426
Заранее благодарю.

rainbowrussia 20.06.2010 04:00

Прочитать конфигурационный файл - LoadVars, onData
Картинкам присвойте имена, ну или хотя бы индексы - _root["mcPic"+i].idx = i;
Тем картинкам, которые одинаковые присвойте одинаковые индексы.
Если я правильно понял - пользователь должен единственно верно расставить картинки - значит задайте массив правильного расположеня, в который поместите присвоенные индексы - например [1, 2, 2, 2, 3, 4, 4, 4, 4, 5]. Проверяйте местоположения размещенных картинок на соответствие их индекса массиву.
Сорри если непонятно.

winnner 20.06.2010 11:40

Спасибо за ответ.
Такое решение я уже обдумывал. Оно конечно же сокращает код.
Но в этом случае мне придётся вручную создавать массив, тем более он будет заранее определён и заказчик не сможет его изменить. До этого, когда картинки были разные, массив создавался автоматически. Заказчик указывал в конфигурационном файле только их количество.
Ну и "Проверяйте местоположения размещенных картинок на соответствие их индекса массиву." непонятно как? Извините может я туплю, но не могу пока въехать, как местоположения размещенных картинок сравнить с таким массивом.

rainbowrussia 20.06.2010 11:45

Пусть заказчик в конфигурационном файле задает адреса картинок, их индексы (одинаковые для условно одинаковых картинок), а так же "правильный" ответ в виде последовательности индексов. Читая "задачу" вы задаете всем мувикам _root["mc"+i"].idx = readidx; прочитанный индекс, читаете в массив правильный ответ, ну а далее я не знаю как у вас происходит процесс "решения" задачи, примерно так же как вы раньше проверяли верно ли расставлены мувики вы будете проверять их, только не их порядковые номера, а их .idx свойства на соответствие "правильному" массиву.

winnner 20.06.2010 13:01

Да это всё понятно, но в таком случае невозможно организовать нормалную проверку. Т.к. индексы меняются местами т.е. при проверке Y idx_3 > Y idx_4 а в конце наоборот Y idx_4 > Y idx_3.
Проверяю так
Код AS1/AS2:

b=i+1;
if(_root["img_"+idxArr[b]]._y > _root["img_"+idxArr[i]]._y){
                  antwort+=1;
                  };

если количество правильных ответов равно количеству картинок - решение верное.

Добавлено через 4 минуты
P.S.
Посмотрите внимательно на картинку. Это правильный ответ.

rainbowrussia 20.06.2010 13:14

Сложно что-то советовать не видя кода. Приведите хотя бы полную процедуру проверки правильности ответа в том виде как она сейчас у вас работает (для условия когда все картинки разные).

winnner 20.06.2010 13:50

Пожалуйста, вот:

Код AS1/AS2:

mc_button.onPress = function() {
        for (i=0; i<bz; i++) {//bz - количество картинок
                if(_root["platz_"+i].hitTest(_root.box_0)){platziert = 1;}else{platziert = 0;};
//box_0 - место куда должны быть перетянуты картинки "platz_"+i имя мувика с картинкой.
        if(platziert == 1){
                if(_root["platz_"+i]._y < _root["platz_"+(i+1)]._y){ 
                  antwort+=1;
                  };
                };       
        }//endFor
        if (antwort==bz) {
                mitt(1); //сообшение о правильном решении
        } else {
                mitt(0); //сообшение об ошибочном решении
        };
};

так было.

Добавлено через 17 минут
P.S.
Вот трейс проверки с индексом :
idx_0._y=124 platz_0._y=124
idx_1._y=148 platz_1._y=148
idx_2._y=161 platz_2._y=161
idx_3._y=172 platz_3._y=172
idx_4._y=184 platz_4._y=184
idx_5._y=189 platz_5._y=189
idx_3._y=172 platz_6._y=267
idx_2._y=161 platz_7._y=280
количество правильных решений=6

rainbowrussia 20.06.2010 17:02

На счет idx_0._y я не понял, вероятно вы меня не так про индексы поняли.
Предлагаю сделать следующее:

Заказчик задает количество картинок и указывает какие из них одинаковые. Я не знаю как у вас это делается, предполагаю что все картинки имеют имена типа "imageX.jpg", где X от 1 до N и N задается заказчиком. В этом случае чтобы указать какие картинки считабтся одинаковыми заказчик дополнительно должен задать их индексы, которые будут одинаковыми для одинаковых картнок, например [1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7] - массив из N элементов (*). Это же и будет являться правильным решением, как я понимаю. Вы создавая мувики _root["platz_"+i] дополнительно им присваиваете очередной индекс _root["platz_"+i].idx = indexes[i] из этого массива.

Далее проверяем все мувики hitTest чтобы они все находились в заданной области, проверяем чтобы _y координаты не совпадали, это цикл в цикле - for (j=0; j<i-1; j++;)

Можно попутно создавать массив объектов вида { y:_root["platz_"+i]._y, idx:_root["platz_"+i].idx }. Отсортировать массив по возрастанию по переменной y. Пройтись по массиву, проверить чтобы idx не уменьшался. Если все так - решение верное.

Есть наверняка и более простой вариант.

winnner 20.06.2010 20:56

Вы всё правильно поняли насчет номеров картинок. Индекс в конфиге я сделал.
Насчет idx_0._y, idx_0 это имя переменной из idx_ и значения i в цикле, а далее = значение по оси _y.
Вот это я не понял:"проверяем чтобы _y координаты не совпадали, это цикл в цикле - for (j=0; j<i-1; j++". Это как?
Если не сложно - поясните пожалуйста.

Сейчас я проверяю так:
Код AS1/AS2:

mc_button.onPress = function() {
        loesungArr=loesung.split(",");
        for (i=0; i<bz; i++) {
                b=i+1;
                if(_root["platz_"+i].hitTest(_root.box_0)){platziert = 1;}else{platziert = 0;};
        if(platziert == 1){
                trace("idx_"+idxArr[i]+"._y="+_root["platz_"+idxArr[i]]._y+"  platz_"+i+"._y="+_root["platz_"+i]._y);
                if(_root["platz_"+i]._y == _root["platz_"+idxArr[i]]._y){
                  antwort+=1;
                  };
                };       
        }

Думаю что это неправильно...

rainbowrussia 20.06.2010 23:37

Если loesung это и есть строка, содержащая "1,2,3,3,3,4,5,6,6,6,7", то код будет примерно такой:

Код AS1/AS2:

mc_button.onPress = function() {
        loesungArr=loesung.split(",");
        goodplace = 1;
        var els = new Array();
        for (i=0; i<bz; i++) {
                // формируем массив объектов с парами _y и idx
                els.push({ y:_root["platz_"+i]._y, idx:loesungArr[i] });
                if(!(_root["platz_"+i].hitTest(_root.box_0))){ goodplace = 0; break; }
                if (i > 0) {
                        // проверяем чтобы _y позиции были разные у клипов, иначе имееп неопределенность
                        for (j=0; j<i; j++) {
                                if (_root["platz_"+i]._y == _root["platz_"+j]._y) { goodplace = 0; break; }
                        }
                }
        }
 
        if (goodplace == 1) {
 
          // сортируем массив по возрастанию "y"
          els.sort(function (a, b) { if (a.y < b.y) { return -1; } else if (a.y > b.y) { return +1; } else { return 0; } });
 
          // если картинки расставлены верно, то idx будут в точности такие как в ответе
          solved = 1;
          for (i=0; i<bz; i++) {
            if (els[i].idx != loesungArr) {
              solved = 0;
              break;
            }
          }
 
          if (solved == 1) {
                mitt(1); //сообшение о правильном решении
          } else {
                mitt(0); //сообшение об ошибочном решении
          };
 
        } else {
                mitt(0); //неверное расположение
        }
 
}

К сожалению не имея исходника проверить сложно, возможно допустил какие-то опечатки или даже ошибки.


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

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