Lesson results commit
This commit is contained in:
parent
209150d624
commit
2c11d6d0dc
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue