CCCPaste

Chess board total piece influence

#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()