Как отобразить и обновить счет на экране?

#python #canvas #tkinter #tkinter-canvas

#python #python-3.x #tkinter #tkinter-canvas

Вопрос:

Мой вопрос касается отображения и обновления текста, чтобы отобразить оценку на экране.

Я хотел бы создать счет, подобный реальной игре, который будет отображаться на экране. Но после изучения Google я не нашел никого, кто хотел бы увеличить оценку на экране…

Действительно, я хотел бы, чтобы оценка увеличивалась каждый раз, когда птица проходит между трубами, и, следовательно, всякий раз, когда трубы имеют X 67 пикселей. Итак, кто-нибудь знает, как это сделать?

 from tkinter import *
import random
from random import randint

def sauter(event):
    canvas.move(image_oiseau, 0, -10*DY)


def deplacement():
    global tuyx,tuyx2,h,H,oisx,oisy,solx,sol2x

    x0, y0, x1, y1 = canvas.bbox(image_oiseau)
    if y1 < 416:
        canvas.move(image_oiseau, 0, DY)

    canvas.coords(image_sol,solx,512)  
    if solx >= -144:
        solx=solx-5
    else:
        solx=144

    canvas.coords(image_sol2,sol2x,512)
    if sol2x >= 144:
        sol2x=sol2x-5
    else:
        sol2x=432

    canvas.coords(image_tuyau_haut,tuyx,h)
    canvas.coords(image_tuyau_bas,tuyx,h-241)
    if tuyx>=-28:
        tuyx=tuyx-5
    else:
        tuyx=316
        h=randint(256,505)

    canvas.coords(image_tuyau_haut2,tuyx2,H)
    canvas.coords(image_tuyau_bas2,tuyx2,H-241)
    if tuyx2>=-28:
        tuyx2=tuyx2-5
    else:
        tuyx2=316
        H=randint(256,505)

    canvas.after(40,deplacement)


LARGEUR = 286
HAUTEUR = 510
DY = 5
tuyx=316
tuyx2=488 
h=randint(256,505)
H=randint(256,505)
oisx=67
oisy=244
solx=144
sol2x=432


fenetre = Tk()
canvas = Canvas(fenetre, width=LARGEUR, height=HAUTEUR)

fond = PhotoImage(file="background-day.png")
fond2 = PhotoImage(file="background-night.png")
fond=[fond,fond2]
F= random.choice(fond)
canvas.create_image(144,256, anchor=CENTER,image=F)

tuyau_haut = PhotoImage(file="tuyau_vers_le_haut.png")
image_tuyau_haut = canvas.create_image(tuyx,h,anchor=CENTER,image=tuyau_haut)
image_tuyau_haut2 = canvas.create_image(tuyx2,H,anchor=CENTER,image=tuyau_haut)

tuyau_bas = PhotoImage(file="tuyau_vers_le_bas.png")
image_tuyau_bas = canvas.create_image(tuyx,h,anchor=CENTER,image=tuyau_bas)
image_tuyau_bas2 = canvas.create_image(tuyx2,H,anchor=CENTER,image=tuyau_bas)

sol = PhotoImage(file="sol-day.png")
image_sol = canvas.create_image(144,512, anchor=S,image=sol)
image_sol2 = canvas.create_image(432,512, anchor=S,image=sol)

oiseau = PhotoImage(file="yellowbird-midflap.png")
oiseau2 = PhotoImage(file="bluebird-midflap.png")
oiseau3 = PhotoImage(file="redbird-midflap.png")
oiseau=[oiseau,oiseau2,oiseau3]
O=random.choice(oiseau)
image_oiseau=canvas.create_image(oisx,oisy, anchor=W,image=O) 

deplacement()

canvas.pack()
canvas.focus_set()
canvas.bind("<space>",sauter) 

fenetre.mainloop() 
  

Может ли кто-нибудь объяснить мне проблему, потому что я думал, что это будет легко:(
Вот картинки из игры 🙂

Вот картинки игры

Комментарии:

1. зачем импортировать random, а затем из random импортировать randint?

2. Я собираюсь изменить это позже, но это не вопрос : ‘)

3. Я бы хотел помочь, но нет способа запустить ваш код, потому что у меня нет файлов изображений. Если бы вы просто заменили их черными ящиками или чем-то еще, люди помогли бы

4. Я разместил ссылку для загрузки картинок: D mediafire.com/file/nr1a1qmfsh6s8s4/Flappy_Bird.zip/file

5. Ваш вопрос неясен — вам нужно знать, как отображать и обновлять оценку на экране, или вам нужно знать, как инициировать увеличение подсчета очков?

Ответ №1:

Вот один из подходов к отображению результатов: он использует tk.Label , который обновляется одновременно с увеличением оценки.

Триггер, который увеличивает оценку, в настоящее время является случайным вызовом on_change ; вы можете изменить это, чтобы оно было тестом, если координаты трубы x становятся ниже координат птицы x (птица успешно пересекла препятствие)

Вы можете, если хотите, переместить метку оценки на холст.

 import random
import tkinter as tk


WIDTH, HEIGHT = 500, 500


def create_pipes():
    pipes = []
    for x in range(0, WIDTH, 40):
        y1 = random.randrange(50, HEIGHT - 50)
        y0 = y1   50
        pipes.append(canvas.create_line(x, 0, x, y1))
        pipes.append(canvas.create_line(x, y0, x, HEIGHT))
    return pipes


def move_pipes():
    for pipe in pipes:
        canvas.move(pipe, -2, 0)
        x, y0, _, y1 = canvas.coords(pipe)
        if x < 0:
            canvas.coords(pipe, WIDTH 20, y0, WIDTH 20, y1)

    if random.randrange(0, 20) == 10:
        on_change()

    root.after(40, move_pipes)


def on_change():
    global score
    score  = 1
    score_variable.set(f'score: {score}')


root = tk.Tk()
tk.Button(root, text='start', command=move_pipes).pack()
score = 0
score_variable = tk.StringVar(root, f'score: {score}')
score_lbl = tk.Label(root, textvariable=score_variable)
score_lbl.pack()

canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT, bg="cyan")
canvas.pack()

pipes = create_pipes()

root.mainloop()