2017-05-17 5 views
0

나는 tic-tac-toe의 자바 스크립트 게임을 만들고 위키피디아 문서에 설명 된 전략에 따라 현명한 움직임을 만들 정도로 현명하게 만들려고합니다. . IE는 2 개의 X 또는 2 개의 O가있는 행 또는 열이 있으면 빈 자리를 가져옵니다. 그래서, 키 값 쌍의 행 또는 열을 주어진 값이 될 수 말할 수 : OBJ { 키 1 : "X", 키 2 : "" KEY3 : "X", } 내가 가진정렬 유형 함수를 사용하여 효율적으로 객체의 특정 키/값을 업데이트하는 방법

한 동안이 작업을 수행하는 방법을 연구하고 있으며 일련의 루프가 아닌 다른 방법이 있다면 궁금합니다. 첫 번째 시도는 빈 값을 분리 할 수 ​​있도록 항목을 사전 순으로 정렬하려고 시도했습니다. var = "" "X" "X"

이 경우 첫 번째 항목을 쉽게 호출하고 업데이트 할 수 있지만 나는 그것을 원래의 위치로 되돌릴 수 없다. 그러나 많은 낭비적인 코드를 생성하지 않는 방법으로이를 수행하는 방법을 알아낼 수 없습니다. 아마도 여러 개의 루프로 분리하는 것이 더 좋을까요? 하나는 빈 자리가있는 행과 열을 분리하는 것 (8 개가 있습니다)입니까?

또 다른 아이디어는 그리드의 각 값에 1의 값을 부여한 다음 그리드를 살펴보고 행이 3과 동일한 지 확인합니다 (이들을 조인하고 .eval() 메서드를 사용하는 var 생성) , 각 항목을 1과 동일하게 만들고 공백 자리를 1로 업데이트하고 이미 다른 두 지점을 업데이트하십시오.

가능한 한 구체적으로 표시하려고했지만이 특정 문제를 설명하는 데별로 좋지 않습니다. 나는 인정한다. 다음 https://jsfiddle.net/1hup5195/

는 참조 용으로 내 스크립트의 일부입니다 : 여기

내가 만든 JS 바이올린입니다

$(document).ready(function(){  
var playerTurn = true; 
var buttonStatus = "allowclick"; // Change to inactive once game starts 
var player = ""; 
var machine = ""; 
var test = ""; 
var emptyObj = {1: "", 2: "", 3: "", 
       4: "", 5: "", 6: "", 
       7: "", 8: "", 9: ""}; 
var gridObj = {1: "", 2: "", 3: "", 
       4: "", 5: "", 6: "", 
       7: "", 8: "", 9: ""}; 
var winningObj = [[1,2,3], [4,5,6], [7,8,9], [1,4,7], [2,5,8], [3,6,9], [1,5,9], [3,5,7]]; 




// Check if player is holding a corner 
function machineFunction() { 
    // Loop through winningObj and check if there are rows/columns with 2/3 taken 
    // for(i = 0; i < winningObj.length; i++) { 
     var i = 3; 
     var alpha = winningObj[i][0]; 
     var bravo = winningObj[i][1]; 
     var charlie = winningObj[i][2]; 
     console.log(alpha); 
     console.log(bravo); 
     console.log(charlie); 
     // After defining alpha/bravo/charlie, fire the fxn 
     testFxn(alpha, bravo, charlie); 
     // This is my function to sort the 3 different spots within the grid 
     function testFxn(a,b,c) { 
      // Test would be equal to ["", "X", "X"] or something similar 
      var test = [gridObj[a], gridObj[b], gridObj[c]].sort(); 
      console.log(test); 
      console.log(gridObj); 
      // If 2/3 spots taken by either X or O, take this spot 
      if (test[0] === "" && test[1] === "X" && test[2] === "X") { 
       console.log("#" + alpha + "") 
       $('#' + alpha + '').html(machine); 
       gridObj[alpha] = machine; 
       console.log(gridObj); 
       $(this).html(machine); // Sends player over to html 
       gridObj[this.id] = machine; // Update gridObj object 
       playerTurn = true; 
      } 
      if (test[0] === "" && test[1] === "O" && test[2] === "O") { 
       // How do I get the ID I need?? 
       $('#' + test[0] + '').html(machine); 
       playerTurn = true; 
      } 
     }; 
+0

이것은 피들 (Fiddle)의 링크입니다. 이전 작품이 생각지도 않습니다. (https://jsfiddle.net/1hup5195/#&togetherjs=i67M4LaRnw) –

답변

0

당신은이 같은 STH (... 반복하는 일부 사용) 할 수 있습니다 :

var rows = [[1,2,3], [4,5,6], [7,8,9], [1,4,7], [2,5,8], [3,6,9], [1,5,9], [3,5,7]]; 
var gridObj = {1: "", 2: "", 3: "", 
      4: "", 5: "", 6: "", 
      7: "", 8: "", 9: ""}; 

rows.some(function(row){//iterate over all rows 
    var values=row.map(key=>gridObj[key]);//get the rows values 
    if(values.filter(el=>el==="X").length===2){//check if there are two Xses 
     gridObj[rows[values.indexOf("")]]="O";//get the field id and add O to the blank field 
     return true;//stop iterating the rows 
    } 
}); 

http://jsbin.com/miriwuhuce/edit?console

0

나는 논평하고 싶다. 그러나 나는 그럴 수 없다. 그래서 여기 내 대답은 대답입니다 ...

각 "개체"의 개체를 만들면 다른 배열에서 참조 할 수 있습니다. 그래서 당신은 array.copy를 할 수 있고, 그것을 정렬 한 다음 그 객체의 값을 변경할 수 있습니다.

동일한 객체를 보유하는 다른 배열에서도 값을 설정합니다.

행운을 빈다.

0

자바 스크립트는 map이라는 훌륭한 기능을 가지고 있으며 배열에서 사용할 수 있습니다. Here is documentation.

맵에서 수행 할 수있는 콜백은 배열의 각 요소에 대해 정의 된 기능을 수행하고 (가능성있는 상태를 현재 상태와 비교하여 확인), 변경되거나 변경되지 않은 값으로 새 배열을 반환하는 콜백을 제공합니다.예를 들어, 당신은 당신이 지금과 같은 상태를 승리의 배열을 가지고 있고, 나는이 정말 더 나은 효율성의 관점에서 귀하의 질문에 대답하지 않습니다 알고

var winner = winningObj.map((item) => { //()=>{} is ES6 syntax. Same as function(){} 
    var token = {} 
    if currentState[item[0]] != empty 
     token.1st = X 

    if currentState[item[1]] != empty 
     token.2nd = X 
    if currentState[item[2]] != empty 
     token.3rd = X 

    if all tokens are X 
     return X  // winner! 
    else if all tokens are O 
     return O  // check the other winning conditions, or keep playing 
    else 
     return false 
); 

if winner.containsValue(X) 
    X wins 
else if winner.containsValue(O) 
    O wins 
else 
    keep playing 

을하지만,이 방법은 당신이 작성하는 것을 방지 할 수 있습니다 루프를 풀고 map()이 모든 작업을 처리하도록하십시오.

관련 문제