import pytest class Line: def __init__(self, a_grouping): self.line = a_grouping def all_same_value(self): for x in range(0, len(self.line) - 1): if self.line[x] != self.line[x + 1]: return False return True def get_winner(self): return self.line[0] def get_value_at_index(self, index): return self.line[index] class Row(Line): def __repr__(self): return ''.format(self.line) class Column(Line): def __repr__(self): return ''.format(self.line) class Diagonal(Line): def __repr__(self): return ''.format(self.line) class Game: def __init__(self, board): self.board = board self.rows = [Row(row) for row in board] self.columns = [] self.make_columns() self.diagonals = [] self.make_diagonals() def state(self): for row in self.rows: if row.all_same_value(): return '{} wins'.format(row.get_winner()) return self.column_state() def column_state(self): for column in self.columns: if column.all_same_value(): return '{} wins'.format(column.get_winner()) return self.diagonal_state() def diagonal_state(self): for diagonal in self.diagonals: if diagonal.all_same_value(): return '{} wins'.format(diagonal.get_winner()) return 'draw' def make_columns(self): """ create Lines from a board's columns :return: """ row_length = len(self.rows) for x in range(0, row_length): column = [row.get_value_at_index(x) for row in self.rows] self.columns.append(Column(column)) def make_diagonals(self): """ Create a Line object from a board's diagonal values :return: """ diagonal = [] for x in range(0, len(self.rows)): diagonal.append(self.rows[x].get_value_at_index(x)) self.diagonals.append(Diagonal(diagonal)) diagonal = [] for x in range(len(self.rows) - 1, -1, -1): diagonal.append(self.rows[x].get_value_at_index(x)) self.diagonals.append(Diagonal(diagonal))