SwVitaliy

Untitled

Aug 1st, 2012
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <html>
  2. <head>
  3.     <title>xio</title>
  4.     <meta charset="utf8" />
  5.     <script type="text/javascript">
  6.        
  7.         var xio = xio || {}
  8.  
  9.         ;(function(ns){
  10.  
  11.             // private data and functions
  12.  
  13.             var table = null,
  14.                 currentElem= null,
  15.                 current = Math.random() > 0.5 ? 'x' : 'o',
  16.                 fields = null,
  17.                 winlen = null;
  18.  
  19.             function strcp(n) { var i, r = ''; for(i=0;i<n; ++i) { r+=this; } return r;  }
  20.  
  21.             function frame() {
  22.                 if (this.innerHTML !== '')
  23.                     return false;
  24.                 this.innerHTML = current;
  25.  
  26.                 var w = iswin(this);
  27.                 if (w) {
  28.                     var i; for (i=0;i<w.length; ++i) {
  29.                         w[i].setAttribute("class", "redCell");
  30.                         w[i].setAttribute("className", "redCell");
  31.                     }
  32.                     return undefined;
  33.                 }
  34.  
  35.                 current = current === 'x' ? 'o' : 'x';
  36.                 printCurrent();
  37.             }
  38.  
  39.             function indOf(child) {
  40.                 var i = 0;
  41.                 while( (child = child.previousSibling) != null ) i++;
  42.                 return i;
  43.             }
  44.  
  45.             function celsByCoords(a) {
  46.                 var i, row, cell, r = [],
  47.                     t = table.getElementsByTagName('tbody')[0];
  48.                 for (i=0; i<a.length; ++i) {
  49.                     row = t.childNodes[a[i].y];
  50.                     r.push(row.childNodes[a[i].x]);
  51.                 }
  52.  
  53.                 return r;
  54.             }
  55.  
  56.             function iswin(cell) {
  57.                 var lx = indOf(cell), ly = indOf(cell.parentNode);
  58.  
  59.                 var verLen = fields[0].length;
  60.  
  61.                 var i, j, winrow = [{x:lx, y:ly}];
  62.                 // horizontal left
  63.                 for (i=lx-1; i>0; --i) {
  64.                     if (fields[i][ly] !== current) {
  65.                         break;
  66.                     }
  67.                     winrow.push({ x:i, y:ly });
  68.                     if (winrow.length >= winlen) { return celsByCoords(winrow); }
  69.                 }
  70.  
  71.                 // horizontal right
  72.                 winrow = [{x:lx, y:ly}];
  73.                 for (i=lx+1; i<fields.length; ++i) {
  74.                     if (fields[i][ly] !== current) {
  75.                         break;
  76.                     }
  77.                     winrow.push({ x:i, y:ly });
  78.                     if (winrow.length >= winlen) { return celsByCoords(winrow); }
  79.                 }
  80.  
  81.                 // vertical top
  82.                 winrow = [{x:lx, y:ly}];
  83.                 for (i=ly-1; i>0; --i) {
  84.                     if (fields[lx][i] !== current) {
  85.                         break;
  86.                     }
  87.                     winrow.push({x:lx, y:i});
  88.                     if (winrow.length >= winlen) { return celsByCoords(winrow); }
  89.                 }
  90.  
  91.                 // vertical down
  92.                 winrow = [{x:lx, y:ly}];
  93.                 for (i=ly+1; i<verLen; ++i) {
  94.                     if (fields[lx][i] !== current) {
  95.                         break;
  96.                     }
  97.                     winrow.push({x:lx, y:i});
  98.                     if (winrow.length >= winlen) { return celsByCoords(winrow); }
  99.                 }
  100.  
  101.                 // left top
  102.                 winrow = [{x:lx, y:ly}];
  103.                 for (i=lx-1, j=ly-1; i>0 && j>0; --i, --j) {
  104.                     if (fields[i][j] !== current) {
  105.                         break;
  106.                     }
  107.                     winrow.push({x:i, y:j});
  108.                     if (winrow.length >= winlen) { return celsByCoords(winrow); }
  109.                 }
  110.  
  111.                 // left down
  112.                 winrow = [{x:lx, y:ly}];
  113.                 for (i=lx-1, j=ly+1; i>0 && j<verLen; --i, ++j) {
  114.                     if (fields[i][j] !== current) {
  115.                         break;
  116.                     }
  117.                     winrow.push({x:i, y:j});
  118.                     if (winrow.length >= winlen) { return celsByCoords(winrow); }
  119.                 }
  120.  
  121.                 // right top
  122.                 winrow = [{x:lx, y:ly}];
  123.                 for (i=lx+1, j=ly-1; i<fields.length && j>0; ++i, --j) {
  124.                
  125.                     if (fields[i][j] !== current) {
  126.                         break;
  127.                     }
  128.                     winrow.push({x:i, y:j});
  129.                     if (winrow.length >= winlen) { return celsByCoords(winrow); }
  130.                 }
  131.  
  132.                 // right down
  133.                 winrow = [{x:lx, y:ly}];
  134.                 for (i=lx+1, j=ly+1; i<fields.length && j<verLen; ++i, ++j) {
  135.                     if (fields[i][j] !== current) {
  136.                         break;
  137.                     }
  138.                     winrow.push({x:i, y:j});
  139.                     if (winrow.length >= winlen) { return celsByCoords(winrow); }
  140.            
  141.                 }
  142.  
  143.                 fields[lx][ly] = current;
  144.                 return false;
  145.             };
  146.  
  147.             function printCurrent() {
  148.                 currentElem.innerHTML = "Сейчас ход: " + current.toUpperCase();
  149.             }
  150.  
  151.             // api functions
  152.  
  153.             ns.setWinLen = function(t) { winlen = t; return this; }
  154.  
  155.             ns.setTable = function(t) { table = t; return this; }
  156.  
  157.             ns.setCurrent = function(t) {
  158.                 currentElem = t;
  159.                 printCurrent();
  160.                 return this;
  161.             };
  162.  
  163.             ns.fillTable = function(w,h) {
  164.                 var row = strcp.apply("<td></td>", [w]);
  165.                 table.innerHTML = "<tbody>" + strcp.apply("<tr>" + row + "</tr>", [h]) + "</tbody>";
  166.                 fields = new Array(w);
  167.                 var i; for(i=0; i<h; ++i) { fields[i] = new Array(h); }
  168.                 return this;
  169.             };
  170.  
  171.             ns.bindEvents = function() {
  172.                 var tbody = table.getElementsByTagName('tbody')[0],
  173.                     rows = tbody.getElementsByTagName('tr'),
  174.                     i, j, cols;
  175.  
  176.                 for (i=0; i<rows.length; ++i) {
  177.                     cols = rows[i].getElementsByTagName('td');
  178.                     for (j=0; j<cols.length; ++j) {
  179.                         cols[j].addEventListener('click', frame);
  180.                     }
  181.                 }
  182.  
  183.             };
  184.  
  185.         })(xio)
  186.  
  187.         function load() {
  188.             var d = document.getElementById('gameFields');
  189.             var s = document.getElementById('current');
  190.             xio.setWinLen(5).setTable(d).setCurrent(s).fillTable(10,10).bindEvents();
  191.         }
  192.     </script>
  193.     <style type="text/css">
  194.     * {
  195.         padding: 0;
  196.         margin: 0;
  197.         font-family: "MS Trebuchet", Arial, sans-serif;
  198.     }
  199.     #gameFields tr { height:30px; }
  200.     #gameFields td { width:30px; border:1px gray solid; text-align: center; }
  201.     #gameFields { border:1px red solid; margin: 20px 0px 0px 20px; }
  202.     #current { margin: 20px 0px 20px 20px; }
  203.     .redCell { background-color: #DD0000; color:white; }
  204.     </style>
  205. </head>
  206. <body onload="load()">
  207.    
  208.     <div id="current"></div>
  209.  
  210.     <table id="gameFields"><thead></thead><tbody></tbody></table>
  211.  
  212. </body>
  213. </html>
Advertisement
Add Comment
Please, Sign In to add comment