Re[2]: Grid game
От: Аноним  
Дата: 21.04.05 16:16
Оценка:
А>Условие яваскрипта сильное.. Отладить не могу.. Был бы язык программирования, а то есть приколы совместимости.. Но скоро будет

Всем здравствуйте! Это опять я. Собственно, обещанная реализация на ЯваСкрипт. Текстовая! Маленькая. Эстеты могут рисовать картинки...

Регистрироваться лень... Поэтому так.
<html>
    <head>
        <title>Grid game</title>
        <meta content="text/html; charset=koi8-r" http-equiv="Content-Type" />
        <meta author="Michael Raskin" />
        <meta generator="GVIM" />
    </head>
    <script language="JavaScript" charset="koi8-r" >
        <!--

        //---------------------------------Script from here

        var d,de; //document and main element used to work in
        var nbsp=String.fromCharCode(160);
        var directions=[[1,1],[-1,1],[-1,-1],[1,-1]];
        var size=16;
        var directionAttribName="name";
        var state0=[[]];
        var marked=[[]];
        var oldmark=[[]];
        var score;
        
        function insText(node,str)
        {
            node.appendChild(d.createTextNode(str));
        }
        
        function makeA(href,cap)
        {
            var a=d.createElement("a");
            a.setAttribute("href",href);
            insText(a,cap);
            return a;
        }

        function tagEl(node,name)
        {
            node.appendChild(d.createElement(name));
        }

        function putText(str)
        {
            insText(de,str);
        }

        function putTag(name)
        {
            tagEl(de,name);
        }

        function fullTag(name,node,text,attribs)
        {
            var my=d.createElement(name);
            if (text!=null) my.appendChild(d.createTextNode(text));
            var i;
            if (attribs!=null)
            for(i=0;i<attribs.length;i++)
            {
                if (attribs[i]!=null)if(attribs[i].length>1)
                    my.setAttribute(attribs[i][0],attribs[i][1]);
            }
            if(node!=null) node.appendChild(my); else
                return my;
            
        }
        
        function hasWay(dir,sgn,isY)
        {
            return (directions[dir][isY]==sgn);
        }

        function nextDir(dir)
        {
            var n=dir+1;
            while (n<0) n+=4;
            while (n>3) n-=4;
            return n;
        }

        function prevDir(dir)
        {
            var n=dir-1;
            while (n<0) n+=4;
            while (n>3) n-=4;
            return n;
        }

        function dir2text(dir)
        {
            var s;
            if (directions[dir][1]==1) s="v"; else s="^";
            if (directions[dir][0]==-1) s="<"+s; else s=s+">";
            return s;
        }

        function xy2id(x,y)
        {
            return "grid_"+x.toString()+"_"+y.toString();
        }
        
        function writeAnyGrid(states,mark,prevMark)
        {
            var i,j;
            var st;
            for(j=0;j<size;j++)
            {
                for(i=0;i<size;i++)
                {
                    if (mark[i][j]){
                        st=["style","color: red"];
                        de.replaceChild(fullTag("a",null,dir2text(states[i][j]),
                            [[directionAttribName,states[i][j].toString()],
                            ["id",xy2id(i,j)],
                            ["href","javascript:click("+i.toString()+","+j.toString()+");"],st]),
                            d.getElementById(xy2id(i,j)));
                    } else if (prevMark[i][j]){
                        st=["style","color: green"];
                        de.replaceChild(fullTag("a",null,dir2text(states[i][j]),
                            [[directionAttribName,states[i][j].toString()],
                            ["id",xy2id(i,j)],
                            ["href","javascript:click("+i.toString()+","+j.toString()+");"],st]),
                            d.getElementById(xy2id(i,j)));
                        
                    }
                }    
            }
        }
        
        function scanGrid(state)
        {
            var i,j;
            for(i=0;i<size;i++) state[i]=[];
            for(i=0;i<size;i++)
                for(j=0;j<size;j++)
                    state[i][j]=
                        Number(d.getElementById(xy2id(i,j)).getAttribute(directionAttribName));
        }

        function rotateAll(state,mark)
        {
            var i,j;
            for(i=0;i<size;i++)for(j=0;j<size;j++)
            {
                state[i][j]+=mark[i][j];
                while(state[i][j]<0)state[i][j]+=4;
                while(state[i][j]>3)state[i][j]-=4;
            }
        }
        
        function writeZeroGrid()
        {
            init();
            clear();
            var i,j;
            for(j=0;j<size;j++)
            {
                for(i=0;i<size;i++) 
                {
                    fullTag("a",de,dir2text(0),[[directionAttribName,"0"],
                        ["id",xy2id(i,j)],
                        ["href","javascript:click("+i.toString()+","+j.toString()+");"]]);
                    putText(nbsp);    
                }    
                putTag("br");
            }
        }
        
        function click(x,y)
        {
            init();
            makeSize();
            var i,j;
            for(i=0;i<size;i++)for(j=0;j<size;j++)
            {
                marked[i][j]=0;
                oldmark[i][j]=0;
            }
            marked[x][y]=1;
            scanGrid(state0);
            score=1;
            iterate();
        }
    
        function checkConnect(x,y,dir)
        {
            //uses oldmark array!!!

            var c=0;
            if ((x>0) && (hasWay(dir,-1,0)))
            {
                if (hasWay(state0[x-1][y],1,0) && oldmark[x-1][y])
                    c++;
            }
            if ((x<size-1) && (hasWay(dir,1,0)))
            {
                if (hasWay(state0[x+1][y],-1,0) && oldmark[x+1][y])
                    c++;
            }
            if ((y>0) && (hasWay(dir,-1,1)))
            {
                if (hasWay(state0[x][y-1],1,1) && oldmark[x][y-1])
                    c++;
            }
            if ((y<size-1) && (hasWay(dir,1,1)))
            {
                if (hasWay(state0[x][y+1],-1,1) && oldmark[x][y+1])
                    c++;
            }
            score+=c;
            return c;    
        }

        function fillMarks()
        {
            var i,j,flag=0,c;
            for (i=0;i<size;i++)for(j=0;j<size;j++)
            {
                c=checkConnect(i,j,state0[i][j]);
                if(c)flag=1;
                marked[i][j]=c;
            }
            return flag;
        }

        function iterate()
        {
            var i,j;
            var scoreboard=d.getElementById("score");
            var nsb=scoreboard.cloneNode(0);
            scoreboard.parentNode.replaceChild(nsb,scoreboard);
            scoreboard=nsb;
            scoreboard.setAttribute("id","score");
            insText(scoreboard,score);

            rotateAll(state0,marked);
            writeAnyGrid(state0,marked,oldmark);
            for(i=0;i<size;i++)for(j=0;j<size;j++)
                oldmark[i][j]=marked[i][j];
            if(fillMarks()) setTimeout(iterate,300);
                else writeAnyGrid(state0,marked,oldmark);
        }

        function makeSize()
        {
            var i;
            for(i=0;i<size;i++)
            {
                state0[i]=[];
                marked[i]=[];
                oldmark[i]=[];
            }
        }
        
        function clear()
        {
            de.parentNode.replaceChild(de.cloneNode(0),de);
            de=d.getElementById("main");
        }
        
        function init()
        {
            d=document;
            de=d.getElementById("main");
        }
    
        //---------------------------------Script up to here
        
        //-->
    </script>
    <body bgcolor="FFFFE0" onload="writeZeroGrid(); " >
        <div id="main">

        </div>
        <div id="score">
        </div>
    </body>
</html>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.