数学期望计算器

2023/12/23 更新,添加清除按钮,百分比,快捷键操作,修改初始窗口大小。

2023/12/22 嫌整包打包Qt5太大,换Tkinter折腾了半天,调窗口大小和缩放,效果太差,不换了。

2023/12/21 (谁能想到搓个计算器的原因是出于打游戏呢

今天上CS2炼金,找了个许久之前用过的方子炼一炉黑龙Glock,出货率15%,果不其然的炸炉了,想了想当炼金术士这么久也没仔细算过期望值,都是大概估一眼就开了,于是决定搞搞这个,搓个计算器方便以后用。

关于数学期望:▷ 数学期望(或期望值) (statorials.org)

放到炼金这里 计算公式就是: 期望值=∑(产出值×产出概率)−成本

PyQt5的简单GUI,这种小打小闹就不往Github上再建个仓库了,直接贴blog。

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QGridLayout
from PyQt5.QtCore import Qt

class CustomLineEdit(QLineEdit):
    def keyPressEvent(self, event):
        if event.key() in [Qt.Key_Plus, Qt.Key_Minus]:
            # 将按键事件传递给主窗口处理
            self.parent().keyPressEvent(event)
        else:
            # 对于其他按键事件,使用默认处理
            super().keyPressEvent(event)

class ExpectedValueCalculator(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.value_entries = []
        self.setGeometry(300, 300, 260, 220)
        self.setWindowTitle('数学期望计算器')

        # 创建布局
        layout = QVBoxLayout()

        # 成本输入
        cost_layout = QHBoxLayout()
        cost_layout.addStretch()
        cost_layout.addWidget(QLabel('成本:'))
        self.cost_entry = CustomLineEdit(self)
        cost_layout.addWidget(self.cost_entry)
        cost_layout.addStretch()
        layout.addLayout(cost_layout)

        # 几率和产出价值输入
        self.grid_layout = QGridLayout()
        self.grid_layout.addWidget(QLabel('几率%'), 0, 0)
        self.grid_layout.addWidget(QLabel('产出价值'), 0, 1)
        layout.addLayout(self.grid_layout)

        # 添加和删除按钮布局
        btn_layout = QHBoxLayout()
        btn_layout.addStretch()
        clear_btn = QPushButton('清除', self)
        clear_btn.clicked.connect(self.clear_entries)
        btn_layout.addWidget(clear_btn)
        add_btn = QPushButton('+', self)
        add_btn.clicked.connect(self.add_value_entry)
        btn_layout.addWidget(add_btn)
        remove_btn = QPushButton('-', self)
        remove_btn.clicked.connect(self.remove_value_entry)
        btn_layout.addWidget(remove_btn)
        btn_layout.addStretch()
        layout.addLayout(btn_layout)

        # 计算按钮和结果显示
        calc_layout = QHBoxLayout()
        calc_layout.addStretch()
        calc_btn = QPushButton('计算', self)
        calc_btn.clicked.connect(self.calculate_expected_value)
        calc_layout.addWidget(calc_btn)
        calc_layout.addStretch()
        layout.addLayout(calc_layout)

        self.result_label = QLabel('数学期望: 0')
        layout.addWidget(self.result_label)

        self.setLayout(layout)
        self.add_value_entry()
        self.add_value_entry()
        self.add_value_entry()

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Plus:
            self.add_value_entry()
        elif event.key() == Qt.Key_Minus:
            self.remove_value_entry()
        elif event.key() == Qt.Key_Return:
            self.calculate_expected_value()
        elif event.key() == Qt.Key_Escape:
            self.clear_entries()

    def add_value_entry(self):
        probability_entry = CustomLineEdit(self)
        value_entry = CustomLineEdit(self)
        row = len(self.value_entries) + 2
        self.grid_layout.addWidget(probability_entry, row, 0)
        self.grid_layout.addWidget(value_entry, row, 1)
        self.value_entries.append((probability_entry, value_entry))

    def remove_value_entry(self):
        if len(self.value_entries) > 1:
            probability_entry, value_entry = self.value_entries.pop()
            probability_entry.deleteLater()
            value_entry.deleteLater()

    def clear_entries(self):
        self.cost_entry.clear()
        for probability_entry, value_entry in self.value_entries:
            probability_entry.clear()
            value_entry.clear()
        self.result_label.setText('数学期望: 0')

    def calculate_expected_value(self):
        try:
            cost = float(self.cost_entry.text())
            total_value = sum(float(entry[1].text()) * float(entry[0].text()) / 100 for entry in self.value_entries)
            expected_value = total_value - cost
            percentage_value = (expected_value / cost) * 100 if cost != 0 else 0
            self.result_label.setText(f'数学期望: {expected_value:.2f} ({percentage_value:.2f}%)')
        except ValueError as e:
            self.result_label.setText(f'错误: {e}')

def main():
    app = QApplication(sys.argv)
    ex = ExpectedValueCalculator()
    ex.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
Table of Contents