Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Алгоритм определения победителя в игре "крестики-нолики"
 
 автор: pavluxa09   (23.06.2012 в 18:42)   письмо автору
 
 

Здравствуйте, уважаемые пользователи. Облазил весь гугл но не смог найти готового ответа на мой вопрос. У меня имеется двумерный массив (игровое поле), у которого длина и выноса одинаковые, но при этом они динамические (могут иметь размер от 3 до n) клеток. Стоит условие, если размер поля > 4, то нужно собрать 4 одинаковых значка подрядидущих, иначе 3. В массиве храняться значения 0 1 и 2, соответственно 1 - крестик 2 - нолик.

Помогите пожалуйста как определить подряд идущие элементы в массиве и решить задачу.

  Ответить  
 
 автор: elenaki   (23.06.2012 в 19:03)   письмо автору
 
   для: pavluxa09   (23.06.2012 в 18:42)
 

у которого длина и выноса одинаковые
===================================
это что?

  Ответить  
 
 автор: pavluxa09   (23.06.2012 в 19:28)   письмо автору
 
   для: elenaki   (23.06.2012 в 19:03)
 

количество строк равно количеству столбцов

  Ответить  
 
 автор: elenaki   (24.06.2012 в 18:34)   письмо автору
 
   для: pavluxa09   (23.06.2012 в 19:28)
 

если б было "длина и высота", не было б вопроса. а на каком языке "длина и выноса"?
на белорусском?

  Ответить  
 
 автор: cheops   (24.06.2012 в 07:08)   письмо автору
 
   для: pavluxa09   (23.06.2012 в 18:42)
 

Обходите каждую крестик/нолик и проверяйте его окружение по горизонтали, вертикали и диагонали. Игровую матрицу можно рассматривать как координатную сетку, координаты диагональных, вертикальных и горизонтальных элементов легко вычислить.

  Ответить  
 
 автор: pavluxa09   (24.06.2012 в 10:48)   письмо автору
 
   для: cheops   (24.06.2012 в 07:08)
 

Это было бы удобно, если бы у меня количество подрядидущих элементов для выигрыша было фиксированное, а оно переменное

  Ответить  
 
 автор: cheops   (25.06.2012 в 07:43)   письмо автору
 
   для: pavluxa09   (24.06.2012 в 10:48)
 

На момент обхода вам же известно необходимое количество подряд идущих элементов? Просто оформите проверку в виде функции, которая принимает в качестве параметра это количество, тогда проверка будет сводится к предварительному вычислению количества элементов и к вызову проверочной функции с передачей параметра.

  Ответить  
 
 автор: pavluxa09   (25.06.2012 в 19:52)   письмо автору
 
   для: cheops   (25.06.2012 в 07:43)
 

У меня имеется двумерный массив, который состоит из 0 1 2, где 0 - пустая ячейка , 1 - крестик, 2 - нолик. Я уже сделал что бы оно проверяло вертиаль и горизонталь вот таким вот образом :

$aGame['board'] - двумерный массив пропущенный через json_encode
$sWinCombination = implode( ',', array_fill( 0, $aGame['boardLength'], $aGame['whoseAction'] ) );
        if( strpos( $aGame['board'], $sWinCombination ) !== false )
            $iWinner = $aGame['whoseAction'];
        else {
            $aGame['board'] = json_decode( $aGame['board'] );
            array_unshift( $aGame['board'], null );
            $aGame['board'] = call_user_func_array( "array_map", $aGame['board'] );
            $aGame['board'] = json_encode( $aGame['board'] );
            if( strpos( $aGame['board'], $sWinCombination ) !== false )
                $iWinner = $aGame['whoseAction'];
            # По диалоганали
            else if( strpos( $aGame['board'], '0' ) === false ) 
                $iWinner = 0;
        }


Не как не могу сообразить по диагоналям (
Может есть у кого-то готовый пример где поле не фиксиованное в размерах и тоже основано на двумерном массиве?

  Ответить  
 
 автор: pavluxa09   (29.06.2012 в 11:45)   письмо автору
 
   для: pavluxa09   (25.06.2012 в 19:52)
 

UP

  Ответить  
 
 автор: pavluxa09   (30.06.2012 в 00:49)   письмо автору
 
   для: pavluxa09   (29.06.2012 в 11:45)
 


function determineWinner( array & $aArray, $iDigitsCount ) {
    
    # Получение размера матрицы :
    $iSize = count( $aArray );
    
    # Проверка значений аргументов :
    if( $iSize < $iDigitsCount )
        return -2;
    for( $i = 0; $i < $iSize; $i++ )
        if( count( $aArray[0] ) != $iSize )
            return -3;
    
    $iResult = -1;
        
    /* Поиск победителя по горизонтали */
    $sArray = json_encode( $aArray );
    if( strpos( $sArray, implode( ',', array_fill( 0, $iDigitsCount, 1 ) ) ) !== false )
        $iResult = 1;
    else if( strpos( $sArray, implode( ',', array_fill( 0, $iDigitsCount, 2 ) ) ) !== false )
        $iResult = 2;
        
    /* Поиск победителя по вертикали */    
    if( $iResult == -1 ) {
        $aTmpArray = array();
        foreach( $aArray as $i => $js )
              foreach( $js as $j => $value )
                $aTmpArray[$j][$i] = $value;
        $sArray = json_encode( $aTmpArray );
        if( strpos( $sArray, implode( ',', array_fill( 0, $iDigitsCount, 1 ) ) ) !== false )
            $iResult = 1;
        else if( strpos( $sArray, implode( ',', array_fill( 0, $iDigitsCount, 2 ) ) ) !== false )
            $iResult = 2;
    }
    
    /* Поиск победителя по диагонали */
    if( $iResult == -1 ) {
        $aBasicDiagonals = array();
        for( $i = 0; $i < $iSize * 2 - 1; $i++ ) {
            $aBasicDiagonal = array();
            if( $i < $iSize )
                for( $j = 0; $j < $i + 1; $j++ )
                    $aBasicDiagonal[] = $aArray[$i - $j][$j];
            else
                for( $j = 0; $j < $iSize * 2 - $i - 1; $j++ ) 
                    $aBasicDiagonal[] = $aArray[$i - $j - ($i - $iSize + 1)][$i - $iSize + $j + 1];
            $aBasicDiagonals[] = $aBasicDiagonal;
        }
        $aBasicDiagonals = json_encode( $aBasicDiagonals );
        if( strpos( $aBasicDiagonals, implode( ',', array_fill( 0, $iDigitsCount, 1 ) ) ) !== false )
            $iResult = 1;
        else if( strpos( $aBasicDiagonals, implode( ',', array_fill( 0, $iDigitsCount, 2 ) ) ) !== false )
            $iResult = 2;
    }
    
    /* Поиск победителя по побочной диагонали */
    if( $iResult == -1 ) {
        for( $i = 0; $i < $iSize; $i++ )
            for( $j = 0; $j < $iSize; $j++ )
                  $aTmpArray[$iSize - $j - 1][$i] = $aArray[$i][$j];
        $aIncidentalDiagonals = array();
        for( $i = 0; $i < $iSize * 2 - 1; $i++ ) {
            $aIncidentalDiagonal = array();
            if( $i < $iSize )
                for( $j = 0; $j < $i + 1; $j++ )
                    $aIncidentalDiagonal[] = $aTmpArray[$i - $j][$j];
            else
                for( $j = 0; $j < $iSize * 2 - $i - 1; $j++ ) 
                    $aIncidentalDiagonal[] = $aTmpArray[$i - $j - ($i - $iSize + 1)][$i - $iSize + $j + 1];
            $aIncidentalDiagonals[] = $aIncidentalDiagonal;
        }
        $aIncidentalDiagonals = json_encode( $aIncidentalDiagonals );
        if( strpos( $aIncidentalDiagonals, implode( ',', array_fill( 0, $iDigitsCount, 1 ) ) ) !== false )
            $iResult = 1;
        else if( strpos( $aIncidentalDiagonals, implode( ',', array_fill( 0, $iDigitsCount, 2 ) ) ) !== false )
            $iResult = 2;
    }
    
    /* Может это ничья? */
    if( $iResult == -1 ) {
        $bHaveZeros = false;
        for( $i = 0; $i < $iSize; $i++ ) {
            for( $j = 0; $j < $iSize; $j++ ) {
                if( $aArray[$i][$j] == 0 ) {
                    $bHaveZeros = true;    
                    break;
                }
            }
        }
        if( $bHaveZeros == false )
            $iResult = 0;
    }
    
    return $iResult;

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования