Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 8, 2016 11:31:16

artouro
Зарегистрирован: 2016-08-08
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите отладить программу на Python 3.5

Помогите, пожалуйста, отредактировать и отладить программу на Python 3.5 , непонятно почему выдаёт ошибки в функции show_score . Текст программы тут:

 from tkinter import *
HEIGHT = 500
WIDTH = 800
window = Tk()
window.title('Bubble Blaster')
c = Canvas(window, width=WIDTH, height=HEIGHT, bg='darkblue')
c.pack()
ship_id = c.create_polygon(5, 5, 5, 25, 30, 15, fill='red')
ship_id2 = c.create_oval(0, 0, 30, 30, outline='red')
SHIP_R = 15
MID_X = WIDTH / 2
MID_Y = HEIGHT / 2
c.move(ship_id, MID_X, MID_Y)
c.move(ship_id2, MID_X, MID_Y)
SHIP_SPD = 10
def move_ship(event):
    if event.keysym == 'Up':
        c.move(ship_id, 0, -SHIP_SPD)
        c.move(ship_id2, 0, -SHIP_SPD)
    elif event.keysym == 'Down':
        c.move(ship_id, 0, SHIP_SPD)
        c.move(ship_id2, 0, SHIP_SPD)
    elif event.keysym == 'Left':
        c.move(ship_id, -SHIP_SPD, 0)
        c.move(ship_id2, -SHIP_SPD, 0)
    elif event.keysym == 'Right':
        c.move(ship_id, SHIP_SPD, 0)
        c.move(ship_id2, SHIP_SPD, 0)
c.bind_all('<Key>', move_ship)
from random import randint
bub_id = list()
bub_r = list()
bub_speed = list()
MIN_BUB_R = 10
MAX_BUB_R = 30
MAX_BUB_SPD = 10
GAP = 100
def create_bubble():
    x = WIDTH + GAP
    y = randint(0, HEIGHT)
    r = randint(MIN_BUB_R, MAX_BUB_R)
    id1 = c.create_oval(x - r, y - r, x + r, y + r, outline = 'white')
    bub_id.append(id1)
    bub_r.append(r)
def move_bubbles():
    for i in range(len(bub_id)):
        c.move(bub_id[i], -bub_speed[i], 0)
def del_bubble(i):
    del bub_r[i]
    del bub_speed[i]
    c.delete(bub_id[i])
    del bub_id[i]
def clean_up_bubs():
    for i in range(len(bub_id)-1, -1, -1):
        x, y = get_coords(bub_id[i])
        if x < -GAP:
            del_bubble(i)
from math import sqrt
def distance (id1, id2):
    x1, y1 = get_coords(id1)
    x2, y2 = get_coords(id2)
    return sqrt((x2-x1)**2 + (y2-y1)**2)
def collision():
    points = 0
    for bub in range (len(bub_id)-1, -1, -1):
        if distance(ship_id2, bub_id[bub]) < (SHIP_R + bub_r[bub]):
            points += (bub_r[bub] + bub_speed[bub])
            del_bubble(bub)
    return points
c.create_text(50, 30, text='TIME', fill='white' )
c.create_text(150, 30, text='SCORE', fill='white' )
time_text = c.create_text(50, 50, fill='white' )
score_text = c.create_text(150, 50, fill='white' )
def show_score(score):
    c.interconfig(score_text, text=str(score))
def show_time(time_left):
    c.interconfig(time_text, text=str(time_left))
from time import sleep, time
BUB_CHANCE = 10
TIME_LIMIT = 30
BONUS_SCORE = 1000
bonus = 0
end = time() + TIME_LIMIT
score = 0
#MAIN GAME LOOP
while time() < end:
    if randint(1, BUB_CHANCE) == 1:
        create_bubble()
    move_bubbles()
    clean_up_bubs()
    score += collision()
    if (int(score / BONUS_SCORE)) > bonus:
        bonus += 1
        end += TIME_LIMIT
    show_score(score)
    show_time(int(end - time()))
    window.update()
    sleep(0.01)
def get_coords(id_num):
    pos = c.coords(id_num)
    x = (pos[0] + pos[2])/2
    y = (pos[1] + pos[3])/2
    return x, y
from math import sqrt
def distance(id1, id2):
    x1, y1 = get_coords(id1)
    x2, y2 = get_coords(id2)
    return sqrt((x2 - x1)**2 + (y2 - y1)**2)
c.create_text(MID_X, MID_Y, \
    text='GAME OVER', fill='white', font=('Helvetica', 30))
c.create_text(MID_X, MID_Y + 30, \
    text='Score:'+str(score), fill='white')
c.create_text(MID_X, MID_Y + 45, \
    text='Bonus time:'+ str(bonus*TIME_LIMIT), fill='white'

Офлайн

#2 Авг. 8, 2016 23:23:03

XoFfiCEr
От:
Зарегистрирован: 2011-06-05
Сообщения: 50
Репутация: +  1  -
Профиль   Отправить e-mail  

Помогите отладить программу на Python 3.5

Ну все правильно
AttributeError: ‘Canvas’ object has no attribute ‘interconfig’
Похоже вы перепутали с itemconfig
Исправьте artouro и перезапустите.



Офлайн

#3 Авг. 10, 2016 13:37:58

artouro
Зарегистрирован: 2016-08-08
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите отладить программу на Python 3.5

Да, спасибо, эту ошибку исправил, но теперь ошибка при первомже вызове функции движения пузырей move_bubbles() в главном цикле строке 89 почему-то когда индекс списка вначале вроде должен быть i = 0 почему-то сразу оказывается
c.move(bub_id, -bub_speed, 0)
IndexError: list index out of range

Офлайн

#4 Авг. 10, 2016 17:15:20

artouro
Зарегистрирован: 2016-08-08
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите отладить программу на Python 3.5

Получилось! правда, эмпирическим путём, присвоением начальных значений переменным(печатаются для отладки). Что можно улучшить в этой игре?

 from tkinter import *
HEIGHT = 500
WIDTH = 800
window = Tk()
window.title('Bubble Blaster')
c = Canvas(window, width=WIDTH, height=HEIGHT, bg='darkblue')
c.pack()
ship_id = c.create_polygon(5, 5, 5, 25, 30, 15, fill='red')
ship_id2 = c.create_oval(0, 0, 30, 30, outline='red')
SHIP_R = 15
MID_X = WIDTH / 2
MID_Y = HEIGHT / 2
c.move(ship_id, MID_X, MID_Y)
c.move(ship_id2, MID_X, MID_Y)
SHIP_SPD = 10
def move_ship(event):
    if event.keysym == 'Up':
        c.move(ship_id, 0, -SHIP_SPD)
        c.move(ship_id2, 0, -SHIP_SPD)
    elif event.keysym == 'Down':
        c.move(ship_id, 0, SHIP_SPD)
        c.move(ship_id2, 0, SHIP_SPD)
    elif event.keysym == 'Left':
        c.move(ship_id, -SHIP_SPD, 0)
        c.move(ship_id2, -SHIP_SPD, 0)
    elif event.keysym == 'Right':
        c.move(ship_id, SHIP_SPD, 0)
        c.move(ship_id2, SHIP_SPD, 0)
c.bind_all('<Key>', move_ship)
from random import randint
bub_id = list()
bub_r = list()
bub_speed = list()
MIN_BUB_R = 10
MAX_BUB_R = 30
MAX_BUB_SPD = 10
GAP = 100
def get_coords(id_num):
    pos = c.coords(id_num)
    x = (pos[0] + pos[2])/2
    y = (pos[1] + pos[3])/2
    return x, y
def create_bubble():
    x = WIDTH + GAP
    y = randint(0, HEIGHT)
    r = randint(MIN_BUB_R, MAX_BUB_R)
    id1 = c.create_oval(x - r, y - r, x + r, y + r, outline = 'white')
    bub_id.append(id1)
    bub_r.append(r)
    bub_speed.append(MAX_BUB_SPD)
def move_bubbles():
    for i in range(len(bub_id)):
        print(i)
        print(len(bub_id))
        print(bub_id, bub_speed) 
        print(bub_id[i], -bub_speed[i])
        c.move(bub_id[i], -bub_speed[i], 0)
def del_bubble(i):
    del bub_r[i]
    del bub_speed[i]
    c.delete(bub_id[i])
    del bub_id[i]
def clean_up_bubs():
    for i in range(len(bub_id)-1, -1, -1):
        x, y = get_coords(bub_id[i])
        if x < -GAP:
            del_bubble(i)
from math import sqrt
def distance (id1, id2):
    x1, y1 = get_coords(id1)
    x2, y2 = get_coords(id2)
    return sqrt((x2-x1)**2 + (y2-y1)**2)
def collision():
    points = 0
    for bub in range (len(bub_id)-1, -1, -1):
        if distance(ship_id2, bub_id[bub]) < (SHIP_R + bub_r[bub]):
            points += (bub_r[bub] + bub_speed[bub])
            del_bubble(bub)
    return points
c.create_text(50, 30, text='TIME', fill='white' )
c.create_text(150, 30, text='SCORE', fill='white' )
time_text = c.create_text(50, 50, fill='white' )
score_text = c.create_text(150, 50, fill='white' )
def show_score(score):
    c.itemconfig(score_text, text=str(score))
def show_time(time_left):
    c.itemconfig(time_text, text=str(time_left))
from time import sleep, time
BUB_CHANCE = 10
TIME_LIMIT = 30
BONUS_SCORE = 1000
bonus = 0
end = time() + TIME_LIMIT
score = 0
#MAIN GAME LOOP
while time() < end:
    if randint(1, BUB_CHANCE) == 1:
        create_bubble()
    move_bubbles()
    clean_up_bubs()
    score += collision()
    if (int(score / BONUS_SCORE)) > bonus:
        bonus += 1
        end += TIME_LIMIT
    show_score(score)
    show_time(int(end - time()))
    window.update()
    sleep(0.01)
from math import sqrt
def distance(id1, id2):
    x1, y1 = get_coords(id1)
    x2, y2 = get_coords(id2)
    return sqrt((x2 - x1)**2 + (y2 - y1)**2)
c.create_text(MID_X, MID_Y, \
    text='GAME OVER', fill='white', font=('Helvetica', 30))
c.create_text(MID_X, MID_Y + 30, \
    text='Score:'+str(score), fill='white')
c.create_text(MID_X, MID_Y + 45, \
    text='Bonus time:'+ str(bonus*TIME_LIMIT), fill='white')

Офлайн

#5 Авг. 10, 2016 22:16:51

XoFfiCEr
От:
Зарегистрирован: 2011-06-05
Сообщения: 50
Репутация: +  1  -
Профиль   Отправить e-mail  

Помогите отладить программу на Python 3.5

Сделать движение бластера более быстрым и более плавным.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version