前面 写了一个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_())
(全文完)
欢迎转载,转载请注明出处!