Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import tkinter as tk
- class Checkers:
- def __init__(self, master):
- self.master = master
- self.master.title("Checkers")
- self.canvas = tk.Canvas(self.master, width=600, height=600)
- self.canvas.pack()
- self.board = self.create_board()
- self.selected_piece = None
- self.draw_board()
- self.canvas.bind("<Button-1>", self.on_square_click)
- self.current_player = 1
- def create_board(self):
- board = []
- for row in range(8):
- board.append([0] * 8)
- for col in range(8):
- if (row + col) % 2 == 0:
- if row < 3:
- board[row][col] = 1
- elif row > 4:
- board[row][col] = 2
- return board
- def draw_board(self):
- for row in range(8):
- for col in range(8):
- if (row + col) % 2 == 0:
- color = "#B58863"
- else:
- color = "#F0D9B5"
- self.canvas.create_rectangle(col * 75, row * 75, (col + 1) * 75, (row + 1) * 75, fill=color)
- if self.board[row][col] == 1:
- self.canvas.create_oval(col * 75 + 10, row * 75 + 10, (col + 1) * 75 - 10, (row + 1) * 75 - 10,
- fill="#C44F53")
- elif self.board[row][col] == 2:
- self.canvas.create_oval(col * 75 + 10, row * 75 + 10, (col + 1) * 75 - 10, (row + 1) * 75 - 10,
- fill="#F7DC6F")
- elif self.board[row][col] == 3:
- self.canvas.create_oval(col * 75 + 10, row * 75 + 10, (col + 1) * 75 - 10, (row + 1) * 75 - 10,
- fill="#FFD700")
- elif self.board[row][col] == 4:
- self.canvas.create_oval(col * 75 + 10, row * 75 + 10, (col + 1) * 75 - 10, (row + 1) * 75 - 10,
- fill="#B8860B")
- def on_square_click(self, event):
- row = event.y // 75
- col = event.x // 75
- if self.selected_piece:
- if self.is_valid_move(self.selected_piece, row, col):
- self.move_piece(self.selected_piece, row, col)
- self.selected_piece = None
- self.draw_board()
- self.current_player = 3 - self.current_player
- else:
- self.selected_piece = None
- self.draw_board()
- elif self.board[row][col] != 0 and self.board[row][col] % 2 == self.current_player % 2:
- self.selected_piece = (row, col)
- self.draw_board()
- self.highlight_moves(row, col)
- def is_valid_move(self, start_pos, end_row, end_col):
- start_row, start_col = start_pos
- if self.board[end_row][end_col] != 0:
- return False
- piece = self.board[start_row][start_col]
- if piece == 1:
- if end_row < start_row:
- return False
- if abs(end_row - start_row) == 1 and abs(end_col - start_col) == 1:
- return True
- if abs(end_row - start_row) == 2 and abs(end_col - start_col) == 2:
- mid_row = (start_row + end_row) // 2
- mid_col = (start_col + end_col) // 2
- if self.board[mid_row][mid_col] == 2 or self.board[mid_row][mid_col] == 4:
- self.board[mid_row][mid_col] = 0
- return True
- if abs(end_row - start_row) == 2 and abs(end_col - start_col) == 0:
- mid_row = (start_row + end_row) // 2
- mid_col = start_col
- if self.board[mid_row][mid_col] == 2 or self.board[mid_row][mid_col] == 4:
- self.board[mid_row][mid_col] = 0
- return True
- if start_row == 6 and end_row == 7 and abs(end_col - start_col) == 1:
- self.board[end_row][end_col] = 3
- return True
- elif piece == 2:
- if end_row > start_row:
- return False
- if abs(end_row - start_row) == 1 and abs(end_col - start_col) == 1:
- return True
- if abs(end_row - start_row) == 2 and abs(end_col - start_col) == 2:
- mid_row = (start_row + end_row) // 2
- mid_col = (start_col + end_col) // 2
- if self.board[mid_row][mid_col] == 1 or self.board[mid_row][mid_col] == 3:
- self.board[mid_row][mid_col] = 0
- return True
- if abs(end_row - start_row) == 2 and abs(end_col - start_col) == 0:
- mid_row = (start_row + end_row) // 2
- mid_col = start_col
- if self.board[mid_row][mid_col] == 1 or self.board[mid_row][mid_col] == 3:
- self.board[mid_row][mid_col] = 0
- return True
- if start_row == 1 and end_row == 0 and abs(end_col - start_col) == 1:
- self.board[end_row][end_col] = 4
- return True
- elif piece == 3 or piece == 4:
- if abs(end_row - start_row) == 1 and abs(end_col - start_col) == 1:
- return True
- if abs(end_row - start_row) == 2 and abs(end_col - start_col) == 2:
- mid_row = (start_row + end_row) // 2
- mid_col = (start_col + end_col) // 2
- if self.board[mid_row][mid_col] == 1 or self.board[mid_row][mid_col] == 3:
- self.board[mid_row][mid_col] = 0
- return True
- elif self.board[mid_row][mid_col] == 2 or self.board[mid_row][mid_col] == 4:
- self.board[mid_row][mid_col] = 0
- if piece == 3:
- self.board[end_row][end_col] = 3
- else:
- self.board[end_row][end_col] = 4
- return True
- return False
- def move_piece(self, start_pos, end_row, end_col):
- start_row, start_col = start_pos
- piece = self.board[start_row][start_col]
- self.board[end_row][end_col] = piece
- self.board[start_row][start_col] = 0
- if end_row == 0 and piece == 2:
- self.board[end_row][end_col] = 4
- elif end_row == 7 and piece == 1:
- self.board[end_row][end_col] = 3
- def highlight_moves(self, row, col):
- if self.board[row][col] == 1:
- if row < 7 and col > 0 and self.board[row + 1][col - 1] == 0:
- self.canvas.create_rectangle((col - 1) * 75, (row + 1) * 75, col * 75, (row + 2) * 75, fill="green")
- if row < 7 and col < 7 and self.board[row + 1][col + 1] == 0:
- self.canvas.create_rectangle((col + 1) * 75, (row + 1) * 75, (col + 2) * 75, (row + 2) * 75,
- fill="green")
- if row < 6 and col > 1 and (self.board[row + 1][col - 1] == 2 or self.board[row + 1][col - 1] == 4) and \
- self.board[row + 2][col - 2] == 0:
- self.canvas.create_rectangle((col - 2) * 75, (row + 2) * 75, (col - 1) * 75, (row + 3) * 75,
- fill="green")
- if row < 6 and col < 6 and (self.board[row + 1][col + 1] == 2 or self.board[row + 1][col + 1] == 4) and \
- self.board[row + 2][col + 2] == 0:
- self.canvas.create_rectangle((col + 2) * 75, (row + 2) * 75, (col + 3) * 75, (row + 3) * 75,
- fill="green")
- elif self.board[row][col] == 2:
- if row > 0 and col > 0 and self.board[row - 1][col - 1] == 0:
- self.canvas.create_rectangle((col - 1) * 75, (row - 1) * 75, col * 75, row * 75, fill="green")
- if row > 0 and col < 7 and self.board[row - 1][col + 1] == 0:
- self.canvas.create_rectangle((col + 1) * 75, (row - 1) * 75, (col + 2) * 75, row * 75, fill="green")
- if row > 1 and col > 1 and (self.board[row - 1][col - 1] == 1 or self.board[row - 1][col - 1] == 3) and \
- self.board[row - 2][col - 2] == 0:
- self.canvas.create_rectangle((col - 2) * 75, (row - 2) * 75, (col - 1) * 75, (row - 1) * 75,
- fill="green")
- if row > 1 and col < 6 and (self.board[row - 1][col + 1] == 1 or self.board[row - 1][col + 1] == 3) and \
- self.board[row - 2][col + 2] == 0:
- self.canvas.create_rectangle((col + 2) * 75, (row - 2) * 75, (col + 3) * 75, (row - 1) * 75,
- fill="green")
- elif self.board[row][col] == 3 or self.board[row][col] == 4:
- piece = self.board[row][col]
- directions = [(-1, -1), (-1, 1), (1, -1), (1, 1)]
- for d in directions:
- for i in range(1, 8):
- r = row + i * d[0]
- c = col + i * d[1]
- if r < 0 or r > 7 or c < 0 or c > 7:
- break
- elif self.board[r][c] == 0:
- self.canvas.create_rectangle(c * 75, r * 75, (c + 1) * 75, (r + 1) * 75, fill="green")
- elif (self.board[r][c] == 1 or self.board[r][c] == 3) and piece == 4:
- self.canvas.create_rectangle(c * 75, r * 75, (c + 1) * 75, (r + 1) * 75, fill="green")
- break
- elif (self.board[r][c] == 2 or self.board[r][c] == 4) and piece == 3:
- self.canvas.create_rectangle(c * 75, r * 75, (c + 1) * 75, (r + 1) * 75, fill="green")
- break
- else:
- break
- root = tk.Tk()
- game = Checkers(root)
- root.mainloop()
Advertisement