PyQt5–石头布和剪刀布游戏

PyQt5–石头布和剪刀布游戏

在这篇文章中,我们将看到如何使用PyQt5创建一个剪刀石头布游戏。 剪刀石头布是 一种手游,通常在两个人之间进行,每个玩家同时用伸出的手形成三种形状中的一种。这些形状是 “石头”、”纸 “和 “剪刀”。下面是该游戏的表现形式。

PyQt5--石头布和剪刀布游戏

GUI的实施步骤:

  1. 创建一个头部标签,显示游戏的标题,设置其字体和属性

  2. 在头部标签下面创建一个用户标签,将显示用户选择的手势

  3. 创建一个计算机标签,显示由计算机选择的手势
  4. 在用户和电脑标签之间创建一个标签,显示文本 “vs”
  5. 创建一个结果标签,显示结果,设置字体和其他属性
  6. 创建三个按钮,分别用于石头、纸和剪子
  7. 创建一个重置按钮来重置游戏

**后端实施步骤: **

  1. 创建用户选择和计数器变量,设置其值为-1

  2. 为石头、布和剪刀按钮添加动作

  3. 在动作中根据按下的按钮设置选择值,并将计数器的值设置为3,使所有三个按钮失效

  4. 创建定时器对象,每隔一秒钟调用一次方法

  5. 在定时器方法中,如果计数器的值为-1,则不做任何其他事情,将计数器的值设置为计算机标签,并递减计数器
  6. 检查计数器的值是否等于0,然后从1到3中得到一个随机值,根据这个值将手的符号设置到计算机标签上
  7. 调用who_win方法来获得结果
  8. 在who_wins方法中,首先检查比赛是否为平局,否则找出赢家,并将赢家设置为结果标签
  9. 为复位按钮添加动作
  10. 在复位按钮的动作中,将计数器的值设置为-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())

代码解释

  1. 代码从创建一个新的类–Window开始。
  2. 这个类将是我们应用程序的主窗口。
  3. 接下来,调用 __init__() 方法。
  4. 在这个方法中,我们设置窗口的标题并配置其几何形状。
  5. 我们还调用UiComponents(),这是一个特殊的方法,将显示窗口中所有的小部件。
  6. 现在让我们来看看当我们运行这段代码时会发生什么。
  7. 首先,我们创建一个Window的实例,并将其标题设为 “Python”。
  8. 然后我们配置窗口的几何形状,把它的大小设置为100×100像素,把它在屏幕上的位置设置为320×400像素(见图1-1)。
  9. 图 1-1: 配置了几何图形的 Python 窗口 接下来,我们调用 UiComponents()。
  10. 这种方法将在窗口中显示我们所有的小部件(见图1-2)。
  11. 窗口对象 图 1-2: 显示所有部件的 Python 窗口 在这个例子中,我们的窗口中只有两个部件 – 文本框和按钮。
  12. 然而,你可以添加尽可能多的小工具
  13. 该代码创建了一个新的窗口,并将其标题设置为 “Python”。
  14. 然后它将窗口的几何形状设置为(100, 100, 320, 400)。
  15. 最后,它在窗口对象上调用UiComponents()方法。
  16. 16.UiComponents()方法负责显示窗口中所有的小部件。
  17. 该代码首先通过调用show()来显示所有的部件。
  18. 在显示完所有的部件后,代码调用一个叫做updateWidget()的方法。
  19. 这个方法负责更新窗口中的每个部件。
  20. 代码开始创建一个QLabel对象,并将其几何形状设置为宽20、10、280像素,高60像素。
  21. 21.然后将标签的字体设置为Times New Roman,并启用粗体和斜体设置,同时启用下划线。
  22. 最后,头部的对齐方式被设置为Qt.AlignCenter。
  23. 接下来,代码创建了一个选择变量,并将其设置为0。
  24. 选择变量将存储用户在石头(0)和纸(1)之间的选择。
  25. 下一行代码创建了一个头部标签对象,并将其几何形状设置为20,10,280像素宽,60像素高。
  26. 然后,标签的字体被设置为Times New Roman,并启用粗体和斜体设置,同时禁用下划线。
  27. 最后,头部的对齐方式被设置为Qt.AlignLeftJustified。
  28. 接下来,我们使用QPushButton对象创建两个按钮。
  29. 一个按钮将用于选择石头或纸,而另一个将用于取消游戏。
  30. 我们首先创建一个名为 “rock “的QPushButton对象。
  31. 这个按钮将被用来选择玩家是否要玩石头。
  32. 代码创建了一个QLabel对象,并将其几何形状设置为20×10像素,左上角为(280,60)像素。
  33. 然后,字体被设置为Times New Roman字体,粗体、斜体和下划线属性被设置为True。
  34. 最后,头部的对齐方式被设置为Qt.AlignCenter。
  35. 代码开始创建一个新的QGraphicsItem,它是用户界面的头部。
  36. 头部对象有一个GraphicsEffect属性,可以被设置为几种颜色效果之一。
  37. 在这个例子中,我们使用QGraphicsColorizeEffect类来改变头部对象的颜色为深青色。
  38. 接下来,我们创建一个新的QLabel对象,并将其几何尺寸设置为150 x 110像素,宽度为30像素,高度为50像素。
  39. 我们还将其字体属性设置为下划线(false)和斜体(false),这样它就不会显示任何文字。
  40. 最后,我们创建另一个名为user的QLabel对象,并将其几何尺寸设置为50 x 100像素,宽度为70像素,高度为70像素。
  41. 现在让我们看一下使用这些对象的一些代码。# 设置颜色 self.head.setGraphicsEffect(Qt.darkCyan) # 创建 vs 标签 self.vs = QLabel(“vs”, self) # 设置几何形状 self.vs.setGeometry(150, 110, 30, 50)
  42. 该代码将创建一个名为head的QGraphicsItem对象,并将图形效果设置为着色。
  43. 头部也将创建一个QLabel对象,并将其作为父对象。
  44. 标签将被赋予150 x 110像素的几何形状,宽度为30像素,高度为50像素。
  45. 接下来,标签的字体将被设置为斜体,并禁用下划线。
  46. 最后,用户的QLabel对象将被创建,尺寸与头部相同。
  47. 代码从创建一个用户界面开始。
  48. 用户界面由三个标签、一个计算机选择标签和三个按钮组成。
  49. 第一个按钮,岩石按钮,被设置为30×270像素的几何形状,边界为80像素,中心点为35像素。
    1. 第二个按钮,即纸张按钮,其几何尺寸为120×270像素,边界为80像素,中心点为35像素。
  50. 第三个按钮,即剪刀按钮,其几何尺寸为210×270像素,有80像素的边框和35像素的中心点。
  51. 接下来,代码为每个按钮设置了动作。
  52. 对于 “石头 “按钮,代码将其连接到一个动作,当它被点击时在屏幕上打印 “石头”。
  53. 对于 “纸 “按钮,代码将其连接到一个动作,当它被点击时在屏幕上打印出 “纸”。
  54. 对于剪刀按钮,代码将其连接到一个动作,当它被点击时在屏幕上打印出 “剪刀”。
  55. 该代码创建了一个有三个按钮的用户界面。
  56. 第一个按钮,”岩石”,被配置为具有以下几何形状。30 x 270 x 80像素。
  57. 第二个按钮,”纸”,被配置为具有以下几何形状:120 x 270 x 80像素。
  58. 第三个按钮 “剪刀 “被配置为具有以下几何图形:210 x 270 x 80像素。
  59. 每个按钮都有一个与之相关的动作。
  60. 岩石按钮的动作与rock_action函数相连,当它被点击时将被执行。
  61. 纸张按钮的动作与paper_action函数相连,当它被点击时将被执行。
  62. 剪刀按钮的动作与sc_action函数相连,并在点击时执行。
  63. 代码从创建一个名为game_reset的QPushButton对象开始。
  64. 该按钮有以下属性: name: “game_reset” label: “重置 “图标。”ui/images/pushbutton.png” 接下来,代码使用setGeometry()设置按钮的几何形状。
  65. 坐标是(100,320,120,50)。
  66. 按钮的尺寸也被指定(它将是100×32像素)。
  67. 最后,用setGraphicsEffect()给按钮添加一个颜色效果。
  68. 这个效果使用Qt的红色作为它的底色。
  69. 下一步是为game_reset按钮创建一个动作处理程序。
  70. 当有人点击它时,这个处理程序将被调用。
  71. 该代码创建了一个QTimer对象,并给它附加了一个名为timeout()的动作。
  72. 这个动作将导致定时器运行1000毫秒(1秒)。
  73. 在这段时间过后,showTime()函数将被执行。
  74. 这个函数只是在屏幕上显示一条信息:”定时器开始”。
  75. 该代码创建了一个名为game_reset的QPushButton,并将其几何形状设置为100 x 320像素,宽度为120像素,高度为50像素。
  76. 它还将按钮的颜色设置为红色。
  77. 接下来,代码创建了一个QGraphicsColorizeEffect对象,并将其颜色设置为Qt.red。
  78. 最后,代码为game_reset按钮添加了一个名为clicked的动作,将其连接到self.reset_action函数。
  79. 当用户点击game_reset按钮时,这个函数将被执行。
  80. 这段代码的最后部分负责创建一个定时器对象,并为其添加一个名为timeout的动作,将其连接到self.showTime函数。
  81. 这个函数将
  82. 这段代码以初始化一些变量开始。
  83. 第一个变量是self.counter,它将跟踪石头、布和剪刀按钮被点击的次数。
  84. 接下来,代码设置了三个按钮(石头、纸和剪刀)并定义了它们各自的动作。
  85. 当用户点击岩石按钮时,代码将self.choice设为1,并将用户标签的边框图片设为rock.png。
  86. 当用户点击纸张按钮时,代码将self.choice设为2,并将用户标签的边框图片设为Paper.png。
  87. 最后,当用户点击剪刀按钮时,代码将self.choice设为3,并将用户标签的边框图片设为Scissor.png。
  88. 接下来是一些逻辑,检查谁赢得了用户之间的每场比赛岩石对纸张,岩石对剪刀,和纸张对剪刀。
  89. 如果其中一个匹配已经完成(由任何一个玩家点击这些按钮之一),那么什么也不会发生;屏幕上不会显示或以任何方式改变新的图像,因为没有必要这样做,因为两个玩家都是
  90. 这段代码首先设置了一些变量来存储用户的选择信息。
  91. 这些变量将在以后的代码中用于检查谁赢得了比赛。
  92. 接下来,代码会检查是否有任何按钮被点击过。
  93. 如果其中一个按钮被点击了,那么就会采取适当的行动。
  94. 如果没有按钮被点击,那么代码会设置三个按钮,并通过检查用户的选择变量来确定用户会选择哪一个。
  95. 一旦做出这个决定,适当的岩石图像、纸张图像或剪刀图像将被设置为用户的标签,计数器的值将减少1。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程