Avatar billede Slettet bruger
21. februar 2002 - 22:54 Der er 16 kommentarer og
1 løsning

Rekursiv funktion

Jeg laver et grid (15x25) bestående af 375 kasser i 5 forskellige farver, altså 75 af hver. Kasserne placeres randomize farvemæssigt, og systematisk navnemæssigt som;

0  1  2  3  4  5  6  7  8  9 10 11 12 13 14
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
osv. osv.

Det jeg har brug for er en rekursiv funktion, der tjekker om sidemanden har samme farve, og hvis det er tilfældet, ja så skal funktionen kalde sig selv og so on... MEN - jeg er sq kun kommet til første led på hver side af valgte object. Jeg mangler altså funktioen der kalder sig selv, og bryder ud af loopet hvis værdien ikke findes.

Dette er mit udkast;
function checkBox () {
    delboxes = new Array();
    delboxes.push(_root.boxname);
    // left
    box_left = tetri[_root.boxposX-1][_root.boxposY];
    Left_color = eval("_root.tile" add box_left add ".myCol");
    if (left_color == _root.boxcolor) {
        delboxes.push(box_left);
    }
    // right
    box_right = tetri[_root.boxposX+1][_root.boxposY];
    right_color = eval("_root.tile" add box_right add ".myCol");
    if (right_color == _root.boxcolor) {
        delboxes.push(box_right);
    }
    // up
    box_up = tetri[_root.boxposX][_root.boxposY-1];
    up_color = eval("_root.tile" add box_up add ".myCol");
    if (up_color == _root.boxcolor) {
        delboxes.push(box_up);
    }
    // down
    box_down = tetri[_root.boxposX][_root.boxposY+1];
    down_color = eval("_root.tile" add box_down add ".myCol");
    if (down_color == _root.boxcolor) {
        delboxes.push(box_down);
    }
delBox();
}

Er der nogen der har erfaring med dette, eller kan henvise til andre eksempler på rekursive funktioner, work-arounds etc.

Mvh/M1chael
Avatar billede lingoman Nybegynder
21. februar 2002 - 23:15 #1
Er det meningen at hver kasse objekt skal grupperes med andre kasser som har samme farve og som har en fælles kant ?
Avatar billede Slettet bruger
21. februar 2002 - 23:21 #2
Ja, det var menningen, -men min funktion når kun 1 led ud.
Dvs. jeg fanger de kasser der ligger rundt om mit objekt som har samme farve. Idéen er at de omkringliggende kasser skal kalde samme funktion i funktionen, men uden at køre i uendeligt loop.
Avatar billede lingoman Nybegynder
21. februar 2002 - 23:44 #3
Den er svær ;) Hvis jeg ser lyset inden de andre, poster jeg et svar :)
Avatar billede pixelpaw Nybegynder
22. februar 2002 - 10:40 #4
Denne funktion, ligger den på alle kasserne?
Hvad med om den lå på tidslinien og blev kaldt fra hver kasse, som sender "sig selv med":
_root.checkBox(this);

og funktion skal jo så se ca sådan her ud:
function checkBox (objMC) {

Hvis et af dine check giver true, skal funktionen tvinge den omtalte box til også at lave checket, og hvis der så igen er true, så bliver der checket igen, og igen, indtil at alle check returnerer false.

Det er nok sådan jeg ville gribe det an på
Avatar billede Slettet bruger
22. februar 2002 - 10:51 #5
Funktionen ligger på tidslinien, og bliver kaldt fra den enkelte kasse når der trykkes.
Kaldet medsender en variable der fortæller hvor den befinder sig i et 2dimensionelt array, og ud fra disse oplysninger kan jeg så se hvilke kasser der skal tjekkes op på, men som sagt når jeg kun et led ud

F.eks tjekker jeg her for den kasse der ligger til venstre for den valgte kasse ved at trække -1 fra i mit array i X-positionen;
box_left = tetri[_root.boxposX-1][_root.boxposY];
Avatar billede pixelpaw Nybegynder
22. februar 2002 - 11:08 #6
Er det så ikke bare at checke videre i rækken?
Hvis det er box1 der checker, og den finder ud af at box2 også er rød, så skal den fortælle box2 at den også skal lave checket
Avatar billede Slettet bruger
22. februar 2002 - 12:28 #7
Jo, det er det der er meningen men...

Hvis box1 tjekker box2, så skal box2 jo ikke tjekke box1 igen da det vil foresage et uendeligt loop.
Hvis jeg har fire ens farver som nedenstående;

30 31 .. .. ..
45 46 .. .. ..

Og 30 er valgt, så finder den 45 og 31, men hvilken af de 2 skal tjekke 46?  Og hvad skal 46 tjekke...
Det er derfor jeg leder efter en rekursiv funktion som eksekverer i stacks, og som bryder ud af et loops
Avatar billede pixelpaw Nybegynder
22. februar 2002 - 13:01 #8
ja der skal en del regler til for at det skal lykkedes

if (!blnCheckDone) {
  _root.checkBox();
  blnCheckDone = true;
}

så vil den kun køre én gang
Avatar billede pixelpaw Nybegynder
22. februar 2002 - 13:02 #9
men der kommer helt sikkert andre ting der også skal checkes for undervejs
Avatar billede barklund Nybegynder
22. februar 2002 - 14:47 #10
Jubii... Endelig lidt programmering, hvor man kan få lov til at udfolde sig... :o)

jeg ville dele det op i to funktioner, hoved og sub, således:

function checkBox() {
    delboxes = new Array();
    checkBoxSub(_root.boxname, _root.boxposX, _root.boxposY, _root.boxcolor, delboxes);
    delBox();
}
function checkBoxSub(mc_name, posx, posy, color, arr) {
    arr.push(mc_name);
   
    var i, dx, dy, next_box, next_color;
    var x_changes = [-1,1,0,0];
    var y_changes = [0,0,-1,1];
    for (i = 0; i < 4; i++) {
        dx = x_changes[i];
        dy = y_changes[i];
        next_box = tetri[posx+dx][posy+dy];
        if (arr.find(next_box) == -1) {
            next_color = eval("_root.tile" add next_box add ".myCol");
            if (next_color == color)
                checkBoxSub(next_box,posx+dx,posy+dy,color,arr);
        }
    }
}

Sådan lidt deklarativt-agtigt...

Dette kræver så:

Array.prototype.find = function(key) {
    var pos = -1;
    var n = this.length;
    while (n--) {
        if (this[n] == key)
            pos = n;
    }
    return pos;
}

Håber det virker. Hvis det gør, så: Tillykke... :o)

/Barklund
Avatar billede Slettet bruger
22. februar 2002 - 15:00 #11
Lav lige etr svar Barklund ;-)
Avatar billede barklund Nybegynder
22. februar 2002 - 15:01 #12
Virker det?
Avatar billede Slettet bruger
22. februar 2002 - 15:02 #13
Det virker for fedt :0)
Thanx..
Avatar billede barklund Nybegynder
22. februar 2002 - 15:05 #14
Se det her er det fede... Lad os få flere af den slags spørgsmål, så vi kan få noget udfordring... :o)

Tarker...
Avatar billede Slettet bruger
22. februar 2002 - 15:07 #15
Enig ;-)
Avatar billede ditlev Juniormester
23. februar 2002 - 20:58 #16
Kort kommentar:

Imponerende.....
Flot at se det programmerings potentiale I besider folde sig ud.

/Ditlev
Avatar billede pixelpaw Nybegynder
24. februar 2002 - 04:24 #17
jeg vil gerne lige høre lidt nærmere:

http://www.eksperten.dk/spm/176833
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester