当前位置:首页>python>39.Python实战__模拟 “ 剪、包、锤 ”游戏

39.Python实战__模拟 “ 剪、包、锤 ”游戏

  • 2026-10-11 07:19:28
39.Python实战__模拟 “ 剪、包、锤 ”游戏
    前面聊了聊如何在GUI窗口里面加载图片,今天就用图片结合其它控件来模拟一个咱们常玩的包袱、剪刀、锤 的小游戏,游戏的动画效果如下:
    其实上面的游戏很简单,用到的控件就是两个:标签、下拉菜单;素材就是6张小图片;
    主要逻辑就是利用下拉菜单的信号currentTextChanged 连接一个槽函数,所有给标签设置图片的操作都在槽函数内完成;
附上原代码:
一、导入常用的模块
from PySide6.QtCore import Qtfrom PySide6.QtGui import QPixmapfrom PySide6.QtWidgets import QWidget, QApplication,      QGridLayout, QLabel, QComboBoximport random # 导入随机模块
二、创建类 Win 并继承自 QWidget
class Win(QWidget):    def __init__(self):                super().__init__()                # 设置窗口标题                self.setWindowTitle("剪包锤游戏")                # 设置窗口尺寸                self.resize(500, 350)                # 设置样式表,可先跳过,后面有空再聊                self.setStyleSheet("""                                                      QWidget                          {                           font-size:20px;                           border-image: url(./bg02.png);                          }                           QLabel                           {                            font-size:20px;                            border-image: none;                           }                           QComboBox                           {                            font-size:20px;                            border-image: none;                           }                            """)                # 创建主布局为网格布局        self.main_layout = QGridLayout()        # 把网格布局设置给主窗口                self.setLayout(self.main_layout)                # 设置各网格间距为20                self.main_layout.setSpacing(20)                # 设置布局中各列的宽度占比                self.main_layout.setColumnStretch(0, 1)                self.main_layout.setColumnStretch(1, 1)                self.main_layout.setColumnStretch(2, 3)                # 设置布局中控件顶部对齐                self.main_layout.setAlignment(Qt.AlignmentFlag.AlignTop)        # 下面是为主窗口设置背景图片后重新绘制背景                self.setAttribute(Qt.WidgetAttribute.WA_StyledBackground, True)        # 创建setup_01 实例方法                # 在实例方法中创建控件                self.setup_01()
三、创建实例方法setup_01( )
def setup_01(self):        # 创建一个列表        self.list = ["包袱", "剪刀", "锤"]        # 创建一个标签和下拉菜单        self.label_00 = QLabel("人方:")        self.combobox_01 = QComboBox()        # 给下拉菜单添加列表选项        self.combobox_01.addItems(self.list)        # 设置下拉菜单启动显示为空        self.combobox_01.setCurrentIndex(-1)        # 为下拉菜单启动时设置占位提示内容        self.combobox_01.setPlaceholderText("请选择手势")        # 为下拉列表 当前文本改变 信号连接一个槽函数        self.combobox_01.currentTextChanged.connect(self.show_image)        # 创建一个列表显示为电脑方        self.label_02 = QLabel("电脑方:")        # 设置列表居中显示        self.label_02.setAlignment(Qt.AlignmentFlag.AlignCenter)        # 把上面控件添加到网格布局中        self.main_layout.addWidget(self.label_00, 0, 0)        self.main_layout.addWidget(self.combobox_01, 0, 1)        # 电脑方在布局中占两列        self.main_layout.addWidget(self.label_02, 0, 2)        # 创建人方标签用来放置剪、包、锤图片        self.label_10 = QLabel()        # 设置标签内容图片居中显示        self.label_10.setAlignment(Qt.AlignCenter)        # 创建电脑方标签用来放置剪、包、锤图片        self.label_11 = QLabel()        # 设置标签内容图片居中显示        self.label_11.setAlignment(Qt.AlignCenter)        # 把二个标签放到布局中        self.main_layout.addWidget(self.label_10, 1, 0, 1, 2)        self.main_layout.addWidget(self.label_11, 1, 2)        # 创建一个文字标签用来显示游戏结果        self.label_20 = QLabel()        self.main_layout.addWidget(self.label_20, 2, 0, 1, -1)
四、创建槽函数,并实现逻辑运算
def show_image(self, text):        if text == "包袱":                img = QPixmap("./包.png")        elif text == "剪刀":                img = QPixmap("./剪.png")        else:                img = QPixmap("./锤.png")        # 对图片进行缩放    scaled_img = img.scaled(190, 190)        self.label_10.setPixmap(scaled_img)        # 使用随机函数,使电脑从列表中取出一个结果        self.result = random.choice(self.list)     # 下面是用随机函数拿到的电脑随机手势       if self.result == "包袱":        img_2 = QPixmap("./包1.png")    elif self.result == "剪刀":                img_2 = QPixmap("./剪1.png")        else:                img_2 = QPixmap("./锤1.png")        # 对图片进行缩放    scaled_img_2 = img_2.scaled(190, 190)        self.label_11.setPixmap(scaled_img_2)        # 下面是输赢判断if语句    # 用if语句判断输赢        if text == "包袱":                if self.result == "包袱":                        result_show = "双方平局!"                elif self.result == "剪刀":                        result_show = "很遗憾,你输了!"                else:                        result_show = "恭喜你,你赢了!"        elif text == "剪刀":                if self.result == "包袱":                        result_show = "恭喜你,你赢了!"                elif self.result == "剪刀":                        result_show = "双方平局!"                else:                        result_show = "很遗憾,你输了!"        else:                if self.result == "包袱":                        result_show = "很遗憾,你输了!"                elif self.result == "剪刀":                        result_show = "恭喜你,你赢了!"                else:                        result_show = "双方平局!"     # 给标签设置判定输赢的结果       self.label_20.setText(result_show)        # 设置文本居中显示    self.label_20.setAlignment(Qt.AlignmentFlag.AlignCenter)        # 为文字设置样式表,字体尺寸30px; 颜色为红色;    self.label_20.setStyleSheet(                                 "font-size: 30px;"                                    "color: red;"                                )                           
五、最后是实例化并运行程序
if __name__ == "__main__":    import sys    # 创建一个应用程序对象    app = QApplication(sys.argv)    # 实例化一个窗口win    win = Win()    # 显示窗口win    win.show()    # 运行app程序    sys.exit(app.exec())
    上面的槽函数都是用最直接,最容易理解的语法写的,其实专业程序员,完全可以优化一下,让代码更少,但是针对业余爱好者,上面的写法是最容易理解的逻辑;大家有空了可以自己敲一遍,想一想,练习练习。

最新文章

随机文章