From 209150d624f65cf0f6df2980ee9d7ce97c15ec77 Mon Sep 17 00:00:00 2001 From: Artur Savitskiy Date: Tue, 4 Jun 2024 08:43:38 +0200 Subject: [PATCH] Lesson results commit --- HNS/MB/GameMode.py | 16 +++++ HNS/MB/ShipField.py | 17 +++-- HNS/MB/ShipMode.py | 4 +- HNS/MB/main.py | 153 +++++++++++++++++++++++++++++++++++--------- 4 files changed, 150 insertions(+), 40 deletions(-) create mode 100644 HNS/MB/GameMode.py diff --git a/HNS/MB/GameMode.py b/HNS/MB/GameMode.py new file mode 100644 index 0000000..b71ce26 --- /dev/null +++ b/HNS/MB/GameMode.py @@ -0,0 +1,16 @@ +from enum import Enum + + +class GameMode(Enum): + MENU = "MENU" + PLAN = "PLAN" + BATTLE = "BATTLE" + END = "END" + + @staticmethod + def from_string(raw_value): + if raw_value: + value = raw_value.upper() + if value in GameMode.__members__: + return GameMode[value] + return GameMode.MENU diff --git a/HNS/MB/ShipField.py b/HNS/MB/ShipField.py index e41e589..26f3b91 100644 --- a/HNS/MB/ShipField.py +++ b/HNS/MB/ShipField.py @@ -20,7 +20,7 @@ class ShipField: ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '] self.ships = [4, 3, 3, 2, 2, 2, 1, 1, 1, 1] - self.field_mode = ShipMode.PUT + self.field_mode = ShipMode.INACTIVE self.ship_size = 4 self.ship_direction = ShipDirection.VERTICAL @@ -74,7 +74,7 @@ class ShipField: self.field[row * ShipField.field_size + c] = "p" else: self.field[row * ShipField.field_size + c] = "r" - else: + elif self.field_mode == ShipMode.SHOOT: self.field[row * ShipField.field_size + col] += "+" def clear_marker(self): @@ -232,11 +232,14 @@ class ShipField: else: self.ship_direction = ShipDirection.VERTICAL - def toggle_field_mode(self): - if self.field_mode == ShipMode.PUT: - self.field_mode = ShipMode.SHOOT - else: - self.field_mode = ShipMode.PUT + def set_field_mode(self, value): + if value is None: + return + + if type(value) is not ShipMode: + return + + self.field_mode = value def print_field(self): for r in range(0, ShipField.field_size): diff --git a/HNS/MB/ShipMode.py b/HNS/MB/ShipMode.py index 741f104..30d8e6f 100644 --- a/HNS/MB/ShipMode.py +++ b/HNS/MB/ShipMode.py @@ -4,7 +4,7 @@ from enum import Enum class ShipMode(Enum): PUT = "PUT" SHOOT = "SHOOT" - UNKNOWN = "UNKNOWN" + INACTIVE = "INACTIVE" @staticmethod def from_string(raw_value): @@ -12,4 +12,4 @@ class ShipMode(Enum): value = raw_value.upper() if value in ShipMode.__members__: return ShipMode[value] - return ShipMode.UNKNOWN + return ShipMode.INACTIVE diff --git a/HNS/MB/main.py b/HNS/MB/main.py index e8e758c..d92b2bc 100644 --- a/HNS/MB/main.py +++ b/HNS/MB/main.py @@ -4,9 +4,11 @@ from tkinter import filedialog from tkinter import * from ShipField import ShipField from ShipView import ShipView +from ShipMode import ShipMode +from GameMode import GameMode -def create_view(window, col_offset=0, row_offset=0): +def create_view(window): field = ShipField() buttons = [] view = ShipView(field, buttons) @@ -14,7 +16,6 @@ def create_view(window, col_offset=0, row_offset=0): 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 + row_offset) btn.bind('', lambda e, x=r, y=c: left_button_click(view, x, y)) btn.bind('', lambda e: right_button_click(view)) btn.bind('', lambda e, x=r, y=c: button_enter(view, x, y)) @@ -24,6 +25,20 @@ def create_view(window, col_offset=0, row_offset=0): return view +def show_view(view, col_offset=0, row_offset=0): + field_size = view.ship_field.field_size + + for r in range(0, field_size): + for c in range(0, field_size): + btn = view.buttons[r * field_size + c] + btn.grid(column=c + col_offset, row=r + row_offset) + + +def hide_view(view): + for button in view.buttons: + button.grid_forget() + + def colorize(view): field = view.ship_field for i in range(len(field.field)): @@ -50,9 +65,6 @@ def keypress_handler(e): global active_view if e.keysym.isnumeric(): active_view.ship_field.set_ship_size(int(e.keysym)) - else: - if e.keysym == 'm': - active_view.ship_field.toggle_field_mode() def left_button_click(view, row, col): @@ -109,54 +121,133 @@ def refresh_remaining_ships_label(view): view.remaining_ships_text.set(text[:-2]) +def next_game_mode(): + global game_mode + + if game_mode == GameMode.MENU: + game_mode = GameMode.PLAN + elif game_mode == GameMode.PLAN: + game_mode = GameMode.BATTLE + elif game_mode == GameMode.BATTLE: + game_mode = GameMode.END + + update_game_mode() + + +def update_game_mode(): + global game_mode + + if game_mode == GameMode.MENU: + window.geometry('400x280') + my_view.ship_field.set_field_mode(ShipMode.INACTIVE) + enemy_view.ship_field.set_field_mode(ShipMode.INACTIVE) + + lbl_lower_enemy_horizontal.grid_forget() + lbl_lower_horizontal.grid_forget() + + savebutton.grid_forget() + loadbutton.grid_forget() + + start_button.grid(column=start_column_enemy_field, row=load_button_row, columnspan=4) + load_game_button.grid(column=start_column_enemy_field, row=load_button_row + 1, columnspan=4) + exit_button.grid(column=start_column_enemy_field, row=load_button_row + 2, columnspan=4) + + hide_view(my_view) + hide_view(enemy_view) + + elif game_mode == GameMode.PLAN: + window.geometry('1020x640') + + my_view.ship_field.set_field_mode(ShipMode.PUT) + enemy_view.ship_field.set_field_mode(ShipMode.INACTIVE) + + lbl_lower_horizontal.grid(column=start_column_my_field, row=row_horizontal_separator, columnspan=10) + lbl_lower_enemy_horizontal.grid(column=start_column_enemy_field, row=row_horizontal_separator, columnspan=10) + + savebutton.grid(column=start_column_my_field, row=load_button_row, columnspan=4) + loadbutton.grid(column=start_column_my_field + 6, row=load_button_row, columnspan=4) + + start_button.grid(column=start_column_my_field, row=load_button_row + 1, columnspan=4) + load_game_button.grid_forget() + exit_button.grid_forget() + + show_view(my_view, start_column_my_field, start_row_my_field) + show_view(enemy_view, start_column_enemy_field, start_row_enemy_field) + + elif game_mode == GameMode.BATTLE: + window.geometry('1020x640') + + my_view.ship_field.set_field_mode(ShipMode.INACTIVE) + enemy_view.ship_field.set_field_mode(ShipMode.SHOOT) + + lbl_lower_enemy_horizontal.grid_forget() + lbl_lower_horizontal.grid_forget() + + savebutton.grid_forget() + loadbutton.grid_forget() + + start_button.grid_forget() + load_game_button.grid_forget() + exit_button.grid_forget() + + show_view(my_view, start_column_my_field, start_row_my_field) + show_view(enemy_view, start_column_enemy_field, start_row_enemy_field) + + elif game_mode == GameMode.END: + window.geometry('400x280') + + my_view.ship_field.set_field_mode(ShipMode.INACTIVE) + enemy_view.ship_field.set_field_mode(ShipMode.INACTIVE) + + lbl_lower_enemy_horizontal.grid_forget() + lbl_lower_horizontal.grid_forget() + + savebutton.grid_forget() + loadbutton.grid_forget() + + start_button.grid_forget() + load_game_button.grid_forget() + exit_button.grid_forget() + + hide_view(my_view) + hide_view(enemy_view) + + lbl_left_vertical.grid(column=start_column_my_field - 1, row=start_row_my_field) + lbl_center_vertical.grid(column=col_vertical_separator, row=start_row_my_field) + lbl_upper_horizontal.grid(column=start_column_my_field, row=start_row_my_field - 1) + + window = Tk() window.title("Ship Craft!") -window.geometry('1020x540') window.bind_all('', keypress_handler) start_column_my_field = 1 start_row_my_field = 1 - start_column_enemy_field = start_column_my_field + ShipField.field_size + 1 start_row_enemy_field = start_row_my_field - col_vertical_separator = start_column_my_field + ShipField.field_size row_horizontal_separator = start_row_my_field + ShipField.field_size - load_button_row = start_row_my_field + ShipField.field_size + 1 -my_view = create_view(window, start_column_my_field, start_row_my_field) -enemy_view = create_view(window, start_column_enemy_field, start_row_enemy_field) +my_view = create_view(window) +enemy_view = create_view(window) active_view = my_view -if start_column_my_field > 0: - lbl_left_vertical = Label(window, text='', width=5, height=2) - lbl_left_vertical.grid(column=start_column_my_field - 1, row=start_row_my_field) - +lbl_left_vertical = Label(window, text='', width=5, height=2) lbl_center_vertical = Label(window, text='', width=5, height=2) -lbl_center_vertical.grid(column=col_vertical_separator, row=start_row_my_field) - -if start_row_my_field > 0: - lbl_upper_horizontal = Label(window, text='', width=5, height=2) - lbl_upper_horizontal.grid(column=start_column_my_field, row=start_row_my_field - 1) +lbl_upper_horizontal = Label(window, text='', width=5, height=2) lbl_lower_horizontal = Label(window, text='', width=50, height=2, textvariable=my_view.remaining_ships_text) -lbl_lower_horizontal.grid(column=start_column_my_field, row=row_horizontal_separator, columnspan=10) - lbl_lower_enemy_horizontal = Label(window, text='', width=50, height=2, textvariable=enemy_view.remaining_ships_text) -lbl_lower_enemy_horizontal.grid(column=start_column_enemy_field, row=row_horizontal_separator, columnspan=10) savebutton = Button(window, text='Save', width=20, height=2, command=lambda: savebutton_click(my_view)) -savebutton.grid(column=start_column_my_field, row=load_button_row, columnspan=4) - loadbutton = Button(window, text='Load', width=20, height=2, command=lambda: loadbutton_click(my_view)) -loadbutton.grid(column=start_column_my_field + 6, row=load_button_row, columnspan=4) -savebutton_enemy = Button(window, text='Save', width=20, height=2, command=lambda: savebutton_click(enemy_view)) -savebutton_enemy.grid(column=start_column_enemy_field, row=load_button_row, columnspan=4) - -loadbutton_enemy = Button(window, text='Load', width=20, height=2, command=lambda: loadbutton_click(enemy_view)) -loadbutton_enemy.grid(column=start_column_enemy_field + 6, row=load_button_row, columnspan=4) +start_button = Button(window, text='START', width=20, height=2, command=next_game_mode) +load_game_button = Button(window, text='LOAD', width=20, height=2) +exit_button = Button(window, text='EXIT', width=20, height=2) +game_mode = GameMode.MENU +update_game_mode() window.mainloop()