#pythonista 3 #chess engine based on piece influence from array import array n = 9 m = "" #move string # 0123456789012" pieces = ".prnbqkPRNBQK" adj = 0 x = y = 0 board = array('B') board = [[0] * n for i in range(n)] inf = array('B') inf = [[0] * n for i in range(n+1)] #king influence field kf = [[-1,-1],[ 0,-1],[ 1,-1], [-1, 0], [ 1, 0], [-1, 1],[ 0, 1],[ 1, 1]] nf = [[-1,-2],[ 1,-2], [-2,-1],[ 2,-1], [-2, 1],[ 2, 1], [-1, 2],[ 1, 2]] ''' #test board board[8] = [0, 0, 0, 0, 0, 0, 0, 0, 0]# R 8 - 2 board[7] = [0, 0, 0, 0, 0, 0, 0, 0, 0]# N 9 - 3 board[6] = [0, 0, 0, 0, 0, 0, 0, 0, 0]# B 10 - 4 board[5] = [0, 0, 0, 0, 0, 0, 0, 0, 0]# Q 11 - 5 board[4] = [0, 0, 0, 0, 0, 0, 0, 0, 0]# K 12 - 6 board[3] = [0, 0, 0, 0, 0, 0, 0, 0, 0]# P 7 - 1 board[2] = [0, 0, 0, 0, 0, 0, 0, 0, 0] board[1] = [0, 0, 0, 0, 0, 0, 0, 0, 0] # 1 2 3 4 5 6 7 8 ''' #standard board W B board[8] = [0, 2, 3, 4, 5, 6, 4, 3, 2]# R 8 - 2 board[7] = [0, 1, 1, 1, 1, 1, 1, 1, 1]# N 9 - 3 board[6] = [0, 0, 0, 0, 0, 0, 0, 0, 0]# B 10 - 4 board[5] = [0, 0, 0, 0, 0, 0, 0, 0, 0]# Q 11 - 5 board[4] = [0, 0, 0, 0, 0, 0, 0, 0, 0]# K 12 - 6 board[3] = [0, 0, 0, 0, 0, 0, 0, 0, 0]# P 7 - 1 board[2] = [0, 7, 7, 7, 7, 7, 7, 7, 7] board[1] = [0, 8, 9,10,11,12,10, 9, 8] def on(h,v): # on board return(int((h>0) and (h<9) and (v>0) and (v<9))) def enter_move(m): m = input(": ") if(len(m)==3): board[int(m[2])][int(m[1])] = pieces.find(m[0]) if(len(m)==4): board[int(m[3])][int(m[2])] = board[int(m[1])][int(m[0])] board[int(m[1])][int(m[0])] = 0 def move_gen(): pass def disp_ascii(): # print out ascii representation print("\n ascii board") for j in range(1,n): print(n-j,"| ", end="") for i in range(1,n): print(pieces[board[9-j][i]], end = " ") print() print(" ","-"*22) print(" 1 2 3 4 5 6 7 8") def disp_board():#debug - display numeric board print("\n numeric board") for j in range(1,n): for i in range(1,n): print("%02d" % board[9-j][i], end = " ") print() def disp_inf():#debug - display numeric board print("\n influence") for j in range(1,n): print(n-j,"| ", end="") for i in range(1,n): print("%02d" % inf[9-j][i], end = " ") print() print(" ","-"*22) print(" 1 2 3 4 5 6 7 8") print("\ntotal influence: ", sum(sum(inf,[]))) def calc_inf(): #this part uses the on() function #reset influence array for j in range(n): for i in range(n): inf[i][j] = 0 total_inf = 0 for j in range(1,n): for i in range(1,n): if(board[i][j]==12 or board[i][j]==6):#kings adj=int(board[i][j]==12) or int(not(board[i][j]==6))-1 for w in range(len(kf)):# k-king if(on(i+kf[w][0],j+kf[w][1])):inf[i+kf[w][0]][j+kf[w][1]]+=adj if(board[i][j]==9 or board[i][j]==3):#knights adj=int(board[i][j]==9) or int(not(board[i][j]==3))-1 for w in range(len(nf)):# k-king if(on(i+nf[w][0],j+nf[w][1])):inf[i+nf[w][0]][j+nf[w][1]]+=adj if(board[i][j]==7):#white pawn adj=1 if(on(i+1,j-1)):inf[i+1][j-1]+=adj if(on(i+1,j+1)):inf[i+1][j+1]+=adj if(board[i][j]==1):#black pawn adj=-1 if(on(i-1,j-1)):inf[i-1][j-1]+=adj if(on(i-1,j+1)):inf[i-1][j+1]+=adj if(board[i][j]==8 or board[i][j]==2):#rooks adj=int(board[i][j]==8) or int(not(board[i][j]==2))-1 for w in range(-7,8): if(on(i,j+w)):inf[i][j+w]+=adj if(on(i+w,j)):inf[i+w][j]+=adj inf[i][j]-=2*adj if(board[i][j]==10 or board[i][j]==4):#bishops adj=int(board[i][j]==10) or int(not(board[i][j]==4))-1 for w in range(-7,8): if(on(i+w,j+w)):inf[i+w][j+w]+=adj if(on(i+w,j-w)):inf[i+w][j-w]+=adj inf[i][j]-=2*adj if(board[i][j]==11 or board[i][j]==5):#queens adj=int(board[i][j]==11) or int(not(board[i][j]==5))-1 for w in range(-7,8): if(on(i,j+w)):inf[i][j+w]+=adj #rook part if(on(i+w,j)):inf[i+w][j]+=adj if(on(i+w,j+w)):inf[i+w][j+w]+=adj #bishop part if(on(i+w,j-w)):inf[i+w][j-w]+=adj inf[i][j]-=4*adj calc_inf() disp_inf() disp_ascii() while(True): enter_move(m) calc_inf() disp_inf() disp_ascii() # disp_board()