記憶翻牌遊戲

#setInterval
#Math.random()亂數

*html原始碼,牌的建置:
    有十六張牌,分別給他們0~15的id,以便在Javascript中控制牌。
    程式碼:
    <div class="board">
        <div class="card" id=0 ></div>
        <div class="card" id=1 ></div>
        <div class="card" id=2 ></div>
        <div class="card" id=3 ></div>
        <div class="card" id=4 ></div>
        <div class="card" id=5 ></div>
        <div class="card" id=6 ></div>
        <div class="card" id=7 ></div>
        <div class="card" id=8 ></div>
        <div class="card" id=9 ></div>
        <div class="card" id=10 ></div>
        <div class="card" id=11 ></div>
        <div class="card" id=12 ></div>
        <div class="card" id=13 ></div>
        <div class="card" id=14 ></div>
        <div class="card" id=15 ></div>
    </div>
*html原始碼,時間的建置:倒數、重新開始、暫停
    在class="timing"的部分,只是顯示倒數的時間
    restart的部分,使用onclick="",點下去後執行restart()函式
    stop則執行stop()函式。
    程式碼:
    <div class="timing" id="timing">
        倒數:
    </div>
    <div class="restart">
        <input type="button" onclick="restart()" value="洗牌or開始">
    </div>
    <div class="stop">
    <input type="button" onclick="stop()" id="stop" value="暫停">
    </div>
*Javascript程式碼的部分:
    有的功能:
    1.確認哪一個位置的牌被翻閱
    2.紀錄翻開的第一張牌跟第二章牌,判斷是否為同樣的花色
    3.紀錄有幾對成功
    4.時間暫停
    5.亂數洗牌

<script>
    //首先要來設定變數
    var clickable=false;//暫停,是否開始
    var round=0;//回合
    var FirstCard,//翻開的第一張牌的花色
        SecondCard,
        FirstPosition,//翻開的位置
        SecondPosition,
        success=0;//紀錄有幾對成功
    var stopbool=false;//現在是否暫停
    var start=false;//能不能點擊,代表的是整個遊戲是否開始
    var time,
        timer;
    //接著是花色,設定一個長度為16的陣列,花色的名字有8個,並重複。
    var fruit=['apple','banana','cherry','peach'
    ,'orange','strawberry','juice','apple',
    'banana','cherry','peach','orange',
    'strawberry','juice','lemons','lemons'];

    //接著設定一個陣列,代表每一個位置上的牌是否是被翻閱
    var opened=new Array(16);
    for (i=0;i<opened.length;i++){
        opened[i]=false;
    }

    //restart函式,這個函式的功能是開始遊戲或重新洗牌(重新開始),
   var restart=function(){
       clearInterval(timer);    //一開始先清除timer這個計時器(往下會寫到)
       time=60;    //接著重新設定time=60
       start=true;    //遊戲已經開始
       timer = setInterval(countDown,1000);//計時器每一秒值行countDown函式
       clickable=true;//可以點擊
       ChangeSuit(fruit);//執行ChangeSuit函式,這是洗牌的函式,傳入fruit這個代表花色的陣列
   }
   
   //暫停功能,stop()函式。如果現在是遊戲開始(start==true),判斷現在是否暫停。
   //如果現在沒有暫停,代表點下去是玩家要暫停,所以先終止計時器,然後設定stopbool是true,代表現在暫停
   //clickable=false,玩家不能點牌。
   var stop=function(){
       if(start==true){
        if(stopbool==false){
            clearInterval(timer);
            stopbool=true;
            clickable=false;
            document.getElementById("stop").value="繼續";
        }
       else if (stopbool==true){
        timer = setInterval(countDown,1000);
        stopbool=false;
        clickable=true;
        document.getElementById("stop").value="暫停";
       }
    }
}
   
    //計時,
   function countDown(){
       if(time>=0){
        document.getElementById("timing").innerHTML="倒數"+time 
        +"秒";
        console.log(time);
        time-=1;}
        else if(time<0&&success<8){//如果沒有在時間內完成
            clearInterval(timer);
            clickable=false;
            document.getElementById("timing").innerHTML="U Lose";
        }
   } 

   //此函式改變花色,打亂fruit的順序
   function ChangeSuit(arr){
       success=0;//重新設定成功的牌對為零
       document.getElementById("count").innerHTML="已成功: "+success;
       for (i=0;i<16;i++){
        document.getElementById(i).innerHTML="";//蓋上,所以用內容是""空的代表
        opened[i]=false;
        }
        //開始洗牌
        //Math.random()函式,隨機產生出0~1之間的小數,
        //Math.floor()函式,會將所有的小數無條件捨去到整數
        //Math.ramdom()*i,假設最大為0.9,則乘上1會得到0,乘上2得到1,乘上3得到2...以此類推,
        //先記錄隨機得到的數字位置,接著調換位置。
       var i
       j,
       temp;
       for (i = arr.length - 1i > 0i--) { 
       j = Math.floor(Math.random() *i );
       temp = arr[i];
       arr[i] = arr[j];
       arr[j] = temp;
       }
       return arr;
   }

    //點擊位置後判斷,是否是可以點擊的狀態(沒有暫停),將翻開的位置對應opened。
      for(var i=0;i<16;i++){
        document.getElementById(i).onclick=function(){
            if(clickable===true){
            if(opened[this.id]===false){
                opened[this.id]=true;
                this.innerHTML='<img src="./'+fruit[this.id]+'.jpg"></img>';//改變花色
                //翻牌後判斷,第一張牌
                if(round===0){
                    FirstCard=fruit[this.id];//第一張牌的花色
                    FirstPosition=this.id;//第一張牌的位置
                    round+=1;
                }
                else if(round===1){
                    SecondCard=fruit[this.id];
                    SecondPosition=this.id;
                    round-=1;
                    setTimeout("judge()",500);//執行判斷
                }  
            }
        }
        }
    }
    
    //判斷第一張跟第二張卡片
    judge=function(){
        if(FirstCard!=SecondCard){
            document.getElementById(FirstPosition).innerHTML="";
            document.getElementById(SecondPosition).innerHTML="";
            opened[FirstPosition]=false;
            opened[SecondPosition]=false;
        }
        else if(FirstCard===SecondCard){
            success+=1;
            if(success<8){
            document.getElementById("count").innerHTML="已成功: " + success;}
            else if(success==8){
                clearInterval(timer);
                document.getElementById("count").innerHTML="Win!!!" ;
            }
        }
    }

</script> 

留言