hnc-artur/HNS/MB/main.py

224 lines
6.3 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 ShootResult import ShootResult
from FieldMode import FieldMode
field_size = 10
mode = FieldMode.Placing
ship_size = 4
ship_direction = 0
empty_field = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
my_field = list(empty_field)
enemy_field = list(empty_field)
buttons = []
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
value = (field[index]).strip()
if value == '':
field[index] = '0'
return ShootResult.Empty
elif value == '1':
field[index] = '\\'
return ShootResult.Damaged
return ShootResult.Undefined
def set_ship(field, row, col, size, direction):
# 0. Проверка стартовой точки (находится ли в поле)
if row < 0 or row > field_size - 1:
return
if col < 0 or col > field_size - 1:
return
# 1. Нахождение стартовой точки
index = row * field_size + col
# 2. Определяем направление и в зависимости от него
# 2.1 Если вниз - то сравниваем размер поля (field_size=10) - row и size (field_size - row > size или row + size < field_size)
if direction == 0:
if field_size - row < size:
# 3. Если не помещается, то корабль не ставим
return
# 4. А если помещается - ставим корабль, т.е. (row,col) до (row+size,col) заполняем единичками
for r in range(row, row + size):
index = r * field_size + col
field[index] = '1'
# 2.2 Если вправо - то сравниваем field_size - col и size (field_size - col > size или col + size < field_size)
if direction == 1:
if field_size - col < size:
# 3. Если не помещается, то корабль не ставим
return
# 4. А если помещается - ставим корабль, т.е. (row,col) до (row,col+size) заполняем единичками
for c in range(col, col + size):
index = row * field_size + c
field[index] = '1'
def draw_field(window, field):
for r in range(0, field_size):
for c in range(0, field_size):
btn = Button(window, text="", bg='white', width=5, height=2)
btn.grid(column=c, row=r)
btn.bind('<Enter>', lambda e, row=r, col=c: button_hover(my_field, row, col))
btn.bind('<Button-1>', lambda e, x=r, y=c: button_action(my_field, x, y))
btn.bind('<Button-3>', rotate_ship)
buttons.append(btn)
def rotate_ship(e):
global ship_direction
if ship_direction == 0:
ship_direction = 1
else:
ship_direction = 0
def button_hover(field, row, col):
clear_placing(field)
place_ship(field, row, col, ship_size, ship_direction)
colorize(field)
def clear_placing(field):
for r in range(0, field_size):
for c in range(0, field_size):
index = r*field_size+c
if field[index] == 'p':
field[index] = ''
def place_ship(field, row, col, size, direction):
blocked = False
if row < 0 or row > field_size - 1:
return
if col < 0 or col > field_size - 1:
return
if direction == 0:
if field_size - row < size:
return
for r in range(row, row + size):
if check_blocked(field, r, col):
blocked = True
break
if not blocked:
for r in range(row, row + size):
field[r * field_size + col] = 'p'
if direction == 1:
if field_size - col < size:
return
for c in range(col, col + size):
if check_blocked(field, row, c):
blocked = True
break
if not blocked:
for c in range(col, col + size):
field[row * field_size + c] = 'p'
def check_blocked(field, row, col):
for r in range(row-1, row+2):
for c in range(col-1, col+2):
if r < 0 or r > field_size - 1:
continue
if c < 0 or c > field_size - 1:
continue
if (field[r*field_size + c]).strip() != '':
return True
return False
def colorize(field):
for r in range(0, field_size):
for c in range(0, field_size):
index = r*field_size+c
btn = buttons[index]
bg = 'white'
if field[index] == '1':
bg = 'pink'
elif field[index] == '\\':
bg = 'red'
elif field[index] == '0':
bg = 'black'
elif field[index] == 'p':
bg = 'blue'
btn.configure(bg=bg)
def button_action(field, row, col):
if mode == FieldMode.Enemy:
shoot(field, row, col)
colorize(field)
elif mode == FieldMode.Friendly:
colorize(field)
elif mode == FieldMode.Placing:
set_ship(field, row, col, ship_size, ship_direction)
def keypress_handler(e):
global ship_size
if e.keysym in '1234':
ship_size = int(e.keysym)
window = Tk()
window.title("Ship Craft!")
window.geometry('450x410')
window.bind_all('<KeyPress>', keypress_handler)
#set_ship(my_field, 1, 1, 4, 1)
#set_ship(my_field, 0, 6, 3, 0)
#set_ship(my_field, 9, 9, 1, 0)
#set_ship(my_field, 0, 0, 1, 0)
#set_ship(my_field, 9, 0, 1, 0)
#set_ship(my_field, 9, 2, 4, 1)
draw_field(window, my_field)
colorize(my_field)
window.mainloop()