Python

Задача питон помогите срочно

помогите доделать задачу чтобы рыцарь не выходил за рамки( нельзя было уйти слишком много наверх)
 from tkinter import * 
import random

window = Tk()

w = 600
h = 600

window.geometry(str(w) + 'x' + str(h))

# Холст для отрисовки игрового поля
canvas = Canvas(window, width=w, height=h)
canvas.place(in_=window, x=0, y=0)

# Фон для игры
bg_photo = PhotoImage(file='bg_2.png')

# Персонаж
class Knight:
def __init__(self):
self.x = 70
self.y = h // 2
self.v = 0
self.photo = PhotoImage(file='knight.png')
# Движение
def up(self, event):
self.v = -3

def down(self, event):
self.v = 3

def stop(self, event):
self.v = 0

# Дракон
class Dragon:
def __init__(self):
self.x = 750
self.y = random.randint(100, 500)
self.v = random.randint(1,3)
self.photo = PhotoImage(file='dragon.png')

knight = Knight()

dragons = []
for i in range(3):
dragons.append(Dragon())

def game():
canvas.delete('all')
canvas.create_image(300,300, image=bg_photo)
canvas.create_image(knight.x,knight.y,image=knight.photo)
knight.y += knight.v
#print( knight.v)

current_dragon = 0
dragon_to_kill = -1

for dragon in dragons:
dragon.x -= dragon.v
canvas.create_image(dragon.x,dragon.y,image=dragon.photo)
# Проверка столкновений
if ((dragon.x-knight.x)**2) + ((dragon.y - knight.y)**2)
Evgeny Votanovcky
Evgeny Votanovcky
223
Эх, зачем на курсы записался, если все скатываешь? Держи и с рамками и с осью х:
 from tkinter import * 
import random

window = Tk()
w = 600
h = 600
window.geometry(f'{w}x{h}')

canvas = Canvas(window, width=w, height=h)
canvas.place(in_=window, x=0, y=0)
bg_photo = PhotoImage(file='bg_2.png')



class Knight:

def __init__(self):
self.x = 70
self.y = h // 2
self.v = 0
self.v_x = 0
self.photo = PhotoImage(file='cat.png')

def up(self, event):
self.v = -3

def down(self, event):
self.v = +3

def right(self, event):
self.v_x = +3

def left(self, event):
self.v_x = -3

def stop_all(self, event):
self.v = 0
self.v_x = 0


class Dragon:
def __init__(self):
self.x = random.randint(700, 1500)
self.y = random.randint(100, 500)
self.v = random.randint(1, 3)
self.photo = PhotoImage(file='dragon.png')


knight = Knight()
dragons = []
for i in range(10):
dragons.append(Dragon())


def game():
canvas.delete('all')
canvas.create_image(h // 2, w // 2, image=bg_photo)
canvas.create_image(knight.x, knight.y, image=knight.photo)
knight.y += knight.v
knight.x += knight.v_x
canvas.create_image(knight.x, knight.y, image=knight.photo)
kill_dragon = -1
for i, dragon in enumerate(dragons):
dragon.x -= dragon.v
canvas.create_image(dragon.x, dragon.y, image=dragon.photo)

if ((dragon.x - knight.x) ** 2 + (dragon.y - knight.y) ** 2)
Виктор Приходько
Виктор Приходько
254
Лучший ответ
Виктор Приходько А вообще, бро, советую тебе подружиться с однокурсниками и спрашивать у них. И на что тебе куратор и учитель? И какой смысл твоего «обучения»?
Evgeny Votanovcky " все скатываешь"?!, данный материал не понятен не только мне, и я часто выкладываю вопросы о заданиях с максимума?! зачем говорить когда не знаешь? мне не понетен материал и япрошу помощи других
Anton Karnauhov game() забыл, окно чистое
Ну правильно, у вас по кнопке дёргается метод рыцаря, и без всяких проверок он идёт, куда захочет.

Надо, чтоб была сатурация, т.е. кол-во клеток для движения урезалось до оставшихся свободных до края поля.

Можно вкрутить эту логику в самого рыцаря, это колхоз, но работать будет.

Можно сделать контроллер, методы которого привязываются к кнопкам, а контроллер знает о поле и о рыцаре и вычисляет, на сколько легитимно можно подвинуться, и как реагировать на ошибку (например, как в варкрафте 3-м: "и почему я не генерал? щёлкать я тоже умею") и т. п.

Я бы рекомендовал второй вариант.

К примеру:
 class Controller:
def __init__(self, knight: Knight):
self.knight = knight

def up(self, event):
if self.knight.y = w:
# тут можно ругаться, например, звуковым сигналом
self.knight.down(self, min(w - self.knight.y, 3))
А рыцарю вместо event передавать кол-во единиц для смещения.
 class Knight:
def __init__(self):
self.x = 70
self.y = h // 2
self.v = 0
self.photo = PhotoImage(file='knight.png')
# Движение
def up(self, v: int):
self.v = -v

def down(self, v: int):
self.v = v
И само движение тоже проводить через контроллер. Вместо knight.y += knight.v вызывать
 controller.move(knight.v) 
А контроллер будет проверять границы и обновлять не только координату, но и скорость. Можно делать, чтоб рыцарь останавливался у границы или рикошетировал от неё.
DV
Denis Vackulenko
54 053
Evgeny Votanovcky а как сделать так чтобы этого не было?
Evgeny Votanovcky а куда это вставлять?
Evgeny Votanovcky по чему-то он все равно может идти наверх
Evgeny Votanovcky AttributeError: type object 'Controller' has no attribute 'move'
Evgeny Votanovcky вы можете помочь?
 # Персонаж
class Knight:
def __init__(self):
self.x = 70
self.y = h // 2
self.v = 0
self.photo = PhotoImage(file='knight.png')
# Движение
def up(self, event):
self.v = -3

def down(self, event):
self.v = 3

def stop(self, event):
self.v = 0
# Ограничение
def check_height(self):
if self.y > h:
self.y = h
Evgeny Votanovcky ОГРОМНОЕ СПАСИБО!а как добавить рыцарю движение по оси x пожалуйста помогите!
Evgeny Votanovcky почему-то заходит за границы(