11# author : Wang Jianing(18201)
22from random import shuffle , choice
33# from random import randint, seed, sample
4- # from itertools import combinations
4+ from typing import List
55# import time
66from safe_eval import safe_eval
77import configparser
1111
1212# OutputEnable = 0
1313# seedNum = 60223
14- EnuLimit = 40
14+ # EnuLimit = 40
15+ EnuLimit = 4
1516
1617def choose_3BV (board_constraint , attempt_times_limit , params ):
1718 # def choose_3BV_laymine(laymine):
@@ -175,81 +176,7 @@ def refreshBoard2(Board , BoardofGame, ClickedPoses):
175176 ClickedPoses .append ((m ,n ))
176177 return BoardofGame
177178
178- # def SolveDirect(MatrixA, Matrixx, Matrixb, BoardofGame):
179- # # 考虑只一个方程判雷,比如3个方格,雷数也是正好是3,等等
180- # # 返回MatrixA, Matrixx, Matrixb, BoardofGame, NotMine, flag
181- # # flag=1表明有所动作,比如标雷或发现NotMine
182- # # NotMine存储非雷的位置
183- # # 注意:处理结束后的矩阵可能有重复的行(?)
184- # flag = 0
185- # NotMine = []
186- # MatrixColumn = len(Matrixx)
187- # MatrixRow = len(Matrixb)
188- # for i in range(MatrixRow-1, -1, -1):#第一轮循环,找是雷的位置
189- # if sum(MatrixA[i][:]) == Matrixb[i]:
190- # flag = 1
191- # for k in range(MatrixColumn-1, -1, -1):
192- # if MatrixA[i][k] == 1:
193- # m,n = Matrixx[k]
194- # BoardofGame[m][n] = 11#在游戏局面中标雷
195- # Matrixx.pop(k)
196- # for t in range(0,MatrixRow):
197- # if MatrixA[t][k] == 0:
198- # MatrixA[t].pop(k)
199- # else:
200- # MatrixA[t].pop(k)
201- # Matrixb[t] -= 1
202- # MatrixColumn -= 1
203- # MatrixA.pop(i)
204- # Matrixb.pop(i)
205- # MatrixRow -= 1
206- # for i in range(MatrixRow-1, -1, -1):# 第二轮循环,找不是雷的位置
207- # if Matrixb[i]==0:
208- # flag = 1
209- # for k in range(MatrixColumn-1, -1, -1):
210- # if MatrixA[i][k] == 1 and Matrixx[k] not in NotMine:
211- # NotMine.append(Matrixx[k])
212-
213- # return BoardofGame, NotMine, flag
214-
215- # SolveMinus = ms_toollib.py_SolveMinus
216- # SolveMinus(MatrixA, Matrixx, Matrixb, BoardofGame)
217- # 用减法和集合的包含关系判雷
218- # 返回BoardofGame, NotMine, flag
219- # 如果发现IsMine而没有发现NotMine,会再用单集合找一遍。如果发现NotMine,则不调用方法1
220- # 因此,若方法2没有发现NotMine,则方法1也不可能发现NotMine;
221- # 若方法2发现NotMine,则方法1还可能发现NotMine
222- # 注意:处理结束后的矩阵可能有重复的行
223-
224- # SolveEnumerate = ms_toollib.py_SolveEnumerate
225- # SolveEnumerate(MatrixA, Matrixx, Matrixb, BoardofGame, enuLimit=30)
226- #枚举法判雷
227-
228- # calPossibility = ms_toollib.py_cal_possibility
229-
230- # calPossibility_onboard = ms_toollib.py_cal_possibility_onboard
231-
232- def refreshMatrixWithNotMine (MatrixA ,Matrixx ,Matrixb ,NotMine ):
233- # 用非雷刷新三个矩阵,同时删掉全为0的行
234- # 拟弃用。不合理。
235- # MatrixA,Matrixx,Matrixb = refreshMatrixWithNotMine(MatrixA,Matrixx,Matrixb,NotMine)
236- MatrixRow = len (Matrixb )
237- # MatrixColumn = len(Matrixx)
238- NotMineRel = []
239- for j in NotMine :
240- NotMineRel .append (Matrixx .index (j ))
241- NotMineRel .sort (reverse = True )
242- for m in NotMineRel :
243- Matrixx .pop (m )
244- for i in range (MatrixRow - 1 , - 1 , - 1 ):
245- if sum (MatrixA [i ][:]) == 0 :
246- MatrixA .pop (i )
247- Matrixb .pop (i )
248- continue
249- for m in NotMineRel :
250- MatrixA [i ].pop (m )
251-
252- return MatrixA , Matrixx , Matrixb
179+
253180
254181def Victory (BoardofGame ,Board ):
255182 # 判断当前是否获胜
@@ -264,7 +191,7 @@ def Victory(BoardofGame,Board):
264191 return 1
265192
266193
267- def enumerateChangeBoard (board , BoardofGame , xx , yy ):
194+ def enumerateChangeBoard (board , BoardofGame , xx , yy ) -> ( List [ List [ int ]], bool ) :
268195 # 等可能给出全部可能情况中(i,j)不为雷的随机一种情况,此时(i,j)一定是未打开状态;
269196 # 但若超过最大枚举长度,
270197 # 将返回非随机的某一种可能的情况(暂未实现),若剩余位置数少于雷数,则返回原图
@@ -518,59 +445,6 @@ def debug_ms_board(ms_board):
518445
519446
520447
521- # layMineSolvable = ms_toollib.layMineSolvable
522- # layMineSolvable = ms_toollib.py_layMineSolvable_thread
523- # layMineSolvable(Row, Column, MineNum, X0, Y0, Min3BV = 0, Max3BV = 1e6,
524- # MaxTimes = 1e6, enuLimit = 30)
525- # 3BV下限、上限,最大尝试次数,返回是否成功。
526- # 若不成功返回最后生成的局面(不一定无猜),默认尝试十万次
527- # 工具箱里的这两个函数,一个是单线程,一个是多线程
528- # 性能对比:(16, 16, 72) -> 10.49, 32.02
529- # (16, 30, 99) -> 2.98, 2.66
530- # layMineSolvable = debug_laymine
531-
532-
533- # calOp = ms_toollib.py_calOp # 输入列表的局面,计算空,0的8连通域数
534- # calOp(Board)
535-
536- # cal3BV = ms_toollib.py_cal3BV
537- # 计算3BV,接受列表
538- # def cal3BV(Board):
539-
540- # def isJudgeable(BoardofGame, EnuLimit=30):
541- # # 返回此时是否存在可判的格子,如果还能判返回True
542- # # 这个过程中,如果AI见到的游戏局面中有未标的雷,会标雷,但仍然可能有漏标的
543- # # flag = 0
544- # MatrixA, Matrixx, Matrixb = refreshMatrix(BoardofGame)
545- # BoardofGame, NotMine, flag = SolveDirect(MatrixA, Matrixx, Matrixb, BoardofGame)
546- # if not NotMine:
547- # MatrixA, Matrixx, Matrixb = refreshMatrix(BoardofGame)
548- # BoardofGame, NotMine, flag = SolveMinus(MatrixA, Matrixx, Matrixb, BoardofGame)
549- # if not NotMine:
550- # Matrix_as, Matrix_xs, Matrix_bs, _ = refresh_matrixs(BoardofGame)
551- # BoardofGame, NotMine, flag = SolveEnumerate(Matrix_as, Matrix_xs, Matrix_bs, BoardofGame, EnuLimit)
552- # if not NotMine:
553- # return BoardofGame, False
554- # return BoardofGame, True
555-
556- # def xyisJudgeable(BoardofGame, x, y, EnuLimit=30):
557- # # (x,y)是否必然安全,如果必然安全,返回True
558- # MatrixA, Matrixx, Matrixb = refreshMatrix(BoardofGame)
559-
560- # if (x,y) not in Matrixx: # 内部的非雷按理无法判出
561- # return False
562-
563- # BoardofGame, NotMine, flag = SolveDirect(MatrixA, Matrixx, Matrixb, BoardofGame)
564- # if (x,y) not in NotMine:
565- # MatrixA, Matrixx, Matrixb = refreshMatrix(BoardofGame)
566- # BoardofGame, NotMine, flag = SolveMinus(MatrixA, Matrixx, Matrixb, BoardofGame)
567- # if (x,y) not in NotMine:
568- # Matrix_as, Matrix_xs, Matrix_bs, _, _ = refresh_matrixs(BoardofGame) # result of refresh_matrixs has len of 5
569- # BoardofGame, NotMine, flag = SolveEnumerate(Matrix_as, Matrix_xs, Matrix_bs, BoardofGame, EnuLimit)
570- # if (x,y) not in NotMine:
571- # return False
572- # return True
573-
574448def updata_ini (file_name : str , data ):
575449 conf = configparser .ConfigParser ()
576450 conf .read (file_name , encoding = 'utf-8' )
0 commit comments