PyQt5–石头布和剪刀布游戏

  • Post category:Python

这里是Python的PyQt5石头、布、剪刀游戏使用攻略,整个游戏涉及到了PyQt5的图形界面以及Python的逻辑处理。

游戏介绍

石头、布、剪刀游戏是一种小游戏,规则十分简单:玩家出一个手势(石头、布、剪刀),电脑也出一个手势,双方比较大小,如果玩家胜利则获得1分,电脑胜利则扣除1分,游戏一共进行10轮,分数多的一方获胜。

PyQt5图形界面制作

在PyQt5中,我们使用QLabel组件来创建石头、布、剪刀的图片显示,使用QPushButton组件来创建操作按钮,使用QLineEdit组件来显示分数和当前轮数。

# 导入PyQt5组件
from PyQt5.QtWidgets import QApplication, QLabel, QPushButton, QLineEdit, QMessageBox, QWidget, QHBoxLayout, QVBoxLayout
from PyQt5.QtGui import QFont, QPixmap
from PyQt5.QtCore import Qt, QTimer

# 创建应用
app = QApplication([])
app.setFont(QFont("Microsoft YaHei"))

# 创建窗口
window = QWidget()
window.setWindowTitle("石头、布、剪刀游戏")
window.setFixedSize(800, 600)

# 设计背景色
window.setStyleSheet("background-color:#F2F2F2")

# 设置水平和垂直布局
h_layout = QHBoxLayout() # 水平布局
v_layout = QVBoxLayout() # 垂直布局

# 创建石头、布、剪刀的QLabel组件
label_stone = QLabel(window)
label_stone.setMaximumSize(128, 128)
label_stone.setPixmap(QPixmap("images/stone.jpg"))

label_paper = QLabel(window)
label_paper.setMaximumSize(128, 128)
label_paper.setPixmap(QPixmap("images/paper.jpg"))

label_scissors = QLabel(window)
label_scissors.setMaximumSize(128, 128)
label_scissors.setPixmap(QPixmap("images/scissors.jpg"))

# 创建分数和当前轮数的QLineEdit组件
line_score = QLineEdit(window)
line_score.setAlignment(Qt.AlignCenter)
line_score.setEnabled(False)

line_round = QLineEdit(window)
line_round.setAlignment(Qt.AlignCenter)
line_round.setEnabled(False)

# 创建操作按钮
button_start = QPushButton("开始游戏", window)
button_restart = QPushButton("重新开始", window)
button_stone = QPushButton("石头", window)
button_paper = QPushButton("布", window)
button_scissors = QPushButton("剪刀", window)

# 添加到布局中
h_layout.addWidget(label_stone)
h_layout.addWidget(label_paper)
h_layout.addWidget(label_scissors)

v_layout.addWidget(line_score)
v_layout.addWidget(line_round)

v_layout.addWidget(button_start)
v_layout.addWidget(button_restart)

h_layout.addLayout(v_layout)

h_layout.addWidget(button_stone)
h_layout.addWidget(button_paper)
h_layout.addWidget(button_scissors)

# 设置布局
window.setLayout(h_layout)

# 显示窗口
window.show()

游戏规则

在Python代码中,我们需要定义游戏规则以及判断胜负的函数。

# 定义游戏规则
RULES = {
    "stone": {
        "win": "scissors",
        "lost": "paper",
        "image": "images/stone.jpg"
    },
    "paper": {
        "win": "stone",
        "lost": "scissors",
        "image": "images/paper.jpg"
    },
    "scissors": {
        "win": "paper",
        "lost": "stone",
        "image": "images/scissors.jpg"
    }
}

player_score = 0 # 玩家分数
computer_score = 0 # 电脑分数
round_count = 0 # 当前轮数

# 判断胜负的函数
def is_win(player_selection, computer_selection):
    global player_score, computer_score

    if player_selection == computer_selection:
        result = "平局"
    elif RULES[player_selection]["win"] == computer_selection:
        result = "你赢了"
        player_score += 1
    else:
        result = "电脑赢了"
        computer_score += 1

    # 更新分数和轮数
    line_score.setText("玩家{}分 - {}分电脑".format(player_score, computer_score))
    round_count += 1
    line_round.setText("当前轮数:{}".format(round_count))

    # 判断是否达到最大轮数
    if round_count >= 10:
        if player_score > computer_score:
            msg_box = QMessageBox(QMessageBox.Information, "游戏结束", "你赢了!")
        elif player_score < computer_score:
            msg_box = QMessageBox(QMessageBox.Information, "游戏结束", "电脑赢了!")
        else:
            msg_box = QMessageBox(QMessageBox.Information, "游戏结束", "平局!")

        msg_box.exec_()
        restart_game()
        return

    # 显示胜负结果
    msg_box = QMessageBox(QMessageBox.Information, "本轮结果", result)
    msg_box.exec_()

开始游戏、重新开始和出拳

添加事件处理程序以控制游戏进程, 包括开始游戏、“重新开始”和“出拳”等操作。

# 开始游戏
def start_game():
    global player_score, computer_score, round_count

    player_score = 0
    computer_score = 0
    round_count = 0

    line_score.setText("玩家{}分 - {}分电脑".format(player_score, computer_score))
    line_round.setText("当前轮数:{}".format(round_count))

    button_stone.setEnabled(True)
    button_paper.setEnabled(True)
    button_scissors.setEnabled(True)

# 重新开始游戏
def restart_game():
    start_game()
    line_score.clear()
    line_round.clear()

# 出拳
def player_select(hand):
    button_stone.setEnabled(False)
    button_paper.setEnabled(False)
    button_scissors.setEnabled(False)

    # 显示玩家出的手势
    player_image = QLabel(window)
    player_image.setMaximumSize(128, 128)
    player_image.setPixmap(QPixmap(RULES[hand]["image"]))

    v_layout.addWidget(player_image)

    # 显示电脑出的手势
    computer_image = QLabel(window)
    computer_image.setMaximumSize(128, 128)

    timer = QTimer()
    timer.setInterval(100)
    timer.timeout.connect(lambda: computer_image.setPixmap(QPixmap(RULES[random.choice(["stone", "paper", "scissors"])]["image"])))
    timer.start()

    v_layout.addWidget(computer_image)

    # 判断胜负
    QTimer.singleShot(2000, lambda: is_win(hand, computer_image.pixmap().toImage()))

示例说明

以下是两个示例说明:

示例 1:开始游戏和出拳

在这个示例中,我们将演示如何开始游戏,并让玩家出“石头”。

# 开始游戏
start_game()

# 玩家出石头
button_stone.clicked.connect(lambda: player_select("stone"))

示例 2:重新开始游戏

在这个示例中,我们将演示如何重新开始游戏。

# 重新开始游戏
button_restart.clicked.connect(restart_game)

结束语

以上就是使用PyQt5和Python编写石头、布、剪刀游戏的完整攻略。在实现过程中,需要注意事件处理程序的编写以及布局和组件的配合使用。