2017-09-16 1 views
0

주제 제목이 충분히 구체적이지만 여기에 대해서는 확실하지 않습니다. 두 가지 방법이 있습니다. 하나는 블록의 조건부와 함께 일부 배열을 반복하여 올바른 데이터를 푸시하는 것입니다. 여기 내 메서드에서 결과 값을 세 번째 메서드로 반환하는 방법

다른 방법은, 내 선택 휴리스틱에 따라 그 점수를 계산 하나 그 코드

def iterate_lines 
    WIN_COMBINATIONS.each_with_index do |line,index| 
    lines = @board[line[0]] + @board[line[1]] + @board[line[2]] 
     if lines.include?("X") && !lines.include?("O") 
     scores = tally_scores(lines.count("X"),"X",index) 
      elsif lines.include?("O") && !lines.include?("X") 
     scores = tally_scores(lines.count("O"),"O",index) 
      elsif lines.include?("X") && lines.include?("O") 
     scores = tally_scores(0,"",index) 
      elsif !lines.include?("X") && !lines.include?("O") 
     scores = tally_scores(0,"",index) 
     end 
     p scores 
    end 
end 

이다. 나 그냥을 할 수있는 iterate_lines '의 호출에'점수 '나는 변수로 설정하여, 여기에 표시된 것처럼, 또는'을 'iterate_lines 나도으로부터 올바른 값을 인쇄 할 수 있습니다'tally_scores를 호출

def tally_scores(score,player,index) 
    score = 1 if score == 1 && player == "X" 
    score = -1 if score == 1 && player == "O" 
    score = 10 if score == 2 && player == "X" 
    score = -10 if score == 2 && player == "O" 
    score = 100 if score == 3 && player == "X" 
    score = -100 if score == 3 && player == "O" 
    score 
end 

'iterate_lines'에서 인쇄하십시오.

당연히 'iterate_lines'의 반환 값은 배열 (WIN_COMBINATIONS)입니다. return scores을 하드 코딩하면 분명히 마지막 값을 알 수 있습니다.

제 문제는 제가 'tally_scores'에서 나오는 것을 얻는 데 필요한 제 3의 방법이 있지만 아직 정규 인수 (별칭 my_method(scores))로 전달할 수 없습니다. 그 이유는 세 번째 방법은 다른 이유 때문에 전달 된 인수 목록을 소유하고 있기 때문입니다. 메소드가 호출 될 때까지는 플러스가됩니다.

def get_scores 
    # other code 
    #: something like this: 
    score = iterate_lines 
    # or 
    score = tally_scores 
    # or 
    # ? 
end 

그래서 나는 내가 모퉁이에 몸을 기울이고 내가 가지고있는 것을 휴지통으로 돌려 보내야한다고 생각합니다. 나는 'tally_scores'를 가져 와서 점수를 인스턴스 변수 배열에 넣으려고했다. 나는 그것을 지나칠 때 마지막 값을 제외하고는 모두 발견했습니다.

+0

결코 당신이 뭔가를 할 때 명시 적으로'return'를 사용하는 상처 :

def iterate_lines WIN_COMBINATIONS.map.with_index do |line, index| # set score according to your conditional logic score # or alternatively, "next score" end end 

그것은 예를 들어, 다른 곳으로 인쇄 논리를 추출하는 것이 좋습니다 이렇게. –

+0

확실히, 나는 명백한 반환을 시도했다 그러나 어디에서든지 얻지 않는다. 나는 그것이 나를 위해하는 모든 것이 하나의 가치를 얻음을 의미한다. – stuartambient

+0

tic-tac-toe입니까? 그렇다면 일부 코드가 빠져 있기 때문에 (WIN_COMBINATIONS 및 @ board) 코드 일부가 빠져 있기 때문에 일부 작업을 이해할 수 없습니다. 몇 가지 관찰 : 1) 블록 변수'index'는 사용되지 않습니다; 1, [1, "O"] => - 1, [2, "X"] => 10을 사용할 수있는 'talley_scores' [2, "O"] => - 10, [3, "X"] => 100, [3, "X"] => - 100}'; 3)''X ''와''O "'를 행, 열 및 대각선으로 계산하여 시작하는 것이 가장 좋을 것입니다. 4) ttt 인 경우 점수를 계산하는 것이 이상한 방법으로 보입니다. –

답변

1

여기에는 몇 가지 문제가 있습니다. 무엇보다도 먼저, 여러분이 사용했을 때 보았 듯이 each_with_index은 부작용을 사용하지 않는다면 그 블록에서 일어나는 일은 아무런 영향을 미치지 않습니다. 블록에 변수를 설정하면 각 반복이 재설정됩니다.

결과를 반복으로 생성 된 결과의 배열이되도록 map.with_index으로 변경할 수 있습니다.

는 또한 tally_scores는 하나의 점수를 반환하기 때문에, 여기 그것과 비슷한 라인에 score을해야 scores처럼 보인다 : 당신이 map.with_index를 사용하는 경우

scores = tally_scores(lines.count("X"),"X",index) 

을 다음 블록의 반환 값은해야한다 score, 그런 식으로 점수가 배열됩니다. 그러나 블록의 return score을 사용할 수 없으므로 부모 블록의 메소드에서 반환되며 블록의 반복은 반환되지 않습니다. 대신 next score을 사용하거나 간단히 score을 마지막 행으로 사용할 수 있습니다.

이러한 변경을 수행하면 scores = iterate_lines이라고 할 수 있습니다.

그것은 다음과 같이 보일 것입니다 :

scores = iterate_lines 
scores.each { |score| p score } 
+0

위대한 작품! 나는지도가 유용 할 것 같은 느낌을 가졌지 만'map.with_index'가 가능한 것이 무엇인지 몰랐습니다. – stuartambient

관련 문제