JS小游戏-宇宙战机

游戏介绍:
业余时间写的一个飞行射击游戏,纵向,共六关。

游戏需求:
1.战机可发射子弹,子弹可通过获取道具升级。
2.战机可放bomb,可获取道具增加数量。
3.战机可蓄力攻击。
4.道具有三种,分别是升级子弹,增加bomb数量,增加战机数量。
5.每关音乐不同。
6.战机被击落后再进入战场,有保护状态。
7.敌机AI设计。


游戏图片:





源文件下载地址: 点击下载


在线游戏地址:开始游戏


JavaScript部分:

[javascript] view plain copy
print ?
  1. /** 宇宙战机 
  2. *   Author: fdipzone 
  3. *   Date:   2013-02-12 
  4. *   Ver:    1.0 
  5. */  
  6. window.onload = function(){  
  7.     var gameimg = [  
  8.         'images/fighter.png',   
  9.         'images/fighter_p.png',   
  10.         'images/fighter_s.png',  
  11.         'images/fighter_sp.png',   
  12.         'images/shot.png',   
  13.         'images/destroy.png',   
  14.         'images/destroy_boss.png',  
  15.         'images/enemy.png',   
  16.         'images/bullet.png',   
  17.         'images/gift.png',   
  18.         'images/bomb.png',   
  19.         'images/boss1.png'];  
  20.   
  21.     var callback = function(){  
  22.         var gameplane = $('gameplane');  
  23.         fighter.init();  
  24.         fighter.bgmove(gameplane);  
  25.     }  
  26.     img_preload(gameimg, callback);  
  27. };  
  28.   
  29.   
  30. /** fighter class */  
  31. var fighter = (function(){  
  32.       
  33.     var hiscore = 10000;                    // 最高分  
  34.     var score = 0;                          // 当前分  
  35.     var fighternum = 3;                     // 战机数量  
  36.     var bombnum = 3;                        // 炸弹数量  
  37.     var ft = null;                          // 战机对象  
  38.     var is_start = 0;                       // 是否已开始游戏  
  39.     var is_bombing = 0;                     // 是否爆炸中  
  40.     var is_lock = 1;                        // 是否锁定  
  41.     var is_over = 0;                        // 是否已结束  
  42.     var is_clear = 0;                       // 清屏  
  43.     var is_pile = 0;                        // 是否已达成蓄力  
  44.     var is_protect = 0;                     // 是否保护状态  
  45.     var pilenum = 0;                        // 已蓄力数量  
  46.     var ackey = {};                         // 记录键是否按下  
  47.     var keypriority = {};                   // 冲突键优先级  
  48.     var gamekey = [37,38,39,40,83,65];      // 游戏的按键  
  49.     var scoretag = [0,20,30,40,50,60,500];  // 不同敌机的分数  
  50.     var level = 1;                          // 关数      
  51.     var power = 1;                          // 战机子弹威力  
  52.     var cheatcode = [];                     // 记录cheat输入  
  53.     var failtimes = 0;                      // 挑战失败次数  
  54.       
  55.     // boss 数据  
  56.     var bossdata = [  
  57.                     {'armor':500, 'left':136, 'top':-169, 'step':30},  
  58.                     {'armor':1000, 'left':136, 'top':-169, 'step':30},  
  59.                     {'armor':1500, 'left':136, 'top':-169, 'step':30},  
  60.                     {'armor':2000, 'left':136, 'top':-169, 'step':30},  
  61.                     {'armor':2500, 'left':136, 'top':-169, 'step':30},  
  62.                     {'armor':3000, 'left':136, 'top':-169, 'step':30},  
  63.                    ];  
  64.   
  65.     // 出现的敌机  
  66.     var enemydata = [];  
  67.   
  68.     // 当前出现的boss  
  69.     var curboss = null;  
  70.       
  71.     // 关卡数据  
  72.     var map = [  
  73.         // level 1  
  74.         {  
  75.             'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]],   
  76.             'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],  
  77.             'ms3500':[[1, 10, 12, -23, 190, 10]],  
  78.             'ms5500':[[3, 800, 2, 100, -50, 10]],  
  79.             'ms7500':[[3, 800, 2, 200, 450, -10]],  
  80.             'ms8000':[[1, 10, 11, -23, 100, 10]],  
  81.             'ms9500':[[3, 800, 2, 100, -50, 10]],  
  82.             'ms11500':[[3, 800, 2, 200, 450, -10]],  
  83.             'ms13500':[[3, 800, 2, 100, -50, 10]],  
  84.             'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],  
  85.             'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],  
  86.             'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]],  
  87.             'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]],  
  88.             'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],  
  89.             'ms38000':[[1, 10, 11, -23, 10, 10]],  
  90.             'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],  
  91.             'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],  
  92.             'ms45500':[[3, 800, 2, 50, -50, 10]],  
  93.             'ms47500':[[3, 800, 2, 150, 450, -10]],  
  94.             'ms49500':[[3, 800, 2, 50, -50, 10]],  
  95.             'ms51500':[[3, 800, 2, 150, 450, -10]],  
  96.             'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],  
  97.             'ms60000':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],  
  98.             'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],  
  99.             'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]],  
  100.             'ms71000':[[1, 10, 13, -23, 220, 10]],  
  101.             'ms76000':[]  
  102.         },  
  103.         // level 2  
  104.         {  
  105.             'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]],   
  106.             'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],  
  107.             'ms3500':[[1, 10, 12, -23, 190, 10]],  
  108.             'ms5500':[[3, 800, 2, 100, -50, 10]],  
  109.             'ms7500':[[3, 800, 2, 200, 450, -10]],  
  110.             'ms8000':[[1, 10, 11, -23, 100, 10]],  
  111.             'ms9500':[[3, 800, 2, 100, -50, 10]],  
  112.             'ms11500':[[3, 800, 2, 200, 450, -10]],  
  113.             'ms13500':[[3, 800, 2, 100, -50, 10]],  
  114.             'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],  
  115.             'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],  
  116.             'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]],  
  117.             'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]],  
  118.             'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],  
  119.             'ms38000':[[1, 10, 11, -23, 10, 10]],  
  120.             'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],  
  121.             'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],  
  122.             'ms45500':[[3, 800, 2, 50, -50, 10]],  
  123.             'ms47500':[[3, 800, 2, 150, 450, -10]],  
  124.             'ms49500':[[3, 800, 2, 50, -50, 10]],  
  125.             'ms51500':[[3, 800, 2, 150, 450, -10]],  
  126.             'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],  
  127.             'ms60000':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],  
  128.             'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],  
  129.             'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]],  
  130.             'ms71000':[[1, 10, 13, -23, 220, 10]],  
  131.             'ms76000':[]  
  132.         },  
  133.         // level 3  
  134.         {  
  135.             'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]],   
  136.             'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],  
  137.             'ms3500':[[1, 10, 12, -23, 190, 10]],  
  138.             'ms5500':[[3, 800, 2, 100, -50, 10]],  
  139.             'ms7500':[[3, 800, 2, 200, 450, -10]],  
  140.             'ms8000':[[1, 10, 11, -23, 100, 10]],  
  141.             'ms9500':[[3, 800, 2, 100, -50, 10]],  
  142.             'ms11500':[[3, 800, 2, 200, 450, -10]],  
  143.             'ms13500':[[3, 800, 2, 100, -50, 10]],  
  144.             'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],  
  145.             'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],  
  146.             'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]],  
  147.             'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]],  
  148.             'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],  
  149.             'ms38000':[[1, 10, 11, -23, 10, 10]],  
  150.             'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],  
  151.             'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],  
  152.             'ms45500':[[3, 800, 2, 50, -50, 10]],  
  153.             'ms47500':[[3, 800, 2, 150, 450, -10]],  
  154.             'ms49500':[[3, 800, 2, 50, -50, 10]],  
  155.             'ms51500':[[3, 800, 2, 150, 450, -10]],  
  156.             'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],  
  157.             'ms60000':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],  
  158.             'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],  
  159.             'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]],  
  160.             'ms71000':[[1, 10, 13, -23, 220, 10]],  
  161.             'ms76000':[]  
  162.         },  
  163.         // level 4  
  164.         {  
  165.             'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]],   
  166.             'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],  
  167.             'ms3500':[[1, 10, 12, -23, 190, 10]],  
  168.             'ms5500':[[3, 800, 2, 100, -50, 10]],  
  169.             'ms7500':[[3, 800, 2, 200, 450, -10]],  
  170.             'ms8000':[[1, 10, 11, -23, 100, 10]],  
  171.             'ms9500':[[3, 800, 2, 100, -50, 10]],  
  172.             'ms11500':[[3, 800, 2, 200, 450, -10]],  
  173.             'ms13500':[[3, 800, 2, 100, -50, 10]],  
  174.             'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],  
  175.             'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],  
  176.             'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]],  
  177.             'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]],  
  178.             'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],  
  179.             'ms38000':[[1, 10, 11, -23, 10, 10]],  
  180.             'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],  
  181.             'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],  
  182.             'ms45500':[[3, 800, 2, 50, -50, 10]],  
  183.             'ms47500':[[3, 800, 2, 150, 450, -10]],  
  184.             'ms49500':[[3, 800, 2, 50, -50, 10]],  
  185.             'ms51500':[[3, 800, 2, 150, 450, -10]],  
  186.             'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],  
  187.             'ms60000':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],  
  188.             'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],  
  189.             'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]],  
  190.             'ms71000':[[1, 10, 13, -23, 220, 10]],  
  191.             'ms76000':[]  
  192.         },  
  193.         // level 5  
  194.         {  
  195.             'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]],   
  196.             'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],  
  197.             'ms3500':[[1, 10, 12, -23, 190, 10]],  
  198.             'ms5500':[[3, 800, 2, 100, -50, 10]],  
  199.             'ms7500':[[3, 800, 2, 200, 450, -10]],  
  200.             'ms8000':[[1, 10, 11, -23, 100, 10]],  
  201.             'ms9500':[[3, 800, 2, 100, -50, 10]],  
  202.             'ms11500':[[3, 800, 2, 200, 450, -10]],  
  203.             'ms13500':[[3, 800, 2, 100, -50, 10]],  
  204.             'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],  
  205.             'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],  
  206.             'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]],  
  207.             'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]],  
  208.             'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],  
  209.             'ms38000':[[1, 10, 11, -23, 10, 10]],  
  210.             'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],  
  211.             'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],  
  212.             'ms45500':[[3, 800, 2, 50, -50, 10]],  
  213.             'ms47500':[[3, 800, 2, 150, 450, -10]],  
  214.             'ms49500':[[3, 800, 2, 50, -50, 10]],  
  215.             'ms51500':[[3, 800, 2, 150, 450, -10]],  
  216.             'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],  
  217.             'ms60000':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],  
  218.             'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],  
  219.             'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]],  
  220.             'ms71000':[[1, 10, 13, -23, 220, 10]],  
  221.             'ms76000':[]  
  222.         },  
  223.         // level 6  
  224.         {  
  225.             'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]],   
  226.             'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],  
  227.             'ms3500':[[1, 10, 12, -23, 190, 10]],  
  228.             'ms5500':[[3, 800, 2, 100, -50, 10]],  
  229.             'ms7500':[[3, 800, 2, 200, 450, -10]],  
  230.             'ms8000':[[1, 10, 11, -23, 100, 10]],  
  231.             'ms9500':[[3, 800, 2, 100, -50, 10]],  
  232.             'ms11500':[[3, 800, 2, 200, 450, -10]],  
  233.             'ms13500':[[3, 800, 2, 100, -50, 10]],  
  234.             'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],  
  235.             'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],  
  236.             'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]],  
  237.             'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]],  
  238.             'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],  
  239.             'ms38000':[[1, 10, 11, -23, 10, 10]],  
  240.             'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],  
  241.             'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],  
  242.             'ms45500':[[3, 800, 2, 50, -50, 10]],  
  243.             'ms47500':[[3, 800, 2, 150, 450, -10]],  
  244.             'ms49500':[[3, 800, 2, 50, -50, 10]],  
  245.             'ms51500':[[3, 800, 2, 150, 450, -10]],  
  246.             'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],  
  247.             'ms60000':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],  
  248.             'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],  
  249.             'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]],  
  250.             'ms71000':[[1, 10, 13, -23, 220, 10]],  
  251.             'ms76000':[]  
  252.         }  
  253.     ];  
  254.   
  255.   
  256.     // 初始化  
  257.     init = function(){  
  258.         ft = $('fighter');  
  259.         reset();  
  260.         key_event();  
  261.     }  
  262.   
  263.   
  264.     // 开始游戏  
  265.     start = function(){  
  266.         is_clear = 0;  
  267.         is_protect = 0;  
  268.         disp(ft.id, 'show');  
  269.         reset_fighter();  
  270.         reset_pile();  
  271.         process();  
  272.         bgsound(level, true);  
  273.         bgchange(level);  
  274.         fighter_init();  
  275.     }  
  276.   
  277.   
  278.     // 设置事件  
  279.     key_event = function(){  
  280.   
  281.         document.onkeydown = function(e){  
  282.             var e = e || window.event;  
  283.             var curkey = e.keyCode || e.which || e.charCode;  
  284.   
  285.             if(is_start==0){   
  286.                 if(cheatcode.length>12){  
  287.                     cheatcode.shift();  
  288.                 }  
  289.                 cheatcode.push(curkey); // 记录用户输入的cheatcode  
  290.             }  
  291.               
  292.             if(is_start==1 && in_array(curkey,gamekey)){  
  293.                 if(ackey[curkey.toString()]==0 || typeof(ackey[curkey.toString()])=='undefined' || !in_array(curkey,[83,65])){    // 射击与炸弹连按屏蔽  
  294.                     ackey[curkey.toString()] = 1;    // save key down  
  295.                     switch(curkey){  
  296.                         case 37:  
  297.                         case 39:  
  298.                             keypriority.left = curkey;    // left right  
  299.                             break;  
  300.                         case 38:  
  301.                         case 40:  
  302.                             keypriority.top = curkey;    // up down  
  303.                             break;  
  304.                     }  
  305.                 }else{  
  306.                     return false;  
  307.                 }  
  308.             }  
  309.               
  310.             if(curkey==13 || is_start==1 && is_lock==0){    // game is start or key=13  
  311.                 switch(curkey){  
  312.                     case 13: // enter  
  313.                         if(is_start==0){  
  314.                             is_start=1;  
  315.                             disp('op''hide');  
  316.                             msg_show();  
  317.                             setTimeout(function(){  
  318.                                 msg_hide();  
  319.                                 cheat();  
  320.                                 start();  
  321.                             }, 1500);  
  322.                         }  
  323.                         break;  
  324.   
  325.                     case 83: // 射击  
  326.                         shot();  
  327.                         break;  
  328.   
  329.                     case 65: // 炸弹  
  330.                         bomb();  
  331.                         break;  
  332.                 }  
  333.             }  
  334.         }  
  335.   
  336.         document.onkeyup = function(e){  
  337.             var e = e || window.event;  
  338.             var curkey = e.keyCode || e.which || e.charCode;  
  339.             if(is_start==1 && in_array(curkey,gamekey)){  
  340.                 ackey[curkey.toString()] = 0;    // release key down  
  341.                   
  342.                 if(curkey==83){// 释放蓄力攻击  
  343.                     if(is_pile==1){  
  344.                         pile_shot();  
  345.                     }  
  346.                     reset_pile();  
  347.                 }  
  348.             }  
  349.         }  
  350.   
  351.     }  
  352.   
  353.   
  354.     // 循环执行的动作  
  355.     action = function(){  
  356.         var movestep = 5;    // 移动步长  
  357.         var et = setInterval(function(){  
  358.             if(is_start==0 || is_lock==1){  
  359.                 clearInterval(et);  
  360.             }  
  361.               
  362.             // 移动  
  363.             if(ackey['37']==1 && (ackey['39']==0 || keypriority.left==37)){    // 冲突时判断优先级  
  364.                 if(getPosition(ft,'left')<movestep){  
  365.                     setPosition(ft, 'left', 0);    // left  
  366.                 }else{  
  367.                     setPosition(ft, 'left', getPosition(ft,'left') - movestep);  
  368.                 }  
  369.             }  
  370.             if(ackey['38']==1 && (ackey['40']==0 || keypriority.top==38)){  
  371.                 if(getPosition(ft, 'top')<movestep){  
  372.                     setPosition(ft, 'top', 0);    // top  
  373.                 }else{  
  374.                     setPosition(ft, 'top', getPosition(ft,'top') - movestep);  
  375.                 }  
  376.             }  
  377.             if(ackey['39']==1 && (ackey['37']==0 || keypriority.left==39)){  
  378.                 if(400-(getPosition(ft,'left')+50)<movestep){  
  379.                     setPosition(ft, 'left', 350);    //width-fighter.width  
  380.                 }else{  
  381.                     setPosition(ft, 'left', getPosition(ft,'left') + movestep);  
  382.                 }  
  383.             }  
  384.             if(ackey['40']==1 && (ackey['38']==0 || keypriority.top==40)){  
  385.                 if(640-(getPosition(ft,'top')+50)<movestep){  
  386.                     setPosition(ft, 'top', 590);    // height-fighter.height  
  387.                 }else{  
  388.                     setPosition(ft, 'top', getPosition(ft,'top') + movestep);  
  389.                 }  
  390.             }  
  391.   
  392.             // 蓄力攻击  
  393.             if(ackey['83']==1){  
  394.                 if(pilenum<1000){  
  395.                     pilenum = pilenum + 20;  
  396.                 }else if(is_pile==0){  
  397.                     is_pile = 1;  
  398.                     if(is_protect==1){  
  399.                         setClass(ft, 'fighter_sp');  
  400.                     }else{  
  401.                         setClass(ft, 'fighter_s');  
  402.                     }  
  403.                 }  
  404.             }  
  405.   
  406.         }, 20);  
  407.     }  
  408.   
  409.   
  410.     // 战机射击  
  411.     shot = function(){  
  412.         // 创建子弹  
  413.         var bullet = document.createElement('div');  
  414.         var offsetx;  
  415.   
  416.         switch(power){  
  417.             case 1:  
  418.                 offsetx = 20;  
  419.                 break;  
  420.             case 2:  
  421.                 offsetx = 15;  
  422.                 break;  
  423.             case 3:  
  424.                 offsetx = 10;  
  425.                 break;  
  426.             case 4:  
  427.                 offsetx = 4;  
  428.                 break;  
  429.         }  
  430.   
  431.         setClass(bullet, 'shot' + power);  
  432.   
  433.         // 设置子弹初始位置  
  434.         setPosition(bullet, 'top', getPosition(ft, 'top')-30);  
  435.         setPosition(bullet, 'left', getPosition(ft, 'left') + offsetx);  
  436.           
  437.         ft.parentNode.appendChild(bullet);  
  438.           
  439.         // 设置子弹运动  
  440.         var et = setInterval(function(){  
  441.             if(getPosition(bullet,'top')<=-30 || is_lock==1){  
  442.                 clearInterval(et);  
  443.                 ft.parentNode.removeChild(bullet);    // 释放子弹  
  444.             }  
  445.   
  446.             for(var i=0; i<enemydata.length; i++){  
  447.                 if(enemydata[i]!=null){  
  448.                     if(impact(bullet, enemydata[i])){    // 打中敌机  
  449.                         destroy(enemydata[i]);  
  450.                         scoreup(enemydata[i].type);  
  451.                         enemydata[i] = null;  
  452.                         clearInterval(et);  
  453.                         ft.parentNode.removeChild(bullet);  
  454.                     }  
  455.                 }  
  456.             }  
  457.   
  458.             if(curboss!=null){    // boss 战  
  459.                 if(impact(bullet, curboss['obj'])){ // 打中boss  
  460.                     curboss['armor']=parseInt(curboss['armor'])-power*10;  
  461.                     clearInterval(et);  
  462.                     ft.parentNode.removeChild(bullet);  
  463.                 }  
  464.             }  
  465.   
  466.             setPosition(bullet, 'top', getPosition(bullet, 'top')-15);  
  467.   
  468.         }, 30)  
  469.     }  
  470.   
  471.   
  472.     // 蓄力射击  
  473.     pile_shot = function(){  
  474.         var pilebullet = document.createElement('div');  
  475.         setClass(pilebullet, 'pileshot');  
  476.   
  477.         // 设置子弹初始位置  
  478.         setPosition(pilebullet, 'top', getPosition(ft, 'top')-30);  
  479.         setPosition(pilebullet, 'left', getPosition(ft, 'left'));  
  480.           
  481.         ft.parentNode.appendChild(pilebullet);  
  482.   
  483.         var et = setInterval(function(){  
  484.             if(getPosition(pilebullet,'top')<=-85 || is_lock==1){  
  485.                 clearInterval(et);  
  486.                 ft.parentNode.removeChild(pilebullet); // 释放子弹  
  487.             }  
  488.   
  489.             for(var i=0; i<enemydata.length; i++){  
  490.                 if(enemydata[i]!=null){  
  491.                     if(impact(pilebullet, enemydata[i])){    // 打中敌机  
  492.                         destroy(enemydata[i]);  
  493.                         scoreup(enemydata[i].type);  
  494.                         enemydata[i] = null;  
  495.                     }  
  496.                 }  
  497.             }  
  498.   
  499.             if(curboss!=null){    // boss 战  
  500.                 if(impact(pilebullet, curboss['obj'])){ // 打中boss  
  501.                     curboss['armor']=parseInt(curboss['armor'])-100;  
  502.                     clearInterval(et);  
  503.                     ft.parentNode.removeChild(pilebullet); // 释放子弹  
  504.                 }  
  505.             }  
  506.   
  507.             setPosition(pilebullet, 'top', getPosition(pilebullet, 'top')-20);  
  508.   
  509.         }, 30)  
  510.     }  
  511.   
  512.   
  513.     // 放炸弹  
  514.     bomb = function(){  
  515.         if(is_bombing==0 && bombnum>0){    // 不是爆炸中且有炸弹数  
  516.             is_bombing = 1;  
  517.             bombnum --;  
  518.             setHtml('bombnum', bombnum);    // 自减1  
  519.   
  520.             var opacity = 100;  
  521.             setOpacity($('bomb'), opacity);  
  522.             disp('bomb''show');  
  523.   
  524.             // 清除所有敌机及敌方子弹  
  525.             is_clear = 1;  
  526.   
  527.             // 打击boss  
  528.             if(curboss!=null){  
  529.                 curboss['armor'] = parseInt(curboss['armor'])-300;  
  530.             }  
  531.   
  532.             var step = 0;  
  533.             var et = setInterval(function(){    // 炸弹效果  
  534.                 if(step<11){  
  535.                     setBgPosition($('bomb'), 0, step*(-280));  
  536.                 }else{  
  537.                     clearInterval(et);  
  538.                     disp('bomb''hide');  
  539.                     is_bombing = 0;  
  540.                     is_clear = 0;  
  541.                 }  
  542.                 step ++;  
  543.             }, 70);  
  544.         }  
  545.     }  
  546.   
  547.   
  548.     // 游戏进程  
  549.     process = function(){  
  550.         var leveldata = map[level-1], processed = 0, step = 10;  
  551.         var levelstep = 0;    // 每关开始清0  
  552.         var et = setInterval(function(){  
  553.             if(is_lock==0){  
  554.                 processed += step;  
  555.                 if(attrcount(leveldata)>levelstep){    // 未完成本关  
  556.                     if(leveldata['ms'+processed]){  
  557.                         for(var i=0; i<leveldata['ms'+processed].length; i++){  
  558.                             var msdata = leveldata['ms'+processed][i];  
  559.                             create(msdata);  
  560.                         }  
  561.                         levelstep ++;    // 进度  
  562.                     }  
  563.                 }else{    // 已完成本关,进入Boss战  
  564.                     bosswar();  
  565.                     clearInterval(et);  
  566.                 }  
  567.             }  
  568.   
  569.             if(is_over==1){  
  570.                 clearInterval(et);  
  571.             }  
  572.   
  573.         }, step);  
  574.     }  
  575.   
  576.   
  577.     /* 创建关卡元素 
  578.     /* msdata:{ 
  579.        num:出现的数量 
  580.        interval:间隔 
  581.        type:类型 
  582.        top:原始top坐标 
  583.        left:原始left坐标 
  584.        step:移动距离 
  585.        } 
  586.     */  
  587.     create = function(msdata){  
  588.         var num = msdata[0],  
  589.             interval = msdata[1],  
  590.             type = msdata[2],  
  591.             top = msdata[3],  
  592.             left = msdata[4],  
  593.             step = msdata[5];  
  594.   
  595.         var et = setInterval(function(){  
  596.                 if(num>0){  
  597.                     var enft = document.createElement('div');  
  598.                     setClass(enft, 'element' + type);  
  599.                     enft.type = type;  
  600.                     setPosition(enft, 'top', top);  
  601.                     setPosition(enft, 'left', left);  
  602.                     ft.parentNode.appendChild(enft);  
  603.                     if(type<=10){  
  604.                         enemydata.push(enft);  
  605.                     }  
  606.                     route(enft, type, step);  
  607.                     num--;  
  608.                 }else{  
  609.                     clearInterval(et);  
  610.                 }  
  611.             }, interval);  
  612.     }  
  613.   
  614.   
  615.     // 元素运动轨迹  
  616.     route = function(enft, type, step){  
  617.         var et = null;  
  618.         switch(type){  
  619.             case 1: // 曲线  
  620.                 var count = 0;  
  621.                 et = setInterval(function(){  
  622.                     if(node_exist(enft)){  
  623.                         setPosition(enft, 'top', getPosition(enft,'top')+Math.abs(step));  
  624.                         setPosition(enft, 'left', getPosition(enft,'left')+step);  
  625.                         count<5? count++ : (count=0, step*=-1);  
  626.                         if(getPosition(enft, 'top')>640 || is_over==1 || is_clear==1){  
  627.                             clearInterval(et);  
  628.                             ft.parentNode.removeChild(enft);  
  629.                         }  
  630.                         impact_handle(enft, et);  
  631.                     }else{  
  632.                         clearInterval(et);  
  633.                     }  
  634.                 }, 80);  
  635.                 break;  
  636.   
  637.             case 2: // 横向  
  638.                 var count = 0;  
  639.                 et = setInterval(function(){  
  640.                     if(node_exist(enft)){  
  641.                         setPosition(enft, 'left', getPosition(enft,'left')+step);  
  642.                         count<9? count++ : (count=0, attack(enft,1,17,47));  
  643.                         if(getPosition(enft,'left')>400 && step>0 || getPosition(enft,'left')<-50 && step<0 || is_over==1 || is_clear==1){  
  644.                             clearInterval(et);  
  645.                             ft.parentNode.removeChild(enft);  
  646.                         }  
  647.                         impact_handle(enft, et);  
  648.                     }else{  
  649.                         clearInterval(et);  
  650.                     }  
  651.                 }, 80);  
  652.                 break;  
  653.   
  654.             case 3: // 竖向  
  655.                 var count = 0;  
  656.                 et = setInterval(function(){  
  657.                     if(node_exist(enft)){  
  658.                         setPosition(enft, 'top', getPosition(enft,'top')+step);  
  659.                         count<9? count++ : (count=0, attack(enft,1,17,47));  
  660.                         if(getPosition(enft,'top')>640 || is_over==1 || is_clear==1){  
  661.                             clearInterval(et);  
  662.                             ft.parentNode.removeChild(enft);  
  663.                         }  
  664.                         impact_handle(enft, et);  
  665.                     }else{  
  666.                         clearInterval(et);  
  667.                     }  
  668.                 }, 75);  
  669.                 break;  
  670.   
  671.             case 4: // 左右循环移动攻击  
  672.                 var count = 0;  
  673.                 et = setInterval(function(){  
  674.                     if(node_exist(enft)){  
  675.                         setPosition(enft, 'left', getPosition(enft,'left')+step);  
  676.                         count<10? count++ : (count=0, attack(enft,4,17,31));  
  677.                           
  678.                         if(getPosition(enft,'left')>=350 && step>0 || getPosition(enft,'left')<=0 && step<0){  
  679.                             step*=-1;  
  680.                         }  
  681.   
  682.                         if(is_over==1 || is_clear==1){  
  683.                             clearInterval(et);  
  684.                             ft.parentNode.removeChild(enft);  
  685.                         }  
  686.                         impact_handle(enft, et);  
  687.                     }else{  
  688.                         clearInterval(et);  
  689.                     }  
  690.                 }, 80);  
  691.                 break;  
  692.   
  693.             case 5: // 从后面攻击  
  694.                 var count = 0;  
  695.                 et = setInterval(function(){  
  696.                     if(node_exist(enft)){  
  697.                         setPosition(enft, 'top', getPosition(enft,'top')+step);  
  698.                         count<9? count++ : (count=0, attack(enft,1,17,-17));  
  699.                         if(getPosition(enft,'top')<-32 || is_over==1 || is_clear==1){  
  700.                             clearInterval(et);  
  701.                             ft.parentNode.removeChild(enft);  
  702.                         }  
  703.                         impact_handle(enft, et);  
  704.                     }else{  
  705.                         clearInterval(et);  
  706.                     }  
  707.                 }, 75);  
  708.                 break;  
  709.   
  710.             case 11: // power gift  
  711.                 var count = 0;  
  712.                 et = setInterval(function(){  
  713.                     if(node_exist(enft)){  
  714.                         setPosition(enft, 'top', getPosition(enft,'top')+Math.abs(step));  
  715.                         setPosition(enft, 'left', getPosition(enft,'left')+step);  
  716.                         count<5? count++ : (count=0, step*=-1);  
  717.                         if(getPosition(enft, 'top')>640 || is_over==1){  
  718.                             clearInterval(et);  
  719.                             ft.parentNode.removeChild(enft);  
  720.                         }  
  721.                         if(impact(enft, ft) && is_lock==0){    // 奖励与战机相撞  
  722.                             powerup();  
  723.                             ft.parentNode.removeChild(enft);  
  724.                             clearInterval(et);  
  725.                         }  
  726.                     }else{  
  727.                         clearInterval(et);  
  728.                     }  
  729.                 }, 80);  
  730.                 break;  
  731.   
  732.             case 12: // bomb gift  
  733.                 var count = 0;  
  734.                 et = setInterval(function(){  
  735.                     if(node_exist(enft)){  
  736.                         setPosition(enft, 'top', getPosition(enft,'top')+Math.abs(step));  
  737.                         setPosition(enft, 'left', getPosition(enft,'left')+step);  
  738.                         count<5? count++ : (count=0, step*=-1);  
  739.                         if(getPosition(enft, 'top')>640 || is_over==1){  
  740.                             clearInterval(et);  
  741.                             ft.parentNode.removeChild(enft);  
  742.                         }  
  743.                         if(impact(enft, ft) && is_lock==0){    // 奖励与战机相撞  
  744.                             bombup();  
  745.                             ft.parentNode.removeChild(enft);  
  746.                             clearInterval(et);  
  747.                         }  
  748.                     }else{  
  749.                         clearInterval(et);  
  750.                     }  
  751.                 }, 80);  
  752.                 break;  
  753.   
  754.             case 13: // fighter gift  
  755.                 var count = 0;  
  756.                 et = setInterval(function(){  
  757.                     if(node_exist(enft)){  
  758.                         setPosition(enft, 'top', getPosition(enft,'top')+Math.abs(step));  
  759.                         setPosition(enft, 'left', getPosition(enft,'left')+step);  
  760.                         count<5? count++ : (count=0, step*=-1);  
  761.                         if(getPosition(enft, 'top')>640 || is_over==1){  
  762.                             clearInterval(et);  
  763.                             ft.parentNode.removeChild(enft);  
  764.                         }  
  765.                         if(impact(enft, ft) && is_lock==0){    // 奖励与战机相撞  
  766.                             fighterup();  
  767.                             ft.parentNode.removeChild(enft);  
  768.                             clearInterval(et);  
  769.                         }  
  770.                     }else{  
  771.                         clearInterval(et);  
  772.                     }  
  773.                 }, 80);  
  774.                 break;  
  775.         }  
  776.     }  
  777.   
  778.   
  779.     // 销毁  
  780.     destroy = function(dobj){    // dobj:被销毁的对象  
  781.         var dest = document.createElement('div');  
  782.         setClass(dest, 'destroy');  
  783.         setPosition(dest, 'top', getPosition(dobj, 'top'));  
  784.         setPosition(dest, 'left', getPosition(dobj, 'left'));  
  785.         ft.parentNode.appendChild(dest);  
  786.   
  787.         if(dobj.id=='fighter'){    // 战机被击中  
  788.             disp(dobj.id, 'hide');  
  789.             power = 1;  
  790.             bombnum = 3;  
  791.             fighternum--;  
  792.             setHtml('fighternum', fighternum);  
  793.             setHtml('bombnum', bombnum);  
  794.             is_lock = 1;  
  795.         }else{  
  796.             dobj.parentNode.removeChild(dobj);  
  797.         }  
  798.           
  799.         var step = 0;  
  800.         var et = setInterval(function(){  
  801.             if(step<11){  
  802.                 setBgPosition(dest, step*(-48), 0);  
  803.                 step++;  
  804.             }else{  
  805.                 if(dobj.id=='fighter'){  
  806.                     setTimeout(function(){  
  807.                         if(fighternum>0){  
  808.                             levelcontinue();  
  809.                         }else{  
  810.                             if(curboss!=null){  
  811.                                 obj = curboss['obj'];  
  812.                                 obj.parentNode.removeChild(obj);  
  813.                             }  
  814.                             gameover();    //战机全部被击中,游戏结束  
  815.                         }  
  816.                     },1000);  
  817.                 }  
  818.                 dest.parentNode.removeChild(dest);  
  819.                 clearInterval(et);  
  820.             }  
  821.         }, 50);  
  822.     }  
  823.   
  824.   
  825.     // boss war  
  826.     bosswar = function(){  
  827.         var boss = bossdata[level-1];  
  828.         var bossft = document.createElement('div');  
  829.         setClass(bossft, 'boss' + level);  
  830.         setPosition(bossft, 'left', boss['left']);  
  831.         setPosition(bossft, 'top', boss['top']);  
  832.         ft.parentNode.appendChild(bossft);  
  833.           
  834.         curboss = {"armor":boss['armor'],"obj":bossft};  
  835.   
  836.         switch(level){  
  837.             case 1: // boss 1  
  838.             case 2: // boss 2  
  839.             case 3: // boss 3  
  840.             case 4: // boss 4  
  841.             case 5: // boss 5  
  842.             case 6: // boss 6  
  843.                 var step = -3;  
  844.                 var count = 0;  
  845.                 var et = setInterval(function(){  
  846.                     if(getPosition(bossft,'top')<50){    // boss 进场  
  847.                         setPosition(bossft, 'top', getPosition(bossft, 'top')+5);  
  848.                     }else{  
  849.   
  850.                         if(curboss['armor']<=0){    // boss over  
  851.                             clearInterval(et);  
  852.                             bossover();  
  853.                         }else{  
  854.   
  855.                             if(step<0){ // 左移动  
  856.                                 if(getPosition(bossft,'left')>10){  
  857.                                     setPosition(bossft, 'left', getPosition(bossft, 'left')+step);  
  858.                                 }else{  
  859.                                     step*=-1;  
  860.                                 }  
  861.                             }  
  862.   
  863.                             if(step>0){ // 右移动  
  864.                                 if(getPosition(bossft,'left')<260){  
  865.                                     setPosition(bossft, 'left', getPosition(bossft, 'left')+step);  
  866.                                 }else{  
  867.                                     step*=-1;  
  868.                                 }  
  869.                             }  
  870.   
  871.                             if(count>=35 && count%35==0){  
  872.                                  attack(bossft, 1, 30, 30);  
  873.                                  attack(bossft, 1, 80, 30);  
  874.                             }  
  875.                               
  876.                             if(count>=60 && count%60==0){  
  877.                                 attack(bossft, 2, 15, 75);  
  878.                                 attack(bossft, 2, 105, 75);  
  879.                             }  
  880.   
  881.                             if(count>=100 && count%100==0){  
  882.                                 attack(bossft, 3, 60, 92);  
  883.                             }  
  884.   
  885.                             count<8400? count++ : count=0;  
  886.   
  887.                         }  
  888.                     }  
  889.                 }, boss['step']);  
  890.                 break;  
  891.         }  
  892.     }  
  893.   
  894.   
  895.     /* attack 
  896.     * obj  敌机 
  897.     * type 攻击类型 
  898.     * left 子弹初始left 
  899.     * top  子弹初始top 
  900.     */  
  901.     attack = function(obj, type, left, top){  
  902.         if(is_lock==1){  
  903.             return false;    // 如已锁定不射击  
  904.         }  
  905.   
  906.         var oleft = getPosition(obj, 'left')+left;  
  907.         var otop = getPosition(obj, 'top')+top;  
  908.   
  909.         switch(type){  
  910.   
  911.             case 1: //向战机攻击  
  912.   
  913.                 // 子弹初始位置与战机位置  
  914.                 var opoint = {x:oleft+7, y:otop+7};  
  915.                 var dpoint = {x:getPosition(ft,'left')+25, y:getPosition(ft,'top')+25};  
  916.                 var p = vector(opoint, dpoint, 8);  
  917.   
  918.                 enftbullet('bullet', oleft, otop, p[0], p[1], 35);  
  919.                 break;  
  920.   
  921.             case 2: //直线攻击  
  922.                 var num = 3;  
  923.                 var st = setInterval(function(){  
  924.                     if(num>0){  
  925.                         enftbullet('bullet', oleft, otop, 0, 8, 35);  
  926.                         num --;  
  927.   
  928.                     }else{  
  929.                         clearInterval(st);  
  930.                     }  
  931.                 }, 150);  
  932.                 break;  
  933.   
  934.             case 3: // 散开攻击  
  935.                 var num = 3;  
  936.                 var st = setInterval(function(){  
  937.                     if(num>0){  
  938.                         switch(num){  
  939.                             case 1:  
  940.                                 enftbullet('sbullet', oleft, otop, 0, 8, 35);  
  941.                                 break;  
  942.   
  943.                             case 2:  
  944.                                 enftbullet('sbullet', oleft, otop, 3, 8, 35);  
  945.                                 break;  
  946.   
  947.                             case 3:  
  948.                                 enftbullet('sbullet', oleft, otop, -3, 8, 35);  
  949.                                 break;  
  950.                         }  
  951.   
  952.                         num --;  
  953.   
  954.                     }else{  
  955.                         clearInterval(st);  
  956.                     }  
  957.                 }, 0);  
  958.                 break;  
  959.   
  960.             case 4: // 小散开攻击  
  961.                 var num = 3;  
  962.                 var st = setInterval(function(){  
  963.                     if(num>0){  
  964.                         switch(num){  
  965.                             case 1:  
  966.                                 enftbullet('bullet', oleft, otop, 0, 8, 35);  
  967.                                 break;  
  968.   
  969.                             case 2:  
  970.                                 enftbullet('bullet', oleft, otop, 3, 8, 35);  
  971.                                 break;  
  972.   
  973.                             case 3:  
  974.                                 enftbullet('bullet', oleft, otop, -3, 8, 35);  
  975.                                 break;  
  976.                         }  
  977.   
  978.                         num --;  
  979.   
  980.                     }else{  
  981.                         clearInterval(st);  
  982.                     }  
  983.                 }, 0);  
  984.                 break;  
  985.         }  
  986.     }  
  987.   
  988.   
  989.     /* enft bullet 
  990.     * type 子弹类型 
  991.     * oleft,otop 子弹初始位置 
  992.     * left,top 子弹徧移 
  993.     * speed 速度 
  994.     */  
  995.     enftbullet = function(type, oleft, otop, left, top, speed){  
  996.         var bullet = document.createElement('div');  
  997.         setClass(bullet, type);  
  998.         setPosition(bullet, 'left', oleft);  
  999.         setPosition(bullet, 'top', otop);  
  1000.         ft.parentNode.appendChild(bullet);  
  1001.   
  1002.         var et = setInterval(function(){  
  1003.             setPosition(bullet, 'top', getPosition(bullet,'top')+top);  
  1004.             setPosition(bullet, 'left', getPosition(bullet,'left')+left);  
  1005.   
  1006.             if(getPosition(bullet,'left')>400 || getPosition(bullet,'left')<-30 || getPosition(bullet,'top')<-30 || getPosition(bullet,'top')>640 || is_lock==1 || is_clear==1){  
  1007.                 clearInterval(et);  
  1008.                 ft.parentNode.removeChild(bullet);  
  1009.             }  
  1010.   
  1011.             impact_handle(bullet, et);  
  1012.         }, speed);  
  1013.     }  
  1014.   
  1015.   
  1016.     // boss over  
  1017.     bossover = function(){  
  1018.         obj = curboss['obj'];  
  1019.         obj.parentNode.removeChild(obj);  
  1020.   
  1021.         scoreup(6); // boss score  
  1022.   
  1023.         var dest = document.createElement('div');  
  1024.         setClass(dest, 'destroyboss');  
  1025.         setPosition(dest, 'top', getPosition(obj, 'top'));  
  1026.         setPosition(dest, 'left', getPosition(obj, 'left'));  
  1027.         ft.parentNode.appendChild(dest);  
  1028.   
  1029.         var step = 0;  
  1030.         var et = setInterval(function(){  
  1031.             if(step<21){  
  1032.                 setBgPosition(dest, step*(-150), 0);  
  1033.             }else if(step==21){  
  1034.                 dest.parentNode.removeChild(dest);  
  1035.             }else if(step==50){  
  1036.                 clearInterval(et);  
  1037.                 levelup();  
  1038.             }  
  1039.             step++;  
  1040.         }, 50);  
  1041.     }  
  1042.   
  1043.   
  1044.     // continue  
  1045.     levelcontinue = function(){  
  1046.         reset_fighter();  
  1047.         disp(ft.id, 'show');  
  1048.         setProtect();  
  1049.         fighter_init();  
  1050.     }  
  1051.   
  1052.   
  1053.     // 过关  
  1054.     levelup = function(){  
  1055.         keypriority = {};  
  1056.         enemydata = [];  
  1057.         curboss = null;  
  1058.         level ++;  
  1059.   
  1060.         bgsound('pass'false);  
  1061.   
  1062.         var processed = 0;  
  1063.         var et = setInterval(function(){  
  1064.             is_lock = 1;  
  1065.             processed = processed + 15;  
  1066.               
  1067.             if(getPosition(ft, 'top')>-50){  
  1068.                 setPosition(ft, 'top', getPosition(ft, 'top')-15);  
  1069.             }  
  1070.               
  1071.             if(processed>=2500){  
  1072.                 clearInterval(et);  
  1073.                 disp(ft.id, 'hide');  
  1074.                   
  1075.                 if(level<=map.length){  
  1076.                     bgchange(0);  
  1077.                     msg_show();  
  1078.                     setTimeout(function(){  
  1079.                         msg_hide();  
  1080.                         start();  
  1081.                     }, 1500);  
  1082.                 }else{  
  1083.                     gameclear();    // 通关  
  1084.                 }  
  1085.             }  
  1086.         }, 25);  
  1087.     }  
  1088.   
  1089.   
  1090.     // 更新分数  
  1091.     scoreup = function(type){  
  1092.         if(typeof(scoretag[type])!='undefined'){  
  1093.             score = score + scoretag[type] * level;  
  1094.             setHtml('score', score);  
  1095.             if(score > hiscore){  
  1096.                 hiscore = score;  
  1097.                 setHtml('hiscore', hiscore);  
  1098.             }  
  1099.         }  
  1100.     }  
  1101.   
  1102.   
  1103.     // 子弹升级  
  1104.     powerup = function(){  
  1105.         power = power+1>4? 4 : power+1;  
  1106.     }      
  1107.   
  1108.   
  1109.     // 炸弹增加  
  1110.     bombup = function(){  
  1111.         bombnum ++;  
  1112.         setHtml('bombnum', bombnum);  
  1113.     }  
  1114.   
  1115.   
  1116.     // 战机增加  
  1117.     fighterup = function(){  
  1118.         fighternum ++;  
  1119.         setHtml('fighternum', fighternum);  
  1120.     }  
  1121.   
  1122.   
  1123.     // 保护状态  
  1124.     setProtect = function(){  
  1125.         is_protect = 1;  
  1126.         if(is_pile==1){  
  1127.             setClass(ft, 'fighter_sp');  
  1128.         }else{  
  1129.             setClass(ft, 'fighter_p');  
  1130.         }  
  1131.         setTimeout(function(){  
  1132.             is_protect = 0;  
  1133.             if(is_pile==1){  
  1134.                 setClass(ft, 'fighter_s');  
  1135.             }else{  
  1136.                 setClass(ft, 'fighter');  
  1137.             }  
  1138.         }, 3000)  
  1139.     }  
  1140.   
  1141.   
  1142.     // 碰撞处理  
  1143.     impact_handle = function(obj, et){    // et 定时器  
  1144.         if(impact(obj, ft) && is_lock==0){    // 产生碰撞  
  1145.             if(is_protect==0){  
  1146.                 destroy(ft);  
  1147.                 clearInterval(et);  
  1148.                 ft.parentNode.removeChild(obj);  
  1149.             }  
  1150.         }  
  1151.     }  
  1152.   
  1153.   
  1154.     // 全部通关  
  1155.     gameclear = function(){  
  1156.         is_over = 1;  
  1157.         disp('gameclear''show');  
  1158.         setHtml('clearcon''Game Clear' + '<br>' + 'SCORE : ' + score);  
  1159.         bgsound('clear'false);  
  1160.         bgchange('clear');  
  1161.         setTimeout(function(){  
  1162.             bgsound();  
  1163.             init();  
  1164.         }, 16000);  
  1165.     }  
  1166.   
  1167.   
  1168.     // 游戏结束  
  1169.     gameover = function(){  
  1170.         is_over = 1;  
  1171.         disp('gameover''show');  
  1172.         setHtml('overcon''LEVEL : ' + level + '<br>' + 'SCORE : ' + score);  
  1173.         bgsound('over'false);  
  1174.         bgchange('over');  
  1175.         failtimes++;  
  1176.         setTimeout(function(){  
  1177.             if(failtimes==3){  
  1178.                 alert('在游戏开始画面依次输入 ↑ ↑ ↓ ↓ ← → ← → a s a s,再开始游戏,会有惊喜^_^');  
  1179.             }  
  1180.             bgsound();  
  1181.             init();  
  1182.         }, 8000);  
  1183.     }  
  1184.   
  1185.   
  1186.     // 显示讯息  
  1187.     msg_show = function(){  
  1188.         setHtml('level''LEVEL - ' + level);  
  1189.         disp('level''show');  
  1190.         is_lock = 1;  
  1191.     }  
  1192.   
  1193.   
  1194.     // 隐藏讯息  
  1195.     msg_hide = function(){  
  1196.         disp('level''hide');  
  1197.     }  
  1198.   
  1199.   
  1200.     // 重置  
  1201.     reset = function(){  
  1202.         is_start = 0;  
  1203.         is_bombing = 0;  
  1204.         is_lock = 1;  
  1205.         is_over = 0;  
  1206.         is_clear = 0;  
  1207.         is_protect = 0;  
  1208.         level = 1;  
  1209.         power = 1;  
  1210.         ackey = {};  
  1211.         keypriority = {};  
  1212.         enemydata = [];  
  1213.         score = 0;  
  1214.         fighternum = 3;  
  1215.         bombnum = 3;  
  1216.   
  1217.         setHtml('hiscore', hiscore);  
  1218.         setHtml('score', score);  
  1219.         setHtml('fighternum', fighternum);  
  1220.         setHtml('bombnum', bombnum);  
  1221.   
  1222.         reset_fighter();  
  1223.         reset_pile();  
  1224.   
  1225.         disp('op''show');  
  1226.         disp('gameover''hide');  
  1227.         disp('gameclear''hide');  
  1228.   
  1229.         bgchange(0);  
  1230.     }  
  1231.   
  1232.   
  1233.     // 重置战机位置  
  1234.     reset_fighter = function(){  
  1235.         setPosition(ft, 'top', 640);  
  1236.         setPosition(ft, 'left', 175);  
  1237.         setClass(ft, 'fighter');  
  1238.     }  
  1239.   
  1240.   
  1241.     // 重置蓄力  
  1242.     reset_pile = function(){  
  1243.         is_pile = 0;  
  1244.         pilenum = 0;  
  1245.         if(is_protect==1){  
  1246.             setClass(ft, 'fighter_p');  
  1247.         }else{  
  1248.             setClass(ft, 'fighter');  
  1249.         }  
  1250.     }  
  1251.   
  1252.   
  1253.     // 战机初始化  
  1254.     fighter_init = function(){  
  1255.         var et = setInterval(function(){  
  1256.             if(getPosition(ft, 'top')>400){  
  1257.                 setPosition(ft, 'top', getPosition(ft, 'top')-12);  
  1258.             }else{  
  1259.                 clearInterval(et);  
  1260.                 is_lock = 0;  
  1261.                 action();  
  1262.             }  
  1263.         }, 30);  
  1264.     }  
  1265.   
  1266.   
  1267.     // 密技30命  
  1268.     cheat = function(){  
  1269.         if(cheatcode.join(',')=='38,38,40,40,37,39,37,39,65,83,65,83,13'){  
  1270.             fighternum = 30;  
  1271.             setHtml('fighternum', fighternum);  
  1272.         }  
  1273.         cheatcode = [];  
  1274.     }  
  1275.   
  1276.   
  1277.     // 背景控制  
  1278.     bgmove = function(obj){  
  1279.         var step = 1;  
  1280.         var et = setInterval(function(){  
  1281.             var bgpos = getBgPosition(obj);  
  1282.             if(bgpos['top']==640){  
  1283.                 setBgPosition(obj, 0, 0);    // reset  
  1284.             }else{  
  1285.                 setBgPosition(obj, bgpos['left'], bgpos['top']+step);  
  1286.             }  
  1287.         }, 50);  
  1288.     }  
  1289.   
  1290.   
  1291.     // 背景切换  
  1292.     bgchange = function(file){  
  1293.         var obj = $('gameplane');  
  1294.         setClass(obj, 'gameplane bg'+file);  
  1295.     }  
  1296.   
  1297.   
  1298.     // 音乐控制  
  1299.     bgsound = function(file, loop){  
  1300.         var id = 'audioplayer';  
  1301.           
  1302.         if(typeof(file)!='undefined'){  
  1303.             if(typeof(loop)=='undefined'){  
  1304.                 loop = false;  
  1305.             }  
  1306.   
  1307.             var audiofile = [];  
  1308.             audiofile['mp3'] = 'music/' + file + '.mp3';  
  1309.             audiofile['ogg'] = 'music/' + file + '.ogg';  
  1310.             audioplayer(id, audiofile , loop);  
  1311.         }else{  
  1312.             audioplayer(id);  
  1313.         }  
  1314.     }  
  1315.   
  1316.     return this;  
  1317.   
  1318. })();  
/** 宇宙战机
*   Author: fdipzone
*   Date:   2013-02-12
*   Ver:    1.0
*/
window.onload = function(){
    var gameimg = [
        'images/fighter.png', 
        'images/fighter_p.png', 
        'images/fighter_s.png',
        'images/fighter_sp.png', 
        'images/shot.png', 
        'images/destroy.png', 
        'images/destroy_boss.png',
        'images/enemy.png', 
        'images/bullet.png', 
        'images/gift.png', 
        'images/bomb.png', 
        'images/boss1.png'];

    var callback = function(){
        var gameplane = $('gameplane');
        fighter.init();
        fighter.bgmove(gameplane);
    }
    img_preload(gameimg, callback);
};


/** fighter class */
var fighter = (function(){
    
    var hiscore = 10000;                    // 最高分
    var score = 0;                          // 当前分
    var fighternum = 3;                     // 战机数量
    var bombnum = 3;                        // 炸弹数量
    var ft = null;                          // 战机对象
    var is_start = 0;                       // 是否已开始游戏
    var is_bombing = 0;                     // 是否爆炸中
    var is_lock = 1;                        // 是否锁定
    var is_over = 0;                        // 是否已结束
    var is_clear = 0;                       // 清屏
    var is_pile = 0;                        // 是否已达成蓄力
    var is_protect = 0;                     // 是否保护状态
    var pilenum = 0;                        // 已蓄力数量
    var ackey = {};                         // 记录键是否按下
    var keypriority = {};                   // 冲突键优先级
    var gamekey = [37,38,39,40,83,65];      // 游戏的按键
    var scoretag = [0,20,30,40,50,60,500];  // 不同敌机的分数
    var level = 1;                          // 关数    
    var power = 1;                          // 战机子弹威力
    var cheatcode = [];                     // 记录cheat输入
    var failtimes = 0;                      // 挑战失败次数
    
    // boss 数据
    var bossdata = [
                    {'armor':500, 'left':136, 'top':-169, 'step':30},
                    {'armor':1000, 'left':136, 'top':-169, 'step':30},
                    {'armor':1500, 'left':136, 'top':-169, 'step':30},
                    {'armor':2000, 'left':136, 'top':-169, 'step':30},
                    {'armor':2500, 'left':136, 'top':-169, 'step':30},
                    {'armor':3000, 'left':136, 'top':-169, 'step':30},
                   ];

    // 出现的敌机
    var enemydata = [];

    // 当前出现的boss
    var curboss = null;
    
    // 关卡数据
    var map = [
        // level 1
        {
            'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]], 
            'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
            'ms3500':[[1, 10, 12, -23, 190, 10]],
            'ms5500':[[3, 800, 2, 100, -50, 10]],
            'ms7500':[[3, 800, 2, 200, 450, -10]],
            'ms8000':[[1, 10, 11, -23, 100, 10]],
            'ms9500':[[3, 800, 2, 100, -50, 10]],
            'ms11500':[[3, 800, 2, 200, 450, -10]],
            'ms13500':[[3, 800, 2, 100, -50, 10]],
            'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
            'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
            'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]],
            'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]],
            'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
            'ms38000':[[1, 10, 11, -23, 10, 10]],
            'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
            'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
            'ms45500':[[3, 800, 2, 50, -50, 10]],
            'ms47500':[[3, 800, 2, 150, 450, -10]],
            'ms49500':[[3, 800, 2, 50, -50, 10]],
            'ms51500':[[3, 800, 2, 150, 450, -10]],
            'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
            'ms60000':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
            'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
            'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]],
            'ms71000':[[1, 10, 13, -23, 220, 10]],
            'ms76000':[]
        },
        // level 2
        {
            'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]], 
            'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
            'ms3500':[[1, 10, 12, -23, 190, 10]],
            'ms5500':[[3, 800, 2, 100, -50, 10]],
            'ms7500':[[3, 800, 2, 200, 450, -10]],
            'ms8000':[[1, 10, 11, -23, 100, 10]],
            'ms9500':[[3, 800, 2, 100, -50, 10]],
            'ms11500':[[3, 800, 2, 200, 450, -10]],
            'ms13500':[[3, 800, 2, 100, -50, 10]],
            'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
            'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
            'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]],
            'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]],
            'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
            'ms38000':[[1, 10, 11, -23, 10, 10]],
            'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
            'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
            'ms45500':[[3, 800, 2, 50, -50, 10]],
            'ms47500':[[3, 800, 2, 150, 450, -10]],
            'ms49500':[[3, 800, 2, 50, -50, 10]],
            'ms51500':[[3, 800, 2, 150, 450, -10]],
            'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
            'ms60000':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
            'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
            'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]],
            'ms71000':[[1, 10, 13, -23, 220, 10]],
            'ms76000':[]
        },
        // level 3
        {
            'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]], 
            'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
            'ms3500':[[1, 10, 12, -23, 190, 10]],
            'ms5500':[[3, 800, 2, 100, -50, 10]],
            'ms7500':[[3, 800, 2, 200, 450, -10]],
            'ms8000':[[1, 10, 11, -23, 100, 10]],
            'ms9500':[[3, 800, 2, 100, -50, 10]],
            'ms11500':[[3, 800, 2, 200, 450, -10]],
            'ms13500':[[3, 800, 2, 100, -50, 10]],
            'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
            'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
            'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]],
            'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]],
            'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
            'ms38000':[[1, 10, 11, -23, 10, 10]],
            'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
            'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
            'ms45500':[[3, 800, 2, 50, -50, 10]],
            'ms47500':[[3, 800, 2, 150, 450, -10]],
            'ms49500':[[3, 800, 2, 50, -50, 10]],
            'ms51500':[[3, 800, 2, 150, 450, -10]],
            'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
            'ms60000':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
            'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
            'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]],
            'ms71000':[[1, 10, 13, -23, 220, 10]],
            'ms76000':[]
        },
        // level 4
        {
            'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]], 
            'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
            'ms3500':[[1, 10, 12, -23, 190, 10]],
            'ms5500':[[3, 800, 2, 100, -50, 10]],
            'ms7500':[[3, 800, 2, 200, 450, -10]],
            'ms8000':[[1, 10, 11, -23, 100, 10]],
            'ms9500':[[3, 800, 2, 100, -50, 10]],
            'ms11500':[[3, 800, 2, 200, 450, -10]],
            'ms13500':[[3, 800, 2, 100, -50, 10]],
            'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
            'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
            'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]],
            'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]],
            'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
            'ms38000':[[1, 10, 11, -23, 10, 10]],
            'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
            'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
            'ms45500':[[3, 800, 2, 50, -50, 10]],
            'ms47500':[[3, 800, 2, 150, 450, -10]],
            'ms49500':[[3, 800, 2, 50, -50, 10]],
            'ms51500':[[3, 800, 2, 150, 450, -10]],
            'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
            'ms60000':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
            'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
            'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]],
            'ms71000':[[1, 10, 13, -23, 220, 10]],
            'ms76000':[]
        },
        // level 5
        {
            'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]], 
            'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
            'ms3500':[[1, 10, 12, -23, 190, 10]],
            'ms5500':[[3, 800, 2, 100, -50, 10]],
            'ms7500':[[3, 800, 2, 200, 450, -10]],
            'ms8000':[[1, 10, 11, -23, 100, 10]],
            'ms9500':[[3, 800, 2, 100, -50, 10]],
            'ms11500':[[3, 800, 2, 200, 450, -10]],
            'ms13500':[[3, 800, 2, 100, -50, 10]],
            'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
            'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
            'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]],
            'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]],
            'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
            'ms38000':[[1, 10, 11, -23, 10, 10]],
            'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
            'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
            'ms45500':[[3, 800, 2, 50, -50, 10]],
            'ms47500':[[3, 800, 2, 150, 450, -10]],
            'ms49500':[[3, 800, 2, 50, -50, 10]],
            'ms51500':[[3, 800, 2, 150, 450, -10]],
            'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
            'ms60000':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
            'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
            'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]],
            'ms71000':[[1, 10, 13, -23, 220, 10]],
            'ms76000':[]
        },
        // level 6
        {
            'ms50':[[3, 680, 1, -50, 10, 10],[3, 680, 1, -50, 290, 10]], 
            'ms2500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
            'ms3500':[[1, 10, 12, -23, 190, 10]],
            'ms5500':[[3, 800, 2, 100, -50, 10]],
            'ms7500':[[3, 800, 2, 200, 450, -10]],
            'ms8000':[[1, 10, 11, -23, 100, 10]],
            'ms9500':[[3, 800, 2, 100, -50, 10]],
            'ms11500':[[3, 800, 2, 200, 450, -10]],
            'ms13500':[[3, 800, 2, 100, -50, 10]],
            'ms15500':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
            'ms20000':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
            'ms25000':[[1, 10, 4, 150, -50, 10],[1, 10, 4, 250, 400, -10],[1, 10, 4, 100, 400, -10]],
            'ms30000':[[3, 800, 5, 692, 90, -10],[3, 800, 5, 692, 280, -10]],
            'ms35000':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
            'ms38000':[[1, 10, 11, -23, 10, 10]],
            'ms40000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
            'ms42500':[[3, 680, 1, -50, 70, 10],[3, 680, 1, -50, 220, 10]],
            'ms45500':[[3, 800, 2, 50, -50, 10]],
            'ms47500':[[3, 800, 2, 150, 450, -10]],
            'ms49500':[[3, 800, 2, 50, -50, 10]],
            'ms51500':[[3, 800, 2, 150, 450, -10]],
            'ms55500':[[3, 800, 3, -50, 90, 10],[3, 800, 3, -50, 280, 10]],
            'ms60000':[[3, 800, 3, -50, 30, 10],[3, 800, 3, -50, 340, 10]],
            'ms65000':[[1, 10, 4, 100, 400, -10],[1, 10, 4, 300, -50, 10]],
            'ms68000':[[3, 800, 5, 692, 110, -10],[3, 800, 5, 692, 260, -10]],
            'ms71000':[[1, 10, 13, -23, 220, 10]],
            'ms76000':[]
        }
    ];


    // 初始化
    init = function(){
        ft = $('fighter');
        reset();
        key_event();
    }


    // 开始游戏
    start = function(){
        is_clear = 0;
        is_protect = 0;
        disp(ft.id, 'show');
        reset_fighter();
        reset_pile();
        process();
        bgsound(level, true);
        bgchange(level);
        fighter_init();
    }


    // 设置事件
    key_event = function(){

        document.onkeydown = function(e){
            var e = e || window.event;
            var curkey = e.keyCode || e.which || e.charCode;

            if(is_start==0){ 
                if(cheatcode.length>12){
                    cheatcode.shift();
                }
                cheatcode.push(curkey); // 记录用户输入的cheatcode
            }
            
            if(is_start==1 && in_array(curkey,gamekey)){
                if(ackey[curkey.toString()]==0 || typeof(ackey[curkey.toString()])=='undefined' || !in_array(curkey,[83,65])){    // 射击与炸弹连按屏蔽
                    ackey[curkey.toString()] = 1;    // save key down
                    switch(curkey){
                        case 37:
                        case 39:
                            keypriority.left = curkey;    // left right
                            break;
                        case 38:
                        case 40:
                            keypriority.top = curkey;    // up down
                            break;
                    }
                }else{
                    return false;
                }
            }
            
            if(curkey==13 || is_start==1 && is_lock==0){    // game is start or key=13
                switch(curkey){
                    case 13: // enter
                        if(is_start==0){
                            is_start=1;
                            disp('op', 'hide');
                            msg_show();
                            setTimeout(function(){
                                msg_hide();
                                cheat();
                                start();
                            }, 1500);
                        }
                        break;

                    case 83: // 射击
                        shot();
                        break;

                    case 65: // 炸弹
                        bomb();
                        break;
                }
            }
        }

        document.onkeyup = function(e){
            var e = e || window.event;
            var curkey = e.keyCode || e.which || e.charCode;
            if(is_start==1 && in_array(curkey,gamekey)){
                ackey[curkey.toString()] = 0;    // release key down
                
                if(curkey==83){// 释放蓄力攻击
                    if(is_pile==1){
                        pile_shot();
                    }
                    reset_pile();
                }
            }
        }

    }


    // 循环执行的动作
    action = function(){
        var movestep = 5;    // 移动步长
        var et = setInterval(function(){
            if(is_start==0 || is_lock==1){
                clearInterval(et);
            }
            
            // 移动
            if(ackey['37']==1 && (ackey['39']==0 || keypriority.left==37)){    // 冲突时判断优先级
                if(getPosition(ft,'left')<movestep){
                    setPosition(ft, 'left', 0);    // left
                }else{
                    setPosition(ft, 'left', getPosition(ft,'left') - movestep);
                }
            }
            if(ackey['38']==1 && (ackey['40']==0 || keypriority.top==38)){
                if(getPosition(ft, 'top')<movestep){
                    setPosition(ft, 'top', 0);    // top
                }else{
                    setPosition(ft, 'top', getPosition(ft,'top') - movestep);
                }
            }
            if(ackey['39']==1 && (ackey['37']==0 || keypriority.left==39)){
                if(400-(getPosition(ft,'left')+50)<movestep){
                    setPosition(ft, 'left', 350);    //width-fighter.width
                }else{
                    setPosition(ft, 'left', getPosition(ft,'left') + movestep);
                }
            }
            if(ackey['40']==1 && (ackey['38']==0 || keypriority.top==40)){
                if(640-(getPosition(ft,'top')+50)<movestep){
                    setPosition(ft, 'top', 590);    // height-fighter.height
                }else{
                    setPosition(ft, 'top', getPosition(ft,'top') + movestep);
                }
            }

            // 蓄力攻击
            if(ackey['83']==1){
                if(pilenum<1000){
                    pilenum = pilenum + 20;
                }else if(is_pile==0){
                    is_pile = 1;
                    if(is_protect==1){
                        setClass(ft, 'fighter_sp');
                    }else{
                        setClass(ft, 'fighter_s');
                    }
                }
            }

        }, 20);
    }


    // 战机射击
    shot = function(){
        // 创建子弹
        var bullet = document.createElement('div');
        var offsetx;

        switch(power){
            case 1:
                offsetx = 20;
                break;
            case 2:
                offsetx = 15;
                break;
            case 3:
                offsetx = 10;
                break;
            case 4:
                offsetx = 4;
                break;
        }

        setClass(bullet, 'shot' + power);

        // 设置子弹初始位置
        setPosition(bullet, 'top', getPosition(ft, 'top')-30);
        setPosition(bullet, 'left', getPosition(ft, 'left') + offsetx);
        
        ft.parentNode.appendChild(bullet);
        
        // 设置子弹运动
        var et = setInterval(function(){
            if(getPosition(bullet,'top')<=-30 || is_lock==1){
                clearInterval(et);
                ft.parentNode.removeChild(bullet);    // 释放子弹
            }

            for(var i=0; i<enemydata.length; i++){
                if(enemydata[i]!=null){
                    if(impact(bullet, enemydata[i])){    // 打中敌机
                        destroy(enemydata[i]);
                        scoreup(enemydata[i].type);
                        enemydata[i] = null;
                        clearInterval(et);
                        ft.parentNode.removeChild(bullet);
                    }
                }
            }

            if(curboss!=null){    // boss 战
                if(impact(bullet, curboss['obj'])){ // 打中boss
                    curboss['armor']=parseInt(curboss['armor'])-power*10;
                    clearInterval(et);
                    ft.parentNode.removeChild(bullet);
                }
            }

            setPosition(bullet, 'top', getPosition(bullet, 'top')-15);

        }, 30)
    }


    // 蓄力射击
    pile_shot = function(){
        var pilebullet = document.createElement('div');
        setClass(pilebullet, 'pileshot');

        // 设置子弹初始位置
        setPosition(pilebullet, 'top', getPosition(ft, 'top')-30);
        setPosition(pilebullet, 'left', getPosition(ft, 'left'));
        
        ft.parentNode.appendChild(pilebullet);

        var et = setInterval(function(){
            if(getPosition(pilebullet,'top')<=-85 || is_lock==1){
                clearInterval(et);
                ft.parentNode.removeChild(pilebullet); // 释放子弹
            }

            for(var i=0; i<enemydata.length; i++){
                if(enemydata[i]!=null){
                    if(impact(pilebullet, enemydata[i])){    // 打中敌机
                        destroy(enemydata[i]);
                        scoreup(enemydata[i].type);
                        enemydata[i] = null;
                    }
                }
            }

            if(curboss!=null){    // boss 战
                if(impact(pilebullet, curboss['obj'])){ // 打中boss
                    curboss['armor']=parseInt(curboss['armor'])-100;
                    clearInterval(et);
                    ft.parentNode.removeChild(pilebullet); // 释放子弹
                }
            }

            setPosition(pilebullet, 'top', getPosition(pilebullet, 'top')-20);

        }, 30)
    }


    // 放炸弹
    bomb = function(){
        if(is_bombing==0 && bombnum>0){    // 不是爆炸中且有炸弹数
            is_bombing = 1;
            bombnum --;
            setHtml('bombnum', bombnum);    // 自减1

            var opacity = 100;
            setOpacity($('bomb'), opacity);
            disp('bomb', 'show');

            // 清除所有敌机及敌方子弹
            is_clear = 1;

            // 打击boss
            if(curboss!=null){
                curboss['armor'] = parseInt(curboss['armor'])-300;
            }

            var step = 0;
            var et = setInterval(function(){    // 炸弹效果
                if(step<11){
                    setBgPosition($('bomb'), 0, step*(-280));
                }else{
                    clearInterval(et);
                    disp('bomb', 'hide');
                    is_bombing = 0;
                    is_clear = 0;
                }
                step ++;
            }, 70);
        }
    }


    // 游戏进程
    process = function(){
        var leveldata = map[level-1], processed = 0, step = 10;
        var levelstep = 0;    // 每关开始清0
        var et = setInterval(function(){
            if(is_lock==0){
                processed += step;
                if(attrcount(leveldata)>levelstep){    // 未完成本关
                    if(leveldata['ms'+processed]){
                        for(var i=0; i<leveldata['ms'+processed].length; i++){
                            var msdata = leveldata['ms'+processed][i];
                            create(msdata);
                        }
                        levelstep ++;    // 进度
                    }
                }else{    // 已完成本关,进入Boss战
                    bosswar();
                    clearInterval(et);
                }
            }

            if(is_over==1){
                clearInterval(et);
            }

        }, step);
    }


    /* 创建关卡元素
    /* msdata:{
       num:出现的数量
       interval:间隔
       type:类型
       top:原始top坐标
       left:原始left坐标
       step:移动距离
       }
    */
    create = function(msdata){
        var num = msdata[0],
            interval = msdata[1],
            type = msdata[2],
            top = msdata[3],
            left = msdata[4],
            step = msdata[5];

        var et = setInterval(function(){
                if(num>0){
                    var enft = document.createElement('div');
                    setClass(enft, 'element' + type);
                    enft.type = type;
                    setPosition(enft, 'top', top);
                    setPosition(enft, 'left', left);
                    ft.parentNode.appendChild(enft);
                    if(type<=10){
                        enemydata.push(enft);
                    }
                    route(enft, type, step);
                    num--;
                }else{
                    clearInterval(et);
                }
            }, interval);
    }


    // 元素运动轨迹
    route = function(enft, type, step){
        var et = null;
        switch(type){
            case 1: // 曲线
                var count = 0;
                et = setInterval(function(){
                    if(node_exist(enft)){
                        setPosition(enft, 'top', getPosition(enft,'top')+Math.abs(step));
                        setPosition(enft, 'left', getPosition(enft,'left')+step);
                        count<5? count++ : (count=0, step*=-1);
                        if(getPosition(enft, 'top')>640 || is_over==1 || is_clear==1){
                            clearInterval(et);
                            ft.parentNode.removeChild(enft);
                        }
                        impact_handle(enft, et);
                    }else{
                        clearInterval(et);
                    }
                }, 80);
                break;

            case 2: // 横向
                var count = 0;
                et = setInterval(function(){
                    if(node_exist(enft)){
                        setPosition(enft, 'left', getPosition(enft,'left')+step);
                        count<9? count++ : (count=0, attack(enft,1,17,47));
                        if(getPosition(enft,'left')>400 && step>0 || getPosition(enft,'left')<-50 && step<0 || is_over==1 || is_clear==1){
                            clearInterval(et);
                            ft.parentNode.removeChild(enft);
                        }
                        impact_handle(enft, et);
                    }else{
                        clearInterval(et);
                    }
                }, 80);
                break;

            case 3: // 竖向
                var count = 0;
                et = setInterval(function(){
                    if(node_exist(enft)){
                        setPosition(enft, 'top', getPosition(enft,'top')+step);
                        count<9? count++ : (count=0, attack(enft,1,17,47));
                        if(getPosition(enft,'top')>640 || is_over==1 || is_clear==1){
                            clearInterval(et);
                            ft.parentNode.removeChild(enft);
                        }
                        impact_handle(enft, et);
                    }else{
                        clearInterval(et);
                    }
                }, 75);
                break;

            case 4: // 左右循环移动攻击
                var count = 0;
                et = setInterval(function(){
                    if(node_exist(enft)){
                        setPosition(enft, 'left', getPosition(enft,'left')+step);
                        count<10? count++ : (count=0, attack(enft,4,17,31));
                        
                        if(getPosition(enft,'left')>=350 && step>0 || getPosition(enft,'left')<=0 && step<0){
                            step*=-1;
                        }

                        if(is_over==1 || is_clear==1){
                            clearInterval(et);
                            ft.parentNode.removeChild(enft);
                        }
                        impact_handle(enft, et);
                    }else{
                        clearInterval(et);
                    }
                }, 80);
                break;

            case 5: // 从后面攻击
                var count = 0;
                et = setInterval(function(){
                    if(node_exist(enft)){
                        setPosition(enft, 'top', getPosition(enft,'top')+step);
                        count<9? count++ : (count=0, attack(enft,1,17,-17));
                        if(getPosition(enft,'top')<-32 || is_over==1 || is_clear==1){
                            clearInterval(et);
                            ft.parentNode.removeChild(enft);
                        }
                        impact_handle(enft, et);
                    }else{
                        clearInterval(et);
                    }
                }, 75);
                break;

            case 11: // power gift
                var count = 0;
                et = setInterval(function(){
                    if(node_exist(enft)){
                        setPosition(enft, 'top', getPosition(enft,'top')+Math.abs(step));
                        setPosition(enft, 'left', getPosition(enft,'left')+step);
                        count<5? count++ : (count=0, step*=-1);
                        if(getPosition(enft, 'top')>640 || is_over==1){
                            clearInterval(et);
                            ft.parentNode.removeChild(enft);
                        }
                        if(impact(enft, ft) && is_lock==0){    // 奖励与战机相撞
                            powerup();
                            ft.parentNode.removeChild(enft);
                            clearInterval(et);
                        }
                    }else{
                        clearInterval(et);
                    }
                }, 80);
                break;

            case 12: // bomb gift
                var count = 0;
                et = setInterval(function(){
                    if(node_exist(enft)){
                        setPosition(enft, 'top', getPosition(enft,'top')+Math.abs(step));
                        setPosition(enft, 'left', getPosition(enft,'left')+step);
                        count<5? count++ : (count=0, step*=-1);
                        if(getPosition(enft, 'top')>640 || is_over==1){
                            clearInterval(et);
                            ft.parentNode.removeChild(enft);
                        }
                        if(impact(enft, ft) && is_lock==0){    // 奖励与战机相撞
                            bombup();
                            ft.parentNode.removeChild(enft);
                            clearInterval(et);
                        }
                    }else{
                        clearInterval(et);
                    }
                }, 80);
                break;

            case 13: // fighter gift
                var count = 0;
                et = setInterval(function(){
                    if(node_exist(enft)){
                        setPosition(enft, 'top', getPosition(enft,'top')+Math.abs(step));
                        setPosition(enft, 'left', getPosition(enft,'left')+step);
                        count<5? count++ : (count=0, step*=-1);
                        if(getPosition(enft, 'top')>640 || is_over==1){
                            clearInterval(et);
                            ft.parentNode.removeChild(enft);
                        }
                        if(impact(enft, ft) && is_lock==0){    // 奖励与战机相撞
                            fighterup();
                            ft.parentNode.removeChild(enft);
                            clearInterval(et);
                        }
                    }else{
                        clearInterval(et);
                    }
                }, 80);
                break;
        }
    }


    // 销毁
    destroy = function(dobj){    // dobj:被销毁的对象
        var dest = document.createElement('div');
        setClass(dest, 'destroy');
        setPosition(dest, 'top', getPosition(dobj, 'top'));
        setPosition(dest, 'left', getPosition(dobj, 'left'));
        ft.parentNode.appendChild(dest);

        if(dobj.id=='fighter'){    // 战机被击中
            disp(dobj.id, 'hide');
            power = 1;
            bombnum = 3;
            fighternum--;
            setHtml('fighternum', fighternum);
            setHtml('bombnum', bombnum);
            is_lock = 1;
        }else{
            dobj.parentNode.removeChild(dobj);
        }
        
        var step = 0;
        var et = setInterval(function(){
            if(step<11){
                setBgPosition(dest, step*(-48), 0);
                step++;
            }else{
                if(dobj.id=='fighter'){
                    setTimeout(function(){
                        if(fighternum>0){
                            levelcontinue();
                        }else{
                            if(curboss!=null){
                                obj = curboss['obj'];
                                obj.parentNode.removeChild(obj);
                            }
                            gameover();    //战机全部被击中,游戏结束
                        }
                    },1000);
                }
                dest.parentNode.removeChild(dest);
                clearInterval(et);
            }
        }, 50);
    }


    // boss war
    bosswar = function(){
        var boss = bossdata[level-1];
        var bossft = document.createElement('div');
        setClass(bossft, 'boss' + level);
        setPosition(bossft, 'left', boss['left']);
        setPosition(bossft, 'top', boss['top']);
        ft.parentNode.appendChild(bossft);
        
        curboss = {"armor":boss['armor'],"obj":bossft};

        switch(level){
            case 1: // boss 1
            case 2: // boss 2
            case 3: // boss 3
            case 4: // boss 4
            case 5: // boss 5
            case 6: // boss 6
                var step = -3;
                var count = 0;
                var et = setInterval(function(){
                    if(getPosition(bossft,'top')<50){    // boss 进场
                        setPosition(bossft, 'top', getPosition(bossft, 'top')+5);
                    }else{

                        if(curboss['armor']<=0){    // boss over
                            clearInterval(et);
                            bossover();
                        }else{

                            if(step<0){ // 左移动
                                if(getPosition(bossft,'left')>10){
                                    setPosition(bossft, 'left', getPosition(bossft, 'left')+step);
                                }else{
                                    step*=-1;
                                }
                            }

                            if(step>0){ // 右移动
                                if(getPosition(bossft,'left')<260){
                                    setPosition(bossft, 'left', getPosition(bossft, 'left')+step);
                                }else{
                                    step*=-1;
                                }
                            }

                            if(count>=35 && count%35==0){
                                 attack(bossft, 1, 30, 30);
                                 attack(bossft, 1, 80, 30);
                            }
                            
                            if(count>=60 && count%60==0){
                                attack(bossft, 2, 15, 75);
                                attack(bossft, 2, 105, 75);
                            }

                            if(count>=100 && count%100==0){
                                attack(bossft, 3, 60, 92);
                            }

                            count<8400? count++ : count=0;

                        }
                    }
                }, boss['step']);
                break;
        }
    }


    /* attack
    * obj  敌机
    * type 攻击类型
    * left 子弹初始left
    * top  子弹初始top
    */
    attack = function(obj, type, left, top){
        if(is_lock==1){
            return false;    // 如已锁定不射击
        }

        var oleft = getPosition(obj, 'left')+left;
        var otop = getPosition(obj, 'top')+top;

        switch(type){

            case 1: //向战机攻击

                // 子弹初始位置与战机位置
                var opoint = {x:oleft+7, y:otop+7};
                var dpoint = {x:getPosition(ft,'left')+25, y:getPosition(ft,'top')+25};
                var p = vector(opoint, dpoint, 8);

                enftbullet('bullet', oleft, otop, p[0], p[1], 35);
                break;

            case 2: //直线攻击
                var num = 3;
                var st = setInterval(function(){
                    if(num>0){
                        enftbullet('bullet', oleft, otop, 0, 8, 35);
                        num --;

                    }else{
                        clearInterval(st);
                    }
                }, 150);
                break;

            case 3: // 散开攻击
                var num = 3;
                var st = setInterval(function(){
                    if(num>0){
                        switch(num){
                            case 1:
                                enftbullet('sbullet', oleft, otop, 0, 8, 35);
                                break;

                            case 2:
                                enftbullet('sbullet', oleft, otop, 3, 8, 35);
                                break;

                            case 3:
                                enftbullet('sbullet', oleft, otop, -3, 8, 35);
                                break;
                        }

                        num --;

                    }else{
                        clearInterval(st);
                    }
                }, 0);
                break;

            case 4: // 小散开攻击
                var num = 3;
                var st = setInterval(function(){
                    if(num>0){
                        switch(num){
                            case 1:
                                enftbullet('bullet', oleft, otop, 0, 8, 35);
                                break;

                            case 2:
                                enftbullet('bullet', oleft, otop, 3, 8, 35);
                                break;

                            case 3:
                                enftbullet('bullet', oleft, otop, -3, 8, 35);
                                break;
                        }

                        num --;

                    }else{
                        clearInterval(st);
                    }
                }, 0);
                break;
        }
    }


    /* enft bullet
    * type 子弹类型
    * oleft,otop 子弹初始位置
    * left,top 子弹徧移
    * speed 速度
    */
    enftbullet = function(type, oleft, otop, left, top, speed){
        var bullet = document.createElement('div');
        setClass(bullet, type);
        setPosition(bullet, 'left', oleft);
        setPosition(bullet, 'top', otop);
        ft.parentNode.appendChild(bullet);

        var et = setInterval(function(){
            setPosition(bullet, 'top', getPosition(bullet,'top')+top);
            setPosition(bullet, 'left', getPosition(bullet,'left')+left);

            if(getPosition(bullet,'left')>400 || getPosition(bullet,'left')<-30 || getPosition(bullet,'top')<-30 || getPosition(bullet,'top')>640 || is_lock==1 || is_clear==1){
                clearInterval(et);
                ft.parentNode.removeChild(bullet);
            }

            impact_handle(bullet, et);
        }, speed);
    }


    // boss over
    bossover = function(){
        obj = curboss['obj'];
        obj.parentNode.removeChild(obj);

        scoreup(6); // boss score

        var dest = document.createElement('div');
        setClass(dest, 'destroyboss');
        setPosition(dest, 'top', getPosition(obj, 'top'));
        setPosition(dest, 'left', getPosition(obj, 'left'));
        ft.parentNode.appendChild(dest);

        var step = 0;
        var et = setInterval(function(){
            if(step<21){
                setBgPosition(dest, step*(-150), 0);
            }else if(step==21){
                dest.parentNode.removeChild(dest);
            }else if(step==50){
                clearInterval(et);
                levelup();
            }
            step++;
        }, 50);
    }


    // continue
    levelcontinue = function(){
        reset_fighter();
        disp(ft.id, 'show');
        setProtect();
        fighter_init();
    }


    // 过关
    levelup = function(){
        keypriority = {};
        enemydata = [];
        curboss = null;
        level ++;

        bgsound('pass', false);

        var processed = 0;
        var et = setInterval(function(){
            is_lock = 1;
            processed = processed + 15;
            
            if(getPosition(ft, 'top')>-50){
                setPosition(ft, 'top', getPosition(ft, 'top')-15);
            }
            
            if(processed>=2500){
                clearInterval(et);
                disp(ft.id, 'hide');
                
                if(level<=map.length){
                    bgchange(0);
                    msg_show();
                    setTimeout(function(){
                        msg_hide();
                        start();
                    }, 1500);
                }else{
                    gameclear();    // 通关
                }
            }
        }, 25);
    }


    // 更新分数
    scoreup = function(type){
        if(typeof(scoretag[type])!='undefined'){
            score = score + scoretag[type] * level;
            setHtml('score', score);
            if(score > hiscore){
                hiscore = score;
                setHtml('hiscore', hiscore);
            }
        }
    }


    // 子弹升级
    powerup = function(){
        power = power+1>4? 4 : power+1;
    }    


    // 炸弹增加
    bombup = function(){
        bombnum ++;
        setHtml('bombnum', bombnum);
    }


    // 战机增加
    fighterup = function(){
        fighternum ++;
        setHtml('fighternum', fighternum);
    }


    // 保护状态
    setProtect = function(){
        is_protect = 1;
        if(is_pile==1){
            setClass(ft, 'fighter_sp');
        }else{
            setClass(ft, 'fighter_p');
        }
        setTimeout(function(){
            is_protect = 0;
            if(is_pile==1){
                setClass(ft, 'fighter_s');
            }else{
                setClass(ft, 'fighter');
            }
        }, 3000)
    }


    // 碰撞处理
    impact_handle = function(obj, et){    // et 定时器
        if(impact(obj, ft) && is_lock==0){    // 产生碰撞
            if(is_protect==0){
                destroy(ft);
                clearInterval(et);
                ft.parentNode.removeChild(obj);
            }
        }
    }


    // 全部通关
    gameclear = function(){
        is_over = 1;
        disp('gameclear', 'show');
        setHtml('clearcon', 'Game Clear' + '<br>' + 'SCORE : ' + score);
        bgsound('clear', false);
        bgchange('clear');
        setTimeout(function(){
            bgsound();
            init();
        }, 16000);
    }


    // 游戏结束
    gameover = function(){
        is_over = 1;
        disp('gameover', 'show');
        setHtml('overcon', 'LEVEL : ' + level + '<br>' + 'SCORE : ' + score);
        bgsound('over', false);
        bgchange('over');
        failtimes++;
        setTimeout(function(){
            if(failtimes==3){
                alert('在游戏开始画面依次输入 ↑ ↑ ↓ ↓ ← → ← → a s a s,再开始游戏,会有惊喜^_^');
            }
            bgsound();
            init();
        }, 8000);
    }


    // 显示讯息
    msg_show = function(){
        setHtml('level', 'LEVEL - ' + level);
        disp('level', 'show');
        is_lock = 1;
    }


    // 隐藏讯息
    msg_hide = function(){
        disp('level', 'hide');
    }


    // 重置
    reset = function(){
        is_start = 0;
        is_bombing = 0;
        is_lock = 1;
        is_over = 0;
        is_clear = 0;
        is_protect = 0;
        level = 1;
        power = 1;
        ackey = {};
        keypriority = {};
        enemydata = [];
        score = 0;
        fighternum = 3;
        bombnum = 3;

        setHtml('hiscore', hiscore);
        setHtml('score', score);
        setHtml('fighternum', fighternum);
        setHtml('bombnum', bombnum);

        reset_fighter();
        reset_pile();

        disp('op', 'show');
        disp('gameover', 'hide');
        disp('gameclear', 'hide');

        bgchange(0);
    }


    // 重置战机位置
    reset_fighter = function(){
        setPosition(ft, 'top', 640);
        setPosition(ft, 'left', 175);
        setClass(ft, 'fighter');
    }


    // 重置蓄力
    reset_pile = function(){
        is_pile = 0;
        pilenum = 0;
        if(is_protect==1){
            setClass(ft, 'fighter_p');
        }else{
            setClass(ft, 'fighter');
        }
    }


    // 战机初始化
    fighter_init = function(){
        var et = setInterval(function(){
            if(getPosition(ft, 'top')>400){
                setPosition(ft, 'top', getPosition(ft, 'top')-12);
            }else{
                clearInterval(et);
                is_lock = 0;
                action();
            }
        }, 30);
    }


    // 密技30命
    cheat = function(){
        if(cheatcode.join(',')=='38,38,40,40,37,39,37,39,65,83,65,83,13'){
            fighternum = 30;
            setHtml('fighternum', fighternum);
        }
        cheatcode = [];
    }


    // 背景控制
    bgmove = function(obj){
        var step = 1;
        var et = setInterval(function(){
            var bgpos = getBgPosition(obj);
            if(bgpos['top']==640){
                setBgPosition(obj, 0, 0);    // reset
            }else{
                setBgPosition(obj, bgpos['left'], bgpos['top']+step);
            }
        }, 50);
    }


    // 背景切换
    bgchange = function(file){
        var obj = $('gameplane');
        setClass(obj, 'gameplane bg'+file);
    }


    // 音乐控制
    bgsound = function(file, loop){
        var id = 'audioplayer';
        
        if(typeof(file)!='undefined'){
            if(typeof(loop)=='undefined'){
                loop = false;
            }

            var audiofile = [];
            audiofile['mp3'] = 'music/' + file + '.mp3';
            audiofile['ogg'] = 'music/' + file + '.ogg';
            audioplayer(id, audiofile , loop);
        }else{
            audioplayer(id);
        }
    }

    return this;

})();


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是C语言雷霆战机小游戏的代码及其解释: ```c #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<windows.h> #include<time.h> #define WIDTH 80 // 游戏区域宽度 #define HEIGHT 30 // 游戏区域高度 #define MAX_ENEMY_NUM 5 // 最大敌机数量 #define BULLET_SPEED 2 // 子弹速度 #define ENEMY_SPEED 1 // 敌机速度 #define FPS 30 // 游戏帧率 #define SCORE_PER_ENEMY 10 // 消灭一个敌机的得分 int score = 0; // 玩家得分 int level = 1; // 玩家关卡 int player_x = WIDTH/2; // 玩家飞机的x坐标 int player_y = HEIGHT-2; // 玩家飞机的y坐标 int bullet_x[HEIGHT]; // 子弹的x坐标 int bullet_y[HEIGHT]; // 子弹的y坐标 int bullet_num = 0; // 当前子弹数量 int enemy_x[MAX_ENEMY_NUM]; // 敌机的x坐标 int enemy_y[MAX_ENEMY_NUM]; // 敌机的y坐标 int enemy_num = 0; // 当前敌机数量 void gotoxy(int x, int y) // 光标移动函数 { COORD pos; HANDLE hOutput; pos.X = x; pos.Y = y; hOutput = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOutput, pos); } void hidecursor() // 隐藏光标函数 { CONSOLE_CURSOR_INFO cursor_info = { 1, 0 }; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); } void draw_player() // 绘制玩家飞机函数 { gotoxy(player_x, player_y); printf("^"); } void draw_bullet(int i) // 绘制子弹函数 { gotoxy(bullet_x[i], bullet_y[i]); printf("|"); } void draw_enemy(int i) // 绘制敌机函数 { gotoxy(enemy_x[i], enemy_y[i]); printf("v"); } void update_bullet() // 更新子弹位置函数 { for(int i=0; i<bullet_num; i++) { bullet_y[i] -= BULLET_SPEED; if(bullet_y[i] <= 0) { for(int j=i; j<bullet_num-1; j++) { bullet_x[j] = bullet_x[j+1]; bullet_y[j] = bullet_y[j+1]; } bullet_num--; i--; } } } void update_enemy() // 更新敌机位置函数 { for(int i=0; i<enemy_num; i++) { enemy_y[i] += ENEMY_SPEED; if(enemy_y[i] >= HEIGHT-1) { for(int j=i; j<enemy_num-1; j++) { enemy_x[j] = enemy_x[j+1]; enemy_y[j] = enemy_y[j+1]; } enemy_num--; i--; } } } void draw_score() // 绘制得分函数 { gotoxy(0, HEIGHT); printf("Score: %d", score); } void draw_level() // 绘制关卡函数 { gotoxy(WIDTH-10, HEIGHT); printf("Level: %d", level); } void draw_gameover() // 绘制游戏结束函数 { gotoxy(WIDTH/2-5, HEIGHT/2); printf("Game Over!"); } void generate_enemy() // 生成敌机函数 { if(enemy_num < MAX_ENEMY_NUM) { enemy_x[enemy_num] = rand() % WIDTH; enemy_y[enemy_num] = 0; enemy_num++; } } void check_collision() // 检查碰撞函数 { for(int i=0; i<bullet_num; i++) { for(int j=0; j<enemy_num; j++) { if(bullet_x[i] == enemy_x[j] && bullet_y[i] == enemy_y[j]) { score += SCORE_PER_ENEMY; for(int k=i; k<bullet_num-1; k++) { bullet_x[k] = bullet_x[k+1]; bullet_y[k] = bullet_y[k+1]; } bullet_num--; for(int k=j; k<enemy_num-1; k++) { enemy_x[k] = enemy_x[k+1]; enemy_y[k] = enemy_y[k+1]; } enemy_num--; } } } for(int i=0; i<enemy_num; i++) { if(enemy_x[i] == player_x && enemy_y[i] == player_y) { draw_gameover(); exit(0); } } } void game_loop() // 游戏循环函数 { while(1) { system("cls"); draw_player(); for(int i=0; i<bullet_num; i++) { draw_bullet(i); } for(int i=0; i<enemy_num; i++) { draw_enemy(i); } draw_score(); draw_level(); update_bullet(); update_enemy(); check_collision(); if(rand() % 100 < level) { generate_enemy(); } if(kbhit()) { char c = getch(); if(c == 'a' && player_x > 0) { player_x--; } else if(c == 'd' && player_x < WIDTH-1) { player_x++; } else if(c == ' ') { bullet_x[bullet_num] = player_x; bullet_y[bullet_num] = player_y-1; bullet_num++; } } Sleep(1000/FPS); } } int main() { srand(time(NULL)); hidecursor(); game_loop(); return 0; } ``` 以上是C语言雷霆战机小游戏的代码及其解释,希望能够帮助您了解该游戏的实现和原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值