AS3 - 从文字游戏的数组中删除空格

时间:2011-08-13 10:42:30

标签: arrays actionscript-3 spaces

我正在使用以下AS3代码构建单词搜索游戏。我的问题是我需要在我的单词数组中有空格,以便我可以使用状态名称之类的东西,但是我需要在单词进入拼图之前删除空格。

另一个问题是,当一个人从拼图中选择一个单词时,它仍会匹配列表中的单词,即使列表中的单词仍有空格。

我已经挣扎了好几天了,可以帮忙。

我相信,我已粘贴下面所有适当的代码。感谢。

 // words and grid
 private var wordList:Array;
 private var usedWords:Array;
 private var grid:Array;

 // sprites 
 private var letterSprites:Sprite;
 private var wordsSprite:Sprite;

 wordList = ("New York,New Jersey,South Carolina,North Carolina").split(",");

 // set up the sprites
 gameSprite = new Sprite();
 addChild(gameSprite);

 letterSprites = new Sprite();
 gameSprite.addChild(letterSprites);

 wordsSprite = new Sprite();
 gameSprite.addChild(wordsSprite);

 // array of letters
 var letters:Array = placeLetters();

 // create word list fields and sprites
        for(var i:int=0;i<usedWords.length;i++) {
            var newWord:TextField = new TextField();
            newWord.defaultTextFormat = letterFormatForList;
            if(i < 20){ // first list
            newWord.x = listXposition; 
            newWord.y = i*spacingForList+listYposition;
            } else { // second list
            newWord.x = listXposition + 130;
            newWord.y = i*spacingForList+listYposition - (20 * 19);
            }
            newWord.width = 135;
            newWord.height = spacingForList;
            newWord.text = usedWords[i];
            newWord.selectable = false;
            wordsSprite.addChild(newWord);
        }

        // set game state
        dragMode = "none";
        numFound = 0;
    }

    // place the words in a grid of letters
    public function placeLetters():Array {

        // create empty grid
        var letters:Array = new Array();
        for(var x:int=0;x<puzzleSize;x++) {
            letters[x] = new Array();
            for(var y:int=0;y<puzzleSize;y++) {
                letters[x][y] = "*";
            }
        }

        // make copy of word list
        var wordListCopy:Array = wordList.concat();
        usedWords = new Array();

        // make 1000 attempts to add words
        var repeatTimes:int = 1000;
        repeatLoop:while (wordListCopy.length > wordsLeft) { 
            if (repeatTimes-- <= 0) break;

            // pick a random word, location and direction
            var wordNum:int = Math.floor(Math.random()*wordListCopy.length);
            var word:String = wordListCopy[wordNum].toUpperCase();
            x = Math.floor(Math.random()*puzzleSize);
            y = Math.floor(Math.random()*puzzleSize);
            var dx:int = Math.floor(Math.random()*3)-1;
            var dy:int = Math.floor(Math.random()*3)-1;
            if ((dx == 0) && (dy == 0)) continue repeatLoop;

            // check each spot in grid to see if word fits
            letterLoop:for (var j:int=0;j<word.length;j++) {
                if ((x+dx*j < 0) || (y+dy*j < 0) || (x+dx*j >= puzzleSize) || (y+dy*j >= puzzleSize)) continue repeatLoop;
                var thisLetter:String = letters[x+dx*j][y+dy*j];
                if ((thisLetter != "*") && (thisLetter != word.charAt(j))) continue repeatLoop;
            }

            // insert word into grid
            insertLoop:for (j=0;j<word.length;j++) {
                letters[x+dx*j][y+dy*j] = word.charAt(j);
            }

            // remove word from list
            wordListCopy.splice(wordNum,1);
            usedWords.push(word);
        }

        // fill rest of grid with random letters
        for(x=0;x<puzzleSize;x++) {
            for(y=0;y<puzzleSize;y++) {
                if (letters[x][y] == "*") {
                    letters[x][y] = String.fromCharCode(65+Math.floor(Math.random()*26));
                }
            }
        }

        return letters;
    }

    // player clicks down on a letter to start
    public function clickLetter(event:MouseEvent) {
        var letter:String = event.currentTarget.getChildAt(0).text;
        startPoint = findGridPoint(event.currentTarget);
        dragMode = "drag";
    }

    // player dragging over letters
    public function overLetter(event:MouseEvent) {
        if (dragMode == "drag") {
            endPoint = findGridPoint(event.currentTarget);

            // if valid range, show outline
            outlineSprite.graphics.clear();
            if (isValidRange(startPoint,endPoint)) {
                drawOutline(outlineSprite,startPoint,endPoint,0xCCCCCC);
            }
        }
    }

    // mouse released
    public function mouseRelease(event:MouseEvent) {
        if (dragMode == "drag") {
            dragMode = "none";
            outlineSprite.graphics.clear();

            // get word and check it
            if (isValidRange(startPoint,endPoint)) {
                var word = getSelectedWord();
                checkWord(word);
            }
        }
    }

    // when a letter is clicked, find and return the x and y location
    public function findGridPoint(letterSprite:Object):Point {

        // loop through all sprites and find this one
        for(var x:int=0;x<puzzleSize;x++) {
            for(var y:int=0;y<puzzleSize;y++) {
                if (grid[x][y] == letterSprite) {
                    return new Point(x,y);
                }
            }
        }
        return null;
    }

    // determine if range is in the same row, column, or a 45 degree diagonal
    public function isValidRange(p1,p2:Point):Boolean {
        if (p1.x == p2.x) return true;
        if (p1.y == p2.y) return true;
        if (Math.abs(p2.x-p1.x) == Math.abs(p2.y-p1.y)) return true;
        return false;
    }

    // draw a thick line from one location to another
    public function drawOutline(s:Sprite,p1,p2:Point,c:Number) {
        var off:Point = new Point(offset.x+spacing/2, offset.y+spacing/2);
        s.graphics.lineStyle(outlineSize,c);
        s.graphics.moveTo(p1.x*spacing+off.x ,p1.y*spacing+off.y-3);
        s.graphics.lineTo(p2.x*spacing+off.x ,p2.y*spacing+off.y-3);
    }

    // find selected letters based on start and end points
    public function getSelectedWord():String {

        // determine dx and dy of selection, and word length
        var dx = endPoint.x-startPoint.x;
        var dy = endPoint.y-startPoint.y;
        var wordLength:Number = Math.max(Math.abs(dx),Math.abs(dy))+1;

        // get each character of selection
        var word:String = "";
        for(var i:int=0;i<wordLength;i++) {
            var x = startPoint.x;
            if (dx < 0) x -= i;
            if (dx > 0) x += i;
            var y = startPoint.y;
            if (dy < 0) y -= i;
            if (dy > 0) y += i;
            word += grid[x][y].getChildAt(0).text;
        }
        return word;
    }

    // check word against word list
    public function checkWord(word:String) {

        // loop through words
        for(var i:int=0;i<usedWords.length;i++) {

            // compare word
            if (word == usedWords[i].toUpperCase()) {
                foundWord(word);
            }

            // compare word reversed
            var reverseWord:String = word.split("").reverse().join("");
            if (reverseWord == usedWords[i].toUpperCase()) {
                foundWord(reverseWord);
            }
        }
    }

    // word found, remove from list, make outline permanent
    public function foundWord(word:String) {
        sndSuccess=new success_sound();
        sndSuccessChannel=sndSuccess.play(200);
        so.data.totalWordsFound = so.data.totalWordsFound + 1;
        so.flush();

        // draw outline in permanent sprite
        drawOutline(oldOutlineSprite,startPoint,endPoint,0xDDDDDD);

        // find text field and set it to gray
        for(var i:int=0;i<wordsSprite.numChildren;i++) {
            if (TextField(wordsSprite.getChildAt(i)).text.toUpperCase() == word) {
                TextField(wordsSprite.getChildAt(i)).textColor = 0x777777;
            }
        }

        // see if all have been found
        numFound++;
        if (numFound == usedWords.length) {
            if (so.data.difficulty == "Easy") {
                so.data.easyWon = so.data.easyWon + 1;
            }
            if (so.data.difficulty == "Medium") {
                so.data.mediumWon = so.data.mediumWon + 1;
            }
            if (so.data.difficulty == "Hard") {
                so.data.hardWon = so.data.hardWon + 1;
            }
            so.flush();
            endGame();
        }
    }

1 个答案:

答案 0 :(得分:2)

我对发布答案犹豫不决,因为我不确定发生了什么,但希望这些信息会有所帮助:

用空格保持你的单词数组,这是个好主意。当您想要检查游戏中的单词时,只需使用函数将两个单词转换为相同的格式。例如:

var wordList:Array = ("New York,New Jersey,South Carolina,North Carolina").split(",");
var selectedWord:String = "NEWYORK";
// minWord converts all words to the same format of no spaces and all lower case.
function minWord(word:String):String {
    return word.replace(/\s/g, "").toLowerCase();
}

// this loop checks all the words from your array against the selectedWord.
for each(var word:String in wordList) {
    trace(minWord(word) + " == " + minWord(selectedWord) + "; ", minWord(word) == minWord(selectedWord));
}

希望有所帮助!