这几天有点不舒服,脑补了些奇奇怪怪的东西,如果有一天真的残废了,会以何种状态面对生活呢?
生命脆弱,人生也无常。
珍惜呀?!
珍惜,说的轻巧,但人的劣性往往是失去了才想到拥有的美好……
不管怎样还是记着高中老班的话,万事平常心呢
毕竟,人生如戏……
嗯…朋友生日,一天飞快没了,晚上静静地理一下第一个tkinter游戏
一、创建游戏画布
代码说明:
1.第六行:resizable函数窗口的大小不可调整,两个参数分别表示水平和垂直方向,(0,0)的意思是“窗口的大小在水平方向上和垂直方向上都不能改变”
2.第七行:调用wm_attributes,将画布的窗口始终放到所有其他窗口之前(-topmost)
3.第八行:多了 bd = 0,highlightthickness = 0,作用是画布之外没有边框,可以使游戏屏幕看上去更加美观。
from tkinter import * import random import time #调用时间函数让游戏有真实感 tk = Tk() tk.("Game") #给窗口命名 tk.resizable(0,0) tk.wm_attributes("-topmost",1) canvas = Canvas(tk, width = 500, height = 400, bd = 0,\ highlightthickness = 0) canvas.pack()#画布调整大小 tk.update()#为动画做好初始化
二、创建球
代码说明:
1.第一行:在程序最后创建一个红色小球
2.第二行及后:主循环,让tkinter间隔为0.01秒的频率一直重画屏幕
class Ball: def __init__(self,canvas,color): #参数为画布和小球的颜色 self.canvas = canvas#画布保存在变量中 self.id = canvas.create_oval(10, 10, 25, 25, fill=color) self.canvas.move(self.id, 245,100)#将球移动到画布中心
代码说明:
1.创建Ball类,初始化对象,即创建对象设置属性,此外init函数是在对象被创建的同时就设置属性的一种方法,Python会在创建新对象是自动调用这个函数
2.第四行:保存tkinter画小球返回的ID,为后期移动屏幕上的小球做准备,参数分别表示为:(10,10)表示左上角x,y坐标,(25,25)表示右下角x,y坐标,填充色
ball = Ball(canvas, paddle, 'red') while 1: tk.update_idletasks() tk.update() time.sleep(0.01) tk.mainloop()
三、来回反弹的小球
代码说明:让小球通过屏幕壁进行来回反弹
from tkinter import * import random import time #调用时间函数让游戏有真实感 class Ball: def __init__(self,canvas,color): #初始化对象,即创建对象设置属性,此外__init__函数是在对象被创建的同时就设置属性的一种方法,Python会在创建新对象是自动调用这个函数 self.canvas = canvas self.id = canvas.create_oval(10, 10, 25, 25, fill=color)#(10,10)表示左上角x,y坐标,(25,25)表示右下角x,y坐标,填充色 self.canvas.move(self.id, 245,100)#将球移动到画布中心 starts = [-3,-2,-1,1,2,3] random.shuffle(starts) self.x = starts[0] self.y = -3 self.canvas_height = self.canvas.winfo_height() self.canvas_width = self.canvas.winfo_width() def draw(self): self.canvas.move(self.id,self.x,self.y)#0表示不要水平移动,-1表示在屏幕上向上移动1个像素 pos = self.canvas.coords(self.id)#coords画布函数,通过ID返回画布上任何画好的东西的当前x,y坐标 if pos[1] <= 0: self.y = 2 if pos[3] >= self.canvas_height: self.y = -3 if pos[0] <= 0: self.x = 2 if pos[2] >= self.canvas_width: self.x = -3 tk = Tk() tk.("Game") #给窗口命名 tk.resizable(0,0) tk.wm_attributes("-topmost",1) canvas = Canvas(tk, width = 500, height = 400, bd = 0,\ highlightthickness = 0) canvas.pack()#画布调整大小 tk.update()#为动画做好初始化 ball = Ball(canvas, 'red') while 1: ball.draw() tk.update_idletasks() tk.update() time.sleep(0.01) tk.mainloop()
改天截个动态图(羞愧脸)
四、球拍来了
from tkinter import * import random import time #调用时间函数让游戏有真实感 class Ball: def __init__(self,canvas,paddle,color): #初始化对象,即创建对象设置属性,此外__init__函数是在对象被创建的同时就设置属性的一种方法,Python会在创建新对象是自动调用这个函数 self.canvas = canvas self.id = canvas.create_oval(10, 10, 25, 25, fill=color)#(10,10)表示左上角x,y坐标,(25,25)表示右下角x,y坐标,填充色 self.canvas.move(self.id, 245,100)#将球移动到画布中心 self.paddle = paddle # self.x = 0 # self.y = -1 starts = [-3,-2,-1,1,2,3] random.shuffle(starts) self.x = starts[0] self.y = -3 self.canvas_height = self.canvas.winfo_height() self.canvas_width = self.canvas.winfo_width() self.hit_bottom = False def hit_paddle(self, pos): paddle_pos = self.canvas.coords(self.paddle.id) if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]: if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]: return True return False def draw(self): self.canvas.move(self.id,self.x,self.y)#0表示不要水平移动,-1表示在屏幕上向上移动1个像素 pos = self.canvas.coords(self.id)#coords画布函数,通过ID返回画布上任何画好的东西的当前x,y坐标 if pos[1] <= 0: self.y = 2 if pos[3] >= self.canvas_height: self.hit_bottom = True if self.hit_paddle(pos) == True: self.y = -3 if pos[0] <= 0: self.x = 2 if pos[2] >= self.canvas_width: self.x = -3 class Paddle: def __init__(self, canvas, color): self.canvas = canvas self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color) # (10,10)表示左上角x,y坐标,(25,25)表示右下角x,y坐标,填充色 self.canvas.move(self.id, 200, 300) # 将球移动到画布中心 self.x = 0 self.canvas_width = self.canvas.winfo_width() self.canvas.bind_all('', self.turn_left) self.canvas.bind_all(' ', self.turn_right) def draw(self): self.canvas.move(self.id, self.x, 0) pos = self.canvas.coords(self.id) if pos[0] <= 0: self.x = 0 if pos[2] >= self.canvas_width: self.x = 0 def turn_left(self,evt): self.x = -2 def turn_right(self,evt): self.x = 2 tk = Tk() tk.("Game") #给窗口命名 tk.resizable(0,0)#窗口的大小不可调整,第一个参数表示长,0,0的意思是“窗口的大小在水平方向上和垂直方向上都不能改变” tk.wm_attributes("-topmost",1)#将画布的窗口始终放到所有其他窗口之前 canvas = Canvas(tk,width=500, height=400, bd=0, highlightthickness=0)#后两个参数作用:确保画布之外没有边框,使得屏幕更美观 canvas.pack() tk.update()#为动画做好初始化 paddle = Paddle(canvas, "blue") ball = Ball(canvas, paddle, 'red') while 1: if ball.hit_bottom == False: ball.draw() paddle.draw() tk.update_idletasks() tk.update() time.sleep(0.01) tk.mainloop()
代码说明:目前只是基本的通过球拍进行反弹,还可以再继续发挥添加奖惩机制等等,有时间再详细说明代码