前面 写了一个24点游戏 24点游戏(上)​,后面又录了一个前半部分代码的实现过程24点游戏实现(上)。


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


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


24点游戏(上)

全排列组合实现方法


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


python GUI界面设计的那些事

python GUI界面设计的那些事(二)

python GUI界面设计的那些事(三)


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

24点游戏实现(下)_提示信息




导入库


24点游戏实现(下)_提示信息_02


初始化界面和变量



24点游戏实现(下)_24点_03


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


24点游戏实现(下)_python_04


清空文本框和输入内容


24点游戏实现(下)_24点_05


确定答案

24点游戏实现(下)_24点_06

无答案

24点游戏实现(下)_python_07

下一轮

24点游戏实现(下)_python_08


计算所有可能的排列组合

24点游戏实现(下)_python_09

显示答案

24点游戏实现(下)_24点_10




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_())


(全文完)


长按二维码,加关注!叶子陪你玩

24点游戏实现(下)_提示信息_11


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

欢迎关注公众微信号:叶子陪你玩编程