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)
Python
Задача питон помогите срочно
помогите доделать задачу чтобы рыцарь не выходил за рамки( нельзя было уйти слишком много наверх)
Эх, зачем на курсы записался, если все скатываешь? Держи и с рамками и с осью х:
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)
Виктор Приходько
А вообще, бро, советую тебе подружиться с однокурсниками и спрашивать у них. И на что тебе куратор и учитель? И какой смысл твоего «обучения»?
Evgeny Votanovcky
" все скатываешь"?!, данный материал не понятен не только мне, и я часто выкладываю вопросы о заданиях с максимума?! зачем говорить когда не знаешь? мне не понетен материал и япрошу помощи других
Anton Karnauhov
game() забыл, окно чистое
Ну правильно, у вас по кнопке дёргается метод рыцаря, и без всяких проверок он идёт, куда захочет.
Надо, чтоб была сатурация, т.е. кол-во клеток для движения урезалось до оставшихся свободных до края поля.
Можно вкрутить эту логику в самого рыцаря, это колхоз, но работать будет.
Можно сделать контроллер, методы которого привязываются к кнопкам, а контроллер знает о поле и о рыцаре и вычисляет, на сколько легитимно можно подвинуться, и как реагировать на ошибку (например, как в варкрафте 3-м: "и почему я не генерал? щёлкать я тоже умею") и т. п.
Я бы рекомендовал второй вариант.
К примеру:
Надо, чтоб была сатурация, т.е. кол-во клеток для движения урезалось до оставшихся свободных до края поля.
Можно вкрутить эту логику в самого рыцаря, это колхоз, но работать будет.
Можно сделать контроллер, методы которого привязываются к кнопкам, а контроллер знает о поле и о рыцаре и вычисляет, на сколько легитимно можно подвинуться, и как реагировать на ошибку (например, как в варкрафте 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)
А контроллер будет проверять границы и обновлять не только координату, но и скорость. Можно делать, чтоб рыцарь останавливался у границы или рикошетировал от неё.
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
почему-то заходит за границы(
Похожие вопросы
- Задача питон. Помогите решить,пожалуйста
- Решить две задачи на питоне. Помогите пожалуйста
- ПОЖАЛУЙСТА, ПОМОГИТЕ, С ЭТОЙ ЗАДАЧЕЙ. ПИТОН.
- ЗАДАЧА ПО ПИТОНУ ПОМОГИТЕ ПЖ
- Помогите пожалуйста с задачей Питон
- Сложная задача. питон
- Информатика дз на языке питон, помогите пж
- Решить задачу питон
- Програмирование питон тэст срочно
- Помогите срочно решить эту задачу