Lesson results commit

This commit is contained in:
Artur Savitskiy 2024-06-10 22:20:20 +02:00
parent 209150d624
commit 2c11d6d0dc
3 changed files with 58 additions and 18 deletions

View File

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

View File

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

View File

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