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