flash on 2011-5-16

by Ayman.Dekeshy
♥1 | Line 269 | Modified 2011-05-16 21:58:08 | MIT License
play

ActionScript3 source code

/**
 * Copyright Ayman.Dekeshy ( http://wonderfl.net/user/Ayman.Dekeshy )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/dCHQ
 */

package {
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.events.Event;
    import flash.text.TextField;
 
    public class bejewelled extends Sprite {
        private var gems_array:Array=new Array();
        private var aGem:Sprite;
        private var selectorBox:Sprite=new Sprite();
        private var selectorRow:int=-10;
        private var selectorColumn:int=-10;
        private var red:uint = 0xFF0000;
        private var green:uint = 0xFF00;
        private var blue:uint = 0xFF;
        private var yellow:uint = 0xFFFF00;
        private var cyan:uint = 0xFFFF;
        private var magenta:uint = 0xFF00FF;
        private var white:uint = 0xFFFFFF;
        private var colours_array:Array=new Array(red,green,blue,yellow,cyan,magenta,white);
        private var clickPossible:Boolean=false;
        private var score_txt:TextField=new TextField();
        private var hint_txt:TextField=new TextField();
        private var score:uint=0;
        private var inaRow:uint=0;
        private var match:Boolean = true;
 
        public function bejewelled() {
            // Game initiation
            // Create and style score text
            addChild(score_txt);
            score_txt.textColor=0xFFFFFF;
            score_txt.x=500;
            // Create and style hint text
            addChild(hint_txt);
            hint_txt.textColor=0xFFFFFF;
            hint_txt.x=550;
            // Create Gems in rows and columns
            for (var i:uint=0; i<8; i++) {
                gems_array[i]=new Array();
                for (var j:uint=0; j<8; j++) {
                    do {
                        gems_array[i][j]=Math.floor(Math.random()*7);
                    }
                        while (rowLineLength(i,j)>2 || columnLineLength(i,j)>2);
                    aGem=new Sprite();
                    aGem.graphics.beginFill(colours_array[gems_array[i][j]]);
                    aGem.graphics.drawCircle(30,30,29);
                    aGem.graphics.endFill();
                    aGem.name=i+"_"+j;
                    aGem.x=j*60;
                    aGem.y=i*60;
                    addChild(aGem);
                }
            }
            // Create and style selector box
            addChild(selectorBox);
            selectorBox.graphics.lineStyle(2,red,1);
            selectorBox.graphics.drawRect(0,0,60,60);
            selectorBox.visible=false;
            // Listen for user input
            stage.addEventListener(MouseEvent.CLICK,onClick);
 
            addEventListener(Event.ENTER_FRAME,everyFrame);
        }
 
        // Every frame...
        private function everyFrame(e:Event):void {
            //Assume that gems are not falling
            var gemsAreFalling:Boolean=false;
            // Check each gem for space below it
            for (var i:int=6; i>=0; i--) {
                for (var j:uint=0; j<8; j++) {
                    // If a spot contains a gem, and has an empty space below...
                    if (gems_array[i][j] != -1 && gems_array[i+1][j]==-1) {
                        // Set gems falling
                        gemsAreFalling=true;
                        gems_array[i+1][j]=gems_array[i][j];
                        gems_array[i][j]=-1;
                        getChildByName(i+"_"+j).y+=60;
                        getChildByName(i+"_"+j).name=(i+1)+"_"+j;
                        break;
                    }
                }
                // If a gem is falling
                if (gemsAreFalling) {
                    // don't allow any more to start falling
                    break;
                }
            }
            // If no gems are falling
            if (! gemsAreFalling) {
                // Assume no new gems are needed
                var needNewGem:Boolean=false;
                // but check all spaces...
                for (i=7; i>=0; i--) {
                    for (j=0; j<8; j++) {
                        // and if a spot is empty
                        if (gems_array[i][j]==-1) {
                            // now we know we need a new gem
                            needNewGem=true;
                            // pick a random color for the gem
                            gems_array[0][j]=Math.floor(Math.random()*7);
                            // create the gem
                            aGem=new Sprite();
                            aGem.graphics.beginFill(colours_array[gems_array[0][j]]);
                            aGem.graphics.drawCircle(30,30,29);
                            aGem.graphics.endFill();
                            // ID it
                            aGem.name="0_"+j;
                            // position it
                            aGem.x=j*60;
                            aGem.y=0;
                            // show it
                            addChild(aGem);
                            // stop creating new gems
                            break;
                        }
                    }
                    // if a new gem was created, stop checking
                    if (needNewGem) {
                        break;
                    }
                }
                // If no new gems were needed...
                if (! needNewGem) {
                    // assume no more/new lines are on the board
                    var moreLinesAvailable:Boolean=false;
                    // check all gems
                    for (i=7; i>=0; i--) {
                        for (j=0; j<8; j++) {
                            // if a line is found
                            if (rowLineLength(i,j)>2 || columnLineLength(i,j)>2) {
                                // then we know more lines are available
                                moreLinesAvailable=true;
                                // creat a new array, set the gem type of the line, and where it is
                                var lineGems:Array=[i+"_"+j];
                                var gemType:uint=gems_array[i][j];
                                var linePosition:int;
                                // check t's a horizontal line...
                                if (rowLineLength(i,j)>2) {
                                    // if so, find our how long it is and put all the line's gems into the array
                                    linePosition=j;
                                    while (sameGemIsHere(gemType,i,linePosition-1)) {
                                        linePosition--;
                                        lineGems.push(i+"_"+linePosition);
                                    }
                                    linePosition=j;
                                    while (sameGemIsHere(gemType,i,linePosition+1)) {
                                        linePosition++;
                                        lineGems.push(i+"_"+linePosition);
                                    }
                                }
                                // check t's a vertical line...
                                if (columnLineLength(i,j)>2) {
                                    // if so, find our how long it is and put all the line's gems into the array
                                    linePosition=i;
                                    while (sameGemIsHere(gemType,linePosition-1,j)) {
                                        linePosition--;
                                        lineGems.push(linePosition+"_"+j);
                                    }
                                    linePosition=i;
                                    while (sameGemIsHere(gemType,linePosition+1,j)) {
                                        linePosition++;
                                        lineGems.push(linePosition+"_"+j);
                                    }
                                }
                                // for all gems in the line...
                                for (i=0; i<lineGems.length; i++) {
                                    // remove it from the program
                                    removeChild(getChildByName(lineGems[i]));
                                    // find where it was in the array
                                    var cd:Array=lineGems[i].split("_");
                                    // set it to an empty gem space
                                    gems_array[cd[0]][cd[1]]=-1;
                                    // set the new score
                                    score+=inaRow;
                                    // set the score setter up
                                    inaRow++;
                                }
                                // if a row was made, stop the loop
                                break;
                            }
                        }
                        // if a line was made, stop making more lines
                        if (moreLinesAvailable) {
                            break;
                        }
                    }
                    // if no more lines were available...
                    if (! moreLinesAvailable) {
                        // allow new moves to be made
                        clickPossible=true;
                        // remove score multiplier
                        inaRow=0;
                    }
                }
            }
            // display new score
            score_txt.text=score.toString();
        }
        // When the user clicks
        private function onClick(e:MouseEvent):void {
            // If a click is allowed
            if (clickPossible) {
                // If the click is within the game area...
                if (mouseX<480&&mouseX>0&&mouseY<480&&mouseY>0) {
                    // Find which row and column were clicked
                    var clickedRow:uint=Math.floor(mouseY/60);
                    var clickedColumn:uint=Math.floor(mouseX/60);
                    // Check if the clicked gem is adjacent to the selector
                    // If not...
                    if (!(((clickedRow==selectorRow+1 || clickedRow==selectorRow-1)&&clickedColumn==selectorColumn)||((clickedColumn==selectorColumn+1 || clickedColumn==selectorColumn-1) && clickedRow==selectorRow))) {
                        // Find row and colum the selector should move to
                        selectorRow=clickedRow;
                        selectorColumn=clickedColumn;
                        // Move it to the chosen position
                        selectorBox.x=60*selectorColumn;
                        selectorBox.y=60*selectorRow;
                        // If hidden, show it.
                        selectorBox.visible=true;
                    }
                    // If it is not next to it...
                    else {
                        // Swap the gems;
                        swapGems(selectorRow,selectorColumn,clickedRow,clickedColumn);
                        // If they make a line...
                        if (rowLineLength(selectorRow,selectorColumn)>2 || columnLineLength(selectorRow,selectorColumn)>2||rowLineLength(clickedRow,clickedColumn)>2 || columnLineLength(clickedRow,clickedColumn)>2) {
                            // remove the hint text
                            hint_txt.text="";
                            // dis-allow a new move until cascade has ended (removes glitches)
                            clickPossible=false;
                            // move and rename the gems
                            getChildByName(selectorRow+"_"+selectorColumn).x=clickedColumn*60;
                            getChildByName(selectorRow+"_"+selectorColumn).y=clickedRow*60;
                            getChildByName(selectorRow+"_"+selectorColumn).name="t";
                            getChildByName(clickedRow+"_"+clickedColumn).x=selectorColumn*60;
                            getChildByName(clickedRow+"_"+clickedColumn).y=selectorRow*60;
                            getChildByName(clickedRow+"_"+clickedColumn).name=selectorRow+"_"+selectorColumn;
                            getChildByName("t").name=clickedRow+"_"+clickedColumn;
                            match = true;
                        }
                        // If not...
                        else {
                            // Switch them back
                            swapGems(selectorRow,selectorColumn,clickedRow,clickedColumn);
                            match = false;
                        }
                        if (match) {
                            // Move the selector position to default
                            selectorRow=-10;
                            selectorColumn=-10;
                            // and hide it
                            selectorBox.visible=false;
                        }
                        else {
                            // Set the selector position
                            selectorRow=clickedRow;
                            selectorColumn=clickedColumn;
                            // Move the box into position
                            selectorBox.x=60*selectorColumn;
                            selectorBox.y=60*selectorRow;
                            match = false;
                            // If hidden, show it.
                            selectorBox.visible=true;
                        }
                    }
                }
                // If the click is outside the game area
                else {
                    // For gems in all rows...
                    for (var i:uint=0; i<8; i++) {
                        // and columns...
                        for (var j:uint=0; j<8; j++) {
                            // if they're not too close to the side... 
                            if (i<7) {
                                // swap them horizontally
                                swapGems(i,j,i+1,j);
                                // check if they form a line
                                if ((rowLineLength(i,j)>2||columnLineLength(i,j)>2||rowLineLength(i+1,j)>2||columnLineLength(i+1,j)>2)) {
                                    // if so, name the move made
                                    selectorBox.x = j*60;
                                    selectorBox.y = i*60;
                                    selectorBox.visible = true;
                                    hint_txt.text = (i+1).toString()+","+(j+1).toString()+"->"+(i+2).toString()+","+(j+1).toString();
                                }
                                // swap the gems back
                                swapGems(i,j,i+1,j);
                            }
                            // then if they're not to close to the bottom...
                            if (j<7) {
                                // swap it vertically
                                swapGems(i,j,i,j+1);
                                // check if it forms a line
                                if ((rowLineLength(i,j)>2||columnLineLength(i,j)>2||rowLineLength(i,j+1)>2||columnLineLength(i,j+1)>2) ) {
                                    // if so, name it
                                    selectorBox.x = j*60;
                                    selectorBox.y = i*60;
                                    selectorBox.visible = true;
                                    hint_txt.text = (i+1).toString()+","+(j+1).toString()+"->"+(i+1).toString()+","+(j+2).toString();
                                }
                                // swap the gems back
                                swapGems(i,j,i,j+1);
                            }
                        }
                    }
                }
            }
        }
        //Swap given gems
        private function swapGems(fromRow:uint,fromColumn:uint,toRow:uint,toColumn:uint):void {
            //Save the original position
            var originalPosition:uint=gems_array[fromRow][fromColumn];
            //Move original gem to new position
            gems_array[fromRow][fromColumn]=gems_array[toRow][toColumn];
            //move second gem to saved, original gem's position
            gems_array[toRow][toColumn]=originalPosition;
        }
        //Find out if there us a horizontal line
        private function rowLineLength(row:uint,column:uint):uint {
            var gemType:uint=gems_array[row][column];
            var lineLength:uint=1;
            var checkColumn:int=column;
            //check how far left it extends
            while (sameGemIsHere(gemType,row,checkColumn-1)) {
                checkColumn--;
                lineLength++;
            }
            checkColumn=column;
            //check how far right it extends
            while (sameGemIsHere(gemType,row,checkColumn+1)) {
                checkColumn++;
                lineLength++;
            }
            // return total line length
            return (lineLength);
        }
        //Find out if there us a vertical line
        private function columnLineLength(row:uint,column:uint):uint {
            var gemType:uint=gems_array[row][column];
            var lineLength:uint=1;
            var checkRow:int=row;
            //check how low it extends
            while (sameGemIsHere(gemType,checkRow-1,column)) {
                checkRow--;
                lineLength++;
            }
            //check how high it extends
            checkRow=row;
            while (sameGemIsHere(gemType,checkRow+1,column)) {
                checkRow++;
                lineLength++;
            }
            // return total line length
            return (lineLength);
        }
        private function sameGemIsHere(gemType:uint,row:int,column:int):Boolean {
            //Check there are gems in the chosen row
            if (gems_array[row]==null) {
                return false;
            }
            //If there are, check if there is a gem in the chosen slot
            if (gems_array[row][column]==null) {
                return false;
            }
            //If there is, check if it's the same as the chosen gem type
            return gemType==gems_array[row][column];
        }
    }
}