2016-10-12 2 views
0

Я работаю над командной игрой Tictactoe, написанной на Ruby. (Для тех, кто не помнит правил, пожалуйста, see here)Tictactoe оценка чека через хэш

Почти все примеры реализации, которые я видел, используют многомерный массив для представления структуры Board. Это как [[1,2,3], [4,5,6], [7,8,9]]. (Here is an example)

Однако, прежде чем увидеть какие-либо другие решения, я начал с реализации хэша. Я представляю столбцы с буквами (A, B, C) и строки с числами (1,2,3), и я устанавливаю «X» или «O» в качестве значения. Пример реализация во время игры:

{:a1=>"X", :b2=>"X", :c3=>"X", :b1=>"O", :c1=>"X", :c2=>"O", :b3=>"X", :a2=>"O", :a3=>"X"} 

(... В каждом движении, добавить новую позицию в этот хэш Это своего рода сетку клетки Легко визуализировать внутри таблицы ASCII)

Все было здорово пока я не стал искать способ определения выигрышных позиций. Но теперь я застрял в поиске хорошего способа использовать свой хеш, чтобы определить, является ли это позицией победителя.

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

Вот плохо выглядящий способ проверки, если это позиция победителя или нет (для одного сценария ..):

def check_status 
    if(@@cells[:a1] == "X" && @@cells[:a2] == "X" && @@cells[:a3] == "X") 
     false # game will end 
    else 
     true # game will continue 
    end 
    end 

ответ

0

Учитывая этот хэш:

board = { 
    :a1=>"X", :a2=>"O", :a3=>"X", 
    :b1=>"O", :b2=>"X", :b3=>"X", 
    :c1=>"X", :c2=>"O", :c3=>"X" 
} 

Вы можете определить проверяемые ключи: (возможные выигрышные позиции)

KEYS = [ 
    [:a1, :a2, :a3], [:b1, :b2, :b3], [:c1, :c2, :c3], # rows 
    [:a1, :b1, :c1], [:a2, :b2, :c2], [:a3, :b3, :c3], # columns 
    [:a1, :b2, :c3], [:c1, :b2, :a3]     # diagonals 
] 

Теперь вы можете получить значения для каждого из этих ключей через values_at и проверьте, являются ли они либо "X", "X", "X", либо "O", "O", "O":

wins = {} 

KEYS.each do |k| 
    case board.values_at(*k) 
    when %w[X X X] then wins[k] = 'X' 
    when %w[O O O] then wins[k] = 'O' 
    end 
end 

wins #=> {[:a3, :b3, :c3]=>"X", [:a1, :b2, :c3]=>"X", [:c1, :b2, :a3]=>"X"} 
Смежные вопросы