From 2c11d6d0dc3444681847cbca7c0f329b6f253e3d Mon Sep 17 00:00:00 2001 From: Artur Savitskiy Date: Mon, 10 Jun 2024 22:20:20 +0200 Subject: [PATCH] Lesson results commit --- HNS/MB/ShipField.py | 8 +++++- HNS/MB/ShipView.py | 4 ++- HNS/MB/main.py | 64 +++++++++++++++++++++++++++++++++------------ 3 files changed, 58 insertions(+), 18 deletions(-) diff --git a/HNS/MB/ShipField.py b/HNS/MB/ShipField.py index 26f3b91..5dbe659 100644 --- a/HNS/MB/ShipField.py +++ b/HNS/MB/ShipField.py @@ -54,7 +54,10 @@ class ShipField: self.set_ship(row, col) elif self.field_mode == ShipMode.SHOOT: - self.shoot(row, col) + shoot_result = self.shoot(row, col) + return shoot_result == ShootResult.EMPTY + + return False def target(self, row, col): self.clear_marker() @@ -179,6 +182,9 @@ class ShipField: def check_ship(self, row, col): return self.field[row * ShipField.field_size + col].strip() == '1' + def check_end(self): + return '1' not in self.field + def check_possible(self, row, col): if self.ship_direction == ShipDirection.VERTICAL: if ShipField.field_size - row >= self.ship_size: diff --git a/HNS/MB/ShipView.py b/HNS/MB/ShipView.py index eab26e2..d79704a 100644 --- a/HNS/MB/ShipView.py +++ b/HNS/MB/ShipView.py @@ -3,7 +3,9 @@ from tkinter import StringVar class ShipView: - def __init__(self, ship_field, buttons): + def __init__(self, ship_field, buttons, enemy): self.ship_field = ship_field self.buttons = buttons self.remaining_ships_text = StringVar() + self.enemy = enemy + self.active = False diff --git a/HNS/MB/main.py b/HNS/MB/main.py index d92b2bc..712c4fc 100644 --- a/HNS/MB/main.py +++ b/HNS/MB/main.py @@ -1,17 +1,19 @@ import json import os +import random from tkinter import filedialog from tkinter import * +from ShootResult import ShootResult from ShipField import ShipField from ShipView import ShipView from ShipMode import ShipMode from GameMode import GameMode -def create_view(window): +def create_view(window, enemy): field = ShipField() buttons = [] - view = ShipView(field, buttons) + view = ShipView(field, buttons, enemy) for r in range(0, field.field_size): for c in range(0, field.field_size): @@ -43,7 +45,7 @@ def colorize(view): field = view.ship_field for i in range(len(field.field)): bg = "white" - if field.field[i] == "1": + if field.field[i] == "1" and not view.enemy: bg = 'pink' if field.field[i] == "\\": bg = 'grey' @@ -53,7 +55,7 @@ def colorize(view): bg = 'blue' if field.field[i] == "r": bg = 'red' - if "+" in field.field[i]: + if "+" in field.field[i] and view.enemy: bg = 'orange' view.buttons[i].configure(bg=bg) @@ -62,13 +64,36 @@ def colorize(view): def keypress_handler(e): - global active_view + if e.keysym.isnumeric(): - active_view.ship_field.set_ship_size(int(e.keysym)) + if my_view.active: + my_view.ship_field.set_ship_size(int(e.keysym)) + elif enemy_view.active: + enemy_view.ship_field.set_ship_size(int(e.keysym)) def left_button_click(view, row, col): - view.ship_field.action(row, col) + + action_result = view.ship_field.action(row, col) + + if action_result and view.enemy and game_mode == GameMode.BATTLE: + # Ход соперника + enemy_shoot_result = ShootResult.UNDEFINED + while enemy_shoot_result != ShootResult.EMPTY: + my_row = random.randint(0, ShipField.field_size) + my_col = random.randint(0, ShipField.field_size - 1) + + enemy_shoot_result = my_view.ship_field.shoot(my_row, my_col) + if game_mode == GameMode.BATTLE and my_view.ship_field.check_end(): + next_game_mode() + return + + colorize(my_view) + + if game_mode == GameMode.BATTLE and view.ship_field.check_end(): + next_game_mode() + return + colorize(view) @@ -78,16 +103,18 @@ def right_button_click(view): def button_enter(view, row, col): - global active_view - active_view = view + if view.enemy: + my_view.ship_field.clear_marker() + enemy_view.ship_field.target(row, col) - if view == my_view: + enemy_view.active = True + my_view.active = False + else: enemy_view.ship_field.clear_marker() my_view.ship_field.target(row, col) - elif view == enemy_view: - my_view.ship_field.clear_marker() - enemy_view.ship_field.target(row, col) + enemy_view.active = False + my_view.active = True colorize(my_view) colorize(enemy_view) @@ -104,6 +131,10 @@ def savebutton_click(view): def loadbutton_click(view): file_path = filedialog.askopenfilename(filetypes=[("JSON files", "*.json")]) + load_field(view, file_path) + + +def load_field(view, file_path): if os.path.isfile(file_path): with open(file_path) as lines: view.ship_field.from_json(json.load(lines)["shipField"]) @@ -158,6 +189,8 @@ def update_game_mode(): elif game_mode == GameMode.PLAN: window.geometry('1020x640') + load_field(enemy_view, "default.json") + my_view.ship_field.set_field_mode(ShipMode.PUT) enemy_view.ship_field.set_field_mode(ShipMode.INACTIVE) @@ -229,9 +262,8 @@ 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) -enemy_view = create_view(window) -active_view = my_view +my_view = create_view(window, False) +enemy_view = create_view(window, True) lbl_left_vertical = Label(window, text='', width=5, height=2) lbl_center_vertical = Label(window, text='', width=5, height=2)