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) self.set_ship(row, col)
elif self.field_mode == ShipMode.SHOOT: 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): def target(self, row, col):
self.clear_marker() self.clear_marker()
@ -179,6 +182,9 @@ class ShipField:
def check_ship(self, row, col): def check_ship(self, row, col):
return self.field[row * ShipField.field_size + col].strip() == '1' 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): def check_possible(self, row, col):
if self.ship_direction == ShipDirection.VERTICAL: if self.ship_direction == ShipDirection.VERTICAL:
if ShipField.field_size - row >= self.ship_size: if ShipField.field_size - row >= self.ship_size:

View File

@ -3,7 +3,9 @@ from tkinter import StringVar
class ShipView: class ShipView:
def __init__(self, ship_field, buttons): def __init__(self, ship_field, buttons, enemy):
self.ship_field = ship_field self.ship_field = ship_field
self.buttons = buttons self.buttons = buttons
self.remaining_ships_text = StringVar() self.remaining_ships_text = StringVar()
self.enemy = enemy
self.active = False

View File

@ -1,17 +1,19 @@
import json import json
import os import os
import random
from tkinter import filedialog from tkinter import filedialog
from tkinter import * from tkinter import *
from ShootResult import ShootResult
from ShipField import ShipField from ShipField import ShipField
from ShipView import ShipView from ShipView import ShipView
from ShipMode import ShipMode from ShipMode import ShipMode
from GameMode import GameMode from GameMode import GameMode
def create_view(window): def create_view(window, enemy):
field = ShipField() field = ShipField()
buttons = [] buttons = []
view = ShipView(field, buttons) view = ShipView(field, buttons, enemy)
for r in range(0, field.field_size): for r in range(0, field.field_size):
for c 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 field = view.ship_field
for i in range(len(field.field)): for i in range(len(field.field)):
bg = "white" bg = "white"
if field.field[i] == "1": if field.field[i] == "1" and not view.enemy:
bg = 'pink' bg = 'pink'
if field.field[i] == "\\": if field.field[i] == "\\":
bg = 'grey' bg = 'grey'
@ -53,7 +55,7 @@ def colorize(view):
bg = 'blue' bg = 'blue'
if field.field[i] == "r": if field.field[i] == "r":
bg = 'red' bg = 'red'
if "+" in field.field[i]: if "+" in field.field[i] and view.enemy:
bg = 'orange' bg = 'orange'
view.buttons[i].configure(bg=bg) view.buttons[i].configure(bg=bg)
@ -62,13 +64,36 @@ def colorize(view):
def keypress_handler(e): def keypress_handler(e):
global active_view
if e.keysym.isnumeric(): 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): 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) colorize(view)
@ -78,16 +103,18 @@ def right_button_click(view):
def button_enter(view, row, col): def button_enter(view, row, col):
global active_view if view.enemy:
active_view = view 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() enemy_view.ship_field.clear_marker()
my_view.ship_field.target(row, col) my_view.ship_field.target(row, col)
elif view == enemy_view: enemy_view.active = False
my_view.ship_field.clear_marker() my_view.active = True
enemy_view.ship_field.target(row, col)
colorize(my_view) colorize(my_view)
colorize(enemy_view) colorize(enemy_view)
@ -104,6 +131,10 @@ def savebutton_click(view):
def loadbutton_click(view): def loadbutton_click(view):
file_path = filedialog.askopenfilename(filetypes=[("JSON files", "*.json")]) 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): if os.path.isfile(file_path):
with open(file_path) as lines: with open(file_path) as lines:
view.ship_field.from_json(json.load(lines)["shipField"]) view.ship_field.from_json(json.load(lines)["shipField"])
@ -158,6 +189,8 @@ def update_game_mode():
elif game_mode == GameMode.PLAN: elif game_mode == GameMode.PLAN:
window.geometry('1020x640') window.geometry('1020x640')
load_field(enemy_view, "default.json")
my_view.ship_field.set_field_mode(ShipMode.PUT) my_view.ship_field.set_field_mode(ShipMode.PUT)
enemy_view.ship_field.set_field_mode(ShipMode.INACTIVE) 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 row_horizontal_separator = start_row_my_field + ShipField.field_size
load_button_row = start_row_my_field + ShipField.field_size + 1 load_button_row = start_row_my_field + ShipField.field_size + 1
my_view = create_view(window) my_view = create_view(window, False)
enemy_view = create_view(window) enemy_view = create_view(window, True)
active_view = my_view
lbl_left_vertical = Label(window, text='', width=5, height=2) lbl_left_vertical = Label(window, text='', width=5, height=2)
lbl_center_vertical = Label(window, text='', width=5, height=2) lbl_center_vertical = Label(window, text='', width=5, height=2)