Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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("<Button-1>", 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()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement