"""
数计班
罗子鸣
2019191144
"""
import sys
import time
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt
from eight_puzzle_problem import EightPuzzleProblem
class SearchMethod: # 记录搜索时间
def __init__(self, time_cost: float, ans_list: list):
self.time_cost = time_cost
self.ans_list = ans_list
class Start(QWidget): # 显示第一个"开始"界面
def __init__(self):
super().__init__()
self.init_UI()
# 设置第一个UI界面
def init_UI(self):
v_layout = QVBoxLayout() # 创建垂直布局
info = QLabel()
info.setText("8-Puzzle Problem") # 屏幕显示text
info.setAlignment(Qt.AlignCenter) # 居中对齐
info.setStyleSheet("QLabel{color:rgb(0,0,0,255);font-size:60px;font-weight:normal;font-family:Consolas;}")
v_layout.addWidget(info)
# 设置start按键
StartButton = QPushButton("Start")
StartButton.clicked.connect(self.onClick_Button)
v_layout.addWidget(StartButton, 0.1)
# 显示作者
author = QLabel()
author.setText("Author: 罗子鸣2019191144") # 屏幕显示text
author.setAlignment(Qt.AlignCenter) # 居中对齐
author.setStyleSheet("QLabel{color:black;font-size:20px;font-weight:normal;font-family:Consolas;}")
v_layout.addWidget(author)
self.setLayout(v_layout)
self.resize(900, 600) # 调整窗口大小
self.setWindowTitle("eppUI")
self.show_center()
self.show()
@staticmethod
def onClick_Button():
begin.close()
ex.start_slove()
# 控制窗口显示在屏幕中心的方法
def show_center(self):
# 获得窗口
qr = self.frameGeometry()
# 获得屏幕中心点
center_point = QDesktopWidget().availableGeometry().center()
# 显示到屏幕中心
qr.moveCenter(center_point)
self.move(qr.topLeft())
class ShowNoSolution(QWidget): # 显示无搜索结果界面
def __init__(self):
super().__init__()
self.init_UI()
def init_UI(self):
v_layout = QVBoxLayout()
info = QLabel()
info.setText("No solution!")
info.setAlignment(Qt.AlignCenter)
info.setStyleSheet("QLabel{color:black;font-size:60px;font-weight:normal;font-family:Arial;}")
v_layout.addWidget(info)
self.setLayout(v_layout)
self.resize(900, 600)
self.setWindowTitle("No Solution")
self.show_center()
begin.close()
print("逆序数为奇数,问题无解!")
self.show()
def show_center(self):
qr = self.frameGeometry()
center_point = QDesktopWidget().availableGeometry().center()
qr.moveCenter(center_point)
self.move(qr.topLeft())
class Puzzle(QWidget):
def __init__(self, state_list: list, search_methods: [] = None):
super().__init__()
self.search_methods = search_methods
self.state_list: list = state_list
self.pix: list = [QPixmap("pic\\pic1.jpg"),
QPixmap("pic\\pic2.jpg"),
QPixmap("pic\\pic3.jpg"),
QPixmap("pic\\pic4.jpg"),
QPixmap("pic\\pic5.jpg"),
QPixmap("pic\\pic6.jpg"),
QPixmap("pic\\pic7.jpg"),
QPixmap("pic\\pic8.jpg"),
QPixmap("pic\\pic9.jpg"),
] # 读取图片
for i in range(0, 9):
self.pix[i] = self.pix[i].scaled(500, 500, QtCore.Qt.KeepAspectRatio) # 调整图片分辨率
def getMap(self, pix: list):
lbl = []
gird_layout = QGridLayout()
for i in self.state_list[0]:
tmp_lbl = QLabel()
tmp_lbl.setPixmap(self.pix[i])
tmp_lbl.setMaximumSize(300, 300)
tmp_lbl.setScaledContents(True)
lbl.append(tmp_lbl)
# 布局设置
for i in range(0, 3):
for j in range(0, 3):
gird_layout.addWidget(lbl[3 * i + j], i, j)
gird_widget = QWidget()
gird_widget.setLayout(gird_layout)
return gird_widget
def start_slove(self): # 显示游戏界面
self.resize(1350, 800)
self.setWindowTitle("8-Puzzle Problem")
self.show_center()
step = 0 # 计步
txt_step = QLabel()
txt_step.setText("The game will start in 3 seconds")
txt_step.setStyleSheet("QLabel{color:rgb(0,0,0,255);font-size:27px;font-weight:normal;font-family:Consolas;}")
txt_test = QLabel()
txt_test.setText("This is a test operation.")
txt_test.setStyleSheet("QLabel{color:rgb(0,0,0,255);font-size:27px;font-weight:normal;font-family:Consolas;}")
# 获取BFS搜索时间
time_cost_bfs = self.search_methods[0].time_cost
time_cost_bfs = '{:.5f}'.format(time_cost_bfs)
txt1 = QLabel()
txt1.setText("BFS: "
"time cost: " + time_cost_bfs + "s" + " " * 3 +
"steps: " + str(len(self.search_methods[0].ans_list) - 1))
txt1.setStyleSheet("QLabel{color:red;font-size:22px;font-weight:normal;font-family:Consolas;}")
# 获取DFS搜索时间
time_cost_dfs = self.search_methods[1].time_cost
time_cost_dfs = '{:.5f}'.format(time_cost_dfs)
txt2 = QLabel()
txt2.setText("DFS: "
"time cost: " + time_cost_dfs + "s" + " " * 3 +
"steps: " + str(len(self.search_methods[1].ans_list) - 1))
txt2.setStyleSheet("QLabel{color:blue;font-size:22px;font-weight:normal;font-family:Consolas;}")
# 获取A*1搜索时间
txt3 = QLabel()
time_cost_Astar1 = self.search_methods[2].time_cost
time_cost_Astar1 = '{:.5f}'.format(time_cost_Astar1)
txt3.setText("A*_1 "
"time cost: " + time_cost_Astar1 + "s" + " " * (3 + len(time_cost_bfs) - len(time_cost_Astar1)) +
"steps: " + str(len(self.search_methods[2].ans_list) - 1))
txt3.setStyleSheet("QLabel{color:orange;font-size:22px;font-weight:normal;font-family:Consolas;}")
# 获取A*2搜索时间
txt4 = QLabel()
time_cost_Astar2 = self.search_methods[3].time_cost
time_cost_Astar2 = '{:.5f}'.format(time_cost_Astar2)
txt4.setText("A*_2 "
"time cost: " + time_cost_Astar2 + "s" + " " * (3 + len(time_cost_bfs) - len(time_cost_Astar2)) +
"steps: " + str(len(self.search_methods[3].ans_list) - 1))
txt4.setStyleSheet("QLabel{color:green;font-size:22px;font-weight:normal;font-family:Consolas;}")
outside = QHBoxLayout()
# 左边画布
h_box_l = QHBoxLayout()
h_widget_l = QWidget()
h_widget_l.setLayout(h_box_l) # 设置布局
h_widget_l.setMaximumSize(800, 800) # 设置尺寸
v_box_r = QVBoxLayout()
v_widget_r = QWidget()
v_widget_r.setLayout(v_box_r) # 设置布局
v_widget_r.setMaximumSize(550, 800) # 设置尺寸
# 添加显示文本框
v_box_r.addWidget(txt_step)
v_box_r.addWidget(txt1)
v_box_r.addWidget(txt2)
v_box_r.addWidget(txt3)
v_box_r.addWidget(txt4)
outside.addWidget(h_widget_l)
outside.addWidget(v_widget_r)
self.setLayout(outside)
self.show()
first = True
start_widget = self.getMap(self.pix[:])
h_box_l.addWidget(start_widget)
while len(self.state_list) > 0:
if first:
QApplication.pr
评论1