О проектеГостеваяКарта сайта

Предложишь лучшее решение - получишь 100 рублей!

Игра `Крестики нолики` на бесконечном поле на JS

Всем известная игра в крестики нолики :)

Цель игры - построить непрерывный ряд из 5 крестиков по горизонтали, вертикали или диагонали.

Решение

Javascript

<script type="text/javascript">
 var TOTLIN, ATFAC, PLAYER, OPPON, IGROK, PROGR, WINLINE, GAMEEND;
 var IGT, X, Y, LX, LY, OTMENA=false;
 var BOARD, VALUE, LINP, WEIGHT = new Array(0, 0, 4, 20, 100, 500, 0);
 function sgn(T) {
   if (T<0) T=-1;
   else if (T>0) T=1;
   else T=0;
   return T;
  }
 function INICIAL() {
   var I, J, tr;
   var f = '<table id="f" style="border: none; border-collapse:collapse;">';
   BOARD = new Array();
   VALUE = new Array();
   LINP = new Array();
   for (I=0;I<=20;I++) {
     if (I>0 && I<20) tr='<tr>';
     BOARD[I] = new Array();
     VALUE[I] = new Array();
     LINP[I] = new Array();
     for (J=0; J<=20; J++) {
       if (I*J>0 && I<20 && J<20) tr += '<td id="c-'+I+'-'+J+'" onclick="ANAKEY(this);" style="font-family: Tahoma, Helvetica, Sans Serif; border: 1px dotted #00a; cursor: pointer; width: 20px; font-weight: bold; text-align: center; vertical-align: middle; font-size: 16px; line-height: 20px">&nbsp;</td>';
       VALUE[I][J] = new Array();
       LINP[I][J] = new Array();
       for(C=1;C<3;C++) { LINP[I][J][C] = new Array(); }
      }
     if (I>0 && I<20) { tr += '</tr>'; f += tr; }
    }
   f += '</table>';
   document.write(f);
   PROGR=0;
   IGROK=0;
  }
 function ANAKEY(a) {
   X = a.id.replace(/c-/,'').replace(/-.*/,'');
   Y = a.id.replace(/c-/,'').replace(/.*-/,'');
   if (BOARD[X][Y] == 0) {
     BOARD[X][Y]=1; MOVEXOD();
     if (GAMEEND) {
       IGROK += 1;
       MESSAG('Поздравляем! Вы выиграли!');
      }
     else {PRGMAK();}
    }
  }
 function NEWGAME() {
   var I, J, C, D;
   if (OTMENA) {
     alert('Игра не закончена!');
     return false;
    }
   for(I=1;I<=19;I++)
     for(J=1;J<=19;J++) {
       geid('c-'+I+'-'+J).innerHTML='&nbsp;';
       geid('c-'+I+'-'+J).className='';
       BOARD[I][J]=0;
       for(C=1;C<3;C++) {
         VALUE[I][J][C] = 0;
         for(D=0;D<4;D++) LINP[I][J][C][D] = 0;
        }
      }
     geid('txt').innerHTML='Ваш ход';
     geid('prg').innerHTML=PROGR;
     geid('igr').innerHTML=IGROK;
     PLAYER=1;
     OTMENA=true;
     TOTLIN=(19*(19-4)+(19-4)*(19-4))*4; LX=1; LY=1;
     X=10;
     Y=X;
     ATFAC=parseInt(IGROK/2);
     if (ATFAC >15) ATFAC=15;
     for(I=1;I<20;I++)
       for(J=1;J<20;J++) {
         IGT = BOARD[I][J];
         DRAMOV(I,J);
        }
  }
 function DRAMOV(XX, YY) {
   var idt;
   LX=XX;
   LY=YY;
   idt='c-'+XX+'-'+YY;
   if (IGT == 1) {
     geid(idt).innerHTML='x';
    }
   else if (IGT == 2) {
     geid(idt).className='red';
     geid(idt).innerHTML='o';
    }
  }
 function MOVEXOD() {
   var T, K, L, X1, Y1, X11, Y11, DX, DY, NUM, LIO, LIP, TTT, idt;
   WINLINE = 0;
   OPPON = 3 - PLAYER;
   GAMEEND = false;
   idt='c-'+LX+'-'+LY; geid(idt).className='';
   for (T=0;T<4;T++)
     for(K=0;K<5;K++) {
       X1 = parseInt(X) + sgn(T - 2) * K;
       Y1 = Y - sgn(T) * K;
       switch(T) {
          case 0: TTT = X1 > 0 && X1 < 16; break;
          case 1: TTT = (X1 > 0 && X1 < 16) && (Y1 > 0 & Y1 < 16); break;
          case 2: TTT = Y1 > 0 && Y1 < 16; break;
          case 3: TTT = (X1 > 4 && X1 < 20) && (Y1 > 0 && Y1 < 16); break;
          default:;
         }
       if(TTT) {
         NUM = LINP[X1][Y1][PLAYER][T];
         NUM = NUM + 1;
         if (NUM == 1) TOTLIN--;
         else if (NUM == 5) GAMEEND = true;
         LINP[X1][Y1][PLAYER][T] = NUM;
         if (GAMEEND && (WINLINE == 0)) WINLINE = T + 1;
         LIP = LINP[X1][Y1][PLAYER][T];
         LIO = LINP[X1][Y1][OPPON][T];
         for(L=0;L<5;L++) {
           X11 = X1 - sgn(T - 2) * L;
           Y11 = parseInt(Y1) + sgn(T) * L;
           if (LIO == 0) VALUE[X11][Y11][PLAYER]=VALUE[X11][Y11][PLAYER] + WEIGHT[LIP + 1] - WEIGHT[LIP];
           else
             if (LIP == 1) VALUE[X11][Y11][OPPON] = VALUE[X11][Y11][OPPON] - WEIGHT[LIO + 1];
          }
        }
      }
   BOARD[X][Y] = PLAYER;
   IGT = PLAYER;
   if (GAMEEND) {
      switch(WINLINE) {
         case 1: DX = 1; DY = 0; break; case 2: DX = 1; DY = 1; break;
         case 3: DX = 0; DY = 1; break; case 4: DX = -1; DY = 1; break;
         default:;
        }
      do {
          X = (X - 0 + DX);
          Y = (Y - 0 + DY);
          }
      while (BOARD[X][Y] == PLAYER);
      X -= DX;
      Y -= DY;
      for(I=1;I<6;I++) {
        idt='c-'+X+'-'+Y; geid(idt).className='green';
        DRAMOV (X, Y); X = X - DX; Y = Y - DY;
       }
    }
   else {
     DRAMOV (X, Y);
     PLAYER = OPPON;
    }
  }
 function PRGMAK() {
   var I, J, MAX, VALZ;
   if (TOTLIN <= 0) { GAMEEND = true; MESSAG('Tie game!'); }
   else {
     OPPON = 3 - PLAYER;
     MAX = -32767;
     X = 10;
     Y = 10;
     if (BOARD[X][Y] == 0) MAX = 4;
     for(I=1;I<20;I++)
       for(J=1;J<20;J++) {
         if (BOARD[I][J]==0) {
           VALZ=parseInt(VALUE[I][J][PLAYER]*(16+ATFAC)/16)+VALUE[I][J][OPPON]+parseInt(Math.random()*4);
           if (VALZ>MAX) {
             X = I; Y = J;
             MAX = VALZ;
            }
          }
        }
       MOVEXOD();
       if (GAMEEND) {
         PROGR++; MESSAG('Компьютер победил!');
        }
    }
  }
 function MESSAG(SS) { alert(SS); OTMENA=false; NEWGAME(); }
 function geid(i) { return document.getElementById(i); }
</script>
 

Демо работы функции

Крестики нолики на бесконечном поле


Цель игры - построить непрерывный ряд из 5 крестиков по горизонтали, вертикали или диагонали.

Для начала игры нажмите кнопку  

 

Текущие результаты игры (компьютер : человек) -  0 : 0


Рейтинг:

Теги: JavaScript игра приколы

Если вы знаете более оригинальное, красивое, ЛУЧШЕЕ решение этой задачи, у вас есть шанс заработать 100 рублей!!! Если ваше решение будет признано лучшим, деньги ваши! Мы гарантируем выплату!

Всего 1 комментарий

< !-- @form -- >

Подписаться на новые комментарии?

%form_captcha%

*Обзазательны для заполнения

PHP

 

Последние комментарии
  • phpguru

    Функция отличная только надо бы добавить для utf8 кодировку обработать строку, а то не все понимают как сделать подобное!
    $str = iconv_strlen($str,'UTF-8');
    Я так считаю!
    13-12-2013 в 12:59:38 ID# 454 посмотреть...


  • SnipCode.ru

    Возможно Вы правы, непонятно только зачем тут iconv_strlen (((
    13-12-2013 в 13:02:55 ID# 455 посмотреть...


  • Сергей

    поторопился, так надо в конце, пардон.
        return $v['pass'];
        }
    return FALSE;
    }

    02-12-2013 в 23:33:41 ID# 377 посмотреть...


  • Сергей

    Думаю все же логичней использовать foreach, т.к. можно промахнуться с ключами, а если массив ассоциативный (я раньше делал ключ = дата и время регистрации), то вообще работать не будет.
     
    function search($array,$login)
    {
       foreach ($array as $k=>$v)
        if($v['login'] == $login){
        return $v['pass'];
        }
    }
    return FALSE;
    Так, на минутку.
    Время исполнения смысла не имеет, авторизация используется 1 раз, если юзер не параноик)))

    02-12-2013 в 23:33:41 ID# 376 посмотреть...


  • Пабло

    Как сделана ваша система рейтинга,с учетом количеством людей,проголосовавших?
    11-11-2013 в 17:04:39 ID# 207 посмотреть...


  • SnipCode.ru

    ну...вобщем то все просто: берем общую оценку, делим на кол-во проголосовавших, получаем рейтинг
    11-11-2013 в 17:07:06 ID# 208 посмотреть...


  • Пабло

    Да,просто у меня возникли проблемы,при сохранении данных,в бд и отображение количество проголосовавших людей,у вас где нибудь на сайте описано как это сделано или будет?
     
    Мне нужна система рейтинга точно такая же как у вас=)
    11-11-2013 в 17:10:56 ID# 209 посмотреть...


  • KorniloFF

    Приведенный код обрезает до первой точки в строке, в случае, если в ней будет их несколько, что не соответствует теме.
    Вот код, обрезающий до последней точки:

    PHP

    $title= preg_replace("/([\s\S.]+)\.\w+$/","$1",$str)
     

    10-11-2013 в 10:45:29 ID# 205 посмотреть...


  • Виктор

    Все отлично работает! Извините , у меня есть задача отрезать после второй и до второй запятой , что нужно поправить в первом примере?
    Спасибо!
    30-09-2013 в 20:34:07 ID# 204 посмотреть...