You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Sudo/main/main.py

365 lines
12 KiB

11 months ago
"""
Name:Sudo Game
Date:2024.04.09
Version:1.0
Description:None
"""
import pickle
11 months ago
import random
from PySide6.QtCore import QTimer
11 months ago
from PySide6.QtWidgets import *
from PySide6.QtGui import QIcon
from win.win import Ui_Form as Form1
import sudo as sd
def replace_element(arr, old_val, new_val):
return list(map(lambda x: new_val if x == old_val else x, arr))
def count_occurrences(lst, x, mode):
count = 0
if mode == 0:
for item in lst:
if item == x:
count += 1
else:
for row in lst:
for item in row:
if item == x:
count += 1
return count
class Form(Form1):
def __init__(self):
super().__init__()
self.setupUi(self)
self.total_seconds = 0
# self.test()
self.konami_code = [65, 66, 65, 66]
# self.lll =[]
self.konami_index = 0
11 months ago
self.pushButton.clicked.connect(self.B_back)
self.B_S.clicked.connect(self.B_S_fun)
self.B_save.clicked.connect(self.B_save_fun)
self.B_read.clicked.connect(self.B_read_fun)
11 months ago
self.timer = QTimer()
self.timer.setInterval(1000)
self.timer.timeout.connect(self.update_time)
self.init_bt()
11 months ago
def init_bt(self):
11 months ago
self.B0_0.clicked.connect(self.put_num)
self.B0_1.clicked.connect(self.put_num)
self.B0_2.clicked.connect(self.put_num)
self.B0_3.clicked.connect(self.put_num)
self.B0_4.clicked.connect(self.put_num)
self.B0_5.clicked.connect(self.put_num)
self.B0_6.clicked.connect(self.put_num)
self.B0_7.clicked.connect(self.put_num)
self.B0_8.clicked.connect(self.put_num)
self.B1_0.clicked.connect(self.put_num)
self.B1_1.clicked.connect(self.put_num)
self.B1_2.clicked.connect(self.put_num)
self.B1_3.clicked.connect(self.put_num)
self.B1_4.clicked.connect(self.put_num)
self.B1_5.clicked.connect(self.put_num)
self.B1_6.clicked.connect(self.put_num)
self.B1_7.clicked.connect(self.put_num)
self.B1_8.clicked.connect(self.put_num)
self.B2_0.clicked.connect(self.put_num)
self.B2_1.clicked.connect(self.put_num)
self.B2_2.clicked.connect(self.put_num)
self.B2_3.clicked.connect(self.put_num)
self.B2_4.clicked.connect(self.put_num)
self.B2_5.clicked.connect(self.put_num)
self.B2_6.clicked.connect(self.put_num)
self.B2_7.clicked.connect(self.put_num)
self.B2_8.clicked.connect(self.put_num)
self.B3_0.clicked.connect(self.put_num)
self.B3_1.clicked.connect(self.put_num)
self.B3_2.clicked.connect(self.put_num)
self.B3_3.clicked.connect(self.put_num)
self.B3_4.clicked.connect(self.put_num)
self.B3_5.clicked.connect(self.put_num)
self.B3_6.clicked.connect(self.put_num)
self.B3_7.clicked.connect(self.put_num)
self.B3_8.clicked.connect(self.put_num)
self.B4_0.clicked.connect(self.put_num)
self.B4_1.clicked.connect(self.put_num)
self.B4_2.clicked.connect(self.put_num)
self.B4_3.clicked.connect(self.put_num)
self.B4_4.clicked.connect(self.put_num)
self.B4_5.clicked.connect(self.put_num)
self.B4_6.clicked.connect(self.put_num)
self.B4_7.clicked.connect(self.put_num)
self.B4_8.clicked.connect(self.put_num)
self.B5_0.clicked.connect(self.put_num)
self.B5_1.clicked.connect(self.put_num)
self.B5_2.clicked.connect(self.put_num)
self.B5_3.clicked.connect(self.put_num)
self.B5_4.clicked.connect(self.put_num)
self.B5_5.clicked.connect(self.put_num)
self.B5_6.clicked.connect(self.put_num)
self.B5_7.clicked.connect(self.put_num)
self.B5_8.clicked.connect(self.put_num)
self.B6_0.clicked.connect(self.put_num)
self.B6_1.clicked.connect(self.put_num)
self.B6_2.clicked.connect(self.put_num)
self.B6_3.clicked.connect(self.put_num)
self.B6_4.clicked.connect(self.put_num)
self.B6_5.clicked.connect(self.put_num)
self.B6_6.clicked.connect(self.put_num)
self.B6_7.clicked.connect(self.put_num)
self.B6_8.clicked.connect(self.put_num)
self.B7_0.clicked.connect(self.put_num)
self.B7_1.clicked.connect(self.put_num)
self.B7_2.clicked.connect(self.put_num)
self.B7_3.clicked.connect(self.put_num)
self.B7_4.clicked.connect(self.put_num)
self.B7_5.clicked.connect(self.put_num)
self.B7_6.clicked.connect(self.put_num)
self.B7_7.clicked.connect(self.put_num)
self.B7_8.clicked.connect(self.put_num)
self.B8_0.clicked.connect(self.put_num)
self.B8_1.clicked.connect(self.put_num)
self.B8_2.clicked.connect(self.put_num)
self.B8_3.clicked.connect(self.put_num)
self.B8_4.clicked.connect(self.put_num)
self.B8_5.clicked.connect(self.put_num)
self.B8_6.clicked.connect(self.put_num)
self.B8_7.clicked.connect(self.put_num)
self.B8_8.clicked.connect(self.put_num)
# 重写窗口按键事件
def keyPressEvent(self, event):
global sudo
key = event.key()
try:
if key == self.konami_code[self.konami_index]:
self.konami_index += 1
if self.konami_index == len(self.konami_code):
sudo.print_sudo()
self.konami_index = 0
else:
self.konami_index = 0
except Exception as e:
self.konami_index = 0
# self.lll.append(key)
# print(self.lll)
11 months ago
def update_time(self):
self.total_seconds += 1
hours = self.total_seconds // 3600
minutes = (self.total_seconds % 3600) // 60
seconds = self.total_seconds % 60
time_str = f"{hours:02d}:{minutes:02d}:{seconds:02d}"
self.lcdNumber.display(time_str)
def B_save_fun(self):
global sudo,cnt,del_cnt
# 保存已填处,第一位用于记录cnt,第二位记录delcnt第三位记录time
answer_list = [cnt,del_cnt, self.total_seconds]
with open('as.pickle', 'wb') as f:
# 使用pickle的dump函数将对象写入文件
pickle.dump(answer_list, f)
with open('sudo.pickle', 'wb') as f:
# 使用pickle的dump函数将对象写入文件
pickle.dump(sudo, f)
print(f"已保存{answer_list[0]}个有效答案")
def B_read_fun(self):
global sudo, cnt, subject_with_answer,del_cnt
answer_list = None
with open('as.pickle', 'rb') as f:
# 使用pickle的load函数从文件中读取对象
answer_list = pickle.load(f)
with open('sudo.pickle', 'rb') as f:
# 使用pickle的load函数从文件中读取对象
sudo = pickle.load(f)
# 配置计数器和计时器
cnt = answer_list[0]
del_cnt = answer_list[1]
print(cnt)
stack.clear()
self.total_seconds = answer_list[2]
self.timer.start()
# 映射题目并配置答案进度
self.translate(sudo.subject)
subject_with_answer = sudo.subject_with_answer
i = 1
self.translate(subject_with_answer,1)
11 months ago
def B_back(self):
global stack, cnt, subject_with_answer
11 months ago
try:
top = stack.pop()
info = top.split(",", 1)
b = self.findChild(QPushButton, info[0])
if info[1] == ' ':
info[1] = 0
11 months ago
b.setText(' ')
cnt = cnt - 1
else:
b.setText(info[1])
subject_with_answer[int(info[0][1]), int(info[0][3])] = int(info[1])
11 months ago
except Exception as e:
print(e)
11 months ago
def check_sudo(self):
global cnt, del_cnt, subject_with_answer
11 months ago
f = 1
for row_index in range(9):
for col_index in range(9):
num = subject_with_answer[row_index, col_index]
11 months ago
# 获取该格子对应的行、列、九宫格
sudo_row = sd.get_row(subject_with_answer, row_index)
sudo_col = sd.get_col(subject_with_answer, col_index)
sudo_block = sd.get_block(subject_with_answer, row_index, col_index)
11 months ago
# print(num)
# print(sudo_row)
# print(sudo_col)
# print(sudo_block)
cnt_oc1 = count_occurrences(sudo_row, num, 0)
cnt_oc2 = count_occurrences(sudo_col, num, 0)
cnt_oc3 = count_occurrences(sudo_block, num, 1)
if cnt_oc1 != 1 or cnt_oc2 != 1 or cnt_oc3 != 1:
f = 0
break
if f == 0:
break
if f == 1:
print("yes")
QMessageBox.information(self, '提示', '成功')
11 months ago
self.timer.stop()
else:
print("no")
QMessageBox.information(self, '提示', '失败')
11 months ago
def put_num(self):
global cnt, del_cnt, subject_with_answer, stack
11 months ago
b = self.sender()
x = int(b.objectName()[1])
y = int(b.objectName()[3])
old_text = b.text()
if b.text() == ' ':
cnt = cnt + 1
stack.append(f'B{x}_{y},{old_text}')
# print(stack)
11 months ago
if self.R_1.isChecked():
b.setText("1")
subject_with_answer[x, y] = 1
11 months ago
if self.R_2.isChecked():
b.setText("2")
subject_with_answer[x, y] = 2
11 months ago
if self.R_3.isChecked():
b.setText("3")
subject_with_answer[x, y] = 3
11 months ago
if self.R_4.isChecked():
b.setText("4")
subject_with_answer[x, y] = 4
11 months ago
if self.R_5.isChecked():
b.setText("5")
subject_with_answer[x, y] = 5
11 months ago
if self.R_6.isChecked():
b.setText("6")
subject_with_answer[x, y] = 6
11 months ago
if self.R_7.isChecked():
b.setText("7")
subject_with_answer[x, y] = 7
11 months ago
if self.R_8.isChecked():
b.setText("8")
subject_with_answer[x, y] = 8
11 months ago
if self.R_9.isChecked():
b.setText("9")
subject_with_answer[x, y] = 9
11 months ago
if cnt == del_cnt:
self.check_sudo()
def B_S_fun(self):
global cnt, del_cnt, stack, sudo, subject_with_answer
11 months ago
# 清零
cnt = 0
stack.clear()
self.total_seconds = 0
self.timer.start()
# 选择难度
if self.R_e.isChecked():
level = 1
if self.R_m.isChecked():
level = 2
if self.R_h.isChecked():
level = 3
# 这里可以用多线程
sudo = sd.Sudo()
subject_with_answer = sudo.createSubjectByLevel(level).subject_with_answer
del_cnt = sudo.get_del_cnt()
# 打印参考答案
# sudo.print_sudo()
# print(sudo)
self.translate(sudo.subject)
11 months ago
def translate(self, nparray, mode=0):
# 将np数组内容映射到按钮上
for row_index, row in enumerate(nparray):
11 months ago
row_list = list(map(str, row.tolist()))
row_list = replace_element(row_list, '0', ' ')
for single_index, single in enumerate(row_list):
# 找到对象名为对应坐标的按钮
11 months ago
b = self.findChild(QPushButton, 'B' + str(row_index) + '_' + str(single_index))
# 将值映射到按钮上
11 months ago
b.setText(single)
# 禁用空值按钮
if mode == 0:
if single != ' ':
b.setDisabled(True)
else:
b.setDisabled(False)
11 months ago
if __name__ == '__main__':
cnt = 0
del_cnt = 0
stack = []
subject_with_answer = None
sudo = None
11 months ago
app = QApplication()
win = Form()
win.setWindowIcon(QIcon('src/sudo32.png'))
win.show()
app.exec()