Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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()
Advertisement
Add Comment
Please, Sign In to add comment