import socket, threading, sys import random interactive_flag = False def pos2_to_pos1(x2): return x2[0] * 8 + x2[1] def pos1_to_pos2(x): row = x // 8 col = x % 8 return [row, col] def get_positions_directions(state, piece, p2, directions): ret = [] for d in directions: for r in range(1, d[1]+1): if d[0] == 'N': if p2[0] - r < 0: break if state[pos2_to_pos1([p2[0] - r, p2[1]])] == 'z': ret.append([p2[0] - r, p2[1]]) continue if abs(ord(state[pos2_to_pos1([p2[0] - r, p2[1]])]) - ord(piece)) > 16: ret.append([p2[0] - r, p2[1]]) break if d[0] == 'S': if p2[0] + r > 7: break if state[pos2_to_pos1([p2[0] + r, p2[1]])] == 'z': ret.append([p2[0] + r, p2[1]]) continue if abs(ord(state[pos2_to_pos1([p2[0] + r, p2[1]])]) - ord(piece)) > 16: ret.append([p2[0] + r, p2[1]]) break if d[0] == 'W': if p2[1] - r < 0: break if state[pos2_to_pos1([p2[0], p2[1] - r])] == 'z': ret.append([p2[0], p2[1] - r]) continue if abs(ord(state[pos2_to_pos1([p2[0], p2[1] - r])]) - ord(piece)) > 16: ret.append([p2[0], p2[1] - r]) break if d[0] == 'E': if p2[1] + r > 7: break if state[pos2_to_pos1([p2[0], p2[1] + r])] == 'z': ret.append([p2[0], p2[1] + r]) continue if abs(ord(state[pos2_to_pos1([p2[0], p2[1] + r])]) - ord(piece)) > 16: ret.append([p2[0], p2[1] + r]) break if d[0] == 'NE': if p2[0] - r < 0 or p2[1] + r > 7: break if state[pos2_to_pos1([p2[0] - r, p2[1] + r])] == 'z': ret.append([p2[0] - r, p2[1] + r]) continue if abs(ord(state[pos2_to_pos1([p2[0] - r, p2[1] + r])]) - ord(piece)) > 16: ret.append([p2[0] - r, p2[1] + r]) break if d[0] == 'SW': if p2[0] + r > 7 or p2[1] - r < 0: break if state[pos2_to_pos1([p2[0] + r, p2[1] - r])] == 'z': ret.append([p2[0] + r, p2[1] - r]) continue if abs(ord(state[pos2_to_pos1([p2[0] + r, p2[1] - r])]) - ord(piece)) > 16: ret.append([p2[0] + r, p2[1] - r]) break if d[0] == 'NW': if p2[0] - r < 0 or p2[1] - r < 0: break if state[pos2_to_pos1([p2[0] - r, p2[1] - r])] == 'z': ret.append([p2[0] - r, p2[1] - r]) continue if abs(ord(state[pos2_to_pos1([p2[0] - r, p2[1] - r])]) - ord(piece)) > 16: ret.append([p2[0] - r, p2[1] - r]) break if d[0] == 'SE': if p2[0] + r > 7 or p2[1] + r > 7: break if state[pos2_to_pos1([p2[0] + r, p2[1] + r])] == 'z': ret.append([p2[0] + r, p2[1] + r]) continue if abs(ord(state[pos2_to_pos1([p2[0] + r, p2[1] + r])]) - ord(piece)) > 16: ret.append([p2[0] + r, p2[1] + r]) break if d[0] == 'PS': if p2[0] + r > 7: break if state[pos2_to_pos1([p2[0] + r, p2[1]])] == 'z': ret.append([p2[0] + r, p2[1]]) continue break if d[0] == 'PN': if p2[0] - r < 0: break if state[pos2_to_pos1([p2[0] - r, p2[1]])] == 'z': ret.append([p2[0] - r, p2[1]]) continue break if d[0] == 'PS2': if p2[0] + r <= 7 and p2[1] + 1 <= 7: if state[pos2_to_pos1([p2[0] + r, p2[1] + 1])] != 'z': if abs(ord(state[pos2_to_pos1([p2[0] + r, p2[1] + 1])]) - ord(piece)) > 16: ret.append([p2[0] + r, p2[1] + 1]) if p2[0] + r <= 7 and p2[1] - 1 >= 0: if state[pos2_to_pos1([p2[0] + r, p2[1] - 1])] != 'z': if abs(ord(state[pos2_to_pos1([p2[0] + r, p2[1] - 1])]) - ord(piece)) > 16: ret.append([p2[0] + r, p2[1] - 1]) continue if d[0] == 'PN2': if p2[0] - r >= 0 and p2[1] + 1 <= 7: if state[pos2_to_pos1([p2[0] - r, p2[1] + 1])] != 'z': if abs(ord(state[pos2_to_pos1([p2[0] - r, p2[1] + 1])]) - ord(piece)) > 16: ret.append([p2[0] - r, p2[1] + 1]) if p2[0] - r >= 0 and p2[1] - 1 >= 0: if state[pos2_to_pos1([p2[0] - r, p2[1] - 1])] != 'z': if abs(ord(state[pos2_to_pos1([p2[0] - r, p2[1] - 1])]) - ord(piece)) > 16: ret.append([p2[0] - r, p2[1] - 1]) continue if d[0] == 'H': if p2[0] - 2 >= 0 and p2[1] - 1 >= 0: if state[pos2_to_pos1([p2[0] - 2, p2[1] - 1])] == 'z' or abs(ord(state[pos2_to_pos1([p2[0] - 2, p2[1] - 1])]) - ord(piece)) > 16: ret.append([p2[0] - 2, p2[1] - 1]) if p2[0] - 2 >= 0 and p2[1] + 1 <= 7: if state[pos2_to_pos1([p2[0] - 2, p2[1] + 1])] == 'z' or abs(ord(state[pos2_to_pos1([p2[0] - 2, p2[1] + 1])]) - ord(piece)) > 16: ret.append([p2[0] - 2, p2[1] + 1]) if p2[0] - 1 >= 0 and p2[1] + 2 <= 7: if state[pos2_to_pos1([p2[0] - 1, p2[1] + 2])] == 'z' or abs(ord(state[pos2_to_pos1([p2[0] - 1, p2[1] + 2])]) - ord(piece)) > 16: ret.append([p2[0] - 1, p2[1] + 2]) if p2[0] + 1 <= 7 and p2[1] + 2 <= 7: if state[pos2_to_pos1([p2[0] + 1, p2[1] + 2])] == 'z' or abs(ord(state[pos2_to_pos1([p2[0] + 1, p2[1] + 2])]) - ord(piece)) > 16: ret.append([p2[0] + 1, p2[1] + 2]) if p2[0] + 2 <= 7 and p2[1] + 1 <= 7: if state[pos2_to_pos1([p2[0] + 2, p2[1] + 1])] == 'z' or abs(ord(state[pos2_to_pos1([p2[0] + 2, p2[1] + 1])]) - ord(piece)) > 16: ret.append([p2[0] + 2, p2[1] + 1]) if p2[0] + 2 <= 7 and p2[1] - 1 >= 0: if state[pos2_to_pos1([p2[0] + 2, p2[1] - 1])] == 'z' or abs(ord(state[pos2_to_pos1([p2[0] + 2, p2[1] - 1])]) - ord(piece)) > 16: ret.append([p2[0] + 2, p2[1] - 1]) if p2[0] + 1 <= 7 and p2[1] - 2 >= 0: if state[pos2_to_pos1([p2[0] + 1, p2[1] - 2])] == 'z' or abs(ord(state[pos2_to_pos1([p2[0] + 1, p2[1] - 2])]) - ord(piece)) > 16: ret.append([p2[0] + 1, p2[1] - 2]) if p2[0] - 1 >= 0 and p2[1] - 2 >= 0: if state[pos2_to_pos1([p2[0] - 1, p2[1] - 2])] == 'z' or abs(ord(state[pos2_to_pos1([p2[0] - 1, p2[1] - 2])]) - ord(piece)) > 16: ret.append([p2[0] - 1, p2[1] - 2]) return ret def get_available_positions(state, p2, piece): ret = [] if piece in ('a', 'h', 'A', 'H'): #Tower aux = get_positions_directions(state, piece, p2, [['N', 7], ['S', 7], ['W', 7], ['E', 7]]) if len(aux) > 0: ret.extend(aux) return ret if piece in ('c', 'f', 'C', 'F'): #Bishop aux = get_positions_directions(state, piece, p2, [['NE', 7], ['SE', 7], ['NW', 7], ['SW', 7]]) if len(aux) > 0: ret.extend(aux) return ret if piece in ('d', 'D'): #Queen aux = get_positions_directions(state, piece, p2, [['N', 7], ['S', 7], ['W', 7], ['E', 7], ['NE', 7], ['SE', 7], ['NW', 7], ['SW', 7]]) if len(aux) > 0: ret.extend(aux) return ret if piece in ('e', 'E'): #King aux = get_positions_directions(state, piece, p2, [['N', 1], ['S', 1], ['W', 1], ['E', 1], ['NE', 1], ['SE', 1], ['NW', 1], ['SW', 1]]) if len(aux) > 0: ret.extend(aux) return ret if piece in ('b', 'g', 'B', 'G'): # Horse aux = get_positions_directions(state, piece, p2, [['H', 1]]) if len(aux) > 0: ret.extend(aux) return ret # Pawn if ord('i') <= ord(piece) <= ord('p'): if p2[0] == 1: aux = get_positions_directions(state, piece, p2, [['PS', 2]]) if len(aux) > 0: ret.extend(aux) else: aux = get_positions_directions(state, piece, p2, [['PS', 1]]) if len(aux) > 0: ret.extend(aux) aux = get_positions_directions(state, piece, p2, [['PS2', 1]]) if len(aux) > 0: ret.extend(aux) return ret if ord('I') <= ord(piece) <= ord('P'): if p2[0] == 6: aux = get_positions_directions(state, piece, p2, [['PN', 2]]) if len(aux) > 0: ret.extend(aux) else: aux = get_positions_directions(state, piece, p2, [['PN', 1]]) if len(aux) > 0: ret.extend(aux) aux = get_positions_directions(state, piece, p2, [['PN2', 1]]) if len(aux) > 0: ret.extend(aux) return ret def sucessor_states(state, player): ret = [] for x in range(ord('a')-player*32, ord('p')-player*32+1): p = state.find(chr(x)) if p < 0: continue p2 = pos1_to_pos2(p) pos_available = get_available_positions(state, p2, chr(x)) # print('%c - Tot %d' % (chr(x), len(pos_available))) for a in pos_available: state_aux = list('%s' % state) state_aux[p] = 'z' if ord('i') <= x <= ord('p') and a[0] == 7: state_aux[pos2_to_pos1(a)] = 'd' elif ord('I') <= x <= ord('P') and a[0] == 0: state_aux[pos2_to_pos1(a)] = 'D' else: state_aux[pos2_to_pos1(a)] = chr(x) ret.append(''.join(state_aux)) return ret def decide_move(state, play): suc = sucessor_states(state, play) idx = random.randint(0, len(suc)-1) # print('State_%s_' % state) # print('%d possible moves... chosen %d' % (len(suc), idx)) # print('SEND_%s_' % suc[idx]) return suc[idx] client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #socket initialization client.connect((sys.argv[1], int(sys.argv[2]))) #connecting client to server hello_msg = '%s_%s' % (sys.argv[4], sys.argv[3]) client.send(hello_msg.encode('ascii')) player = int(sys.argv[4]) while True: #making valid connection while True: message = client.recv(1024).decode('ascii') if len(message) > 0: break # print('Received_%s_' % message) # print('It is my turn...') if interactive_flag: row_from = int(input('Row from > ')) col_from = int(input('Col from > ')) row_to = int(input('Row to > ')) col_to = int(input('Col to > ')) p_from = pos2_to_pos1([row_from, col_from]) p_to = pos2_to_pos1([row_to, col_to]) if (0 <= p_from <= 63) and (0 <= p_to <= 63): message = list(message) aux = message[p_from] message[p_from] = 'z' message[p_to] = aux message = ''.join(message) else: message = decide_move(message, player) # print('Sending_%s_' % message) client.send(message.encode('ascii'))