Кто выиграл в крестики-нолики

категория: Python
Все знаю игру "Крестики-нолики", да и мало кто не играл, я думаю. Дается список строк с результатами игры, любыми:
[u"X.O",
u"XX.",
u"XOO"]
Нужно проверить кто победил "Х" или "О" или нет результата - "D". Довольно таки простая задача, но пришлось все-таки подумать)) и первое, что пришло на ум - это написать функцию на проверку строк, потом преобразовать столбцы и диагонали тоже в строки и также проверить. Код особо не комментировал - потому как писал, чтоб работало)) Интересно просто услышать еще варианты решений. Да и задача, я думаю, многим понравится.
def checkio(game_result):
#
    def count(rows):
        """
        Вычисление победителя в строках
        """
        win = "D"
        for row in rows:
            x = 0
            o = 0
            for el in row:
                if "X" == el:
                    x += 1
                    if x == 3:
                        win = "X"
                else:
                    x = 0
                if "O" == el:
                    o += 1
                    if o == 3:
                        win = "O"
                else:
                    o = 0
        return win
#
    def cols_in_rows(game_result):
        """
        Преобразование столбцов в строки
        """
        col = []
        col_row_str = ""
        cols = []
        for i in range(3):
            for row in game_result:
                row_list = list(row)
                col.append(row_list.pop(i))
#
            col_row = col[:3]
            del col[:3]
            for el in col_row:
                col_row_str += el
#
            cols.append(col_row_str)
            col_row_str = ""
#
        return cols
#
    def diags_in_rows(game_result):
        """
        Преобразование диагоналей в строки
        """
        diag_row = []
        diag_row1 = []
        for i in range(len(game_result)):
            diag = game_result[i][i]
            diag_row.append(diag)
            diag_str = "".join(diag_row)
        for i in range(len(game_result)):
            diag = game_result[i][2-i]
            diag_row1.append(diag)
            diag_str1 = "".join(diag_row1)
#
        return [diag_str, diag_str1]
#
    win = count(game_result)
    if win == "D":
        win = count(cols_in_rows(game_result))
        if win == "D":
            win = count(diags_in_rows(game_result))
#
    return win
#
if __name__ == '__main__':
    # Тесты
    assert checkio([
        u"X.O",
        u"XX.",
        u"XOO"]) == "X", "Xs wins"
    assert checkio([
        u"OO.",
        u"XOX",
        u"XOX"]) == "O", "Os wins"
    assert checkio([
        u"OOX",
        u"XXO",
        u"OXX"]) == "D", "Draw"
    assert checkio([
        u"O.X",
        u"XX.",
        u"XOO"]) == "X", "Xs wins again"


blog comments powered by Disqus