1

AS3 で作業を行うのに問題があります。Rand という名前の var があり、この rand が 0 から 10 の間の数値になると、deathdisk が表示されます。rand が 90 ~ 100 になると、キングディスクが表示されます。私が達成したいことは、それらのディスクが 2 回連続して表示されないことです。Boolean で試してみましたが、うまくいきませんでした。それに加えて、「var」ランドが私が言及した数の間にある場合にのみ、王と死のディスクが表示されなければなりません。乱数の外に現れることもあります。誰かがこの問題で私を助けてくれることを願っています。

いくつかの情報:

ディスクはMCとボタンです。この MC ディスクには 8 つのフレームがあり、1 - 6 は通常のディスクで、7 & 8 はキングとデス ディスクです。ディスクをサイコロで比較できます。プレーヤーがディスク ムービークリップを押すと、ランダムなフレームが選択されます。

diskRoll [クラス]:

package  {

    import flash.display.*;
    import flash.events.*;
    import flash.display.*;
    import flash.utils.*;
    import flash.media.*;

    public class DiskRoll extends MovieClip 
    {
        //Vars

        var diskTilt:Timer = new Timer(1350,1);
        //var rand:int = Math.random() * 100;
        var rand:int = (Math.random()*(100));



        var deathDisk:Boolean = false;
        var kinghDisk:Boolean = false;

        //Sound Vars

        var diskFxChannel:SoundChannel = new SoundChannel();
        var diskHitFx:Sound = new diskHitsound();   
        var diskRollFx:Sound = new diskRollSound(); 

        public function DiskRoll():void 
        {           
            this.addEventListener(MouseEvent.MOUSE_DOWN, hitDisk);
            diskTilt.addEventListener(TimerEvent.TIMER_COMPLETE, tiltOnComplete);
            diskFxChannel = diskRollFx.play();
        }

        //Disk hit function

        private function hitDisk(event:MouseEvent):void{

            //Picks random frame after MOUSE_DOWN from Disks Mc [1-8 Frames total]
            this.gotoAndStop(Math.ceil(Math.random()* 6));

            //Genarate random number calc chances and luck
            rand = (Math.random() * (100));

            //Disk of death between Random number (block second time)
            if(rand >= 90 && rand <=100){ 
                this.gotoAndStop(7);
                kinghDisk = true;
            }

            if(rand >= 0 && rand <=10){ 
                this.gotoAndStop(8);
                deathDisk = true;
            }

            //Disk of death between Random number (block second time)
            if(deathDisk == true){
                rand = (Math.random() * (100))+11;
            }

            if(deathDisk == false){
                rand = (Math.random() * (100));
            }

            //KingsDisk Random between number (block second time)           
            if(kinghDisk == true){
                rand = (Math.random() * (89));
            }

            if(kinghDisk == false){
                rand = (Math.random() * (100));
            }                   

            //If statements per Disk
            if(this.currentFrame == 1){
                trace("DiskRoll 1")
                deathDisk = false;
                kinghDisk = false;
            }
            if(this.currentFrame == 2){
                trace("DiskRoll 2")
                deathDisk = false;
                kinghDisk = false;              
            }
            if(this.currentFrame == 3){
                trace("DiskRoll 3")
                deathDisk = false;
                kinghDisk = false;              
            }
            if(this.currentFrame == 4 /*&& stage.getChildByName("block") == null*/){
                trace("DiskRoll 4")
                deathDisk = false;
                kinghDisk = false;              
            }
            if(this.currentFrame == 5){
                trace("DiskRoll 5")
                deathDisk = false;
                kinghDisk = false;              
            }
            if(this.currentFrame == 6){
                trace("DiskRoll 6")
                deathDisk = false;
                kinghDisk = false;              
            }
            if(this.currentFrame == 7){
                trace("DiskRoll 7")
                deathDisk = false;
                kinghDisk = true;               
            }
            if(this.currentFrame == 8){
                trace("DiskRoll 8")
                deathDisk = true;
                kinghDisk = false;              
            }

            trace(rand);
            trace(deathDisk);
            trace(kinghDisk);

            diskFxChannel = diskHitFx.play();

            this.removeEventListener(MouseEvent.MOUSE_DOWN, hitDisk);

            diskTilt.start();

        }

        //Deblock Disk (button) Timer
        private function tiltOnComplete(event:TimerEvent):void {

            this.gotoAndPlay(1);
            diskTilt.stop();
            this.addEventListener(MouseEvent.MOUSE_DOWN, hitDisk);

            diskFxChannel = diskRollFx.play();

        }

    }

}
4

1 に答える 1

0

それで。より明確にするために、AとBで説明しようとすると。A がケースの 10% に表示されるようにします。ケースの 80% で B が表示されるようにします。C がケースの 10% に表示されるようにします。AA、CC、または AC を取得したくありません。

次に、最終的な配列の 20% である要素 A と C を持つ配列を作成します。条件が Math.random() < 0.5 であるソート関数を適用してシャッフルします。

ここで、2 つの要素ごとに 1 つの要素 B を挿入します。最終的な配列の 80% から回るのに十分なはずです。これにより、2 つのディスクが連続することはありません。

残りの B を好きな場所に挿入します。問題ありません。もちろん、ランダムに行います。Math.random() * temporaryArray.length を挿入する配列内のランダムなインデックスを取得するだけです。

質問や説明が必要な場合は、撮影してください:)

編集

//used some string to identify them. you use your instances
        var deathDisk : String = "death";
        var kingDisk  : String = "king";
        var normalDisk : String = "normal";

        //Any nr of total disks. I reserve 10% of death and 10% of king. The rest are normal.
        var totalNrOfDisks : Number = 40;
        var nrOfDeath : uint = totalNrOfDisks * 10 / 100;
        var nrOfKing  : uint = totalNrOfDisks * 10 / 100;

        //Generate all kings and deaths.
        var kingAndDeath : Array = [];
        for( var i : int = 0; i < nrOfDeath; i++ ) 
        {
            kingAndDeath.push( deathDisk );
        }
        for( i  = 0; i < nrOfKing; i++ ) 
        {
            kingAndDeath.push( kingDisk );
        }

        //shuffle them
        kingAndDeath.sort( function( element0:Number, element1:Number ):Boolean
        {
            return Math.random() < 0.5;
        });

        //Put at least 1 normal between them.
        var allArray : Array = [];
        for( i  = 0; i < kingAndDeath.length; i++ ) 
        {
            allArray.push( normalDisk );
            allArray.push( kingAndDeath[ i ] );
        }


        //While there is room for normals (max nr of disks not attained), insert one at a random spot in the array.
        while( allArray.length < totalNrOfDisks )
        {
            var randomIndex : uint = Math.random() * allArray.length;

            allArray.splice( randomIndex, 0, normalDisk );
        }
        trace( allArray );
于 2013-05-30T11:04:34.543 に答える