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
|
from menu import *
from entry_list import *
from entry import *
from analysis_board import *
from random import *
from time import time
def rnd(i = 1): return randint(0,i)
class Bot():
def __init__(self, name, entry, plr_list=None):
self.color_int = 7
self.is_machine = True
self.name = name
# bots go at the end of the list
self.plr_list = plr_list
self.alg_1 = self.no_alg
self.alg_2 = self.no_alg
self.alg_3 = self.no_alg
self.alg_4 = self.no_alg
self.alg_5 = self.no_alg
# initialize a menu and set it to self.menu
self.param_alg_1 = Param('1st Algorithm', self.alg_name_list, setr_meth=self.set_alg_1)
self.param_alg_2 = Param('2nd Algorithm', self.alg_name_list, setr_meth=self.set_alg_2)
self.param_alg_3 = Param('3rd Algorithm', self.alg_name_list, setr_meth=self.set_alg_3)
self.param_alg_4 = Param('4th Algorithm', self.alg_name_list, setr_meth=self.set_alg_4)
self.param_alg_5 = Param('5th Algorithm', self.alg_name_list, setr_meth=self.set_alg_5)
self.param_alg_1.item = self.alg_1.__name__
self.param_alg_2.item = self.alg_2.__name__
self.param_alg_3.item = self.alg_3.__name__
self.param_alg_4.item = self.alg_4.__name__
self.param_alg_5.item = self.alg_5.__name__
self.entries = EntryList([self.param_alg_1, self.param_alg_2, self.param_alg_3, self.param_alg_4, self.param_alg_5])
self.prompt = f"Edit {self.name}'s Settings"
self.menu = Menu(self.prompt, self.entries)
self.entry = entry
entry.text = name
entry.item = self.menu
self.board = AnalysisBoard()
@property
def text_color(self):
if self.color_int > 0 and self.color_int <=7:
return f'\033[9{self.color_int}m'
@property
def indicate_color(self):
if self.color_int > 0 and self.color_int <=7:
return f'\033[10{self.color_int}m\033[30m'
def set_alg_1(self, alg_name): self.alg_1 = self.alg_list[self.alg_name_list.index(alg_name)]
def set_alg_2(self, alg_name): self.alg_2 = self.alg_list[self.alg_name_list.index(alg_name)]
def set_alg_3(self, alg_name): self.alg_3 = self.alg_list[self.alg_name_list.index(alg_name)]
def set_alg_4(self, alg_name): self.alg_4 = self.alg_list[self.alg_name_list.index(alg_name)]
def set_alg_5(self, alg_name): self.alg_5 = self.alg_list[self.alg_name_list.index(alg_name)]
@property
def alg_list(self):
lst = []
for att in dir(self):
if len(att) >= 5:
if att[-4:] == '_alg' or att[:5] == 'rand_':
lst.append(getattr(self, att))
return lst
@property
def alg_name_list(self):
lst = []
for alg in self.alg_list:
lst.append(alg.__name__)
return lst
def rand_fr(self): return choice('abc') + choice('123')
def rand_sqr(self): return choice(['a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3'])
def rand_lgl(self): return choice(self.board.legal_moves)
def no_alg(self): return ''
def tiar_alg(self):
sqr_nm = ''
row_names = self.board.row_names
shuffle(row_names)
for row_name in row_names:
if self.board.row_dict[row_name].count(self.board.turn) == 2 and self.board.row_dict[row_name].count(' ') == 1:
pos = self.board.row_dict[row_name].index(' ')
sqr_nms = self.board.__getattribute__(f'row_{row_name}_sqr_nms')
sqr_nm = sqr_nms[pos]
return sqr_nm
def block_alg(self):
sqr_nm = ''
row_names = self.board.row_names
shuffle(row_names)
for row_name in row_names:
if self.board.row_dict[row_name].count(self.board.alt_turn) == 2 and self.board.row_dict[row_name].count(' ') == 1:
pos = self.board.row_dict[row_name].index(' ')
sqr_nms = self.board.__getattribute__(f'row_{row_name}_sqr_nms')
sqr_nm = sqr_nms[pos]
return sqr_nm
def build_alg(self):
sqr_nm = ''
row_names = self.board.row_names
shuffle(row_names)
for row_name in row_names:
if self.board.row_dict[row_name].count(self.board.turn) == 1 and self.board.row_dict[row_name].count(' ') == 2:
rng_ind = [0, 1, 2]
pos = self.board.row_dict[row_name].index(self.board.turn)
rng_ind.remove(pos)
sqr_nms = self.board.__getattribute__(f'row_{row_name}_sqr_nms')
sqr_nm = sqr_nms[rng_ind[rnd()]]
return sqr_nm
def fork_alg(self):
sqr_nm = ''
sn = self.board.all_sqr_nms
shuffle(sn)
for s in sn:
if self.board.all_sqrs_dict[s] == self.board.turn:
s_2 = ''
for s_0 in sn:
if s_0 != s and self.board.all_sqrs_dict[s_0] == self.board.turn: s_2 = s_0
if s_2 != '':
rows_s_1 = self.board.sqr_rows[s]
rows_s_2 = self.board.sqr_rows[s_2]
for q in sn:
if self.board.all_sqrs_dict[q] == ' ':
row_q_1 = ''
row_q_2 = ''
for row_q in self.board.sqr_rows[q]:
if row_q in rows_s_1 and self.board.row_dict[row_q].count(' ') == 2 and self.board.row_dict[row_q].count(self.board.turn) == 1:
row_q_1 = row_q
if row_q in rows_s_2 and self.board.row_dict[row_q].count(' ') == 2 and self.board.row_dict[row_q].count(self.board.turn) == 1:
row_q_2 = row_q
pass
if row_q_1 != '' and row_q_2 != '':
sqr_nm = q
return sqr_nm
def move(self, fen_board):
sqr_nm = ''
self.board.fen_board = fen_board
if sqr_nm == '': sqr_nm = self.alg_1()
if sqr_nm == '': sqr_nm = self.alg_2()
if sqr_nm == '': sqr_nm = self.alg_3()
if sqr_nm == '': sqr_nm = self.alg_4()
if sqr_nm == '': sqr_nm = self.alg_5()
self.board.fen_board = '3/3/3'
return sqr_nm
|