Lesson results commit

This commit is contained in:
Artur Savitskiy 2024-07-16 11:40:41 +02:00
parent 2c11d6d0dc
commit 0220d839e2
3 changed files with 109 additions and 2 deletions

View File

@ -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

1
HNS/MB/default.json Normal file
View File

@ -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"}}

View File

@ -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()