植物大战僵尸网页脚本版
目前已经制作了5个关卡
尽量提高仿真度
以后将会在基本完成的基础上加入新创作的内容请用浏览器访问以下地址:
http://www.lonelystar.org/pvz
这次做到了多浏览器兼容
IE6核心的Maxthon,谷歌浏览器6.0.427上,火狐浏览器3.6.4上测试通过
效果基本一致
另外还有几款主流浏览器暂时未进行测试,不过偶估计应该也没啥大问题在
http://topic.csdn.net/u/20100506/13/7db25bef-45d1-4327-980e-6493f47c40c1.html
发表时候的基础上做了很大修改,大量修改了算法,提高了效率

解决方案 »

  1.   

    程序啊
    实在太多了
    随意贴点
    <script language=javascript src="js/Ground.js" type="text/javascript"></script>
    <!--关卡页面4波强度最大为2-->
    <script language=javascript>
    var LevelTeachStep=0,DivTeach=document.createElement('div');
    DivTeach.id='DivTeach';
    DivTeach.style.position='absolute';
    DivTeach.style.width=800+'px';
    DivTeach.style.height=50+'px';
    DivTeach.style.top=550+'px';
    DivTeach.style.left=0;
    DivTeach.style.zIndex=100;
    DivTeach.style.filter='alpha(opacity=90)';
    DivTeach.style.opacity=0.9;
    DivTeach.className='LevelTeach'; for(n=1;n<=9;n++){
    oGP.aP[n]=['','[土地]','[土地]','[草地]','[土地]','[土地]'];
    oGP.aPAfterGrow[n]=['','[土地]','[土地]','[草地]','[土地]','[土地]'];
    oGP.aGroundPlant[n]=new Array(6);
    oGP.aPlant[n]=new Array(6);
    for(m=1;m<=5;m++){
    oGP.aGroundPlant[n][m]=['',''];
    oGP.aPlant[n][m]=['','',''];
    }
    } var ArrayZombies=[]; //僵尸种类的数组0不用,1,2,3等分别表示不同强度的僵尸
    oGP.GroundTime='白天';
    oGP.backgroundImage='images/interface/background1unsodded.jpg';
    oGP.ArrayZombies=['oZombie','oZombie','oZombie','oZombie','oZombie']; //关卡必须出现的僵尸种类
    oGP.CanSelectZombies=''; //备选僵尸
    oGP.MinZombieStrength=1; //僵尸最低强度
    oGP.MaxZombieStrength=1; //僵尸最高强度,修改oGP.ArrayZombies的时候必须连此项一起修改
    for(n=1;n<=oGP.MaxZombieStrength;n++){
    ArrayZombies[n]=[];
    }
    oGP.initSunNum=150; //保存原始阳光值用作reset游戏用
    oGP.SunNum=150; //出场阳光值
    oGP.CanSelectCard=0; //是否允许选卡
    oGP.LevelName='关卡 1-1';
    oGP.InitGround();//开始游戏
    function StartGame(){
    var SunCoolTime;
    Monitor(0); //全局监控计时器
    BeginCool(); //卡片的开场冷却
    MonitorCard();
    tAutoSun(); //检查自动拾取阳光
    //是否选择了有移动子弹的植物,豌豆家族,小蘑菇海蘑菇胆小菇,杨桃
    if(BeginMoveBullet){
    tMoveBullet(); //移动子弹
    }
    $('sFlagMeterTitleF').innerHTML=oGP.LevelName
    $('dFlagMeterTitleB').innerHTML=oGP.LevelName+$('dFlagMeterTitleB').innerHTML;
    $('dFlagMeter').style.display='block';
    }function AutoSelectCard(){
    //自动选择卡片,不允许用户选择卡片关必须定义
    SelectCard(1);
    $('tdShovel').style.visibility='hidden';
    }function Monitor(Num){
    //监控计时器
    switch(Win){
    case 0: //Normal
    switch(true){
    case FlagZombies==3:
    if(AlreadyAddZombiesFlag==0){
    if(Num>=250){ //大于等于最长等待时间
    AlreadyAddZombiesFlag=1;
    AddZombiesFlag();
    Num=0;
    break;
    }else{ //小于25秒
    if(NumZombies==0){ //当前已经没有要打的僵尸了,刷下一波
    AlreadyAddZombiesFlag=1;
    Num=0;
    ShowFinalWave();
    setTimeout('AddZombiesFlag()',5000);
    break;
    }else{ //还有僵尸,距离最长等待时间还差7秒左右,显示最后一波
    if(Num>=170&&Num<=180){ShowFinalWave();}
    Num++;
    }
    }
    }
    break;
    case FlagZombies>=1&&FlagZombies<3:
    if(AlreadyAddZombiesFlag==0){
    if(Num>=250){ //大于等于最长等待时间
    AlreadyAddZombiesFlag=1;
    AddZombiesFlag();
    Num=0;
    break;
    }else{ //小于25秒
    if(NumZombies==0){ //当前已经没有要打的僵尸了,刷下一波
    AlreadyAddZombiesFlag=1;
    Num=0;
    setTimeout('AddZombiesFlag()',5000);
    break;
    }else{ //还有僵尸
    Num++;
    }
    }
    }
    break;
    case FlagZombies==4:
    if(NumZombies==0&&Win==0){
    var imgSF=document.createElement('img');
    imgSF.src=dicCardGif['oSunFlower'].src;
    imgSF.style.position='absolute';
    imgSF.style.zIndex=254;
    imgSF.style.left=567+'px';
    imgSF.style.top=330+'px';
    imgSF.style.cursor='pointer';
    imgSF.onclick=function(){GetNewCard(this,'oSunFlower',100,'1_2');}
    obDAll.appendChild(imgSF);
    var ob=$('PointerUD');
    ob.src='images/interface/PointerDown.gif';
    ob.style.left=576+'px';
    ob.style.top=295+'px';
    ob.style.display='block';
    Win=1;
    return(false);
    }
    }
    break;
    case -1:
    return(false); //over
    break;
    case 1:
    return(false); //win
    break;
    }

    //教学
    var C=1;
    switch(LevelTeachStep){
    case 0:
    obDAll.appendChild(DivTeach);
    $('DivTeach').innerHTML='点击卡片选择豌豆射手!';
    var PointerUD=document.createElement('img');
    PointerUD.src='images/interface/PointerUP.gif';
    PointerUD.id='PointerUD';
    PointerUD.style.position='absolute';
    PointerUD.style.top=80+'px';
    PointerUD.style.left=85+'px';
    PointerUD.style.zIndex=50;
    obDAll.appendChild(PointerUD);
    LevelTeachStep++;
    break;
    case 1:
    if(Chose==1){
    $('DivTeach').innerHTML='点击草地种下豌豆射手,最好种在靠左边!';
    var ob=$('PointerUD');
    ob.src='images/interface/PointerDown.gif'
    ob.style.left=70+'px';
    ob.style.top=270+'px';
    LevelTeachStep++;
    }
    break;
    case 2:
    for(C=1;C<=oGP.MaxC;C++){
    if(oGP.aPlant[C][3][0]!=''){
    $('DivTeach').innerHTML='你拥有了第一个植物,点击收集掉落的阳光!';
    AutoProduceSun(25)
    LevelTeachStep++;
    break;
    }
    }
    if(Chose==0&&C==10){obDAll.removeChild($('PointerUD'));LevelTeachStep=0;break;}
    break;
    case 3:
    if(oGP.SunNum>=100){
    $('DivTeach').innerHTML='你拥有了足够的阳光来种植另一个豌豆射手!';
    var ob=$('PointerUD');
    ob.src='images/interface/PointerUP.gif'
    ob.style.left=80+'px';
    ob.style.top=85+'px';
    LevelTeachStep++;
    break;
    }
    case 4:
    var PlantNum=0;
    for(C=1;C<=oGP.MaxC;C++){
    if(oGP.aPlant[C][3][0]!=''){PlantNum++;}
    }
    if(PlantNum>=2){
    $('PointerUD').style.display='none';
    $('DivTeach').innerHTML='别让僵尸靠近你的房子!';
    $('tdFlagMeter').style.visibility='visible';
    LevelTeachStep++;
    AddZombiesFlag();
    MoveZombies();
    setTimeout(function(){$('DivTeach').style.display='none';},5000);
    }
    break;
    }

    setTimeout(function(){Monitor(Num)},100);
    }function InitLawnMower(){
    //初始化剪草机,每个关卡文件必须定义
    i=document.createElement('img');
    i.id='LawnMower3';
    i.src=dicGroundGif['LawnMower'].src;
    i.style.position='absolute';
    i.style.left=-40+'px';
    i.style.top=GetY(3)-60+'px';
    i.style.zIndex=9;
    obDAll.appendChild(i);
    }function SelectZombie(){
    //选择上场僵尸
    var AlreadySelectNum=oGP.ArrayZombies.length;
    var SelectNum=5-AlreadySelectNum;
    var n,m;
    if(oGP.CanSelectZombies!=''){
    var aSelect=oGP.CanSelectZombies.split(',');
    for(n=1;n<=SelectNum;n++){
    if(aSelect.length==0){break;}
    m=Math.floor(Math.random()*aSelect.length);
    oGP.ArrayZombies.push(aSelect[m]);
    aSelect.splice(m,1);
    }
    }
    var OZombie,HP,tmoObStr;
    for(n=0;n<oGP.ArrayZombies.length;n++){
    tmpObStr=oGP.ArrayZombies[n];
    OZombie=window[tmpObStr].prototype;
    HP=OZombie.HP+OZombie.OrnHP;
    switch(true){
    case HP<420:
    ArrayZombies[1].push(oGP.ArrayZombies[n]);
    break;
    case HP>=420&&HP<1300:
    ArrayZombies[2].push(oGP.ArrayZombies[n]);
    break;
    default:
    ArrayZombies[3].push(oGP.ArrayZombies[n]);
    }
    }
    }function SelectFlagZombie(SumNum){
    //组合每波的僵尸种类;
    var aZ=[],aTmp=[],n,m,U,tmp=oGP.MaxZombieStrength,MinZombieStrength=oGP.MinZombieStrength; //表示僵尸的最高强度;
    while(true){
    if(SumNum<=0){break;}
    if(SumNum<tmp){
    U=SumNum;
    }else{
    U=tmp;
    }
    for(n=MinZombieStrength;n<=U;n++){
    for(m=0;m<ArrayZombies[n].length;m++){
    aTmp.push([n,ArrayZombies[n][m]]);
    }
    }
    if(aTmp.length==0){
    for(n=MinZombieStrength;n<=tmp;n++){
    if(ArrayZombies[n].length>0){
    for(m=0;m<ArrayZombies[n].length;m++){
    aTmp.push([n,ArrayZombies[n][m]]);
    }
    break;
    }
    }
    }
    n=Math.floor(Math.random()*aTmp.length);
    aZ.push(aTmp[n][1]);
    SumNum-=aTmp[n][0];
    }
    return(aZ);
    }
    function AddZombiesFlag(){
    //添加僵尸Flag
    var R,SumNum,aTmp,n,UboundTime,parseIntFlagHead; //SumNum:僵尸强度
    switch(true){
    case FlagZombies>=0&&FlagZombies<3:
    SumNum=1; //僵尸强度和
    UboundTime=10001;
    FlagZombies++;
    NumZombies++;
    parseIntFlagHead=(FlagZombies>1)?parseInt($('imgFlagHead').style.left)-47:139;
    $('imgFlagHead').style.left=parseIntFlagHead+'px';
    $('imgFlagMeterFull').style.clip='rect(0,157,21,'+(parseIntFlagHead+11)+')';
    SetTimeoutZombie(SumNum,UboundTime);
    break;
    default:
    $('imgFlagHead').style.left=-1+'px';
    $('imgFlagMeterFull').style.clip='rect(0,157,21,0)';
    SumNum=2;
    UboundTime=3001;
    aTmp=SelectFlagZombie(SumNum);
    FlagZombies++;
    NumZombies+=aTmp.length;
    for(var n=0;n<aTmp.length-1;n++){
    setTimeout('initZombie("'+aTmp[n]+'")',Math.floor(2000+Math.random()*UboundTime));
    }
    setTimeout('initZombie("'+aTmp[aTmp.length-1]+'");',Math.floor(Math.random()*UboundTime));
    return(false);
    }
    AlreadyAddZombiesFlag=0;
    }
    function GetZombieR(ob){
    //获取initZombie时zombie的R提供给initZombie函数
    return(3);
    }
    </script>
      

  2.   

    额,的确很强大。
    lz把代码分享给大家学习一下吧。JavaScript ,
      

  3.   

    偶忘了修改首页上个版本只有IE兼容的提示了
    这个版本兼容IE,FF,谷歌
    不推荐用IE,因为执行效率确实比FF和谷歌要慢的多
      

  4.   


    下载?
    偶这个是后台asp+前台javascript的
    你怎么下载
      

  5.   


    元素是录像软件录像转换成flv然后转换成gif进行处理
    关卡效果还有待改进,3Q第五关开始就是一个使用铲子铲除植物的教程
    铲除掉三个植物后开始游戏
    点暂停只是个alert('暂停中')这样的提示而已
    所以你只要直接点确定就关闭alert也就关闭暂停了...