24点游戏实现(下)

2021-05-24 14:44:26 浏览数 (1)

前面 写了一个24点游戏(上)https://cloud.tencent.com/developer/article/1827914,后面又录了一个前半部分代码的实现过程24点游戏实现(上):http://mpvideo.qpic.cn/0bf2xqaegaaa64acr7eyljqfbpgdio6aaqya.f10002.mp4?dis_k=1ae21883131923bec5fe542bde9d2a9d&dis_t=1621838294&vid=wxv_1862428760449269765&format_id=10002&support_redirect=1。

今天放上完整的实现效果和代码。

http://mpvideo.qpic.cn/0bf234afkaaa64ajv4e3inqfbx6dkxpqavia.f10002.mp4?dis_k=160917d5c730368424c028f40b083918&dis_t=1621838158&spec_id=MzI4NDYzNTM2MA==1621838436&vid=wxv_1866156197779652614&format_id=10002&support_redirect=1

实现的过程最难的就是查看答案那部分,主要需要穷尽所有可能的答案,不清楚的可以去看之前的文章讲解。

24点游戏(上):https://cloud.tencent.com/developer/article/1827914

全排列组合实现方法:https://cloud.tencent.com/developer/article/1827915

最早有讲过GUI程序的原理,其实本质上和写其他的程序是一样的,主要就是将输入输出换了一个形式,中间处理逻辑还是不变的;另外一个,触发程序的方式变成事件驱动的了,你点个按钮或者鼠标,然后执行某段代码。

python GUI界面设计的那些事 https://cloud.tencent.com/developer/article/1812505

python GUI界面设计的那些事(二) https://cloud.tencent.com/developer/article/1812506

python GUI界面设计的那些事(三) https://cloud.tencent.com/developer/article/1812517

GUI程序比一般的程序其实更好写,因为控件以及功能一开始就帮你划分好了,你只需要依次实现每个控件的功能。


导入库

初始化界面和变量

选择牌,设置牌和设置按钮数字

清空文本框和输入内容

确定答案

无答案

下一轮

计算所有可能的排列组合

显示答案


代码语言:javascript复制
import sys
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtGui import *
from ui_24 import Ui_MainWindow
import os
import random


class Game(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.show()

        self.nums = [] # 保存牌对应的数字
        self.four_card = None #保存四张牌
        self.choice_card() # 选择牌
        self.set_card() #设置牌
        self.set_num() # 设置数字
        self.content = "" # 保存文本框内容
        self.is_have_answer = None #是否存在答案标志变量
        self.combination = []  # 4个数字组合
        self.all_result = []  # 满足24结果的组合
        self.permutation(self.nums) #计算所有可能组合

        # 绑定数字按钮与运算符按钮
        self.pbtn_num1.clicked.connect(lambda: self.input_str(self.pbtn_num1.text()))
        self.pbtn_num2.clicked.connect(lambda: self.input_str(self.pbtn_num2.text()))
        self.pbtn_num3.clicked.connect(lambda: self.input_str(self.pbtn_num3.text()))
        self.pbtn_num4.clicked.connect(lambda: self.input_str(self.pbtn_num4.text()))

        self.pbtn_plus.clicked.connect(lambda: self.input_str(self.pbtn_plus.text()))
        self.pbtn_minus.clicked.connect(lambda: self.input_str(self.pbtn_minus.text()))
        self.pbtn_mutil.clicked.connect(lambda: self.input_str(self.pbtn_mutil.text()))
        self.pbtn_div.clicked.connect(lambda: self.input_str(self.pbtn_div.text()))

        self.pbtn_k_1.clicked.connect(lambda: self.input_str(self.pbtn_k_1.text()))
        self.pbtn_k_2.clicked.connect(lambda: self.input_str(self.pbtn_k_2.text()))

        # 绑定清空按钮与方法
        self.pbtn_clear.clicked.connect(self.clear)
        # 绑定确定按钮与方法
        self.pbtn_enter.clicked.connect(self.judge)
        # 绑定无答案按钮与方法
        self.pbtn_no.clicked.connect(self.no_answer)
        # 绑定下一轮按钮与方法
        self.pbtn_next.clicked.connect(self.next_round)
        # 绑定查看按钮与方法
        self.pbtn_view.clicked.connect(self.display_answer)

    # 选择牌
    def choice_card(self):
        self.nums = []
        all_card = os.listdir("card1")
        self.four_card = random.choices(all_card, k=4)
        for card in self.four_card:
            result = card.split("_")[-1][:-4]
            self.nums.append(result)
        print(self.nums, self.four_card)

    # 设置牌
    def set_card(self):
        card_name_list = [self.card1, self.card2, self.card3, self.card4]
        for i in range(len(card_name_list)):
            card_name = QPixmap(f"card1/{self.four_card[i]}")
            card_name_list[i].setPixmap(card_name)

    # 设置按钮数字
    def set_num(self):
        num_pbtn_list = [self.pbtn_num1, self.pbtn_num2, self.pbtn_num3, self.pbtn_num4]
        for i in range(len(num_pbtn_list)):
            s = str(self.nums[i])
            num_pbtn_list[i].setText(s)

    # 清除文本框内容
    def clear(self):
        self.lb_input.setText("")

    # 输入数字和运算符
    def input_str(self, txt):
        self.content = self.lb_input.text()   txt
        self.lb_input.setText(self.content)

    # 确定
    def judge(self):
        self.content = self.lb_input.text()
        # 替换文本中的乘号和除号为python的运算符
        if "×" in self.content:
            self.content = self.content.replace("×", "*")
        if "÷" in self.content:
            self.content = self.content.replace("÷", "/")
        if eval(self.content) == 24:
            choice = QMessageBox.information(self, "提示信息", "nicen是否进行下一轮", QMessageBox.Yes | QMessageBox.No,
                                             QMessageBox.Yes)
            if choice == QMessageBox.Yes:
                self.next_round()
            else:
                pass

        else:
            choice = QMessageBox.information(self, "提示信息", "再接再厉n是否进行下一轮", QMessageBox.Yes | QMessageBox.No,
                                             QMessageBox.Yes)
            if choice == QMessageBox.No:
                pass
            else:
                self.next_round()

    # 无答案
    def no_answer(self):
        if self.is_have_answer ==True:
            choice = QMessageBox.information(self, "提示信息", "再接再厉n是否显示答案", QMessageBox.Yes | QMessageBox.No,
                                             QMessageBox.Yes)
            if choice == QMessageBox.No:
                pass
            else:
                self.display_answer()
        else:
            choice = QMessageBox.information(self, "提示信息", "nicen是否进行下一轮", QMessageBox.Yes | QMessageBox.No,
                                             QMessageBox.Yes)
            if choice == QMessageBox.Yes:
                self.next_round()
            else:
                pass

    # 下一轮
    def next_round(self):
        self.is_have_answer = None
        self.clear()
        self.choice_card()
        self.set_card()
        self.set_num()
        self.combination = []  # 4个数字组合
        self.all_result = []  # 满足24结果的组合
        self.permutation(self.nums)

    # 计算排列组合的答案
    def permutation(self, num_list):
        self.combination = []
        for i in range(4):
            for j in range(4):
                for m in range(4):
                    for n in range(4):
                        a = num_list.copy()
                        if i != j and i != m and i != n and j != m and j != n and m != n:
                            self.combination.append([a[i], a[j], a[m], a[n]])

        # 操作符列表
        operators = [" ", "-", "*", "/"]

        for item in self.combination:
            for i in operators:
                for j in operators:
                    for m in operators:
                        # 从左到右的组合
                        result1 = eval(f"{item[0]}{i}{item[1]}")
                        result2 = eval(f"{result1}{j}{item[2]}")
                        result3 = eval(f"{result2}{m}{item[3]}")
                        if result3 == 24:
                            self.all_result.append(f"(({item[0]}{i}{item[1]}){j}{item[2]}){m}{item[3]}")
                        # 两两组合
                        result4 = eval(f"{item[0]}{i}{item[1]}")
                        result5 = eval(f"{item[2]}{m}{item[3]}")
                        if result5 == 0 and j == "/":
                            continue
                        else:
                            result6 = eval(f"{result4}{j}{result5}")
                            if result6 == 24 and result5:
                                self.all_result.append(f"({item[0]}{i}{item[1]}){j}({item[2]}{m}{item[3]})")
        if self.all_result:
            self.is_have_answer = True
        else:
            self.is_have_answer = False

    # 显示答案
    def display_answer(self):
        if self.all_result:
            QMessageBox.information(self, "提示信息", f"第一个答案:{self.all_result[0]}", QMessageBox.Yes | QMessageBox.No,
                                    QMessageBox.Yes)
            print(self.all_result[0])
        else:
            print("不存在答案")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Game()
    sys.exit(app.exec_())

(全文完)

欢迎转载,转载请注明出处!

0 人点赞