diff --git a/HNS/MB/ShipField.py b/HNS/MB/ShipField.py index 5dbe659..e298a8f 100644 --- a/HNS/MB/ShipField.py +++ b/HNS/MB/ShipField.py @@ -43,6 +43,89 @@ class ShipField: return None + def mark_killed(self, row, col): + if row < 0 or row > ShipField.field_size: + return + if col < 0 or col > ShipField.field_size: + return + + self.mark_one_killed(row, col) + + # check vertical + for r in range(row + 1, ShipField.field_size): + if self.check_damaged(r, col): + self.mark_one_killed(r, col) + else: + break + + for r in range(row - 1, -1, -1): + if self.check_damaged(r, col): + self.mark_one_killed(r, col) + else: + break + + # check horizontal + for c in range(col + 1, ShipField.field_size): + if self.check_damaged(row, c): + self.mark_one_killed(row, c) + else: + break + + for c in range(col - 1, - 1, -1): + if self.check_damaged(row, c): + self.mark_one_killed(row, c) + else: + break + + def check_killed(self, row, col): + if row < 0 or row > ShipField.field_size: + return + if col < 0 or col > ShipField.field_size: + return + + # check vertical + for r in range(row + 1, ShipField.field_size): + if self.check_ship(r, col): + return False + + elif self.check_empty(r, col): + break + + for r in range(row - 1, -1, -1): + if self.check_ship(r, col): + return False + + elif self.check_empty(r, col): + break + + # check horizontal + for c in range(col + 1, ShipField.field_size): + if self.check_ship(row, c): + return False + + elif self.check_empty(row, c): + break + + for c in range(col - 1, - 1, -1): + if self.check_ship(row, c): + return False + + elif self.check_empty(row, c): + break + + return True + + def mark_one_killed(self, row, col): + self.field[row * ShipField.field_size + col] = 'X' + for r in range(row - 1, row + 2): + if r < 0 or r > ShipField.field_size: + break + for c in range(col - 1, col + 2): + if c < 0 or c > ShipField.field_size: + break + if self.check_empty(r, c): + self.field[r * ShipField.field_size + c] = '0' + def action(self, row, col): self.clear_marker() @@ -55,6 +138,10 @@ class ShipField: elif self.field_mode == ShipMode.SHOOT: shoot_result = self.shoot(row, col) + + if shoot_result == ShootResult.KILLED: + self.mark_killed(row, col) + return shoot_result == ShootResult.EMPTY return False @@ -175,6 +262,8 @@ class ShipField: return ShootResult.EMPTY elif (self.field[index]).strip() == "1": self.field[index] = "\\" + if self.check_killed(row, col): + return ShootResult.KILLED return ShootResult.DAMAGED else: return ShootResult.UNDEFINED @@ -182,6 +271,13 @@ class ShipField: def check_ship(self, row, col): return self.field[row * ShipField.field_size + col].strip() == '1' + def check_damaged(self, row, col): + return self.field[row * ShipField.field_size + col].strip() == '\\' + + def check_empty(self, row, col): + cell = self.field[row * ShipField.field_size + col].strip() + return cell == '0' or cell == '' + def check_end(self): return '1' not in self.field diff --git a/HNS/MB/default.json b/HNS/MB/default.json new file mode 100644 index 0000000..187374d --- /dev/null +++ b/HNS/MB/default.json @@ -0,0 +1 @@ +{"shipField": {"field": [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "1", "", "", " ", "1", "", "1", " ", " ", " ", "1", "", "", " ", "1", "", "1", " ", " ", " ", "1", "", "", " ", "1", "", "1", " ", "", " ", "1", "", "", " ", "", " ", " ", " ", " ", "", " ", "", "1", "1", "", "1", "1", "", " ", "1", "1", "", "", "", " ", "", " ", "", " ", "", "", "", "", " ", " ", " ", " ", "", " ", "", "1", "", "1", " ", "1", " ", "1", " ", " ", " ", " ", "", "", " ", " ", " ", " ", " ", " "], "ships": [], "field_mode": "PUT", "ship_size": 2, "ship_direction": "HORIZONTAL"}} \ No newline at end of file diff --git a/HNS/MB/main.py b/HNS/MB/main.py index 712c4fc..ffd9e89 100644 --- a/HNS/MB/main.py +++ b/HNS/MB/main.py @@ -49,6 +49,8 @@ def colorize(view): bg = 'pink' if field.field[i] == "\\": bg = 'grey' + if field.field[i] == "X": + bg = 'red' if field.field[i] == "0": bg = 'black' if field.field[i] == "p": @@ -80,7 +82,7 @@ def left_button_click(view, row, col): # Ход соперника enemy_shoot_result = ShootResult.UNDEFINED while enemy_shoot_result != ShootResult.EMPTY: - my_row = random.randint(0, ShipField.field_size) + my_row = random.randint(0, ShipField.field_size - 1) my_col = random.randint(0, ShipField.field_size - 1) enemy_shoot_result = my_view.ship_field.shoot(my_row, my_col) @@ -161,6 +163,8 @@ def next_game_mode(): game_mode = GameMode.BATTLE elif game_mode == GameMode.BATTLE: game_mode = GameMode.END + elif game_mode == GameMode.END: + game_mode = GameMode.MENU update_game_mode() @@ -179,6 +183,7 @@ def update_game_mode(): savebutton.grid_forget() loadbutton.grid_forget() + start_button.configure(text="START") 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) @@ -189,6 +194,9 @@ def update_game_mode(): elif game_mode == GameMode.PLAN: window.geometry('1020x640') + my_view.ship_field = ShipField() + enemy_view.ship_field = ShipField() + load_field(enemy_view, "default.json") my_view.ship_field.set_field_mode(ShipMode.PUT) @@ -200,6 +208,7 @@ def update_game_mode(): 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.configure(text="START") start_button.grid(column=start_column_my_field, row=load_button_row + 1, columnspan=4) load_game_button.grid_forget() exit_button.grid_forget() @@ -238,7 +247,8 @@ def update_game_mode(): savebutton.grid_forget() loadbutton.grid_forget() - start_button.grid_forget() + start_button.configure(text="BACK TO MENU") + start_button.grid(column=start_column_enemy_field, row=load_button_row, columnspan=4) load_game_button.grid_forget() exit_button.grid_forget()