def go(self): mv = Moves() movelist = [] y = 0 for line in self.board: x = 0 for square in line: if square=="P": mlist = mv.pawn(x,y) mlist2 = filter(lambda xy: not self.board[xy[1]][xy[0]].isupper(),mlist) for x2, y2 in mlist2: if util.isThisMoveLegal(copy.deepcopy(self.board),(square.upper(),x,x2,y,y2)): usimove = util.rawtousi(square.lower(),x,x2,y,y2,self.sente) if y2 < 3: usimove += "+" #usimove = util.rawtousi(square.lower(),x,x2,y,y2) movelist.append(usimove) #print(usimove) #print("pawn at {}{} can move to {}{}".format(x+1,y+1,x2+1,y2+1)) elif square=="L": mlist = mv.lance(x,y) mlist2 = [] for lx,ly in mlist: if self.board[ly][lx]=="": mlist2.append((lx,ly)) elif self.board[ly][lx].isupper(): break else: mlist2.append((lx,ly)) break for x2, y2 in mlist2: if util.isThisMoveLegal(copy.deepcopy(self.board),(square.upper(),x,x2,y,y2)): usimove = util.rawtousi(square.lower(),x,x2,y,y2,self.sente) if y2 < 3: usimove += "+" #usimove = util.rawtousi(square.lower(),x,x2,y,y2) movelist.append(usimove) #print(usimove) #print("lance at {}{} can move to {}{}".format(x+1,y+1,x2+1,y2+1)) elif square=="N": mlist = mv.knight(x,y) mlist2 = filter(lambda xy: not self.board[xy[1]][xy[0]].isupper(),mlist) for x2, y2 in mlist2: if util.isThisMoveLegal(copy.deepcopy(self.board),(square.upper(),x,x2,y,y2)): usimove = util.rawtousi(square.lower(),x,x2,y,y2,self.sente) if y2 < 3: usimove += "+" #usimove = util.rawtousi(square.lower(),x,x2,y,y2) movelist.append(usimove) #print(usimove) #print("knight at {}{} can move to {}{}".format(x+1,y+1,x2+1,y2+1)) elif square=="S": mlist = mv.silver(x,y) mlist2 = filter(lambda xy: not self.board[xy[1]][xy[0]].isupper(),mlist) for x2, y2 in mlist2: if util.isThisMoveLegal(copy.deepcopy(self.board),(square.upper(),x,x2,y,y2)): usimove = util.rawtousi(square.lower(),x,x2,y,y2,self.sente) if y2 < 3: usimove += "+" #usimove = util.rawtousi(square.lower(),x,x2,y,y2) movelist.append(usimove) #print(usimove) #print("silver at {}{} can move to {}{}".format(x+1,y+1,x2+1,y2+1)) elif square=="G": mlist = mv.gold(x,y) mlist2 = filter(lambda xy: not self.board[xy[1]][xy[0]].isupper(),mlist) for x2, y2 in mlist2: if util.isThisMoveLegal(copy.deepcopy(self.board),(square.upper(),x,x2,y,y2)): usimove = util.rawtousi(square.lower(),x,x2,y,y2,self.sente) #usimove = util.rawtousi(square.lower(),x,x2,y,y2) movelist.append(usimove) #print(usimove) #print("gold at {}{} can move to {}{}".format(x+1,y+1,x2+1,y2+1)) elif square=="K": mlist = mv.king(x,y) mlist2 = filter(lambda xy: not self.board[xy[1]][xy[0]].isupper(),mlist) for x2, y2 in mlist2: if util.isThisMoveLegal(copy.deepcopy(self.board),(square.upper(),x,x2,y,y2)): usimove = util.rawtousi(square.lower(),x,x2,y,y2,self.sente) #usimove = util.rawtousi(square.lower(),x,x2,y,y2) movelist.append(usimove) #print(usimove) #print("king at {}{} can move to {}{}".format(x+1,y+1,x2+1,y2+1)) elif square=="R": mlist = mv.rook(x,y) mlist2 = [] #print(mlist) for mlpart in mlist[:4]: for lx,ly in mlpart: if self.board[ly][lx]=="": mlist2.append((lx,ly)) elif self.board[ly][lx].isupper(): break else: mlist2.append((lx,ly)) break for x2, y2 in mlist2: if util.isThisMoveLegal(copy.deepcopy(self.board),(square.upper(),x,x2,y,y2)): usimove = util.rawtousi(square.lower(),x,x2,y,y2,self.sente) if y2 < 3: usimove += "+" #usimove = util.rawtousi(square.lower(),x,x2,y,y2) movelist.append(usimove) #print(usimove) #print("rook at {}{} can move to {}{}".format(x+1,y+1,x2+1,y2+1)) elif square=="B": mlist = mv.bishop(x,y) mlist2 = [] #print(mlist) for mlpart in mlist[:4]: for lx,ly in mlpart: if self.board[ly][lx]=="": mlist2.append((lx,ly)) elif self.board[ly][lx].isupper(): break else: mlist2.append((lx,ly)) break for x2, y2 in mlist2: if util.isThisMoveLegal(copy.deepcopy(self.board),(square.upper(),x,x2,y,y2)): usimove = util.rawtousi(square.lower(),x,x2,y,y2,self.sente) if y2 < 3: usimove += "+" #usimove = util.rawtousi(square.lower(),x,x2,y,y2) movelist.append(usimove) #print(usimove) #print("bishop at {}{} can move to {}{}".format(x+1,y+1,x2+1,y2+1)) elif square=="+P" or square=="+L" or square=="+N" or square=="+S": mlist = mv.gold(x,y) mlist2 = filter(lambda xy: not self.board[xy[1]][xy[0]].isupper(),mlist) for x2, y2 in mlist2: if util.isThisMoveLegal(copy.deepcopy(self.board),(square.upper(),x,x2,y,y2)): usimove = util.rawtousi(square.lower(),x,x2,y,y2,self.sente) #usimove = util.rawtousi(square.lower(),x,x2,y,y2) movelist.append(usimove) #print(usimove) #print("narikin at {}{} can move to {}{}".format(x+1,y+1,x2+1,y2+1)) elif square=="+R": mlist = mv.rook(x,y,dragon=True) mlist2 = [] for mlpart in mlist[:4]: for lx,ly in mlpart: if self.board[ly][lx]=="": mlist2.append((lx,ly)) elif self.board[ly][lx].isupper(): break else: mlist2.append((lx,ly)) break for lx,ly in mlist[4]: mlist2.append((lx,ly)) for x2, y2 in mlist2: if util.isThisMoveLegal(copy.deepcopy(self.board),(square.upper(),x,x2,y,y2)): usimove = util.rawtousi(square.lower(),x,x2,y,y2,self.sente) #usimove = util.rawtousi(square.lower(),x,x2,y,y2) movelist.append(usimove) #print(usimove) #print("dragon at {}{} can move to {}{}".format(x+1,y+1,x2+1,y2+1)) elif square=="+B": mlist = mv.bishop(x,y,horse=True) mlist2 = [] for mlpart in mlist[:4]: for lx,ly in mlpart: if self.board[ly][lx]=="": mlist2.append((lx,ly)) elif self.board[ly][lx].isupper(): break else: mlist2.append((lx,ly)) break for lx,ly in mlist[4]: mlist2.append((lx,ly)) for x2, y2 in mlist2: if util.isThisMoveLegal(copy.deepcopy(self.board),(square.upper(),x,x2,y,y2)): usimove = util.rawtousi(square.lower(),x,x2,y,y2,self.sente) #usimove = util.rawtousi(square.lower(),x,x2,y,y2) movelist.append(usimove) #print(usimove) #print("horse at {}{} can move to {}{}".format(x+1,y+1,x2+1,y2+1)) x += 1 y += 1 sfeny = ["a","b","c","d","e","f","g","h","i"] for koma in self.komadai: for tempy in range(9): for tempx in range(9): if self.board[tempy][tempx]=="": if self.sente: usimove = "{}*{}{}".format(koma.upper(),tempx+1,sfeny[tempy]) else: usimove = "{}*{}{}".format(koma.upper(),9-tempx,sfeny[8-tempy]) if util.isThisDropLegal(copy.deepcopy(self.board),(koma.upper(),tempx,tempy)): movelist.append(usimove) print(movelist) #time.sleep(5) if util.isCheck(self.board,"opponent"): ismate = util.isMate(copy.deepcopy(self.board),movelist,self.sente) if ismate[0]: print("bestmove {}".format("resign")) return else: movelist = ismate[1] bm = random.choice(movelist) print("bestmove {}".format(bm)) return scoredmovelist=[] nodes = 0 for usimove in movelist: calcboard = copy.deepcopy(self.board) calckmd = copy.deepcopy(self.komadai) if usimove[1]=="*": piece = usimove[0] calckmd.remove(piece.lower()) if self.sente: calcboard[self.SFD[usimove[3]]][int(usimove[2])-1] = piece else: calcboard[8-self.SFD[usimove[3]]][9-int(usimove[2])] = piece else: if self.sente: piece = calcboard[self.SFD[usimove[1]]][int(usimove[0])-1] if usimove[-1]=="+": piece = "+"+piece if calcboard[self.SFD[usimove[3]]][int(usimove[2])-1].islower(): calckmd.append(calcboard[self.SFD[usimove[3]]][int(usimove[2])-1][-1].lower()) calcboard[self.SFD[usimove[3]]][int(usimove[2])-1] = piece calcboard[self.SFD[usimove[1]]][int(usimove[0])-1] = "" else: piece = calcboard[8-self.SFD[usimove[1]]][9-int(usimove[0])] if usimove[-1]=="+": piece = "+"+piece if calcboard[8-self.SFD[usimove[3]]][9-int(usimove[2])].islower(): calckmd.append(calcboard[8-self.SFD[usimove[3]]][9-int(usimove[2])][-1].lower()) calcboard[8-self.SFD[usimove[3]]][9-int(usimove[2])] = piece calcboard[8-self.SFD[usimove[1]]][9-int(usimove[0])] = "" #okomadai = evaluation.getokomadai(calcboard,calckmd) #score = evaluation.evaluation(calcboard,calckmd,self.okomadai,mv,turn="opponent") score = tansaku.minimax(calcboard,calckmd,self.okomadai,mv,2,1,self.sente) nodes += 1 print("info time 1 depth 1 nodes {} score cp {} pv {}".format(nodes,score,usimove)) scoredmovelist.append((usimove,score)) #print(scoredmovelist) bm = max(scoredmovelist,key=lambda x:x[1]) if bm[1]>4000: bms = util.TsumiTansaku(self.board,movelist,self.sente,"me") if bms==[]: bms = [usimv for usimv,sco in scoredmovelist if sco == bm[1]] else: bms = [usimv for usimv,sco in scoredmovelist if sco == bm[1]] print(bms) bm = random.choice(bms) print("bestmove {}".format(bm))