栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【python】用tkinter界面化——剪刀石头布

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【python】用tkinter界面化——剪刀石头布

 1.玩家选择剪刀石头布的其中一个,电脑随机出剪刀石头布的其中一个比输赢

(赢的一方加一分,输的一方不加分,平局各加一分,五次为一局)

 

 

代码附下:

import random
from tkinter import *
from tkinter import messagebox
from PIL import Image, ImageTk


class Game():
    def __init__(self):
        # 创建窗口,设置窗口大小、标题、背景等
        self.root = Tk()  # Toplevel()
        self.root.title = ('剪刀石头布')  # 标题
        self.root['bg'] = 'blue'  # 背景色
        self.root.geometry('500x500')  # 窗口大小
        # 定义字符串变量
        self.player = StringVar()
        self.computer = StringVar()
        self.result = StringVar()  # 显示比分
        self.prompt = StringVar()  # 显示提示信息
        # 设置对象变量,玩家、电脑得分,猜拳次数,图像列表
        self.score_player = 0
        self.score_computer = 0
        self.count = 0
        self.pics = ['2.jpg', '1.jpg', '3.jpg']
        # 设置字符串变量的初始值 :set方法进行设置
        self.player.set('玩家 0')
        self.computer.set('电脑 0')

        self.layout()
        self.root.mainloop()  # 循环更新显示

    def layout(self):  # 窗口布局
        # 显示标题
        Label(self.root, text='剪刀石头布', font=('黑体', 30), fg='white', bg='blue').place(x=150, y=20)
        # 显示玩家的得分标签
        Label(self.root, textvariable=self.player, font=('宋体', 22), fg='white', bg='blue').place(x=80, y=100)
        # 显示电脑的得分标签
        Label(self.root, textvariable=self.computer, font=('宋体', 22), fg='white', bg='blue').place(x=330, y=100)

        # 打开图像,以图像作为按钮供玩家选择
        # 剪刀
        image1 = Image.open(self.pics[0]).resize([70, 70])
        # ImageTk模块支持从图片中创建和修改Tkinter位图图像和PhotoImage对象。
        self.photo1 = ImageTk.PhotoImage(image1)  # 转为与tkinter兼容的图像对象
        # 约定剪刀是0,石头是1,布是2
        Button(self.root, image=self.photo1, command=lambda: self.judge(0)).place(x=90, y=150)
        # 石头
        image2 = Image.open(self.pics[1]).resize([70, 70])
        self.photo2 = ImageTk.PhotoImage(image2)
        Button(self.root, image=self.photo2, command=lambda: self.judge(1)).place(x=90, y=250)
        # 布
        image3 = Image.open(self.pics[2]).resize([70, 70])
        self.photo3 = ImageTk.PhotoImage(image3)
        Button(self.root, image=self.photo3, command=lambda: self.judge(2)).place(x=90, y=350)
        # 电脑的选择布局,图片会更新改变所以必须将按钮和图像对象没为全局的
        image4 = Image.open('4.jpg').resize([70, 70])
        self.photo4 = ImageTk.PhotoImage(image4)
        self.but_computer = Button(self.root, image=self.photo4)
        self.but_computer.place(x=350, y=250)
        # 显示提示信息
        Label(self.root, textvariable=self.prompt, font=('宋体', 22), fg='red', bg='blue').place(x=200, y=150)
        # 显示比分结果信息
        Label(self.root, textvariable=self.result, font=('宋体', 28), fg='red', bg='blue').place(x=200, y=250)

    def judge(self, n):  # 判断模块
        # 每次收到单击按钮事件,就将次数加1
        self.count += 1
        # 产生随机数,电脑根据随机数选择图片并显示
        self.r = random.randint(0, 2)
        image_computer = Image.open(self.pics[self.r]).resize([70,70])
        self.photo_c = ImageTk.PhotoImage(image_computer)  # 必须为全局变量,即对象变量
        # 在tkiner中对象的属性进行修改,用configure
        self.but_computer.configure(image=self.photo_c)

        # 进行输赢判断
        if self.r == n:
            self.score_computer += 1
            self.score_player += 1
            # 实时更新比分,用set()
            self.computer.set('电脑' + str(self.score_computer))
            self.player.set('玩家' + str(self.score_player))
            self.prompt.set('平局')
            # 玩家赢 0-2,1-0,2-1
        elif (n == 0 and self.r == 2) or (n == 1 and self.r == 0) or (n == 2 and self.r == 1):
            self.score_player += 1
            self.player.set('玩家' + str(self.score_player))
            self.prompt.set('玩家赢')
        else:
            self.score_computer += 1
            self.computer.set('电脑' + str(self.score_computer))
            self.prompt.set('电脑赢')
        # 更新比分显示
        self.result.set(str(self.score_player) + ' : ' + str(self.score_computer))
        # 当游戏次数达到5次时,当前游戏结束,显示比赛结果
        if self.count == 5:
            if self.score_player > self.score_computer:
                self.prompt.set('本次游戏玩家赢')
            elif self.score_player < self.score_computer:
                self.prompt.set('本次游戏电脑赢')
            else:
                self.prompt.set('本次游戏双方势均力敌')
            # 显示对话框,根据选择进行不同的判断处理
            msg = messagebox.askyesnocancel('提示', '本轮游戏结束,是否重新开始?')
            # 选择重新开始, 则将所有变量初始化
            if msg == True:
                self.player.set('玩家 0')
                self.computer.set('电脑 0')
                self.score_player = 0
                self.score_computer = 0
                self.count = 0
                image_computer = Image.open('4.jpg').resize([70,70])
                self.photo_c = ImageTk.PhotoImage(image_computer)
                self.but_computer.configure(image=self.photo_c)
                self.result.set(str(self.score_player) + ' : ' + str(self.score_computer))
            else:
                messagebox.askyesnocancel('警告', '游戏结束!!!')
                self.root.destroy() #关闭窗口
Game()
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/461312.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号