From 87200d5c1362f1f67755508c2760d630468bcd50 Mon Sep 17 00:00:00 2001 From: ehermakov Date: Sun, 10 Mar 2024 16:05:44 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B6=D0=B0?= =?UTF-8?q?=D1=8E=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=BA=D1=83?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=BA=D0=BE=D0=BD=D0=B5=D1=86=2015=20=D1=83?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ShipCraft/Переделка/ShipField.py | 154 +++++++-- .../ShipCraft/Переделка/ShootResult.py | 8 + HNS/Excercises/ShipCraft/Переделка/Test.py | 77 +++++ .../__pycache__/ShipField.cpython-311.pyc | Bin 0 -> 9559 bytes .../__pycache__/ShootResult.cpython-311.pyc | Bin 0 -> 632 bytes .../__pycache__/main.cpython-311.pyc | Bin 0 -> 11586 bytes HNS/Excercises/ShipCraft/Переделка/main.py | 305 +++--------------- 7 files changed, 266 insertions(+), 278 deletions(-) create mode 100644 HNS/Excercises/ShipCraft/Переделка/ShootResult.py create mode 100644 HNS/Excercises/ShipCraft/Переделка/Test.py create mode 100644 HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipField.cpython-311.pyc create mode 100644 HNS/Excercises/ShipCraft/Переделка/__pycache__/ShootResult.cpython-311.pyc create mode 100644 HNS/Excercises/ShipCraft/Переделка/__pycache__/main.cpython-311.pyc diff --git a/HNS/Excercises/ShipCraft/Переделка/ShipField.py b/HNS/Excercises/ShipCraft/Переделка/ShipField.py index e509a47..f134494 100644 --- a/HNS/Excercises/ShipCraft/Переделка/ShipField.py +++ b/HNS/Excercises/ShipCraft/Переделка/ShipField.py @@ -1,26 +1,69 @@ -from main import ShootResult +from ShootResult import ShootResult class ShipField: - field = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '] - - field_size = 10 - field_mode = 0 - ship_size = 4 - ship_direction = 0 - def __init__(self): - pass + self.field = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '] + + self.field_size = 10 + self.field_mode = 0 + self.ship_size = 4 + self.ship_direction = 0 + + def __getitem__(self, item): + if item is None: + return None + + if type(item) is not int and item.isnumeric(): + item = int(item) + + if type(item) is int and 0 <= item < len(self.field): + return self.field[item] + + return None + + def action(self, row, col): + self.clear_marker() + + if self.field_mode == 0: + if self.check_possible(row, col): + self.set_ship(row, col) + + elif self.field_mode == 1: + self.shoot(row, col) + + def target(self, row, col): + self.clear_marker() + + if self.field_mode == 0: + if self.check_possible(row, col): + if self.ship_direction == 0: + for r in range(row, row + self.ship_size): + self.field[r * self.field_size + col] = "p" + + if self.ship_direction == 1: + for c in range(col, col + self.ship_size): + self.field[row * self.field_size + c] = "p" + else: + self.field[row * self.field_size + col] += "+" + + def clear_marker(self): + for i in range(0, len(self.field)): + if self.field[i] == "p" or self.field[i] == "+": + self.field[i] = "" + + if "+" in self.field[i]: + self.field[i] = self.field[i].replace("+", "") def set_ship(self, row, col): if row < 0 or row > self.field_size: @@ -55,3 +98,78 @@ class ShipField: return ShootResult.DAMAGED else: return ShootResult.UNDEFINED + + def check_possible(self, row, col): + # Функция должна возвращать True, если можно поставить сюда корабль, + # в противном случае - False + if self.ship_direction == 0: + # Здесь мы знаем, что корабль помещается на поле. + if self.field_size - row >= self.ship_size: + # Теперь нужно проверить, не заблокировано ли какое-то из полей, + for r in range(row, row + self.ship_size): + if not self.check_blocked(r, col): + return False + return True + + if self.ship_direction == 1: + if self.field_size - col >= self.ship_size: + for c in range(col, col + self.ship_size): + if not self.check_blocked(row, c): + return False + return True + + return False + + def check_blocked(self, row, col): + # Функция возвращает True, если все клетки вокруг клетки с координатами row, col + # либо находятся за пределами поля, либо в них нет корабля/они пустые + for r in range(row - 1, row + 2): + for c in range(col - 1, col + 2): + if 0 <= r < self.field_size and 0 <= c < self.field_size: + cell = (self.field[r * self.field_size + c]).strip() + if cell != '' and cell != 'p': + return False + return True + + def set_ship_size(self, value): + if value is None: + return + + if type(value) is str and value.isnumeric(): + value = int(value) + + if type(value) is int and 1 <= value <= 4: + self.ship_size = value + + def set_ship_direction(self, value): + if value is None: + return + + if type(value) is str and value.isnumeric(): + value = int(value) + + if type(value) is int and 0 <= value <= 1: + self.ship_direction = value + + def toggle_ship_direction(self): + if self.ship_direction == 0: + self.ship_direction = 1 + else: + self.ship_direction = 0 + + def toggle_field_mode(self): + if self.field_mode == 0: + self.field_mode = 1 + else: + self.field_mode = 0 + + def print_field(self): + for r in range(0, self.field_size): + blocked_string = "" + ship_string = "" + for c in range(0, self.field_size): + blocked_string += str(self.check_blocked(r, c))[0] + ", " + ship_string += self.field[r * self.field_size + c] + ', ' + print(ship_string[:-2]) + #print(blocked_string[:-2] + ' ' + ship_string[:-2]) + print("********************************************************************") \ No newline at end of file diff --git a/HNS/Excercises/ShipCraft/Переделка/ShootResult.py b/HNS/Excercises/ShipCraft/Переделка/ShootResult.py new file mode 100644 index 0000000..b5b13da --- /dev/null +++ b/HNS/Excercises/ShipCraft/Переделка/ShootResult.py @@ -0,0 +1,8 @@ +from enum import Enum + + +class ShootResult(Enum): + EMPTY = "EMPTY" + DAMAGED = "DAMAGED" + KILLED = "KILLED" + UNDEFINED = "UNDEFINED" diff --git a/HNS/Excercises/ShipCraft/Переделка/Test.py b/HNS/Excercises/ShipCraft/Переделка/Test.py new file mode 100644 index 0000000..b665305 --- /dev/null +++ b/HNS/Excercises/ShipCraft/Переделка/Test.py @@ -0,0 +1,77 @@ +from ShipField import ShipField + + +def verify_value(actual, expected): + if actual == expected: + print("OK") + else: + print("ERROR") + + +my_field = ShipField() + +print("set_ship_size()") +my_field.set_ship_size(1) + +verify_value(my_field.ship_size, 1) + +my_field.set_ship_size(0) +my_field.set_ship_size(6) + +verify_value(my_field.ship_size, 1) + +my_field.set_ship_size([]) +my_field.set_ship_size("") +my_field.set_ship_size(None) +my_field.set_ship_size(True) +my_field.set_ship_size(False) +verify_value(my_field.ship_size, 1) + +my_field.set_ship_size("2") +verify_value(my_field.ship_size, 2) +print() + +print("set_ship_direction()") +my_field.set_ship_direction(1) +verify_value(my_field.ship_direction, 1) + +my_field.set_ship_direction(-1) +my_field.set_ship_direction(6) +verify_value(my_field.ship_direction, 1) + +my_field.set_ship_direction([]) +my_field.set_ship_direction("") +my_field.set_ship_direction(None) +my_field.set_ship_direction(True) +my_field.set_ship_direction(False) +verify_value(my_field.ship_direction, 1) + +my_field.set_ship_direction("0") +verify_value(my_field.ship_direction, 0) +print() + +print('toggle_field_mode()') +verify_value(my_field.field_mode, 0) + +my_field.toggle_field_mode() +verify_value(my_field.field_mode, 1) + +my_field.toggle_field_mode() +verify_value(my_field.field_mode, 0) +print() + +print("set_ship()") +verify_value(my_field.field[0], " ") + +my_field.set_ship_size(1,) +my_field.set_ship_direction(0) +my_field.set_ship(0, 0) + +verify_value(my_field.field[0], "1") +print() + +my_field.set_ship_size(4) +my_field.set_ship_direction(0) +my_field.set_ship(5, 5) +my_field.print_field() + diff --git a/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipField.cpython-311.pyc b/HNS/Excercises/ShipCraft/Переделка/__pycache__/ShipField.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88800194fffc3a9b346e55f2a50d86c5eee5ce1c GIT binary patch literal 9559 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 literal 0 HcmV?d00001 diff --git a/HNS/Excercises/ShipCraft/Переделка/__pycache__/main.cpython-311.pyc b/HNS/Excercises/ShipCraft/Переделка/__pycache__/main.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b706c01e256263616fc3d1bca9ccbc98485f177 GIT binary patch literal 11586 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 literal 0 HcmV?d00001 diff --git a/HNS/Excercises/ShipCraft/Переделка/main.py b/HNS/Excercises/ShipCraft/Переделка/main.py index 7140fb5..2a01437 100644 --- a/HNS/Excercises/ShipCraft/Переделка/main.py +++ b/HNS/Excercises/ShipCraft/Переделка/main.py @@ -1,98 +1,29 @@ from tkinter import * -from enum import Enum - -my_buttons = [] -enemy_buttons = [] - -field_size = 10 -active_field = 0 - -ship_size_left = 4 -ship_direction_left = 0 -field_mode_left = 0 - -ship_size_right = 4 -ship_direction_right = 0 -field_mode_right = 0 - -empty_field = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '] - -my_field = list(empty_field) -enemy_field = list(empty_field) +from ShipField import ShipField -# 1. Определите перечисление (Enum) ShootResult со следующими значениями: -# EMPTY (мимо), DAMAGED (ранен), KILLED (убит), UNDEFINED (действие не определено) +my_field = ShipField() +enemy_field = ShipField() -class ShootResult(Enum): - EMPTY = "EMPTY" - DAMAGED = "DAMAGED" - KILLED = "KILLED" - UNDEFINED = "UNDEFINED" - - -def set_ship(field, row, col, ship_size, direction): - if row < 0 or row > field_size: - return - if col < 0 or col > field_size: - return - index = row * field_size + col - if direction == 0: - if field_size - row < ship_size: - return - for r in range(row, row + ship_size): - index = r * field_size + col - field[index] = "1" - if direction == 1: - if field_size - col < ship_size: - return - for c in range(col, col + ship_size): - index = row * field_size + c - field[index] = "1" - - -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 - if (field[index]).strip() == "": - field[index] = "0" - return ShootResult.EMPTY - elif (field[index]).strip() == "1": - field[index] = "\\" - return ShootResult.DAMAGED - else: - return ShootResult.UNDEFINED +active_field = my_field def draw_field(window, field, col_offset): buttons = [] - for r in range(0, field_size): - for c in range(0, field_size): - index = r * field_size + c + for r in range(0, field.field_size): + for c in range(0, field.field_size): btn = Button(window, text='', width=5, height=2) btn.grid(column=c + col_offset, row=r) - btn.bind('', lambda e, x=r, y=c: left_button_click(field, buttons, x, y)) + btn.bind('', lambda e, x=r, y=c: left_button_click(buttons, x, y)) btn.bind('', right_button_click) - btn.bind('', lambda e, x=r, y=c: button_enter(field, buttons, x, y)) + btn.bind('', lambda e, x=r, y=c: button_enter(buttons, x, y)) buttons.append(btn) colorize(field, buttons) return buttons def colorize(field, buttons): - for i in range(len(field)): + for i in range(len(buttons)): bg = "white" if field[i] == "1": bg = 'pink' @@ -102,214 +33,68 @@ def colorize(field, buttons): bg = 'black' if field[i] == "p": bg = 'blue' + if "+" in field[i]: + bg = 'orange' buttons[i].configure(bg=bg) def keypress_handler(e): - global ship_size_left - global field_mode_left - - global ship_size_right - global field_mode_right - + global active_field if e.keysym.isnumeric(): - number = int(e.keysym) - if 1 <= number <= 4: - if active_field == 0: - ship_size_left = number - else: - ship_size_right = number + active_field.set_ship_size(e.keysym) else: if e.keysym == 'm': - if active_field == 0: - field_mode = field_mode_left - else: - field_mode = field_mode_right - - if field_mode == 0: - field_mode = 1 - else: - field_mode = 0 - - if active_field == 0: - field_mode_left = field_mode - else: - field_mode_right = field_mode + active_field.toggle_field_mode() -def left_button_click(field, buttons, row, col): - global ship_size_left - global ship_direction_left - - global ship_size_right - global ship_direction_right - - if active_field == 0: - field_mode = field_mode_left - ship_size = ship_size_left - ship_direction = ship_direction_left - else: - field_mode = field_mode_right - ship_size = ship_size_right - ship_direction = ship_direction_right - - if field_mode == 0: - if check_possible(field, row, col, ship_size, ship_direction): - set_ship(field, row, col, ship_size, ship_direction) - elif field_mode == 1: - shoot(field, row, col) - colorize(field, buttons) - - -def right_button_click(d): - global ship_direction_left - global ship_direction_right - - global field_mode_left - global field_mode_right - - if active_field == 0: - field_mode = field_mode_left - ship_direction = ship_direction_left - else: - field_mode = field_mode_right - ship_direction = ship_direction_right - - - if field_mode == 0: - if ship_direction == 0: - ship_direction = 1 - else: - ship_direction = 0 - - if active_field == 0: - ship_direction_left = ship_direction - else: - ship_direction_right = ship_direction - -def button_enter(field, buttons, row, col): +def left_button_click(buttons, row, col): global active_field - global ship_direction_left - global ship_direction_right - global ship_size_left - global ship_size_right + active_field.action(row, col) + colorize(active_field, buttons) - global field_mode_left - global field_mode_right +def right_button_click(unused): + global active_field + + active_field.toggle_ship_direction() + + +def button_enter(buttons, row, col): + global active_field if buttons == my_buttons: - active_field = 0 + active_field = my_field + enemy_field.clear_marker() + my_field.target(row, col) + elif buttons == enemy_buttons: - active_field = 1 + active_field = enemy_field + my_field.clear_marker() + enemy_field.target(row, col) - if active_field == 0: - field_mode = field_mode_left - ship_direction = ship_direction_left - ship_size = ship_size_left - other_field = enemy_field - other_buttons = enemy_buttons - else: - field_mode = field_mode_right - ship_direction = ship_direction_right - ship_size = ship_size_right - other_field = my_field - other_buttons = my_buttons - - - for i in range(0, len(other_field)): - if other_field[i] == "p": - other_field[i] = '' - - colorize(other_field, other_buttons) - - - if field_mode == 0: - for i in range(0, len(field)): - if field[i] == "p": - field[i] = '' - - - - if check_possible(field, row, col,ship_size, ship_direction): - if ship_direction == 0: - for r in range(row, row + ship_size): - field[r * field_size + col] = "p" - - if ship_direction == 1: - for c in range(col, col + ship_size): - field[row * field_size + c] = "p" - - colorize(field, buttons) - - -def check_possible(field, row, col, ship_size, ship_direction): - # Функция должна возвращать True, если можно поставить сюда корабль, - # в противном случае - False - - if ship_direction == 0: - # Здесь мы знаем, что корабль помещается на поле. - if field_size - row >= ship_size: - # Теперь нужно проверить, не заблокировано ли какое-то из полей, - for r in range(row, row + ship_size): - if not check_blocked(field, r, col): - return False - return True - - if ship_direction == 1: - if field_size - col >= ship_size: - for c in range(col, col + ship_size): - if not check_blocked(field, row, c): - return False - return True - - return False - - -def check_blocked(field, row, col): - # Функция возвращает True, если все клетки вокруг клетки с координатами row, col - # либо находятся за пределами поля, либо в них нет корабля/они пустые - for r in range(row - 1, row + 2): - for c in range(col - 1, col + 2): - if 0 <= r < field_size and 0 <= c < field_size: - cell = (field[r * field_size + c]).strip() - if cell != '' and cell != 'p': - return False - return True + colorize(my_field, my_buttons) + colorize(enemy_field, enemy_buttons) window = Tk() window.title("Ship Craft!") window.geometry('940x410') 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, 7, 3, 1, 0) + +my_field.toggle_ship_direction() +my_field.set_ship_size(4) +my_field.set_ship(1, 1) +my_field.toggle_ship_direction() +my_field.set_ship_size(3) +my_field.set_ship(0, 6) +my_field.set_ship_size(1) +my_field.set_ship(7, 3) + my_buttons = draw_field(window, my_field, 0) enemy_buttons = draw_field(window, enemy_field, 11) -print(len(my_buttons)) -print(len(enemy_buttons)) lbl = Label(window, text='', width=5, height=2) lbl.grid(column=10, row=0) -window.mainloop() - - -for r in range(0, field_size): - blocked_string = "" - ship_string = "" - for c in range(0, field_size): - blocked_string += str(check_blocked(my_field, r, c))[0] + ", " - ship_string += my_field[r * field_size + c] + ', ' - print(blocked_string[:-2] + ' ' + ship_string[:-2]) -print("********************************************************************") - -for r in range(0, field_size): - possible_string = "" - impossible_string = "" - for c in range(0, field_size): - possible_string += str(check_possible(my_field, r, c))[0] + ", " - impossible_string += my_field[r * field_size + c] + ', ' - print(possible_string[:-2] + ' ' + impossible_string[:-2]) +window.mainloop() \ No newline at end of file