Vla_DOS

Untitled

Mar 4th, 2023
687
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.75 KB | None | 0 0
  1.  
  2. import tkinter as tk
  3.  
  4.  
  5. class Checkers:
  6.     def __init__(self, master):
  7.         self.master = master
  8.         self.master.title("Checkers")
  9.         self.canvas = tk.Canvas(self.master, width=600, height=600)
  10.         self.canvas.pack()
  11.         self.board = self.create_board()
  12.         self.selected_piece = None
  13.         self.draw_board()
  14.         self.canvas.bind("<Button-1>", self.on_square_click)
  15.         self.current_player = 1
  16.  
  17.     def create_board(self):
  18.         board = []
  19.         for row in range(8):
  20.             board.append([0] * 8)
  21.             for col in range(8):
  22.                 if (row + col) % 2 == 0:
  23.                     if row < 3:
  24.                         board[row][col] = 1
  25.                     elif row > 4:
  26.                         board[row][col] = 2
  27.         return board
  28.  
  29.     def draw_board(self):
  30.         for row in range(8):
  31.             for col in range(8):
  32.                 if (row + col) % 2 == 0:
  33.                     color = "#B58863"
  34.                 else:
  35.                     color = "#F0D9B5"
  36.                 self.canvas.create_rectangle(col * 75, row * 75, (col + 1) * 75, (row + 1) * 75, fill=color)
  37.                 if self.board[row][col] == 1:
  38.                     self.canvas.create_oval(col * 75 + 10, row * 75 + 10, (col + 1) * 75 - 10, (row + 1) * 75 - 10,
  39.                                             fill="#C44F53")
  40.                 elif self.board[row][col] == 2:
  41.                     self.canvas.create_oval(col * 75 + 10, row * 75 + 10, (col + 1) * 75 - 10, (row + 1) * 75 - 10,
  42.                                             fill="#F7DC6F")
  43.                 elif self.board[row][col] == 3:
  44.                     self.canvas.create_oval(col * 75 + 10, row * 75 + 10, (col + 1) * 75 - 10, (row + 1) * 75 - 10,
  45.                                             fill="#FFD700")
  46.                 elif self.board[row][col] == 4:
  47.                     self.canvas.create_oval(col * 75 + 10, row * 75 + 10, (col + 1) * 75 - 10, (row + 1) * 75 - 10,
  48.                                             fill="#B8860B")
  49.  
  50.     def on_square_click(self, event):
  51.         row = event.y // 75
  52.         col = event.x // 75
  53.         if self.selected_piece:
  54.             if self.is_valid_move(self.selected_piece, row, col):
  55.                 self.move_piece(self.selected_piece, row, col)
  56.                 self.selected_piece = None
  57.                 self.draw_board()
  58.                 self.current_player = 3 - self.current_player
  59.             else:
  60.                 self.selected_piece = None
  61.                 self.draw_board()
  62.         elif self.board[row][col] != 0 and self.board[row][col] % 2 == self.current_player % 2:
  63.             self.selected_piece = (row, col)
  64.             self.draw_board()
  65.             self.highlight_moves(row, col)
  66.  
  67.     def is_valid_move(self, start_pos, end_row, end_col):
  68.         start_row, start_col = start_pos
  69.         if self.board[end_row][end_col] != 0:
  70.             return False
  71.         piece = self.board[start_row][start_col]
  72.         if piece == 1:
  73.             if end_row < start_row:
  74.                 return False
  75.             if abs(end_row - start_row) == 1 and abs(end_col - start_col) == 1:
  76.                 return True
  77.             if abs(end_row - start_row) == 2 and abs(end_col - start_col) == 2:
  78.                 mid_row = (start_row + end_row) // 2
  79.                 mid_col = (start_col + end_col) // 2
  80.                 if self.board[mid_row][mid_col] == 2 or self.board[mid_row][mid_col] == 4:
  81.                     self.board[mid_row][mid_col] = 0
  82.                     return True
  83.             if abs(end_row - start_row) == 2 and abs(end_col - start_col) == 0:
  84.                 mid_row = (start_row + end_row) // 2
  85.                 mid_col = start_col
  86.                 if self.board[mid_row][mid_col] == 2 or self.board[mid_row][mid_col] == 4:
  87.                     self.board[mid_row][mid_col] = 0
  88.                     return True
  89.             if start_row == 6 and end_row == 7 and abs(end_col - start_col) == 1:
  90.                 self.board[end_row][end_col] = 3
  91.                 return True
  92.         elif piece == 2:
  93.             if end_row > start_row:
  94.                 return False
  95.             if abs(end_row - start_row) == 1 and abs(end_col - start_col) == 1:
  96.                 return True
  97.             if abs(end_row - start_row) == 2 and abs(end_col - start_col) == 2:
  98.                 mid_row = (start_row + end_row) // 2
  99.                 mid_col = (start_col + end_col) // 2
  100.                 if self.board[mid_row][mid_col] == 1 or self.board[mid_row][mid_col] == 3:
  101.                     self.board[mid_row][mid_col] = 0
  102.                     return True
  103.             if abs(end_row - start_row) == 2 and abs(end_col - start_col) == 0:
  104.                 mid_row = (start_row + end_row) // 2
  105.                 mid_col = start_col
  106.                 if self.board[mid_row][mid_col] == 1 or self.board[mid_row][mid_col] == 3:
  107.                     self.board[mid_row][mid_col] = 0
  108.                     return True
  109.             if start_row == 1 and end_row == 0 and abs(end_col - start_col) == 1:
  110.                 self.board[end_row][end_col] = 4
  111.                 return True
  112.         elif piece == 3 or piece == 4:
  113.             if abs(end_row - start_row) == 1 and abs(end_col - start_col) == 1:
  114.                 return True
  115.             if abs(end_row - start_row) == 2 and abs(end_col - start_col) == 2:
  116.                 mid_row = (start_row + end_row) // 2
  117.                 mid_col = (start_col + end_col) // 2
  118.                 if self.board[mid_row][mid_col] == 1 or self.board[mid_row][mid_col] == 3:
  119.                     self.board[mid_row][mid_col] = 0
  120.                     return True
  121.                 elif self.board[mid_row][mid_col] == 2 or self.board[mid_row][mid_col] == 4:
  122.                     self.board[mid_row][mid_col] = 0
  123.                     if piece == 3:
  124.                         self.board[end_row][end_col] = 3
  125.                     else:
  126.                         self.board[end_row][end_col] = 4
  127.                     return True
  128.         return False
  129.  
  130.     def move_piece(self, start_pos, end_row, end_col):
  131.         start_row, start_col = start_pos
  132.         piece = self.board[start_row][start_col]
  133.         self.board[end_row][end_col] = piece
  134.         self.board[start_row][start_col] = 0
  135.         if end_row == 0 and piece == 2:
  136.             self.board[end_row][end_col] = 4
  137.         elif end_row == 7 and piece == 1:
  138.             self.board[end_row][end_col] = 3
  139.  
  140.     def highlight_moves(self, row, col):
  141.         if self.board[row][col] == 1:
  142.             if row < 7 and col > 0 and self.board[row + 1][col - 1] == 0:
  143.                 self.canvas.create_rectangle((col - 1) * 75, (row + 1) * 75, col * 75, (row + 2) * 75, fill="green")
  144.             if row < 7 and col < 7 and self.board[row + 1][col + 1] == 0:
  145.                 self.canvas.create_rectangle((col + 1) * 75, (row + 1) * 75, (col + 2) * 75, (row + 2) * 75,
  146.                                              fill="green")
  147.             if row < 6 and col > 1 and (self.board[row + 1][col - 1] == 2 or self.board[row + 1][col - 1] == 4) and \
  148.                     self.board[row + 2][col - 2] == 0:
  149.                 self.canvas.create_rectangle((col - 2) * 75, (row + 2) * 75, (col - 1) * 75, (row + 3) * 75,
  150.                                              fill="green")
  151.             if row < 6 and col < 6 and (self.board[row + 1][col + 1] == 2 or self.board[row + 1][col + 1] == 4) and \
  152.                     self.board[row + 2][col + 2] == 0:
  153.                 self.canvas.create_rectangle((col + 2) * 75, (row + 2) * 75, (col + 3) * 75, (row + 3) * 75,
  154.                                              fill="green")
  155.         elif self.board[row][col] == 2:
  156.             if row > 0 and col > 0 and self.board[row - 1][col - 1] == 0:
  157.                 self.canvas.create_rectangle((col - 1) * 75, (row - 1) * 75, col * 75, row * 75, fill="green")
  158.             if row > 0 and col < 7 and self.board[row - 1][col + 1] == 0:
  159.                 self.canvas.create_rectangle((col + 1) * 75, (row - 1) * 75, (col + 2) * 75, row * 75, fill="green")
  160.             if row > 1 and col > 1 and (self.board[row - 1][col - 1] == 1 or self.board[row - 1][col - 1] == 3) and \
  161.                     self.board[row - 2][col - 2] == 0:
  162.                 self.canvas.create_rectangle((col - 2) * 75, (row - 2) * 75, (col - 1) * 75, (row - 1) * 75,
  163.                                              fill="green")
  164.             if row > 1 and col < 6 and (self.board[row - 1][col + 1] == 1 or self.board[row - 1][col + 1] == 3) and \
  165.                     self.board[row - 2][col + 2] == 0:
  166.                 self.canvas.create_rectangle((col + 2) * 75, (row - 2) * 75, (col + 3) * 75, (row - 1) * 75,
  167.                                              fill="green")
  168.         elif self.board[row][col] == 3 or self.board[row][col] == 4:
  169.             piece = self.board[row][col]
  170.             directions = [(-1, -1), (-1, 1), (1, -1), (1, 1)]
  171.             for d in directions:
  172.                 for i in range(1, 8):
  173.                     r = row + i * d[0]
  174.                     c = col + i * d[1]
  175.                     if r < 0 or r > 7 or c < 0 or c > 7:
  176.                         break
  177.                     elif self.board[r][c] == 0:
  178.                         self.canvas.create_rectangle(c * 75, r * 75, (c + 1) * 75, (r + 1) * 75, fill="green")
  179.                     elif (self.board[r][c] == 1 or self.board[r][c] == 3) and piece == 4:
  180.                         self.canvas.create_rectangle(c * 75, r * 75, (c + 1) * 75, (r + 1) * 75, fill="green")
  181.                         break
  182.                     elif (self.board[r][c] == 2 or self.board[r][c] == 4) and piece == 3:
  183.                         self.canvas.create_rectangle(c * 75, r * 75, (c + 1) * 75, (r + 1) * 75, fill="green")
  184.                         break
  185.                     else:
  186.                         break
  187.  
  188.  
  189. root = tk.Tk()
  190. game = Checkers(root)
  191. root.mainloop()
  192.  
Advertisement
Comments
Add Comment
Please, Sign In to add comment