hnc-eduard/HNS/Excercises/ShipCraft/main.py

166 lines
5.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from tkinter import *
from enum import Enum
import math
buttons = []
field_size = 10
ship_size = 4
ship_direction = 0
empty_field = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
my_field = list(empty_field)
enemy_field = list(empty_field)
# 1. Определите перечисление (Enum) ShootResult со следующими значениями:
# EMPTY (мимо), DAMAGED (ранен), KILLED (убит), UNDEFINED (действие не определено)
class ShootResult(Enum):
EMPTY = "EMPTY"
DAMAGED = "DAMAGED"
KILLED = "KILLED"
UNDEFINED = "UNDEFINED"
def set_ship(row, col, size, direction):
if row < 0 or row > field_size - 1:
return
if col < 0 or col > field_size - 1:
return
index = row * field_size + col
if direction == 0:
if field_size - row < size:
return
for r in range(row, row + size):
index = r * field_size + col
my_field[index] = "1"
if direction == 1:
if field_size - col < size:
return
for c in range(col, col + size):
index = row * field_size + c
my_field[index] = "1"
def shoot(field, row, col):
if row < 0 or row > field_size - 1:
return ShootResult.UNDEFINED
if col < 0 or col > field_size - 1:
return ShootResult.UNDEFINED
index = row * field_size + col
if (field[index]).strip() == "":
field[index] = "0"
return ShootResult.EMPTY
elif (field[index]).strip() == "1":
field[index] = "\\"
return ShootResult.DAMAGED
else:
return ShootResult.UNDEFINED
def draw_field(window, field):
for r in range(0, field_size):
for c in range(0, field_size):
index = r * field_size + c
bg = 'white'
if field[index] == "1":
bg = 'pink'
btn = Button(window, text='', bg=bg, width=5, height=2)
btn.grid(column=c, row=r)
btn.bind('<Button-1>', lambda e, x=r, y=c: button_click(field, x, y))
btn.bind('<Enter>', lambda e, x=r, y=c: button_enter(field, x, y))
buttons.append(btn)
def colorize(field, buttons):
for i in range(len(field)):
bg = "white"
if field[i] == "1":
bg = 'pink'
if field[i] == "\\":
bg = 'red'
if field[i] == "0":
bg = 'black'
buttons[i].configure(bg=bg)
def button_click(field, row, col):
shoot(field, row, col)
colorize(field, buttons)
def button_enter(field, row, col):
if ship_direction == 0:
if field_size - row < ship_size:
print("Not OK")
return
if ship_direction == 1:
if field_size - col < ship_size:
print("Not OK")
return
print("OK")
def check_possible(field, row, col):
# Функция должна возвращать True, если можно поставить сюда корабль,
# в противном случае - False
if ship_direction == 0:
if field_size - row >= ship_size:
if check_blocked(field, row, col):
# Здесь мы знаем, что корабль помещается на поле.
# Теперь нужно проверить, не заблокировано ли какое-то из полей,
# на которые мы хотим поставить корабль.
# Для этого, всего поля, на которые мы его поставили бы исходя из координат row, col
# нужно проверить с помощью вызова метода check_blocked(...)
return True
if ship_direction == 1:
if field_size - col >= ship_size:
if check_blocked(field, row, col):
# Теперь нужно проверить, не заблокировано ли какое-то из полей,
# на которые мы хотим поставить корабль.
# Для этого, всего поля, на которые мы его поставили бы исходя из координат row, col
# нужно проверить с помощью вызова метода check_blocked(...)
return True
return False
def check_blocked(field, row, col):
# Функция возвращает True, если все клетки вокруг клетки с координатами row, col
# либо находятся за пределами поля, либо в них нет корабля/они пустые
index = row * 10 + col
if abs(row) > field_size + 1 or abs(col) > field_size + 1:
return True
elif (field[index]).strip() == "":
return True
# Во всех других случаях, функция возвращает False
else:
return False
window = Tk()
window.title("Ship Craft!")
window.geometry('450x410')
# set_ship(1, 1, 4, 1)
# set_ship(0, 6, 3, 0)
# set_ship(9, 9, 1, 0)
# set_ship(0, 0, 1, 0)
# set_ship(9, 0, 1, 0)
# set_ship(9, 2, 4, 1)
# draw_field(window, my_field)
# window.mainloop()
print(check_possible(my_field, 0, 0))