频道栏目
首页 > 资讯 > 其他 > 正文

tkinter游戏:戏如人生

17-10-17        来源:[db:作者]  
收藏   我要投稿

这几天有点不舒服,脑补了些奇奇怪怪的东西,如果有一天真的残废了,会以何种状态面对生活呢?
生命脆弱,人生也无常。
珍惜呀?!
珍惜,说的轻巧,但人的劣性往往是失去了才想到拥有的美好……
不管怎样还是记着高中老班的话,万事平常心呢
毕竟,人生如戏……

嗯…朋友生日,一天飞快没了,晚上静静地理一下第一个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()

代码说明:目前只是基本的通过球拍进行反弹,还可以再继续发挥添加奖惩机制等等,有时间再详细说明代码

相关TAG标签
上一篇:vue的使用和介绍
下一篇:Python开发工具Pycharm一些不为人知的技巧
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站