按鍵盤上的“d”按鈕(例如)時如何使方塊移動?
from tkinter import *
root = Tk()
root.title('Snake')
root["width"] = 400
root["height"] = 400
field = Canvas(root)
x = 0
y = 0
def snake(x, y):
field.create_rectangle(10, 20, 30, 40)
field.grid(row=x, column=y)
x = 1
y = 1
return(x, y)
root.bind("<KeyPress>", snake(x=x, y=y))
root.mainloop()
uj5u.com熱心網友回復:
一個簡單的方法是使用event.char. 它回傳按下按鈕的字符。然后檢查它是哪個按鈕并移動它如果它是w,a,s,d-
from tkinter import *
root = Tk()
root.title('Snake')
root["width"] = 400
root["height"] = 400
field = Canvas(root)
rect = field.create_rectangle(10, 20, 30, 40)
field.grid(row=0, column=0)
def snake(event):
x = 0 # Default
y = 0
if event.char == 'w':
y = -10
if event.char == 'a':
x = -10
if event.char == 's':
y = 10
if event.char == 'd':
x = 10
field.move(rect,x,y)
root.bind("<Key>", snake)
root.mainloop()
uj5u.com熱心網友回復:
這是您可以做到的一種方式:
import tkinter as tk
from tkinter import Canvas
root = tk.Tk()
root.title('Snake')
root.geometry("450x450")
w = 400
h = 400
x = w//2
y = h//2
field = Canvas(root, width=w, heigh=h, bg="white")
field.pack(pady=5)
my_rectangle = field.create_rectangle(10, 20, 30, 40)
def left(event):
x = -10
y = 0
field.move(my_rectangle, x, y)
def right(event):
x = 10
y = 0
field.move(my_rectangle, x, y)
def up(event):
x = 0
y = -10
field.move(my_rectangle, x, y)
def down(event):
x = 0
y = 10
field.move(my_rectangle, x, y)
root.bind("<Left>", left)
root.bind("<Right>", right)
root.bind("<Up>", up)
root.bind("<Down>", down)
root.mainloop()
首先創建root,然后給geometry它,在這種情況下它是450x450。之后創建將存盤height和width,和的變數coordinates x and y。然后,創建canvas(field),并canvas指定canvas將位于和geometry的canvas(和background color)。當canvas被創建,我們創造rectangle。函式left, right, up and down將涵蓋rectangle畫布上的移動。field.move(my_rectangle, x, y)- 這行代碼將 my_rectangle 在畫布上移動 x 和 y,或者向左、向右或向上移動,這取決于傳遞的內容。root.bind("<Left>", left)- 將左箭頭鍵系結到left function. 這就是為什么event是parameter的fucntion。
uj5u.com熱心網友回復:
另一種方法
from tkinter import *
root = Tk()
root.title('Snake')
root["width"] = 400
root["height"] = 400
field = Canvas(root)
SIZE = 50
class Snake:
def __init__(self,x,y,canvas):
self.x = x
self.y = y
self.canvas = canvas
self.direction = (SIZE,0)
def keypress(self,event):
if event.keysym == 'Right':
self.direction = (SIZE,0)
if event.keysym == 'Left':
self.direction = (-SIZE,0)
if event.keysym == 'Up':
self.direction = (0,-SIZE)
if event.keysym == 'Down':
self.direction = (0,SIZE)
def move(self):
self.x = self.direction[0]
self.y = self.direction[1]
def redraw(self):
self.canvas.delete('snake')
self.move()
self.canvas.create_rectangle(self.x,self.y,self.x SIZE,self.y SIZE,fill="green",tag="snake")
def update_screen():
snake.redraw()
root.after(1000,update_screen)
snake = Snake(0,0,field)
root.bind("<KeyPress>", lambda event: snake.keypress(event))
root.after_idle(update_screen)
field.grid()
root.mainloop()
這為蛇使用了一個物件,其中包含對按鍵做出反應并重繪蛇的方法。這將洗掉現有的矩形并繪制新的矩形而不是移動(可能證明對于顯示不同的蛇段更有用)。
這種方法的優點是,無論用戶是否按下按鈕,都可以使蛇移動。如果沒有按下任何按鈕,蛇將繼續朝同一方向前進。
一旦你有一個更復雜的游戲,我希望你的 Snake 類包含每次繪制的不同蛇段的串列。當蛇移動到水果上時,會添加一個新段。請參閱下面的多節移動蛇
from tkinter import *
root = Tk()
root.title('Snake')
root["width"] = 400
root["height"] = 400
field = Canvas(root)
SIZE = 10
class Snake:
def __init__(self,x,y,canvas):
self.x = x
self.y = y
self.canvas = canvas
self.direction = (SIZE,0)
self.segments = [(self.x,self.y)]
self.length = 5
def keypress(self,event):
if event.keysym == 'Right':
self.direction = (SIZE,0)
if event.keysym == 'Left':
self.direction = (-SIZE,0)
if event.keysym == 'Up':
self.direction = (0,-SIZE)
if event.keysym == 'Down':
self.direction = (0,SIZE)
def move(self):
self.x = self.direction[0]
self.y = self.direction[1]
new_segment = (self.segments[-1][0] self.direction[0],self.segments[-1][1] self.direction[1])
self.segments.append(new_segment)
if len(self.segments) > self.length:
self.segments.pop(0)
def redraw(self):
self.canvas.delete('snake')
self.move()
for seg in self.segments:
self.canvas.create_rectangle(seg[0],seg[1],seg[0] SIZE,seg[1] SIZE,fill="green",tag="snake")
#self.canvas.create_rectangle(self.x,self.y,self.x SIZE,self.y SIZE,fill="green",tag="snake")
def update_screen():
snake.redraw()
root.after(1000,update_screen)
snake = Snake(0,0,field)
root.bind("<KeyPress>", lambda event: snake.keypress(event))
root.after_idle(update_screen)
field.grid()
root.mainloop()
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/375679.html
上一篇:.csv檔案上的引號不一致
下一篇:從串列運行函式
