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()



