1. 程式人生 > >飛機大戰(JavaScript程式碼)

飛機大戰(JavaScript程式碼)

小遊戲測試:http://handsomecui.top/feiji.html

程式碼:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title></title>
    <meta http-equiv="content" content="text/html" charset="GB2312" />
    <style type="text/css">
        * {
            margin: 0;
            padding: 0;
        }

        #contentdiv {
            position: absolute;
            left: 500px;
        }

        #startdiv {
            width: 320px;
            height: 568px;
            background-image: url(開始背景.png);
        }

        button {
            outline: none;
        }

        #startdiv button {
            position: absolute;
            top: 500px;
            left: 82px;
            width: 150px;
            height: 30px;
            border: 1px solid black;
            border-radius: 30px;
            background-color: #c4c9ca;
        }

        #maindiv {
            width: 320px;
            height: 568px;
            background-image: url(background_1.png);
            display: none;
        }

            #maindiv img {
                position: absolute;
                z-index: 1;
            }

        #scorediv {
            font-size: 16px;
            font-weight: bold;
            position: absolute;
            top: 10px;
            left: 10px;
            display: none;
        }

        #scorediv {
            font-size: 18px;
            font-weight: bold;
        }

        #suspenddiv {
            position: absolute;
            top: 210px;
            left: 82px;
            display: none;
            z-index: 2;
        }

            #suspenddiv button {
                width: 150px;
                height: 30px;
                margin-bottom: 20px;
                border: 1px solid black;
                border-radius: 30px;
                background-color: #c4c9ca;
            }

        #enddiv {
            position: absolute;
            top: 210px;
            left: 75px;
            border: 1px solid gray;
            border-radius: 5px;
            text-align: center;
            background-color: #d7ddde;
            display: none;
            z-index: 2;
        }

        .plantext {
            width: 160px;
            height: 30px;
            line-height: 30px;
            font-size: 16px;
            font-weight: bold;
        }

        #planscore {
            width: 160px;
            height: 80px;
            line-height: 80px;
            border-top: 1px solid gray;
            border-bottom: 1px solid gray;
            font-size: 16px;
            font-weight: bold;
        }

        #enddiv div {
            width: 160px;
            height: 50px;
        }

            #enddiv div button {
                margin-top: 10px;
                width: 90px;
                height: 30px;
                border: 1px solid gray;
                border-radius: 30px;
            }
    </style>
</head>

<body>
    <div id="contentdiv">
        <div id="startdiv">
            <button onclick="begin()">開始遊戲</button>
        </div>
        <div id="maindiv">
            <div id="scorediv">
                <label>分數:</label>
                <label id="label">0</label>
            </div>
            <div id="suspenddiv">
                <button>繼續</button><br />
                <button>重新開始</button><br />
                <button>回到主頁</button>
            </div>
            <div id="enddiv">
                <p class="plantext">飛機大戰分數</p>
                <p id="planscore">0</p>
                <div><button onclick="jixu()">繼續</button></div>
            </div>
        </div>
    </div>
    <script type="text/javascript">
        //獲得主介面
        var mainDiv = document.getElementById("maindiv");
        //獲得開始介面
        var startdiv = document.getElementById("startdiv");
        //獲得遊戲中分數顯示介面
        var scorediv = document.getElementById("scorediv");
        //獲得分數介面
        var scorelabel = document.getElementById("label");
        //獲得暫停介面
        var suspenddiv = document.getElementById("suspenddiv");
        //獲得遊戲結束介面
        var enddiv = document.getElementById("enddiv");
        //獲得遊戲結束後分數統計介面
        var planscore = document.getElementById("planscore");
        //初始化分數
        var scores = 0;

        /*
        建立飛機類
        */
        function plan(hp, X, Y, sizeX, sizeY, score, dietime, sudu, boomimage, imagesrc) {
            this.planX = X;
            this.planY = Y;
            this.imagenode = null;
            this.planhp = hp;
            this.planscore = score;
            this.plansizeX = sizeX;
            this.plansizeY = sizeY;
            this.planboomimage = boomimage;
            this.planisdie = false;
            this.plandietimes = 0;
            this.plandietime = dietime;
            this.plansudu = sudu;
            //行為
            /*
            移動行為
            */
            this.planmove = function () {
                if (scores <= 50000) {
                    this.imagenode.style.top = this.imagenode.offsetTop + this.plansudu + "px";
                }
                else if (scores > 50000 && scores <= 100000) {
                    this.imagenode.style.top = this.imagenode.offsetTop + this.plansudu + 1 + "px";
                }
                else if (scores > 100000 && scores <= 150000) {
                    this.imagenode.style.top = this.imagenode.offsetTop + this.plansudu + 2 + "px";
                }
                else if (scores > 150000 && scores <= 200000) {
                    this.imagenode.style.top = this.imagenode.offsetTop + this.plansudu + 3 + "px";
                }
                else if (scores > 200000 && scores <= 300000) {
                    this.imagenode.style.top = this.imagenode.offsetTop + this.plansudu + 4 + "px";
                }
                else {
                    this.imagenode.style.top = this.imagenode.offsetTop + this.plansudu + 5 + "px";
                }
            }
            this.init = function () {
                this.imagenode = document.createElement("img");
                this.imagenode.style.left = this.planX + "px";
                this.imagenode.style.top = this.planY + "px";
                this.imagenode.src = imagesrc;
                mainDiv.appendChild(this.imagenode);
            }
            this.init();
        }

        /*
        建立子彈類
        */
        function bullet(X, Y, sizeX, sizeY, imagesrc) {
            this.bulletX = X;
            this.bulletY = Y;
            this.bulletimage = null;
            this.bulletattach = 1;
            this.bulletsizeX = sizeX;
            this.bulletsizeY = sizeY;
            //行為
            /*
            移動行為
            */
            this.bulletmove = function () {
                this.bulletimage.style.top = this.bulletimage.offsetTop - 20 + "px";
            }
            this.init = function () {
                this.bulletimage = document.createElement("img");
                this.bulletimage.style.left = this.bulletX + "px";
                this.bulletimage.style.top = this.bulletY + "px";
                this.bulletimage.src = imagesrc;
                mainDiv.appendChild(this.bulletimage);
            }
            this.init();
        }

        /*
        建立單行子彈類
        */
        function oddbullet(X, Y) {
            bullet.call(this, X, Y, 6, 14, "buttle1.png");
        }

        /*
        建立敵機類
        */
        function enemy(hp, a, b, sizeX, sizeY, score, dietime, sudu, boomimage, imagesrc) {
            plan.call(this, hp, random(a, b), -100, sizeX, sizeY, score, dietime, sudu, boomimage, imagesrc);
        }
        //產生min到max之間的隨機數
        function random(min, max) {
            return Math.floor(min + Math.random() * (max - min));
        }

        /*
        建立本方飛機類
        */
        function ourplan(X, Y) {
            var imagesrc = "myplane.png";
            plan.call(this, 1, X, Y, 66, 80, 0, 660, 0, "本方飛機爆炸.gif", imagesrc);
            this.imagenode.setAttribute('id', 'ourplan');
        }

        /*
        建立本方飛機
        */
        var selfplan = new ourplan(120, 485);
        //移動事件
        var ourPlan = document.getElementById('ourplan');
        var yidong = function () {
            var oevent = window.event || arguments[0];
            var chufa = oevent.srcElement || oevent.target;
            var selfplanX = oevent.clientX - 500;
            var selfplanY = oevent.clientY;
            ourPlan.style.left = selfplanX - selfplan.plansizeX / 2 + "px";
            ourPlan.style.top = selfplanY - selfplan.plansizeY / 2 + "px";
            //    document.getElementsByTagName('img')[0].style.left=selfplanX-selfplan.plansizeX/2+"px";
            //    document.getElementsByTagName('img')[0]..style.top=selfplanY-selfplan.plansizeY/2+"px";
        }
        /*
        暫停事件
        */
        var number = 0;
        var zanting = function () {
            if (number == 0) {
                suspenddiv.style.display = "block";
                if (document.removeEventListener) {
                    mainDiv.removeEventListener("mousemove", yidong, true);
                    bodyobj.removeEventListener("mousemove", bianjie, true);
                }
                else if (document.detachEvent) {
                    mainDiv.detachEvent("onmousemove", yidong);
                    bodyobj.detachEvent("onmousemove", bianjie);
                }
                clearInterval(set);
                number = 1;
            }
            else {
                suspenddiv.style.display = "none";
                if (document.addEventListener) {
                    mainDiv.addEventListener("mousemove", yidong, true);
                    bodyobj.addEventListener("mousemove", bianjie, true);
                }
                else if (document.attachEvent) {
                    mainDiv.attachEvent("onmousemove", yidong);
                    bodyobj.attachEvent("onmousemove", bianjie);
                }
                set = setInterval(start, 20);
                number = 0;
            }
        }
        //判斷本方飛機是否移出邊界,如果移出邊界,則取消mousemove事件,反之加上mousemove事件
        var bianjie = function () {
            var oevent = window.event || arguments[0];
            var bodyobjX = oevent.clientX;
            var bodyobjY = oevent.clientY;
            if (bodyobjX < 505 || bodyobjX > 815 || bodyobjY < 0 || bodyobjY > 568) {
                if (document.removeEventListener) {
                    mainDiv.removeEventListener("mousemove", yidong, true);
                }
                else if (document.detachEvent) {
                    mainDiv.detachEvent("onmousemove", yidong);
                }
            }
            else {
                if (document.addEventListener) {
                    mainDiv.addEventListener("mousemove", yidong, true);
                }
                else if (document.attachEvent) {
                    mainDiv.attachEvent("nomousemove", yidong);
                }
            }
        }
        //暫停介面重新開始事件
        //function chongxinkaishi(){
        //    location.reload(true);
        //    startdiv.style.display="none";
        //    maindiv.style.display="block";
        //}
        var bodyobj = document.getElementsByTagName("body")[0];
        if (document.addEventListener) {
            //為本方飛機新增移動和暫停
            mainDiv.addEventListener("mousemove", yidong, true);
            //為本方飛機新增暫停事件
            selfplan.imagenode.addEventListener("click", zanting, true);
            //為body新增判斷本方飛機移出邊界事件
            bodyobj.addEventListener("mousemove", bianjie, true);
            //為暫停介面的繼續按鈕新增暫停事件
            suspenddiv.getElementsByTagName("button")[0].addEventListener("click", zanting, true);
            //    suspenddiv.getElementsByTagName("button")[1].addEventListener("click",chongxinkaishi,true);
            //為暫停介面的返回主頁按鈕新增事件
            suspenddiv.getElementsByTagName("button")[2].addEventListener("click", jixu, true);
        }
        else if (document.attachEvent) {
            //為本方飛機新增移動
            mainDiv.attachEvent("onmousemove", yidong);
            //為本方飛機新增暫停事件
            selfplan.imagenode.attachEvent("onclick", zanting);
            //為body新增判斷本方飛機移出邊界事件
            bodyobj.attachEvent("onmousemove", bianjie);
            //為暫停介面的繼續按鈕新增暫停事件
            suspenddiv.getElementsByTagName("button")[0].attachEvent("onclick", zanting);
            //    suspenddiv.getElementsByTagName("button")[1].attachEvent("click",chongxinkaishi,true);
            //為暫停介面的返回主頁按鈕新增事件
            suspenddiv.getElementsByTagName("button")[2].attachEvent("click", jixu, true);
        }
        //初始化隱藏本方飛機
        selfplan.imagenode.style.display = "none";

        /*
        敵機物件陣列
        */
        var enemys = [];

        /*
        子彈物件陣列
        */
        var bullets = [];
        var mark = 0;
        var mark1 = 0;
        var backgroundPositionY = 0;
        /*
        開始函式
        */
        function start() {
            mainDiv.style.backgroundPositionY = backgroundPositionY + "px";
            backgroundPositionY += 0.5;
            if (backgroundPositionY == 568) {
                backgroundPositionY = 0;
            }
            mark++;
            /*
            建立敵方飛機
            */

            if (mark == 20) {
                mark1++;
                //中飛機
                if (mark1 % 5 == 0) {
                    enemys.push(new enemy(6, 25, 274, 46, 60, 5000, 360, random(1, 3), "中飛機爆炸.gif", "enemy3_fly_1.png"));
                }
                //大飛機
                if (mark1 == 20) {
                    enemys.push(new enemy(12, 57, 210, 110, 164, 30000, 540, 1, "大飛機爆炸.gif", "enemy2_fly_1.png"));
                    mark1 = 0;
                }
                    //小飛機
                else {
                    enemys.push(new enemy(1, 19, 286, 34, 24, 1000, 360, random(1, 4), "小飛機爆炸.gif", "enemy1_fly_1.png"));
                }
                mark = 0;
            }

            /*
            移動敵方飛機
            */
            var enemyslen = enemys.length;
            for (var i = 0; i < enemyslen; i++) {
                if (enemys[i].planisdie != true) {
                    enemys[i].planmove();
                }
                /*
                如果敵機超出邊界,刪除敵機
                */
                if (enemys[i].imagenode.offsetTop > 568) {
                    mainDiv.removeChild(enemys[i].imagenode);
                    enemys.splice(i, 1);
                    enemyslen--;
                }
                //當敵機死亡標記為true時,經過一段時間後清除敵機
                if (enemys[i].planisdie == true) {
                    enemys[i].plandietimes += 20;
                    if (enemys[i].plandietimes == enemys[i].plandietime) {
                        mainDiv.removeChild(enemys[i].imagenode);
                        enemys.splice(i, 1);
                        enemyslen--;
                    }
                }
            }

            /*
            建立子彈
            */
            if (mark % 5 == 0) {
                bullets.push(new oddbullet(parseInt(selfplan.imagenode.style.left) + 31, parseInt(selfplan.imagenode.style.top) - 10));
            }

            /*
            移動子彈
            */
            var bulletslen = bullets.length;
            for (var i = 0; i < bulletslen; i++) {
                bullets[i].bulletmove();
                /*
                如果子彈超出邊界,刪除子彈
                */
                if (bullets[i].bulletimage.offsetTop < 0) {
                    mainDiv.removeChild(bullets[i].bulletimage);
                    bullets.splice(i, 1);
                    bulletslen--;
                }
            }

            /*
            碰撞判斷
            */
            for (var k = 0; k < bulletslen; k++) {
                for (var j = 0; j < enemyslen; j++) {
                    //判斷碰撞本方飛機
                    if (enemys[j].planisdie == false) {
                        if (enemys[j].imagenode.offsetLeft + enemys[j].plansizeX >= selfplan.imagenode.offsetLeft && enemys[j].imagenode.offsetLeft <= selfplan.imagenode.offsetLeft + selfplan.plansizeX) {
                            if (enemys[j].imagenode.offsetTop + enemys[j].plansizeY >= selfplan.imagenode.offsetTop + 40 && enemys[j].imagenode.offsetTop <= selfplan.imagenode.offsetTop - 20 + selfplan.plansizeY) {
                                //碰撞本方飛機,遊戲結束,統計分數
                                selfplan.imagenode.src = "本方飛機爆炸.gif";
                                enddiv.style.display = "block";
                                planscore.innerHTML = scores;
                                if (document.removeEventListener) {
                                    mainDiv.removeEventListener("mousemove", yidong, true);
                                    bodyobj.removeEventListener("mousemove", bianjie, true);
                                }
                                else if (document.detachEvent) {
                                    mainDiv.detachEvent("onmousemove", yidong);
                                    bodyobj.removeEventListener("mousemove", bianjie, true);
                                }
                                clearInterval(set);
                            }
                        }
                        //判斷子彈與敵機碰撞
                        if ((bullets[k].bulletimage.offsetLeft + bullets[k].bulletsizeX > enemys[j].imagenode.offsetLeft) && (bullets[k].bulletimage.offsetLeft < enemys[j].imagenode.offsetLeft + enemys[j].plansizeX)) {
                            if (bullets[k].bulletimage.offsetTop <= enemys[j].imagenode.offsetTop + enemys[j].plansizeY && bullets[k].bulletimage.offsetTop + bullets[k].bulletsizeY >= enemys[j].imagenode.offsetTop) {
                                //敵機血量減子彈攻擊力
                                enemys[j].planhp = enemys[j].planhp - bullets[k].bulletattach;
                                //敵機血量為0,敵機圖片換為爆炸圖片,死亡標記為true,計分
                                if (enemys[j].planhp == 0) {
                                    scores = scores + enemys[j].planscore;
                                    scorelabel.innerHTML = scores;
                                    enemys[j].imagenode.src = enemys[j].planboomimage;
                                    enemys[j].planisdie = true;
                                }
                                //刪除子彈
                                mainDiv.removeChild(bullets[k].bulletimage);
                                bullets.splice(k, 1);
                                bulletslen--;
                                break;
                            }
                        }
                    }
                }
            }
        }
        /*
        開始遊戲按鈕點選事件
        */
        var set;
        function begin() {

            startdiv.style.display = "none";
            mainDiv.style.display = "block";
            selfplan.imagenode.style.display = "block";
            scorediv.style.display = "block";
            /*
            呼叫開始函式
            */
            set = setInterval(start, 20);
        }
        //遊戲結束後點擊繼續按鈕事件
        function jixu() {
            location.reload(true);
        }
    </script>
</body>
</html>