from tkinter import * from ShootResult import ShootResult from FieldMode import FieldMode field_size = 10 mode = FieldMode.Placing ship_size = 4 ship_direction = 0 empty_field = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '] my_field = list(empty_field) enemy_field = list(empty_field) buttons = [] def shoot(field, row, col): if row < 0 or row > field_size - 1: return ShootResult.Undefined if col < 0 or col > field_size - 1: return ShootResult.Undefined index = row * field_size + col value = (field[index]).strip() if value == '': field[index] = '0' return ShootResult.Empty elif value == '1': field[index] = '\\' return ShootResult.Damaged return ShootResult.Undefined def set_ship(field, row, col, size, direction): # 0. Проверка стартовой точки (находится ли в поле) if row < 0 or row > field_size - 1: return if col < 0 or col > field_size - 1: return # 1. Нахождение стартовой точки index = row * field_size + col # 2. Определяем направление и в зависимости от него # 2.1 Если вниз - то сравниваем размер поля (field_size=10) - row и size (field_size - row > size или row + size < field_size) if direction == 0: if field_size - row < size: # 3. Если не помещается, то корабль не ставим return # 4. А если помещается - ставим корабль, т.е. (row,col) до (row+size,col) заполняем единичками for r in range(row, row + size): index = r * field_size + col field[index] = '1' # 2.2 Если вправо - то сравниваем field_size - col и size (field_size - col > size или col + size < field_size) if direction == 1: if field_size - col < size: # 3. Если не помещается, то корабль не ставим return # 4. А если помещается - ставим корабль, т.е. (row,col) до (row,col+size) заполняем единичками for c in range(col, col + size): index = row * field_size + c field[index] = '1' def draw_field(window, field): for r in range(0, field_size): for c in range(0, field_size): btn = Button(window, text="", bg='white', width=5, height=2) btn.grid(column=c, row=r) btn.bind('', lambda e, row=r, col=c: button_hover(my_field, row, col)) btn.bind('', lambda e, x=r, y=c: button_action(my_field, x, y)) btn.bind('', rotate_ship) buttons.append(btn) def rotate_ship(e): global ship_direction if ship_direction == 0: ship_direction = 1 else: ship_direction = 0 def button_hover(field, row, col): clear_placing(field) place_ship(field, row, col, ship_size, ship_direction) colorize(field) def clear_placing(field): for r in range(0, field_size): for c in range(0, field_size): index = r*field_size+c if field[index] == 'p': field[index] = '' def place_ship(field, row, col, size, direction): blocked = False if row < 0 or row > field_size - 1: return if col < 0 or col > field_size - 1: return if direction == 0: if field_size - row < size: return for r in range(row, row + size): if check_blocked(field, r, col): blocked = True break if not blocked: for r in range(row, row + size): field[r * field_size + col] = 'p' if direction == 1: if field_size - col < size: return for c in range(col, col + size): if check_blocked(field, row, c): blocked = True break if not blocked: for c in range(col, col + size): field[row * field_size + c] = 'p' def check_blocked(field, row, col): for r in range(row-1, row+2): for c in range(col-1, col+2): if r < 0 or r > field_size - 1: continue if c < 0 or c > field_size - 1: continue if (field[r*field_size + c]).strip() != '': return True return False def colorize(field): for r in range(0, field_size): for c in range(0, field_size): index = r*field_size+c btn = buttons[index] bg = 'white' if field[index] == '1': bg = 'pink' elif field[index] == '\\': bg = 'red' elif field[index] == '0': bg = 'black' elif field[index] == 'p': bg = 'blue' btn.configure(bg=bg) def button_action(field, row, col): if mode == FieldMode.Enemy: shoot(field, row, col) colorize(field) elif mode == FieldMode.Friendly: colorize(field) elif mode == FieldMode.Placing: set_ship(field, row, col, ship_size, ship_direction) def keypress_handler(e): global ship_size if e.keysym in '1234': ship_size = int(e.keysym) window = Tk() window.title("Ship Craft!") window.geometry('450x410') window.bind_all('', keypress_handler) #set_ship(my_field, 1, 1, 4, 1) #set_ship(my_field, 0, 6, 3, 0) #set_ship(my_field, 9, 9, 1, 0) #set_ship(my_field, 0, 0, 1, 0) #set_ship(my_field, 9, 0, 1, 0) #set_ship(my_field, 9, 2, 4, 1) draw_field(window, my_field) colorize(my_field) window.mainloop()