这里是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编写石头、布、剪刀游戏的完整攻略。在实现过程中,需要注意事件处理程序的编写以及布局和组件的配合使用。