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

177 lines
5.8 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:
return
if col < 0 or col > field_size:
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:
# Теперь нужно проверить, не заблокировано ли какое-то из полей,
for r in range(row, row + ship_size):
if not check_blocked(field, r, col):
return False
return True
return False
if ship_direction == 1:
if field_size - col >= ship_size:
for c in range(col, col + ship_size):
if not check_blocked(field, row, c):
return False
return True
return False
def check_blocked(field, row, col):
# Функция возвращает True, если все клетки вокруг клетки с координатами row, col
# либо находятся за пределами поля, либо в них нет корабля/они пустые
for r in range(row - 1, row + 2):
for c in range(col - 1, col + 2):
if 0 < r < field_size and 0 < c < field_size:
if (field[r * field_size + c]).strip() != '':
return False
return True
window = Tk()
window.title("Ship Craft!")
window.geometry('450x410')
set_ship(1, 1, 4, 1)
set_ship(0, 6, 3, 0)
set_ship(7, 3, 1, 0)
draw_field(window, my_field)
# window.mainloop()
for r in range(0, field_size):
blocked_string = ""
ship_string = ""
for c in range(0, field_size):
blocked_string += str(check_blocked(my_field, r, c))[0] + ", "
ship_string += my_field[r * field_size + c] + ', '
print(blocked_string[:-2] + ' ' + ship_string[:-2])
print("********************************************************************")
for r in range(0, field_size):
possible_string = ""
impossible_string = ""
for c in range(0, field_size):
possible_string += str(check_possible(my_field, r, c))[0] + ", "
impossible_string += my_field[r * field_size + c] + ', '
print(possible_string[:-2] + ' ' + impossible_string[:-2])