import tkinter class Model: def __init__(self, n): self.__n = n self.turn = 0 self.__field = [[0 for i in range(n)] for j in range(n)] def n(self): return self.__n def field(self): return self.__field # ideally: clone def process_click(self, x, y): if self.__field[x][y]: return self.__field[x][y] = self.turn + 1 self.turn ^= 1 class View: def __init__(self, model): self.model = model def draw(self, canvas): canvas.delete("all") n = self.model.n() field = self.model.field() z = 5 # yes, this is ugly, we understand for i in range(n): for j in range(n): cell_size = int(canvas["width"]) // n if field[i][j]: color = ("black", "white")[field[i][j] - 1] canvas.create_oval(cell_size * i + z, cell_size * j + z, cell_size * (i + 1) - z, cell_size * (j + 1) - z, fill=color) class Control: def __init__(self, n): self.model = Model(n) self.view = View(self.model) self.master = tkinter.Tk() self.master.title("MVC for 2017a") self.size = 400 self.master.geometry(str(self.size) + "x" + str(self.size)) self.canvas = tkinter.Canvas(self.master, width=self.size, height=self.size, bg="#7065ff") self.canvas.place(x=0, y=0) self.canvas.bind("", self.process_click) self.view.draw(self.canvas) def run(self): self.master.mainloop() def process_click(self, event): cell_size = int(self.canvas["width"]) // self.model.n() x = event.x // cell_size y = event.y // cell_size self.model.process_click(x, y) self.view.draw(self.canvas) control = Control(5) # ask user for n before this control.run()