【python知识】用 Tkinter实现“剪刀-石头-布”和“弹球游戏 ”

一、提要

        Tkinter是一个Python内置模块,它提供了一个简单易用的界面来创建GUI。

        在实现一些动态的画面、如游戏还是需要一些创新性思维的。在本文中,我们将使用 Tkinter 探索 Python GUI 编程。我们将介绍 Tkinter 的基础知识,并演示如何使用 Tkinter 创建一个简单的 GUI 应用程序。

二、Tkinter的基础介绍

        Tkinter是一个Python内置模块,它提供了一个简单易用的界面来创建GUI。

        Tkinter 提供了一组可用于创建 GUI 的小部件。小部件是提供特定功能(如按钮、标签或输入字段)的图形元素。小部件可以排列在窗口中以创建 GUI。

创建 Tkinter GUI 的基本步骤是:

  1. 导入 Tkinter 模块
  2. 创建窗口
  3. 向窗口添加微件
  4. 配置微件
  5. 向微件添加功能
  6. 启动主事件循环

下面是使用 Tkinter 创建窗口的简单示例:

import tkinter as tkwindow = tk.Tk()
window.mainloop()

三、剪刀石头布游戏

        如果您想了解有关 Tkinter 的更多信息,我会在本文末尾放置一个链接。所以,我想和Tk一起做点什么。我最终做了石头剪刀布,我想和你分享。让我们看一下代码和结果。

        代码不长。它拥有这款游戏所需的所有东西。首先,我们制作可以玩游戏的屏幕。

# Import Required Library
from tkinter import *
import random# Create Object
root = Tk()# Set geometry
root.geometry("300x300")# Set title
root.title("Rock Paper Scissor Game")

        接下来,我为计算机分配值,因为在游戏过程中,您将与计算机竞争。

# Computer Value
computer_value = {"0": "Rock","1": "Paper","2": "Scissor"
}

        然后,我做了一些功能。根据玩家的选择,计算机或玩家获胜。因此,如果玩家选择石头,并且函数也选择石头,他们就会平局。当然,这也适用于剪刀对剪刀。如果你不知道这个游戏,中间有一个简短的解释:

  • 石头>剪刀
  • 剪刀>纸
  • >石头

这部分提供匹配结果。

# Reset The Game
def reset_game():b1["state"] = "active"b2["state"] = "active"b3["state"] = "active"l1.config(text="Player    ")l3.config(text="Computer")l4.config(text="")# Disable the Button
def button_disable():b1["state"] = "disable"b2["state"] = "disable"b3["state"] = "disable"# If player selected rock
def isrock():c_v = computer_value[str(random.randint(0, 2))]if c_v == "Rock":match_result = "Match Draw"elif c_v == "Scissor":match_result = "Player Win"else:match_result = "Computer Win"l4.config(text=match_result)l1.config(text="Rock   ")l3.config(text=c_v)button_disable()# If player selected paper
def ispaper():c_v = computer_value[str(random.randint(0, 2))]if c_v == "Paper":match_result = "Match Draw"elif c_v == "Scissor":match_result = "Computer Win"else:match_result = "Player Win"l4.config(text=match_result)l1.config(text="Paper   ")l3.config(text=c_v)button_disable()# If player selected scissor
def isscissor():c_v = computer_value[str(random.randint(0, 2))]if c_v == "Rock":match_result = "Computer Win"elif c_v == "Scissor":match_result = "Match Draw"else:match_result = "Player Win"l4.config(text=match_result)l1.config(text="Scissor   ")l3.config(text=c_v)button_disable()

        代码的最后一部分,将所有内容打包在一起并编写最后的细节,以便它能够工作并完成代码。这包括在石头、纸或剪刀之间进行选择的按钮。还需要制作文本。

# Add Labels, Frames and Button
Label(root,text="Rock Paper Scissor",font="normal 20 bold",fg="blue").pack(pady=20)frame = Frame(root)
frame.pack()l1 = Label(frame,text="Player    ",font=10)l2 = Label(frame,text="VS    ",font="normal 10 bold")l3 = Label(frame, text="Computer", font=10)l1.pack(side=LEFT)
l2.pack(side=LEFT)
l3.pack()l4 = Label(root,text="",font="normal 20 bold",bg="white",width=15,borderwidth=2,relief="solid")
l4.pack(pady=20)frame1 = Frame(root)
frame1.pack()b1 = Button(frame1, text="Rock",font=10, width=7,command=isrock)b2 = Button(frame1, text="Paper ",font=10, width=7,command=ispaper)b3 = Button(frame1, text="Scissor",font=10, width=7,command=isscissor)b1.pack(side=LEFT, padx=10)
b2.pack(side=LEFT, padx=10)
b3.pack(padx=10)Button(root, text="Reset Game",font=10, fg="red",bg="black", command=reset_game).pack(pady=20)# Execute Tkinter
root.mainloop()

四、更复杂游戏--弹球游戏  

4.1 窗口布局类实现

        窗口和外观,首先是最外层Frame的设定,请看代码:

from tkinter import *
import random
import time# Creating the window:
window = Tk()
window.title("Bounce")
window.geometry('600x600')
window.resizable(False, False)

        这里对窗口一系列设定:

窗口语句功能
window = Tk()创建最外层主窗口
window.title("Bounce")设标题
window.geometry('600x600')设窗口高度、宽度
window.resizable(False, False)设定窗口固定大小

4.2 建立画布对象

        画布是刻画动画功能的对象,画布需要放置在桌面,不可独立存在。因此,桌面就是画布的承载对象。因此,画布有一系列初始化函数,请看下面代码:

window = Tk()# Creating the canvas containing the game:
canvas = Canvas(window, width = 450, height = 450, bg = "black")
canvas.pack(padx = 50, pady= 50)
score = canvas.create_text(10, 20, fill = "white")
window.update()

4.3 建立小球对象

4.3.1 小球对象类

        小球相关的物体是:画布、球拍;即小球在画布内游动,小球被球拍打击而折返。

        因此,小球对象初始化需要两个外界物体,画布、球拍。 

class Ball:def __init__(self, canvas1, paddle1, color):

4.3.2 小球绘制

        小球是椭圆绘制函数,原型如下:

id = C.create_oval(x0, y0, x1, y1, option, ...)

        self.canvas.move(self.id, 190, 160)starting_direction = [-3, -2, -1, 0, 1, 2, 3]random.shuffle(starting_direction)self.x = starting_direction[0]self.y = -3self.canvas_height = self.canvas.winfo_height()self.canvas_width = self.canvas.winfo_width()
小球内初始化代码意义
        self.canvas.move(self.id, 190, 160)将小球移动到画布的位置。
        starting_direction = [-3, -2, -1, 0, 1, 2, 3]小球移动方向【横、竖、斜】
        random.shuffle(starting_direction)混淆方向
        self.x = starting_direction[0]            选一个初始方向
        self.y = -3
        self.canvas_height = self.canvas.winfo_height()取出画布的高、宽,用以判别小球移动范围
        self.canvas_width = self.canvas.winfo_width()

 def hit_paddle(self, ballcoords):  球拍击球处理

 def draw(self):   随小球位置重画
        self.canvas.move(self.id, self.x, self.y)

4.3.3 小球数据的合理设计 

        小球数据因该分成两种:显式数据、隐含数据;显式数据针对画布而言,隐式数据针对小球运动,方向、位置变化等而设定。

4.4 全部程序代码

        在以上游戏调试完成后,我们实现一个更复杂的动态任务。实现弹球游戏,通过<--和-->件移动平板接球,下文是tkinter的应用实例:

from tkinter import *
import random
import time# Creating the window:
window = Tk()
window.title("Bounce")
window.geometry('600x600')
window.resizable(False, False)# Creating the canvas containing the game:
canvas = Canvas(window, width = 450, height = 450, bg = "black")
canvas.pack(padx = 50, pady= 50)
score = canvas.create_text(10, 20, fill = "white")window.update()class Ball:def __init__(self, canvas1, paddle1, color):self.canvas = canvas1self.paddle = paddle1self.id = canvas1.create_oval(10, 10, 25, 25, fill = color)  # The starting point of the ballself.canvas.move(self.id, 190, 160)starting_direction = [-3, -2, -1, 0, 1, 2, 3]random.shuffle(starting_direction)self.x = starting_direction[0]self.y = -3self.canvas_height = self.canvas.winfo_height()self.canvas_width = self.canvas.winfo_width()# Detecting the collision between the ball and the paddle:def hit_paddle(self, ballcoords):paddle_pos = self.canvas.coords(self.paddle.id)if ballcoords[0] <= paddle_pos[2] and ballcoords[2] >= paddle_pos[0]:if paddle_pos[3] >= ballcoords[3] >= paddle_pos[1]:return Truereturn False# Detecting the collision between the the ball and the canvas sides:def draw(self):self.canvas.move(self.id, self.x, self.y)ballcoords = self.canvas.coords(self.id)if ballcoords[1] <= 0:self.y = 3if ballcoords[3] >= self.canvas_height:self.y = 0self.x = 0self.canvas.create_text(225, 150, text = "Game Over!", font = ("Arial", 16), fill = "white")if ballcoords[0] <= 0:self.x = 3if ballcoords[2] >= self.canvas_width:self.x = -3if self.hit_paddle(ballcoords):self.y = -3class Paddle:def __init__(self, canvas1, color):self.canvas1 = canvasself.id = canvas.create_rectangle(0, 0, 100, 10, fill = color)self.canvas1.move(self.id, 180, 350)self.x = 0self.y = 0self.canvas1_width = canvas1.winfo_width()self.canvas1.bind_all("<Left>", self.left)self.canvas1.bind_all("<Right>", self.right)def draw(self):self.canvas1.move(self.id, self.x, 0)paddlecoords = self.canvas1.coords(self.id)if paddlecoords[0] <= 0:self.x = 0if paddlecoords[2] >= self.canvas1_width:self.x = 0def right(self, event):self.x = 3def left(self, event):self.x = -3paddle = Paddle(canvas, color = "white")
ball = Ball(canvas, paddle, color = "red")# New code after here
def handler():global runrun = Falsewindow.protocol("WM_DELETE_WINDOW", handler)
run = Truewhile run:# New code before hereball.draw()paddle.draw()window.update_idletasks()window.update()time.sleep(0.01)window.destroy()    # should always destroy window before exit

五、程序结果 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/110811.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Element Plus 日期选择器的使用和属性

element plus 日期选择器如果如果没有进行处理 他会返回原有的属性值data格式 如果想要获取选中的日期时间就需要通过以下的代码来实现选中的值 format"YYYY/MM/DD" value-format"YYYY-MM-DD" <el-date-pickerv-model"formInline.date" type&…

「MySQL-05」MySQL Workbench的下载和使用

目录 一、MySQL workbench的下载和安装 1. MySQL workbench介绍 2. 到MySQL官网下载mysql workbench 3. 安装workbench 二、创建能远程登录的用户并授权 1. 创建用户oj_client 2. 创建oj数据库 3. 给用户授权 4. 在Linux上登录用户oj_client检查其是否能操作oj数据库 三、使用…

gerrit 如何提交进行review

前言 本文主要介绍如何使用gerrit进行review。 下述所有流程都是参考&#xff1a; https://gerrit-review.googlesource.com/Documentation/intro-gerrit-walkthrough.html 先给一个commit后但是还没有push上去的一个办法&#xff1a; git reset --hard HEAD^可以多次reset.…

DC/DC开关电源学习笔记(一)开关电源技术概述

&#xff08;一&#xff09;开关电源技术概述 1.什么是开关电源&#xff1f;2.开关电源技术概述2.1 小型化、薄型化、轻量化、高频化2.2 高可靠性2.3 低噪声2.4 采用计算机辅助设计和控制 1.什么是开关电源&#xff1f; 开关模式电源&#xff08;Switch Mode Power Supply&…

opencv的使用(Ubuntu linux环境,AS jni,AS java)

最近要完成一个功能&#xff0c;就是把四个视频合成左右上下分布的一个视频。尝试很多方法&#xff0c;最终使用opencv来实现该功能。&#xff08;通过opencv实现的视频好像没有声音。&#xff09;研究的步骤&#xff0c;首先在Ubuntu环境测试&#xff0c;该功能是否实现。然后…

【Luniux】解决Ubuntu外接显示器不显示的问题

Luniux】解决Ubuntu外接显示器不显示的问题 文章目录 Luniux】解决Ubuntu外接显示器不显示的问题1. 检查nvidia显卡驱动是否正常2. 更新驱动3. 检查显示器是否能检测到Reference 1. 检查nvidia显卡驱动是否正常 使用命令行 nvidia-smi来检查显卡驱动是否正常&#xff0c;如果…

3、监测数据采集物联网应用开发步骤(3)

监测数据采集物联网应用开发步骤(2) 系统整体结构搭建 新建项目 输入项目名称&#xff1a;MonitorData 所谓兵马未动粮草先行&#xff0c;按下图创建好对应的模块备用&#xff1a; com.plugins 业务插件模块 com.zxy.adminlog 日志或文本文…

《C和指针》笔记12: 存储类型(自动变量、静态变量和寄存器变量)

文章目录 1. 自动变量&#xff08;auto&#xff09;1.1 自动变量的初始化 2. 静态变量&#xff08;static&#xff09;2.1 静态变量的初始化 3. 寄存器变量&#xff08;register&#xff09; 1. 自动变量&#xff08;auto&#xff09; 在代码块内部声明的变量的缺省存储类型是…

小白必看:期权行权前必须了解的问题。

期权的本质是一个买权或是卖权&#xff0c;也就是说你是权利方的话&#xff0c;你拥有以约定价格向对手方买入&#xff08;买权&#xff09;或卖出&#xff08;卖权&#xff09;一定数量标的的权利。期权行权就是从对手方买入&#xff0c;或向其卖出标的&#xff01;下文介绍小…

葡萄叶病害识别(图像连续识别和视频识别,Python代码,pyTorch框架)

葡萄叶病害识别&#xff08;图像连续识别和视频识别&#xff0c;Python代码&#xff0c;pyTorch框架&#xff09;_哔哩哔哩_bilibili 葡萄数据集 第一个文件夹为 Grape Black Measles&#xff08;葡萄黑麻疹&#xff09;病害&#xff08;3783张&#xff09; Grape Black rot葡…

C#调用barTender打印标签示例

使用的电脑需要先安装BarTender 我封装成一个类 using System; using System.Windows.Forms;namespace FT_Tools {public class SysContext{public static BarTender.Application btapp new BarTender.Application();public static BarTender.Format btFormat;public void Q…

【pytorch】Unfold和Fold的互逆操作

1. 参数定义 Unfold https://pytorch.org/docs/stable/generated/torch.nn.Unfold.html#torch.nn.Unfold Fold https://pytorch.org/docs/stable/generated/torch.nn.Fold.html#torch.nn.Fold 注意&#xff1a;参数当中的padding是在四周边补零&#xff0c;而当fold后的尺寸…

Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required

项目场景&#xff1a; 最近因为公司业务需要在搭一个新架构&#xff0c;用的springboot3和jdk17,在整合mybatis多数据源的时候报错 &#xff08;引用的mybatisplus 和 mybatisplusjion的是最新的包-2023-08-26&#xff09; Error creating bean with name ‘XXXServiceImpl’:…

无涯教程-Android Studio函数

第1步-系统要求 您将很高兴知道您可以在以下两种操作系统之一上开始Android应用程序的开发- MicrosoftWindows10/8/7/Vista/2003(32或64位)MacOSX10.8.5或更高版本,最高10.9(小牛) GNOME或KDE桌面 第二点是,开发Android应用程序所需的所有工具都是开源的,可以从Web上下载。以…

【FPGA】verilog语法的学习与应用 —— 位操作 | 参数化设计

【FPGA】verilog语法的学习与应用 —— 位操作 | 参数化设计 学习新语法&#xff0c;争做新青年 计数器实验升级&#xff0c;让8个LED灯每个0.5s的速率循环闪烁&#xff0c;流水灯ahh好久不见~ 去年光这个就把我折磨够呛。。我肉眼可见的脱发就是从那时候开始的。。在那两个月…

代码随想录打卡—day46—【DP】— 8.29 背包END

1 139. 单词拆分 139. 单词拆分 做了很久...估计2h 一开始我的思路卡死了 看题解之后的思路的详解见注释&#xff0c; 我的写法和carl 答案在一些微小的细节上略有不同&#xff0c;我的更好理解&#xff0c;但他的解法更简单。 我写的过程中&#xff0c;需要注意下标和字符…

爬虫逆向实战(二十四)--某鸟记录中心

一、数据接口分析 主页地址&#xff1a;某鸟记录中心 1、抓包 通过抓包可以发现数据接口是front/record/search/page 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现&#xff0c;请求参数是加密的 请求头是否加密&#xff1f; 通过查…

基于 OV5640 的图像采集显示系统(DVP 接口时序逻辑设计)

文章目录 前言一、DVP 接口时序逻辑设计二、基本数据流接收三、像素位置输出四、舍弃前 N 张图像五、系统异常状态恢复控制六、完整代码展示七、仿真代码展示八、仿真波形展示前言 上一节,我们已经完成了 OV5640 初始化逻辑的介绍。接下来,将要开始完成 DVP 接口的时序设计。…

【C修炼计划】卷壹 · 初识C语言

文章目录 卷壹 初识C语言一 C语言的起源二 C语言的特性三 C语言的应用范围四 C语言程序结构五 C语言书写规范六 C语言编译器安装附 参考资料 卷壹 初识C语言 一 C语言的起源 C语言的前生是B语言&#xff08;BCPL&#xff0c;一种早期的高级语言&#xff09;。下图描…

1. 卷积原理

① 卷积核不停的在原图上进行滑动&#xff0c;对应元素相乘再相加。 ② 下图为每次滑动移动1格&#xff0c;然后再利用原图与卷积核上的数值进行计算得到缩略图矩阵的数据&#xff0c;如下图右所示。 import torch import torch.nn.functional as Finput torch.tensor([[1, 2…