PyQt5–石头布和剪刀布游戏
在这篇文章中,我们将看到如何使用PyQt5创建一个剪刀石头布游戏。 剪刀石头布是 一种手游,通常在两个人之间进行,每个玩家同时用伸出的手形成三种形状中的一种。这些形状是 “石头”、”纸 “和 “剪刀”。下面是该游戏的表现形式。
GUI的实施步骤:
- 创建一个头部标签,显示游戏的标题,设置其字体和属性
-
在头部标签下面创建一个用户标签,将显示用户选择的手势
- 创建一个计算机标签,显示由计算机选择的手势
- 在用户和电脑标签之间创建一个标签,显示文本 “vs”
- 创建一个结果标签,显示结果,设置字体和其他属性
- 创建三个按钮,分别用于石头、纸和剪子
- 创建一个重置按钮来重置游戏
**后端实施步骤: **
- 创建用户选择和计数器变量,设置其值为-1
-
为石头、布和剪刀按钮添加动作
-
在动作中根据按下的按钮设置选择值,并将计数器的值设置为3,使所有三个按钮失效
-
创建定时器对象,每隔一秒钟调用一次方法
- 在定时器方法中,如果计数器的值为-1,则不做任何其他事情,将计数器的值设置为计算机标签,并递减计数器
- 检查计数器的值是否等于0,然后从1到3中得到一个随机值,根据这个值将手的符号设置到计算机标签上
- 调用who_win方法来获得结果
- 在who_wins方法中,首先检查比赛是否为平局,否则找出赢家,并将赢家设置为结果标签
- 为复位按钮添加动作
- 在复位按钮的动作中,将计数器的值设置为-1,启用所有的按钮,并从计算机和用户标签中删除图像。
实施 。
# importing libraries
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import random
import sys
class Window(QMainWindow):
def __init__(self):
super().__init__()
# setting title
self.setWindowTitle("Python ")
# setting geometry
self.setGeometry(100, 100, 320, 400)
# calling method
self.UiComponents()
# showing all the widgets
self.show()
# method for components
def UiComponents(self):
# counter variable
self.counter = -1
# choice variable
self.choice = 0
# creating head label
head = QLabel("Rock Paper Scissor", self)
# setting geometry to the head
head.setGeometry(20, 10, 280, 60)
# font
font = QFont('Times', 15)
font.setBold(True)
font.setItalic(True)
font.setUnderline(True)
# setting font to the head
head.setFont(font)
# setting alignment of the head
head.setAlignment(Qt.AlignCenter)
# setting color effect to the head
color = QGraphicsColorizeEffect(self)
color.setColor(Qt.darkCyan)
head.setGraphicsEffect(color)
# creating a vs label
self.vs = QLabel("vs", self)
# setting geometry
self.vs.setGeometry(150, 110, 30, 50)
# setting font
font.setUnderline(False)
font.setItalic(False)
self.vs.setFont(font)
# creating your choice label
self.user = QLabel("You", self)
# setting geometry
self.user.setGeometry(50, 100, 70, 70)
self.user.setStyleSheet(
"border : 2px solid black; background : white;")
# setting alignment
self.user.setAlignment(Qt.AlignCenter)
# creating computer choice label
self.computer = QLabel("Computer", self)
# setting geometry
self.computer.setGeometry(200, 100, 70, 70)
self.computer.setStyleSheet(
"border : 2px solid black; background : white;")
# setting alignment
self.computer.setAlignment(Qt.AlignCenter)
# result label
self.result = QLabel(self)
# setting geometry to the result
self.result.setGeometry(25, 200, 270, 50)
# setting font
self.result.setFont(QFont('Times', 14))
# setting alignment
self.result.setAlignment(Qt.AlignCenter)
# setting border and color
self.result.setStyleSheet(
"border : 2px solid black; background : white;")
# creating three push button
# for rock paper and scissor
self.rock = QPushButton("Rock", self)
self.rock.setGeometry(30, 270, 80, 35)
self.paper = QPushButton("Paper", self)
self.paper.setGeometry(120, 270, 80, 35)
self.scissor = QPushButton("Scissor", self)
self.scissor.setGeometry(210, 270, 80, 35)
# adding actions to the buttons
self.rock.clicked.connect(self.rock_action)
self.paper.clicked.connect(self.paper_action)
self.scissor.clicked.connect(self.scissor_action)
# creating push button to reset all the game
game_reset = QPushButton("Reset", self)
# setting geometry
game_reset.setGeometry(100, 320, 120, 50)
# setting color effect
color = QGraphicsColorizeEffect(self)
color.setColor(Qt.red)
game_reset.setGraphicsEffect(color)
# adding action to the reset button
game_reset.clicked.connect(self.reset_action)
# creating a timer object
timer = QTimer(self)
# adding action to the timer
timer.timeout.connect(self.showTime)
# starting the timer
timer.start(1000)
def showTime(self):
# if counter value is - 1
if self.counter == -1:
pass
# if counter is not - 1
else:
# setting counter value to the label
self.computer.setText(str(self.counter))
if self.counter == 0:
self.comp_choice = random.randint(1, 3)
# if computer choice is 1
if self.comp_choice == 1:
# setting rock image to the computer label
self.computer.setStyleSheet(
"border-image : url(rock.png);")
elif self.comp_choice == 2:
# setting paper image to the computer label
self.computer.setStyleSheet(
"border-image : url(Paper.png);")
else:
# setting scissor image to the computer label
self.computer.setStyleSheet(
"border-image : url(scissor.png);")
# checking who won the match
self.who_won()
# decrementing the counter value
self.counter -= 1
def rock_action(self):
# making choice as 1
self.choice = 1
# setting rock image to the user label
self.user.setStyleSheet("border-image : url(rock.png);")
# making counter value to 3
self.counter = 3
# disabling the push button
self.rock.setDisabled(True)
self.paper.setDisabled(True)
self.scissor.setDisabled(True)
def paper_action(self):
# making choice as 2
self.choice = 2
# setting rock image to the user label
self.user.setStyleSheet("border-image : url(Paper.png);")
# making counter value to 3
self.counter = 3
# disabling the push button
self.rock.setDisabled(True)
self.paper.setDisabled(True)
self.scissor.setDisabled(True)
def scissor_action(self):
# making choice as 3
self.choice = 3
# setting rock image to the user label
self.user.setStyleSheet("border-image : url(scissor.png);")
# making counter value to 3
self.counter = 3
# disabling the push button
self.rock.setDisabled(True)
self.paper.setDisabled(True)
self.scissor.setDisabled(True)
def reset_action(self):
# making result label empty
self.result.setText("")
# resting the counter value
self.counter = -1
# enabling the push buttons
self.rock.setEnabled(True)
self.paper.setEnabled(True)
self.scissor.setEnabled(True)
# removing images from the user and computer label
self.user.setStyleSheet("border-image : null;")
self.computer.setStyleSheet("border-image : null;")
def who_won(self):
# if match is draw
if self.choice == self.comp_choice:
# setting text to the result label
self.result.setText("Draw Match")
else:
# condition for winning
# user choose rock
if self.choice == 1:
# computer choose paper
if self.comp_choice == 2:
# setting text to the result
self.result.setText("Computer Wins")
else:
self.result.setText("User Wins")
# user chooses paper
elif self.choice == 2:
# computer choose scissor
if self.comp_choice == 3:
# setting text to the result
self.result.setText("Computer Wins")
else:
self.result.setText("User Wins")
# if user chooses scissor
elif self.choice == 3:
# computer choose rock
if self.comp_choice == 1:
# setting text to the result
self.result.setText("Computer Wins")
else:
self.result.setText("User Wins")
# create pyqt5 app
App = QApplication(sys.argv)
# create the instance of our Window
window = Window()
# start the app
sys.exit(App.exec())
代码解释 。
- 代码从创建一个新的类–Window开始。
- 这个类将是我们应用程序的主窗口。
- 接下来,调用
__init__()
方法。 - 在这个方法中,我们设置窗口的标题并配置其几何形状。
- 我们还调用UiComponents(),这是一个特殊的方法,将显示窗口中所有的小部件。
- 现在让我们来看看当我们运行这段代码时会发生什么。
- 首先,我们创建一个Window的实例,并将其标题设为 “Python”。
- 然后我们配置窗口的几何形状,把它的大小设置为100×100像素,把它在屏幕上的位置设置为320×400像素(见图1-1)。
- 图 1-1: 配置了几何图形的 Python 窗口 接下来,我们调用 UiComponents()。
- 这种方法将在窗口中显示我们所有的小部件(见图1-2)。
- 窗口对象 图 1-2: 显示所有部件的 Python 窗口 在这个例子中,我们的窗口中只有两个部件 – 文本框和按钮。
- 然而,你可以添加尽可能多的小工具
- 该代码创建了一个新的窗口,并将其标题设置为 “Python”。
- 然后它将窗口的几何形状设置为(100, 100, 320, 400)。
- 最后,它在窗口对象上调用UiComponents()方法。
- 16.UiComponents()方法负责显示窗口中所有的小部件。
- 该代码首先通过调用show()来显示所有的部件。
- 在显示完所有的部件后,代码调用一个叫做updateWidget()的方法。
- 这个方法负责更新窗口中的每个部件。
- 代码开始创建一个QLabel对象,并将其几何形状设置为宽20、10、280像素,高60像素。
- 21.然后将标签的字体设置为Times New Roman,并启用粗体和斜体设置,同时启用下划线。
- 最后,头部的对齐方式被设置为Qt.AlignCenter。
- 接下来,代码创建了一个选择变量,并将其设置为0。
- 选择变量将存储用户在石头(0)和纸(1)之间的选择。
- 下一行代码创建了一个头部标签对象,并将其几何形状设置为20,10,280像素宽,60像素高。
- 然后,标签的字体被设置为Times New Roman,并启用粗体和斜体设置,同时禁用下划线。
- 最后,头部的对齐方式被设置为Qt.AlignLeftJustified。
- 接下来,我们使用QPushButton对象创建两个按钮。
- 一个按钮将用于选择石头或纸,而另一个将用于取消游戏。
- 我们首先创建一个名为 “rock “的QPushButton对象。
- 这个按钮将被用来选择玩家是否要玩石头。
- 代码创建了一个QLabel对象,并将其几何形状设置为20×10像素,左上角为(280,60)像素。
- 然后,字体被设置为Times New Roman字体,粗体、斜体和下划线属性被设置为True。
- 最后,头部的对齐方式被设置为Qt.AlignCenter。
- 代码开始创建一个新的QGraphicsItem,它是用户界面的头部。
- 头部对象有一个GraphicsEffect属性,可以被设置为几种颜色效果之一。
- 在这个例子中,我们使用QGraphicsColorizeEffect类来改变头部对象的颜色为深青色。
- 接下来,我们创建一个新的QLabel对象,并将其几何尺寸设置为150 x 110像素,宽度为30像素,高度为50像素。
- 我们还将其字体属性设置为下划线(false)和斜体(false),这样它就不会显示任何文字。
- 最后,我们创建另一个名为user的QLabel对象,并将其几何尺寸设置为50 x 100像素,宽度为70像素,高度为70像素。
- 现在让我们看一下使用这些对象的一些代码。# 设置颜色 self.head.setGraphicsEffect(Qt.darkCyan) # 创建 vs 标签 self.vs = QLabel(“vs”, self) # 设置几何形状 self.vs.setGeometry(150, 110, 30, 50)
- 该代码将创建一个名为head的QGraphicsItem对象,并将图形效果设置为着色。
- 头部也将创建一个QLabel对象,并将其作为父对象。
- 标签将被赋予150 x 110像素的几何形状,宽度为30像素,高度为50像素。
- 接下来,标签的字体将被设置为斜体,并禁用下划线。
- 最后,用户的QLabel对象将被创建,尺寸与头部相同。
- 代码从创建一个用户界面开始。
- 用户界面由三个标签、一个计算机选择标签和三个按钮组成。
- 第一个按钮,岩石按钮,被设置为30×270像素的几何形状,边界为80像素,中心点为35像素。
-
- 第二个按钮,即纸张按钮,其几何尺寸为120×270像素,边界为80像素,中心点为35像素。
- 第三个按钮,即剪刀按钮,其几何尺寸为210×270像素,有80像素的边框和35像素的中心点。
- 接下来,代码为每个按钮设置了动作。
- 对于 “石头 “按钮,代码将其连接到一个动作,当它被点击时在屏幕上打印 “石头”。
- 对于 “纸 “按钮,代码将其连接到一个动作,当它被点击时在屏幕上打印出 “纸”。
- 对于剪刀按钮,代码将其连接到一个动作,当它被点击时在屏幕上打印出 “剪刀”。
- 该代码创建了一个有三个按钮的用户界面。
- 第一个按钮,”岩石”,被配置为具有以下几何形状。30 x 270 x 80像素。
- 第二个按钮,”纸”,被配置为具有以下几何形状:120 x 270 x 80像素。
- 第三个按钮 “剪刀 “被配置为具有以下几何图形:210 x 270 x 80像素。
- 每个按钮都有一个与之相关的动作。
- 岩石按钮的动作与rock_action函数相连,当它被点击时将被执行。
- 纸张按钮的动作与paper_action函数相连,当它被点击时将被执行。
- 剪刀按钮的动作与sc_action函数相连,并在点击时执行。
- 代码从创建一个名为game_reset的QPushButton对象开始。
- 该按钮有以下属性: name: “game_reset” label: “重置 “图标。”ui/images/pushbutton.png” 接下来,代码使用setGeometry()设置按钮的几何形状。
- 坐标是(100,320,120,50)。
- 按钮的尺寸也被指定(它将是100×32像素)。
- 最后,用setGraphicsEffect()给按钮添加一个颜色效果。
- 这个效果使用Qt的红色作为它的底色。
- 下一步是为game_reset按钮创建一个动作处理程序。
- 当有人点击它时,这个处理程序将被调用。
- 该代码创建了一个QTimer对象,并给它附加了一个名为timeout()的动作。
- 这个动作将导致定时器运行1000毫秒(1秒)。
- 在这段时间过后,showTime()函数将被执行。
- 这个函数只是在屏幕上显示一条信息:”定时器开始”。
- 该代码创建了一个名为game_reset的QPushButton,并将其几何形状设置为100 x 320像素,宽度为120像素,高度为50像素。
- 它还将按钮的颜色设置为红色。
- 接下来,代码创建了一个QGraphicsColorizeEffect对象,并将其颜色设置为Qt.red。
- 最后,代码为game_reset按钮添加了一个名为clicked的动作,将其连接到self.reset_action函数。
- 当用户点击game_reset按钮时,这个函数将被执行。
- 这段代码的最后部分负责创建一个定时器对象,并为其添加一个名为timeout的动作,将其连接到self.showTime函数。
- 这个函数将
- 这段代码以初始化一些变量开始。
- 第一个变量是self.counter,它将跟踪石头、布和剪刀按钮被点击的次数。
- 接下来,代码设置了三个按钮(石头、纸和剪刀)并定义了它们各自的动作。
- 当用户点击岩石按钮时,代码将self.choice设为1,并将用户标签的边框图片设为rock.png。
- 当用户点击纸张按钮时,代码将self.choice设为2,并将用户标签的边框图片设为Paper.png。
- 最后,当用户点击剪刀按钮时,代码将self.choice设为3,并将用户标签的边框图片设为Scissor.png。
- 接下来是一些逻辑,检查谁赢得了用户之间的每场比赛岩石对纸张,岩石对剪刀,和纸张对剪刀。
- 如果其中一个匹配已经完成(由任何一个玩家点击这些按钮之一),那么什么也不会发生;屏幕上不会显示或以任何方式改变新的图像,因为没有必要这样做,因为两个玩家都是
- 这段代码首先设置了一些变量来存储用户的选择信息。
- 这些变量将在以后的代码中用于检查谁赢得了比赛。
- 接下来,代码会检查是否有任何按钮被点击过。
- 如果其中一个按钮被点击了,那么就会采取适当的行动。
- 如果没有按钮被点击,那么代码会设置三个按钮,并通过检查用户的选择变量来确定用户会选择哪一个。
- 一旦做出这个决定,适当的岩石图像、纸张图像或剪刀图像将被设置为用户的标签,计数器的值将减少1。