Advertisement
Manusman

Chess image bug

Mar 25th, 2020
458
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 12.24 KB | None | 0 0
  1. import colorama
  2. import tkinter as tk
  3. from tkinter import ttk
  4.  
  5.  
  6. class Space(tk.Button):
  7.     color = 0
  8.     inst_num = 0
  9.    
  10.     def __init__(self, name, root, player=None):
  11.         Space.inst_num += 1
  12.         Space.color += 1
  13.         Space.color += (1 if Space.color % 9 == 0 else 0)
  14.  
  15.         self.root = root
  16.         self.name = name
  17.         self.player = player
  18.        
  19.         self.select_move = False
  20.         self.information = {'Name': name, 'Player': C_ABBREVIATIONS[self.player],
  21.                             'Current Space': f'{"H" if Space.inst_num % 8 == 0 else chr(Space.inst_num % 8 + 64)}'
  22.                                              f'{Space.inst_num // 8 + (0 if Space.inst_num % 8 == 0 else 1)}',
  23.                             'Times Moved': 0, 'Opponents Eaten': 0}
  24.  
  25.         super().__init__(self.root, image=P_ABBREVIATIONS[self.name], bg=('grey' if Space.color % 2 == 0 else 'white'),
  26.                          fg=('black' if player == 'B' else 'grey22'), height=80, width=80, relief='flat')
  27.        
  28.  
  29. class ChessBoard:
  30.  
  31.     def __init__(self, root):
  32.         colorama.init()
  33.         self.root = root
  34.         self.root.geometry('1920x1080')
  35.         self.root.title('Chess')
  36.  
  37.         self._init_board()
  38.         self.select_move = False
  39.         self.turn = 'W'
  40.  
  41.         self.invalid = tk.Label(self.root)
  42.         self.invalid.place(relx=0.5, rely=0.05)
  43.         self.turn_lab = ttk.Button(self.root, text=f'{C_ABBREVIATIONS[self.turn]} player\'s turn.', style='Fun.TButton', width=20,
  44.                                    state='disabled')
  45.         self.turn_lab.place(relx=0.5, rely=0.02)
  46.  
  47.     def _init_board(self):
  48.  
  49.         self.board = [[Space('Pawn', self.root, 'B'), Space('Pawn', self.root, 'B'), Space('Pawn', self.root, 'B'),
  50.                        Space('Pawn', self.root, 'B'), Space('Pawn', self.root, 'B'), Space('Pawn', self.root, 'B'),
  51.                        Space('Pawn', self.root, 'B'), Space('Pawn', self.root, 'B')],
  52.  
  53.                       [Space('Pawn', self.root, 'B'), Space('Pawn', self.root, 'B'), Space('Pawn', self.root, 'B'),
  54.                        Space('Pawn', self.root, 'B'), Space('Pawn', self.root, 'B'), Space('Pawn', self.root, 'B'),
  55.                        Space('Pawn', self.root, 'B'), Space('Pawn', self.root, 'B')],
  56.  
  57.                       [Space('Pawn', self.root), Space('Pawn', self.root), Space('Pawn', self.root), Space('Pawn', self.root),
  58.                        Space('Pawn', self.root), Space('Pawn', self.root), Space('Pawn', self.root), Space('Pawn', self.root)],
  59.  
  60.                       [Space('Pawn', self.root), Space('Pawn', self.root), Space('Pawn', self.root), Space('Pawn', self.root),
  61.                        Space('Pawn', self.root), Space('Pawn', self.root), Space('Pawn', self.root), Space('Pawn', self.root)],
  62.  
  63.                       [Space('Pawn', self.root), Space('Pawn', self.root), Space('Pawn', self.root), Space('Pawn', self.root),
  64.                        Space('Pawn', self.root), Space('Pawn', self.root), Space('Pawn', self.root), Space('Pawn', self.root)],
  65.  
  66.                       [Space('Pawn', self.root), Space('Pawn', self.root), Space('Pawn', self.root), Space('Pawn', self.root),
  67.                        Space('Pawn', self.root), Space('Pawn', self.root), Space('Pawn', self.root), Space('Pawn', self.root)],
  68.  
  69.                       [Space('Pawn', self.root, 'W'), Space('Pawn', self.root, 'W'), Space('Pawn', self.root, 'W'),
  70.                        Space('Pawn', self.root, 'W'), Space('Pawn', self.root, 'W'), Space('Pawn', self.root, 'W'),
  71.                        Space('Pawn', self.root, 'W'), Space('Pawn', self.root, 'W')],
  72.  
  73.                       [Space('Pawn', self.root, 'W'), Space('Pawn', self.root, 'W'), Space('Pawn', self.root, 'W'),
  74.                        Space('Pawn', self.root, 'W'), Space('Pawn', self.root, 'W'), Space('Pawn', self.root, 'W'),
  75.                        Space('Pawn', self.root, 'W'), Space('Pawn', self.root, 'W')]]
  76.  
  77.         for i in self.board:
  78.             for j in i:
  79.                 j.place(relx=i.index(j) / 20 + 0.3, rely=self.board.index(i) / 10 + 0.1)
  80.  
  81.                 j['command'] = lambda arg1=j: self._click_space(arg1)
  82.                 j.bind('<Enter>', lambda event_, arg=j: self._space_hover(event_, arg))
  83.                 j.bind('<Leave>', lambda event: self.info.destroy())
  84.  
  85.     def _space_hover(self, event, space):
  86.         print(event)
  87.         self.info = tk.Text(self.root, bd=10, relief='groove', height=7, width=25, font='Helvetica 11')
  88.         self.info.tag_configure('bold', font="Helvetica 11 bold")
  89.         self.info.place(relx=0.15, rely=0.2)
  90.  
  91.         self.info.insert('end', '           BUTTON INFO\n', 'bold')
  92.         for k, v in space.information.items():
  93.             self.info.insert('end', f'{k}: ', 'bold')
  94.             self.info.insert('end', f'{v}\n')
  95.  
  96.         self.info.configure(state='disabled')
  97.  
  98.     def _check_valid_move(self, row_from, col_from, row_to, col_to):
  99.         """In charge of calling all the checking"""
  100.  
  101.         print(f'({row_from}, {col_from}), ({row_to}, {col_to})')
  102.         if self.board[row_to][col_to].player == self.board[row_from][col_from].player:
  103.             return False
  104.         elif P_ABBREVIATIONS[self.board[row_from][col_from].name] == 'Castle':
  105.             return self._check_castle(row_from, col_from, row_to, col_to)
  106.         elif P_ABBREVIATIONS[self.board[row_from][col_from].name] == 'Horse':
  107.             return self._check_horse(row_from, col_from, row_to, col_to)
  108.         elif P_ABBREVIATIONS[self.board[row_from][col_from].name] == 'Bishop':
  109.             return self._check_bishop(row_from, col_from, row_to, col_to)
  110.         elif P_ABBREVIATIONS[self.board[row_from][col_from].name] == 'Queen':
  111.             return self._check_queen(row_from, col_from, row_to, col_to)
  112.         elif P_ABBREVIATIONS[self.board[row_from][col_from].name] == 'King':
  113.             return self._check_king(row_from, col_from, row_to, col_to)
  114.         elif P_ABBREVIATIONS[self.board[row_from][col_from].name] == 'Pawn':
  115.             return self._check_pawn(row_from, col_from, row_to, col_to)
  116.  
  117.     def _check_castle(self, row_from, col_from, row_to, col_to):  # Checks validity of move input by user in play()
  118.         """Checks validity of move involving a castle"""
  119.  
  120.         if row_from == row_to:  # Horizontal movement
  121.             for i in range(min(col_from + 1, col_to + 1), max(col_from, col_to)):
  122.  
  123.                 if self.board[row_from][i].name == ' ':      # Checks that it is all empty spaces in between
  124.                     continue
  125.                 else:
  126.                     return False
  127.             return True
  128.  
  129.         elif col_from == col_to:  # Vertical movement
  130.             print('hi')
  131.             for i in range(min(row_from + 1, row_to + 1), max(row_from, row_to)):
  132.                 if self.board[i][col_from].name == ' ':      # Checks that it is all empty spaces in between
  133.                     print('hello')
  134.                     continue
  135.                 else:
  136.                     return False
  137.             return True
  138.         else:
  139.             return False
  140.  
  141.     # noinspection PyMethodMayBeStatic
  142.     def _check_horse(self, row_from, col_from, row_to, col_to):
  143.         """Checks validity of move involving a horse"""
  144.  
  145.         if ((abs(row_from - row_to) == 1) and (abs(col_from - col_to) == 2)) or ((abs(row_from - row_to) == 2) and (abs(col_from - col_to) == 1)):
  146.             return True
  147.         else:
  148.             return False
  149.  
  150.     def _check_bishop(self, row_from, col_from, row_to, col_to):
  151.         """Checks validity of move involving a bishop"""
  152.  
  153.         if abs(row_from - row_to) == abs(col_from - col_to):
  154.             direction = (1 if row_from < row_to else -1, 1 if col_from < col_to else -1)  # Direction vector
  155.  
  156.             for i in range(1, abs(col_from - col_to)):
  157.  
  158.                 if self.board[row_from + i * direction[0]][col_from + i * direction[1]].name == ' ':     # Checks for empty spaces in between
  159.                     continue
  160.                 else:
  161.                     return False
  162.             return True
  163.         else:
  164.             return False
  165.  
  166.     def _check_queen(self, row_from, col_from, row_to, col_to):
  167.         """Checks validity of move involving a queen"""
  168.  
  169.         return self._check_castle(row_from, col_from, row_to, col_to) or self. _check_bishop(row_from, col_from, row_to, col_to)
  170.  
  171.     # noinspection PyMethodMayBeStatic
  172.     def _check_king(self, row_from, col_from, row_to, col_to):
  173.         """Checks validity of move involving a queen"""
  174.  
  175.         if ((abs(row_from - row_to) == 1) and (col_from == col_to)) or ((abs(col_from - col_to) == 1) and (row_from == row_to)) or \
  176.                 ((abs(row_from - row_to) == 1) and (abs(col_from - col_to) == 1)):
  177.             return True
  178.         else:
  179.             return False
  180.  
  181.     def _check_pawn(self, row_from, col_from, row_to, col_to):
  182.         """Checks validity of move involving a pawn"""
  183.  
  184.         turn_check = (True if self.turn == 'W' else False)
  185.  
  186.         if (row_from - row_to == (1 if turn_check else -1)) and (col_from == col_to) and (self.board[row_to][col_to].name == ' '):  # Regular move
  187.             return True
  188.  
  189.         elif (row_from == (6 if turn_check else 1)) and (row_from - row_to == (2 if turn_check else -2)) and \
  190.                 (col_from == col_to) and (self.board[row_to][col_to].name == ' ') and \
  191.                 (self.board[row_from + (-1 if turn_check else 1)][col_from].name == ' '):  # Two space jump from start
  192.             return True
  193.  
  194.         elif row_from - row_to == (1 if turn_check else -1) and (abs(col_from - col_to) == 1) and (self.board[row_to][col_to].name != ' '):
  195.             return True         # Diagonal eating
  196.         else:
  197.             return False
  198.  
  199.     def _click_space(self, clicked):
  200.         if not self.select_move:
  201.             if clicked.name == 'Empty' or clicked.player != self.turn:
  202.                 self.invalid['text'] = 'Invalid space'
  203.                 return
  204.  
  205.             self.butt_from = clicked
  206.             clicked['relief'] = 'ridge'
  207.             self.from_ = (int(clicked.information['Current Space'][1]) - 1, ord(clicked.information['Current Space'][0]) - 65)
  208.             self.select_move = True
  209.         else:
  210.             self.select_move = False
  211.             self.butt_from['relief'] = 'flat'
  212.             self.to = (int(clicked.information['Current Space'][1]) - 1, ord(clicked.information['Current Space'][0]) - 65)
  213.             self.butt_to = clicked
  214.  
  215.             if self._check_valid_move(self.from_[0], self.from_[1], self.to[0], self.to[1]):
  216.                 self._make_move()
  217.                 self.invalid['text'] = ''
  218.             else:
  219.                 self.invalid['text'] = 'Invalid space'
  220.  
  221.     def _make_move(self):
  222.         self.turn = ('W' if self.turn == 'B' else 'B')
  223.         self.turn_lab['text'] = f'{C_ABBREVIATIONS[self.turn]} player\'s turn'
  224.  
  225.         eat = (0 if self.butt_to.name == ' ' else 1)
  226.         self.butt_to.name = self.butt_from.name
  227.         self.butt_to.player = self.butt_from.player
  228.         self.butt_to.configure(text=self.butt_to.name, fg=self.butt_from['fg'])
  229.         self.butt_to.information.update({'Name': P_ABBREVIATIONS[self.butt_to.name], 'Player': C_ABBREVIATIONS[self.butt_to.player],
  230.                                          'Times Moved': self.butt_from.information['Times Moved'] + 1,
  231.                                          'Opponents Eaten': self.butt_from.information['Opponents Eaten'] + eat})
  232.         self.butt_from.name = ' '
  233.         self.butt_from.player = None
  234.         self.butt_from.configure(text=self.butt_from.name, relief='flat')
  235.         self.butt_from.information.update({'Name': P_ABBREVIATIONS[self.butt_from.name], 'Player': C_ABBREVIATIONS[self.butt_from.player],
  236.                                            'Times Moved': 0, 'Opponents Eaten': 0})
  237.  
  238.  
  239. if __name__ == '__main__':
  240.     master = tk.Tk()
  241.  
  242. P_ABBREVIATIONS = {'Pawn': tk.PhotoImage(r'icons\b_pawn.png').subsample(8, 8), '\u265C': 'Castle', '\u2656': 'Castle', '\u265E': 'Horse',
  243.                    '\u2658': 'Horse', '\u265D': 'Bishop', '\u2657': 'Bishop', '\u265B': 'Queen', '\u2655': 'Queen', '\u265A': 'King',
  244.                    '\u2654': 'King', '\u265F': 'Pawn', '\u2659': 'Pawn', 'Empty': None}
  245.  
  246. C_ABBREVIATIONS = {'W': 'White', 'B': 'Black', None: 'None'}
  247.  
  248. if __name__ == '__main__':
  249.     Chess = ChessBoard(master)
  250.     master.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement