簡體   English   中英

我如何同時移動多個對象,但每個 object 在 tkinter python 中移動不同的距離?

[英]How do i move multiple objects at the same time but every object by different distance in tkinter python?

我有一個生成多個對象的游戲,object 來到 canvas 的另一邊獲勝。 當您按下按鈕時,每 object 向前移動不同的隨機距離。 問題是第一個 object 移動最少,最后一個 object 移動最多。 所以最后一個 object 總是贏。 我如何做到隨機 object 會獲勝而不總是最后一個。

import tkinter
import random
canvas=tkinter.Canvas(width=400, height=400)
canvas.pack()

label=tkinter.Label(text='set amout of cars')
label.pack()

entry=tkinter.Entry()
entry.pack()

def car():
    global move
    move=0
    canvas.delete('all')
    p=int(entry.get())
    for i in range(p):
        canvas.create_rectangle(20,20+i*20,40,30+i*20, fill='coral')

move=0

def race():
    global move
    canvas.delete('all')
    p=int(entry.get())
    for i in range(p):
        rand=random.randint(5,20)
        move=move+rand
        canvas.create_rectangle(20+move,20+i*20,40+move,30+i*20, fill='coral')
    
    
        
button=tkinter.Button(text='start', command=car)
button.pack()
button2=tkinter.Button(text='forward', command=race)
button2.pack()

如評論中所述,每個 object 共享相同的move變量,因此每個 object 從最后一個停止的地方開始。

更好的解決方案是為每個對象調用 canvas 上的move方法。 您可以保存對象列表,也可以要求 canvas 為您提供對象。 然后,您可以使用randint來決定每個項目移動多少。

race function 看起來像這樣:

def race():
    for car in canvas.find("all"):
        delta_x = random.randint(5,20)
        delta_y = 0
        canvas.move(car, delta_x, delta_y)

您的所有對象都使用相同的變量move - 因此在每次執行race時,它們都使用相同的 position。但是在每個循環中,您都添加新的值來move - 所以首先 object 使用 distance move+rand1 ,第二個move+rand1+rand2 ,第三個move+rand1+rand2+rand3等 - 這會產生問題。

每個 object 都應該有自己的變量 position。

所以它需要使用帶位置的列表。


或者最好只創建一次 object 並獲取ID

car_id = canvas.create_rectangle(...)

然后用ID移動這個object

canvas.move(car_id, ...)

這樣每輛車都會使用自己的 position。

當然還需要用list來保存所有的IDs


def restart():
    canvas.delete('all')
    all_cars.clear()

    number = int(entry.get())

    for i in range(number):
        car_id = canvas.create_rectangle(20, 20+i*20, 40, 30+i*20, fill='coral')
        all_cars.append( car_id )

def race():
    for car_id in all_cars:
        distance_x = random.randint(5,20)
        distance_y = 0
        canvas.move(car_id, distance_x, distance_y)

# --- main ---

all_cars = []

編輯:

完整的工作代碼:

我也用過

  • after(100, race) - 所以它會在 100 毫秒后自動重復 function,你不必一次又一次地點擊按鈕race

  • canvas.corrds()獲取當前 position 並檢查它是否結束比賽。

  • create_line顯示終點線

import tkinter as tk
import random

# --- functions ---

def restart():
    canvas.delete('all')
    all_cars.clear()

    number = int(entry.get())

    for i in range(number):
        car_id = canvas.create_rectangle(20, 20+i*20, 40, 30+i*20, fill='coral')
        all_cars.append( car_id )

    # finish line
    canvas.create_line(360, 10, 360, 30+(number-1)*20 + 10, fill='red')
    
def race():
    winner = False
    
    for car_id in all_cars:
        distance_x = random.randint(5, 20)
        distance_y = 0
        canvas.move(car_id, distance_x, distance_y)

        x1, y1, x2, y2 = canvas.coords(car_id)
        
        if x1 >= 360:
            winner = True
            canvas.moveto(car_id, 360, y1-1)
            canvas.itemconfig(car_id, fill='green')

    if not winner:
        root.after(100, race)
    
# --- main ---

all_cars = []  # list for all IDs

root = tk.Tk()

canvas = tk.Canvas(root, width=400, height=400)
canvas.pack()

label = tk.Label(root, text='set amout of cars')
label.pack()

entry = tk.Entry(root)
entry.pack()

button = tk.Button(root, text='start', command=restart)
button.pack()

button2 = tk.Button(root, text='forward', command=race)
button2.pack()

root.mainloop()

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM