2017-01-25 1 views
2

나는 오름차순으로 정렬 한 연관 배열을 가지고 있습니다. 이제이 값에 대한 결정을 내리고 싶습니다. 어떻게 진행해야하는지 이해할 수 없습니다.배열의 값을 기반으로 의사 결정을 내립니다.

가정하자 :

제가 무엇을 달성하고자하는 설명하게을 나는 다음과 같은 원시 배열 한 : 이제

Array 
(
    [0] => Array 
     (
      [cell] => a1 
      [sign] => ◯ 
     ) 
    [1] => Array 
     (
      [cell] => b2 
      [sign] => ✘ 
     ) 
) 

: 그때로

Array 
(
    [0] => Array 
     (
      [cell] => b2 
      [sign] => ✘ 
     )  
    [1] => Array 
     (
      [cell] => a1 
      [sign] => ◯ 
     ) 
) 

을 분류하는 나는 세포의 가치가 a1 = b1 = c1인지 또는 a1 = b2 = c3인지 여부와 같은 결정을 내리고 싶습니다. 어떻게해야합니까?

+0

"나는 같은 셀 A1에 = 지하 1 층 =의 C1 또는의 값 여부 등의 결정을 만들고 싶어 a1 = b2 = c3 등. " 나는 당신이 조금은 정교 할 수 있다는 것을 정확히 알지 못한다. –

+0

정교하게, 그것의 tic tac toe 게임. 그래서 나는 입력 된 값에 따라 결정을 내리고 싶습니다. 입력 된 값은 해당 배열에 있습니다. – Ayan

+0

좀 더 정교하게하기 위해 사용자가 왼쪽에서부터 대각선 인 a1, b2 및 c3 셀을 클릭 한 다음 해당 셀이 승자를 선언하기 위해 동일한 값을 갖고 있는지 확인해야한다고 가정합니다. – Ayan

답변

1

다음은 Javascript에서 좀 더 일반화 된 구현입니다.단지 다른 게임 크기에 대한 디버깅을해야 할 수도 있습니다, 2 × 2와 3 × 3 게임 상태에서 테스트 :

// xxx 
 
// oo- 
 
// o-- 
 
alert("game a: " + WhoIsWinningGeneratePaths('xxxoo-o--')); 
 

 

 
// x-x 
 
// oo- 
 
// o-- 
 
alert("game b: " + WhoIsWinningGeneratePaths('x-xoo-o--')); 
 

 
// x-x 
 
// ooo 
 
// --- 
 
alert("game c: " + WhoIsWinningGeneratePaths('x-xooo---')); 
 

 
// x- 
 
// oo 
 
alert("game d: " + WhoIsWinningGeneratePaths('x-oo')); 
 

 
// x- 
 
// ox 
 
alert("game e: " + WhoIsWinningGeneratePaths('x-ox')); 
 

 

 
// x- 
 
// o- 
 
alert("game f: " + WhoIsWinningGeneratePaths('x-o-')); 
 

 

 
function WhoIsWinningGeneratePaths(state) { 
 

 
    var n = Math.sqrt(state.length); 
 

 
    var rows = IsWin(state, GenPaths(n, 0,  1, n, n)); 
 
    var cols = IsWin(state, GenPaths(n, 0,  n, 1, n)); 
 
    var diUp = IsWin(state, GenPaths(1, n-1, n-1, 0, n)); 
 
    var diDn = IsWin(state, GenPaths(1, 0, n+1, 0, n)); 
 

 
    if (rows !== '-') return rows; 
 
    if (cols !== '-') return cols; 
 
    if (diUp !== '-') return diUp; 
 
    return diDn; 
 

 
} 
 

 
function GenPaths(count, start, incrementA, incrementB, lengthToWin) { 
 
    var paths = []; 
 
    for (var i = 0; i < count; i++) { 
 
    var path = []; 
 
    for (var j = 0; j < lengthToWin; j++) { 
 
     path.push(start + i * incrementB + j * incrementA) 
 
    } 
 
    paths.push(path); 
 
    } 
 
    return paths; 
 
} 
 

 

 
function IsWin(state, paths) { 
 
    for (var i = 0; i < paths.length; i++) { 
 
    var currentPathResult = IsPathWin(state, paths[i]); 
 
    if (currentPathResult != '-') 
 
     return currentPathResult; 
 
    } 
 
    return '-'; 
 
} 
 

 
function IsPathWin(state, path) { 
 
    var first = state[path[0]]; 
 
    for (var j = 1; j < path.length; j++) 
 
    { 
 
    var compareToFirst = state[path[j]]; 
 
    if (compareToFirst !== first) 
 
     return '-'; 
 
    } 
 
    return first; 
 
}

+0

격자 4 * 4, 5 * 5 등 4 개를 한 줄에 3 개의 기호를 확인하는 것과 같은 몇 가지 변경 사항을 고려하여이 코드를 개선해야 할 필요가 있으므로이 코드를 설명해 주실 수 있습니까? – Ayan

1

스퀘어는 3 × 3 것으로 추측, 나는 가장 간단한 방법은 배열 내부의 우승 일치를 저장하고 두 배열을 결합하고 배열에서 중복 된 값을 반환하는 array_intersect()를 사용하여 그들을 비교하는 것입니다 말할 것 . 중복 횟수를 얻으려면 count() 함수를 랩핑하고 플레이어의 1 또는 2의 값이 $winArr과 일치하는지 비교하면됩니다. 분명히 입력 배열에 대해 중복 값을 중지하여 수행 할 작업이 여전히 있습니다. 각 입력 후에 foreach()을 반복하되 적어도 논리는 정확할 것입니다.

$winner; //Winner --> Used when game finished 

$winArr = [ 

    ['c1','c2','c3'], 
    ['b1','b2','b3'], // --> Vertical Win 
    ['a1','a2','a3'], 

    ['a1','b2','c3'], 
    ['c1','b2','c3'], // --> Diagonal Win 

    ['a1','b1','c1'], 
    ['a2','b2','c2'], // --> Horizontal Win 
    ['a3','b3','c3'], 

]; 

$gameArr = [ // --> `Input Values Array = Dimension for P1 & P2 for ease 

'playerOne' => ['a1', 'b1', 'c2', 'c1'], 
'playerTwo' => ['a3', 'b3', 'a2'],  

]; 



foreach ($winArr as $k=>$v) { 

    if (count(array_intersect($v, $gameArr['playerOne'])) === 3) { 

     $winner = 'Player One!';  
     break; 

    } elseif(count(array_intersect($v, $gameArr['playerTwo'])) === 3) { 

     $winner = 'Player Two!'; 
     break; 

    } 

} 

if (isset($winner)) { 

    echo $winner; 

} 

출력 :

Player One! 

참조 :http://www.php.net/manual/en/function.array-intersect.php

+0

즉, $ gameArr 구조로 현재 배열 구조를 변경해야한다는 의미입니까? 내가 가진 구조로 할 수는 없지. – Ayan

1

내가 0부터 시작하는 인덱스에 의해 세포의 위치를 ​​참조하는 것이 좋습니다. 행 또는 열을 선택하기 위해 모듈로 또는 정수 나누기와 같은 수학 트릭을 사용하기가 쉽습니다. 그렇지 않으면 off-by-one 오류를 피하기 위해 많은 오프셋을 사용해야합니다. 빈을 의미하고, x와 O를 의미하는 X와 O가 연주 - ''

0 1 2 
3 4 5 
6 7 8 

게임 상태를 문자로, 문자 배열로 표현 될 수있다 :

IE는 보드가 표시 될 수 있습니다.

여기에 인간 게임이다, 게임은 문자열 배열에 저장 :

x 
o x o 
o x 

var state = "-x-oxoox-"; 

는 게임을 승리 한 경우, 함수를 만들 수 있습니다 확인하려면.

이 함수는 아무도 얻지 못하면 '-'를, x가 얻은 경우 'x'를 반환하고, o가 얻은 경우 'o'를 반환합니다.

나는 점검 할 모든 경로를 하드 코딩하는 구현으로 시작하겠습니다. 그런 다음 확인할 경로를 생성하는 방법을 보여줍니다.

function WhoIsWinningHardCode(state) { 

    var rows  = IsWin(state, [[0,1,2],[3,4,5],[6,7,8]]); 
    var cols  = IsWin(state, [[0,3,6],[1,4,7],[2,5,8]]); 
    var diagUp = IsWin(state, [[6,4,2]]); 
    var diagDown = IsWin(state, [[0,4,8]]); 

    if (rows  !== '-') return rows; 
    if (cols  !== '-') return cols; 
    if (diagUp !== '-') return diagUp; 
    return diagDown; 

} 

function WhoIsWinningGeneratePaths(state) { 

    var rows  = IsWin(state, GenPaths(3, 0, 1, 3)); 
    var cols  = IsWin(state, GenPaths(3, 0, 3, 1)); 
    var diagUp = IsWin(state, GenPaths(1, 2, 2, 0)); 
    var diagDown = IsWin(state, GenPaths(1, 0, 4, 0)); 

    if (rows  !== '-') return rows; 
    if (cols  !== '-') return cols; 
    if (diagUp !== '-') return diagUp; 
    return diagDown; 

} 

function GenPaths(count, start, incrementA, incrementB) { 
    var paths = []; 
    for (var i = 0; i < count; i++) { 
     var path = []; 
     for (var j = 0; j < 3; j++) { 
     path.push(start + i*incrementB + j*incrementA) 
     } 
     paths.push(path); 
    } 
    return paths; 
} 

function IsWin(state, paths) { 
    for (var i = 0; i < paths.length; i++) { 
    var path = paths[i]; 
    var a = state[path[0]]; 
    var b = state[path[1]]; 
    var c = state[path[2]]; 
    if (a !== '-') 
     if (a == b) 
     if (a == c) 
      return a; 
    } 

    return '-'; 
} 
+0

'genPaths'는 3X3 이상의 격자에서도 작동해야합니다. 권리? – Ayan

+1

거의 - GenPaths의 하드 코드 된 숫자 '3'은 매개 변수로 전달되는 변수에 넣어야합니다. 그 세 가지는 기본적으로 "3 x 3 게임의 승리의 길은 3"입니다. 예를 들어, 6x6 게임에서 우승 경로는 6 번 길어야합니다. – William

+0

테스트를 받으셨습니까? 코드를 사용하기 위해 많은 것들을 재구성해야하므로 진행하기 전에 묻습니다. – Ayan

관련 문제