# two player chess in python with Pygame!
# part one, set up variables images and game loop
import pygame
pygame.init()
#common board variables
WIDTH = 1000
HEIGHT = 900
background_color = 'light gray'
square_color = 'dark gray'
screen = pygame.display.set_mode([WIDTH, HEIGHT])
pygame.display.set_caption('Two-Player Pygame Chess!')
font = pygame.font.Font('freesansbold.ttf', 20)
medium_font = pygame.font.Font('freesansbold.ttf', 40)
big_font = pygame.font.Font('freesansbold.ttf', 40)
timer = pygame.time.Clock()
fps = 60
# game variables and images
white_pieces = ['rook', 'knight', 'bishop', 'king', 'queen', 'bishop', 'knight',
'rook',
                 'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn']
white_locations = [(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (5, 0), (6, 0), (7, 0),
                    (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1)]
black_pieces = ['rook', 'knight', 'bishop', 'king', 'queen', 'bishop', 'knight',
'rook',
                 'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn']
black_locations = [(0, 7), (1, 7), (2, 7), (3, 7), (4, 7), (5, 7), (6, 7), (7, 7),
                    (0, 6), (1, 6), (2, 6), (3, 6), (4, 6), (5, 6), (6, 6), (7, 6)]
captured_pieces_white = []
captured_pieces_black = []
# 0 - whites turn no selection: 1-whites turn piece selected: 2- black turn no
selection, 3 - black turn piece selected
turn_step = 0
selection = 100
valid_moves = []
# load in game piece images (queen, king, rook, bishop, knight, pawn) x 2
black_queen = pygame.image.load('assets/images/black queen.png')
black_queen = pygame.transform.scale(black_queen, (80, 80))
black_queen_small = pygame.transform.scale(black_queen, (45, 45))
black_king = pygame.image.load('assets/images/black king.png')
black_king = pygame.transform.scale(black_king, (80, 80))
black_king_small = pygame.transform.scale(black_king, (45, 45))
black_rook = pygame.image.load('assets/images/black rook.png')
black_rook = pygame.transform.scale(black_rook, (80, 80))
black_rook_small = pygame.transform.scale(black_rook, (45, 45))
black_bishop = pygame.image.load('assets/images/black bishop.png')
black_bishop = pygame.transform.scale(black_bishop, (80, 80))
black_bishop_small = pygame.transform.scale(black_bishop, (45, 45))
black_knight = pygame.image.load('assets/images/black knight.png')
black_knight = pygame.transform.scale(black_knight, (80, 80))
black_knight_small = pygame.transform.scale(black_knight, (45, 45))
black_pawn = pygame.image.load('assets/images/black pawn.png')
black_pawn = pygame.transform.scale(black_pawn, (65, 65))
black_pawn_small = pygame.transform.scale(black_pawn, (45, 45))
white_queen = pygame.image.load('assets/images/white queen.png')
white_queen = pygame.transform.scale(white_queen, (80, 80))
white_queen_small = pygame.transform.scale(white_queen, (45, 45))
white_king = pygame.image.load('assets/images/white king.png')
white_king = pygame.transform.scale(white_king, (80, 80))
white_king_small = pygame.transform.scale(white_king, (45, 45))
white_rook = pygame.image.load('assets/images/white rook.png')
white_rook = pygame.transform.scale(white_rook, (80, 80))
white_rook_small = pygame.transform.scale(white_rook, (45, 45))
white_bishop = pygame.image.load('assets/images/white bishop.png')
white_bishop = pygame.transform.scale(white_bishop, (80, 80))
white_bishop_small = pygame.transform.scale(white_bishop, (45, 45))
white_knight = pygame.image.load('assets/images/white knight.png')
white_knight = pygame.transform.scale(white_knight, (80, 80))
white_knight_small = pygame.transform.scale(white_knight, (45, 45))
white_pawn = pygame.image.load('assets/images/white pawn.png')
white_pawn = pygame.transform.scale(white_pawn, (65, 65))
white_pawn_small = pygame.transform.scale(white_pawn, (45, 45))
white_images = [white_pawn, white_queen, white_king, white_knight, white_rook,
white_bishop]
small_white_images = [white_pawn_small, white_queen_small, white_king_small,
white_knight_small,
                      white_rook_small, white_bishop_small]
black_images = [black_pawn, black_queen, black_king, black_knight, black_rook,
black_bishop]
small_black_images = [black_pawn_small, black_queen_small, black_king_small,
black_knight_small,
                      black_rook_small, black_bishop_small]
piece_list = ['pawn', 'queen', 'king', 'knight', 'rook', 'bishop']
# check variables/ flashing counter
def draw_board():
    for i in range(32):
        column = i % 4
        row = i // 4
        if row % 2 == 0 :
            pygame.draw.rect(screen, square_color, [600 - (column * 200), row *
100, 100, 100 ])
        else:
              pygame.draw.rect(screen, square_color, [700 - (column * 200), row *
100, 100, 100 ])
        pygame.draw.rect(screen, 'gray', [0, 800, WIDTH, 100] )
        pygame.draw.rect(screen, 'gold', [0, 800, WIDTH, 100], 5)
        pygame.draw.rect(screen, 'gold', [800, 0, 200, HEIGHT], 5)
        status_text = ["White's turn. Select a piece to move!", "White's turn.
Perform the move!",
                       "Black's turn. Select a piece to move!", "Black's turn.
Perform the move!"
                       ]
        screen.blit(big_font.render(status_text[turn_step], True, 'black'), (15,
820))
        for i in range(9):
            pygame.draw.line(screen, 'black', (0, 100 * i), (800, 100 * i), 2)
            pygame.draw.line(screen, 'black', (100 * i, 0), (100 * i, 800), 2)
def draw_pieces():
    for i in range(len(white_pieces)):
        index = piece_list.index(white_pieces[i])
        if white_pieces[i] == 'pawn':
            screen.blit(white_pawn, (white_locations[i][0] * 100 + 19,
white_locations[i][1] * 100 + 30))
        else:
            screen.blit(white_images[index], (white_locations[i][0] * 100 + 10,
white_locations[i][1] * 100 + 10))
        #highlights the piece that we have selected
        if turn_step < 2:
            if selection == i:
                pygame.draw.rect(screen, 'red' , [white_locations[i][0] * 100 + 1,
white_locations[i][1] * 100 + 1, 100 ,100], 2)
    for i in range(len(black_pieces)):
        index = piece_list.index(black_pieces[i])
        if black_pieces[i] == 'pawn':
            screen.blit(black_pawn, (black_locations[i][0] * 100 + 19,
black_locations[i][1] * 100 + 30))
        else:
            screen.blit(black_images[index], (black_locations[i][0] * 100 + 10,
black_locations[i][1] * 100 + 10))
        #highlights the piece that we have selected
        if turn_step >= 2:
            if selection == i:
                pygame.draw.rect(screen, 'blue' , [white_locations[i][0] * 100 +
1, white_locations[i][1] * 100 + 1, 100 ,100], 2)
#cheking all valid moves
def check_options(pieces, locations, turns):
    moves_list = []
    all_moves_list = []
    for i in range(len(pieces)):
        locations = locations[i]
        piece = pieces[i]
        if piece == 'pawn':
            moves_list = check_pawn(locations, turns)
        elif piece == 'rook':
            moves_list = check_rook(locations, turns)
        elif piece == 'knight':
            moves_list = check_knight(locations, turns)
        elif piece == 'bishop':
            moves_list = check_bishop(locations, turns)
        elif piece == 'queen':
            moves_list = check_queen(locations, turns)
        elif piece == 'king':
            moves_list = check_king(locations, turns)
        all_moves_list.append(moves_list)
    return all_moves_list
#check valid pawn moves
def check_pawn(position, color):
    moves_list = []
    if color == 'white':
        if (position[0], position[1] +1) not in white_locations and (position[0],
position[1] +1) not in black_locations and position[1] < 7:
            moves_list.append((position[0], position[1] +1))
        if (position[0], position[1] + 2) not in white_locations and (position[0],
position[1] + 2) not in black_locations and position[1] == 1:
            moves_list.append((position[0], position[1] +1))
#main game loop
black_options = check_options(black_pieces, black_locations, 'black')
white_options = check_options(white_pieces, white_locations, 'white')
run = True
while run:
    timer.tick(fps)
    screen.fill(background_color)
    draw_board()
    draw_pieces()
#this handles the events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
            x_coord = event.pos[0] // 100
            y_coord = event.pos[1] // 100
            click_coord = (x_coord, y_coord)
            if turn_step <= 1:
                  if click_coord in white_locations:
                      selection = white_locations.index(click_coord)
                      if turn_step == 0:
                           turn_step = 1
                  if click_coord in valid_moves and selection != 100:
                      white_locations[selection] = click_coord
                      if click_coord in black_locations:
                          black_piece = black_locations.index(click_coord)
                          captured_pieces_white.append[black_pieces[black_piece]]
                          black_pieces.pop(black_piece)
                          black_locations.pop(black_piece)
                      black_options = check_options(black_pieces, black_locations,
'black')
                      white_options = check_options(white_pieces, white_locations,
'white')
                      turn_step = 2
                      valid_moves = []
              if turn_step > 1:
                  if click_coord in black_locations:
                      selection = black_locations.index(click_coord)
                      if turn_step == 2:
                           turn_step = 3
                  if click_coord in valid_moves and selection != 100:
                      black_locations[selection] = click_coord
                      if click_coord in white_locations:
                          white_piece = white_locations.index(click_coord)
                          captured_pieces_black.append[white_pieces[white_piece]]
                          white_pieces.pop(white_piece)
                          white_locations.pop(white_piece)
                      black_options = check_options(black_pieces, black_locations,
'black')
                      white_options = check_options(white_pieces, white_locations,
'white')
                      turn_step = 0
                      valid_moves = []
    pygame.display.flip()
pygame.quit