前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >24点游戏实现(下)

24点游戏实现(下)

作者头像
叶子陪你玩
发布2021-05-24 14:44:26
5330
发布2021-05-24 14:44:26
举报

前面 写了一个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%3D%3D1621838436&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, "提示信息", "nice\n是否进行下一轮", 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, "提示信息", "nice\n是否进行下一轮", 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_())

(全文完)

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 叶子陪你玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档