/
meilleurpote.py
156 lines (117 loc) · 4.33 KB
/
meilleurpote.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# -*- coding: utf-8 -*-
"""Robot-joueur de Pooo
Le module fournit les fonctions suivantes :
register_pooo(uid)
init_pooo(init_string)
play_pooo()
"""
__version__='0.1'
## chargement de l'interface de communication avec le serveur
from poooc import order, state, state_on_update, etime
import potocole
from board import Board
from AI import AI
# mieux que des print partout
import logging
# pour faire de l'introspection
import inspect
from tkinter import *
from tkinter import ttk
from display import *
GLOBAL_UID = ""
def register_pooo(uid):
"""Inscrit un joueur et initialise le robot pour la compétition
:param uid: identifiant utilisateur
:type uid: chaîne de caractères str(UUID)
:Example:
"0947e717-02a1-4d83-9470-a941b6e8ed07"
"""
print(uid);
global GLOBAL_UID
GLOBAL_UID = uid ;
MATCH_AI = None ; # 1 AI <=> 1 BOARD
def init_pooo(init_string):
"""Initialise le robot pour un match
:param init_string: instruction du protocole de communication de Pooo (voire ci-dessous)
:type init_string: chaîne de caractères (utf-8 string)
INIT<matchid>TO<#players>[<me>];<speed>;\
<#cells>CELLS:<cellid>(<x>,<y>)'<radius>'<offsize>'<defsize>'<prod>,...;\
<#lines>LINES:<cellid>@<dist>OF<cellid>,...
<me> et <owner> désignent des numéros de 'couleur' attribués aux joueurs. La couleur 0 est le neutre.
le neutre n'est pas compté dans l'effectif de joueurs (<#players>).
'...' signifie que l'on répète la séquence précédente autant de fois qu'il y a de cellules (ou d'arêtes).
0CELLS ou 0LINES sont des cas particuliers sans suffixe.
<dist> est la distance qui sépare 2 cellules, exprimée en... millisecondes !
/!\ attention: un match à vitesse x2 réduit de moitié le temps effectif de trajet d'une cellule à l'autre par rapport à l'indication <dist>.
De manière générale temps_de_trajet=<dist>/vitesse (division entière).
:Example:
"INIT20ac18ab-6d18-450e-94af-bee53fdc8fcaTO6[2];1;3CELLS:1(23,9)'2'30'8'I,2(41,55)'1'30'8'II,3(23,103)'1'20'5'I;2LINES:1@3433OF2,1@6502OF3"
"""
print("INIT DU MATCH");
global MATCH_AI ;
(nbPlayers,playerId,l_n,l_e) = potocole.initStringToAI(init_string);
print("NUMERO DU JOUEUR :",playerId);
board = Board(nbPlayers,l_n);
print("EDGES :" ,l_e);
board.addEdges(l_e);
MATCH_AI = AI(board,playerId) ;
def play_pooo():
"""Active le robot-joueur
"""
logging.info('Entering play_pooo fonction from {} module...'.format(inspect.currentframe().f_back.f_code.co_filename))
global MATCH_AI
global GLOBAL_UID
print("===========DEBUT DU MATCH");
#ON RECUPERE l'ETAT INITIAL ET ON UPDATE BOARD
initial_state = state() ;
print("===STATE====",initial_state)
#(list_cells,list_moves) =
cells_moves = potocole.stateToTupleLists(initial_state);
list_cells = cells_moves[0] ;
list_moves = cells_moves[1] ;
MATCH_AI.board.updateCells(list_cells);
MATCH_AI.board.updateMoves(list_moves);
a= True ;
root=Tk()
root.title="Test"
can=Canvas(master=root, width=500, height=500)
can.pack()
app=Display(MATCH_AI.board,master=root,canvas=can)
#print optionnel, pour debug
print(MATCH_AI.board);
while True:
current_state = state_on_update();
if current_state[0] == "E" : # END OF GAME
break;
elif current_state[0] == "G" : # GAME_OVER
break;
else: #STATE
cells_moves = potocole.stateToTupleLists(current_state);
list_cells = cells_moves[0] ;
list_moves = cells_moves[1] ;
MATCH_AI.board.time = etime() ;
MATCH_AI.board.updateCells(list_cells);
MATCH_AI.board.updateMoves(list_moves);
print("CURRENT_BOARD AT TIME "+str(MATCH_AI.board.time)+" :");
print(MATCH_AI.board);
print("_______________");
app.canvas.delete("all")
app.full_display() #actualisation interface
app.canvas.update()
#app.mainloop()
if a :
MATCH_AI.createOrders(2);
a = False if a else True ;
while (len(MATCH_AI.orders)>0): #enleve les 1ers de la liste et les mets en ORDER
temp_order = MATCH_AI.orders.pop(0) ;
#print("ORDER :"+temp_order);
order("["+GLOBAL_UID+"]"+temp_order);
print("===========FINDUS MATCH");
# séquence type :
# (1) récupère l'état initial
# init_state = state()
# (2) TODO: traitement de init_state
# (3) while True :
# (4) state = state_on_update()
# (5) TODO: traitement de state et transmission d'ordres order(msg)
pass