chess4.py
Created by
schraf
Created on
September 04, 2022
9.39 KB
_R = ' queen '
_Q = ' king_w '
_P = ' bishop_w '
_O = ' knight_w '
_N = ' rook_w '
_M = ' king_b '
_L = ' bishop_b '
_K = ' knight_b '
_J = ' rook_b '
_I = ' king '
_H = None
_G = ' all '
_F = ' black '
_E = ' pawn_w '
_D = ' pawn_b '
_C = ' _ '
_B = True
_A = False
from kandinsky import *
from ion import *
pawn = 3584 , 4352 , 12672 , 65504 , 32800 , 32800 , 16448 , 8320 , 8320 , 8320 , 8320 , 8320 , 8320 , 8320 , 16448 , 98352 , 131080 , 524284 , 524290 , 1048577 , 2097151
knight = 480 , 1840 , 3096 , 6220 , 12390 , 8194 , 24577 , 16497 , 49371 , 33166 , 33152 , 32960 , 32864 , 98352 , 65560 , 196616 , 131080 , 524284 , 524290 , 1048577 , 2097151
rook = 101936 , 168232 , 160200 , 131080 , 131080 , 131056 , 32800 , 32800 , 32800 , 32800 , 32800 , 32800 , 32800 , 32800 , 32800 , 131056 , 131080 , 524284 , 524290 , 1048577 , 2097151
bishop = 3584 , 4352 , 4352 , 4352 , 3584 , 4352 , 12672 , 24768 , 49248 , 32928 , 33056 , 33312 , 32800 , 49248 , 16448 , 49248 , 98352 , 524284 , 524290 , 1048577 , 2097151
queen = 1024 , 2560 , 4352 , 130032 , 137992 , 263172 , 524290 , 524290 , 524290 , 524290 , 524290 , 524290 , 262148 , 262148 , 131080 , 131056 , 65552 , 524284 , 524290 , 1048577 , 2097151
king = 917518 , 593426 , 561442 , 545090 , 544322 , 536962 , 524290 , 524290 , 262148 , 262148 , 131080 , 65552 , 65504 , 32800 , 16448 , 131056 , 65552 , 524284 , 524290 , 1048577 , 2097151
pos , initial_pos = [ 0 , 3 ],[]
lky , pion_selected , mvpi = _H , _H , _H
tour = 0
roque_done = _A
popi = [[ _J , _K , _L , _M , ' queen_b ' , _L , _K , _J ],[ _D , _D , _D , _D , _D , _D , _D , _D ],[ '' , '' , '' , '' , '' , '' , '' , '' ],[ '' , '' , '' , '' , '' , '' , '' , '' ],[ '' , '' , '' , '' , '' , '' , '' , '' ],[ '' , '' , '' , '' , '' , '' , '' , '' ],[ _E , _E , _E , _E , _E , _E , _E , _E ],[ _N , _O , _P , ' queen_w ' , _Q , _P , _O , _N ]]
t_b , t_w = 4800 , 4800
k_w_m , k_b_m , t1_w_m , t1_b_m , t2_w_m , t2_b_m = _A , _A , _A , _A , _A , _A
eat_pion = _A
p1 , p2 = ( 4 , 7 ),( 0 , 7 )
def gpoofpi ( pion ):
pofpi = []
for i in range ( 8 ):
for j in range ( 8 ):
if pion != _G :
if popi [ i ][ j ] == pion : pofpi . append (( j , i ))
elif popi [ i ][ j ] != '' : pofpi . append (( j , i ))
return pofpi
def gpiopo ( p ): return popi [ p [ 1 ]][ p [ 0 ]]
def swpopi ( sender_pos , target_pos , eat = 0 , rock = 0 ):
global tour , eat_pion
if not rock :
if not eat : popi [ sender_pos [ 1 ]][ sender_pos [ 0 ]], popi [ target_pos [ 1 ]][ target_pos [ 0 ]] = popi [ target_pos [ 1 ]][ target_pos [ 0 ]], popi [ sender_pos [ 1 ]][ sender_pos [ 0 ]]
else : popi [ target_pos [ 1 ]][ target_pos [ 0 ]] = popi [ sender_pos [ 1 ]][ sender_pos [ 0 ]]; popi [ sender_pos [ 1 ]][ sender_pos [ 0 ]] = '' ; eat_pion = _A
tour += 1 ; menu ()
def default_pions ():
for i in range ( 8 ):
for j in range ( 8 ):
if popi [ i ][ j ] != '' : draw_pion ( eval ( popi [ i ][ j ]. split ( _C )[ 0 ]), d_p ( j , i , 3 )[ 0 ], d_p ( j , i , 3 )[ 1 ], get_font ([ j , i ]), get_pion_color ([ j , i ]))
def draw_pion ( t , x , y , back = ( 0 ,) * 3 , font = ( 170 , 170 , 170 )):
for i in range ( 21 ):
for j in range ( 21 ): fill_rect ( x + j , y + i , 1 , 1 , t [ i ] >> 20 - j & 1 and font or back )
def debug ( i_pos , target_pos ): draw_string ( ' i_p: ' + str ( i_pos ), 221 , 90 , _F ); draw_string ( ' t_p: ' + str ( target_pos ), 221 , 110 , _F )
def gui (): B = ' XXXsec ' ; A = ' white ' ; fill_rect ( 0 , 0 , 320 , 222 ,( 49 , 46 , 43 )); plateau (); draw_string ( ' CHESS ' , 244 , 3 , A ,( 49 , 46 , 43 )); draw_string ( ' Blacks:16 ' , 225 , 40 , _F ,( 49 , 46 , 43 )); draw_string ( B , 225 , 64 , _F ,( 49 , 46 , 43 )); draw_string ( ' Round: ' , 225 , 100 , A ,( 49 , 46 , 43 )); fill_rect ( 290 , 100 , 20 , 20 ,( 170 , 170 , 170 ) if tour % 2 == 0 else _F ); draw_string ( B , 225 , 140 ,( 170 , 170 , 170 ),( 49 , 46 , 43 )); draw_string ( ' Whites:16 ' , 225 , 164 ,( 170 , 170 , 170 ),( 49 , 46 , 43 )); draw_string ( ' nsi.xyz ' , 235 , 201 , A ,( 49 , 46 , 43 )); default_pions ()
def menu (): fill_rect ( 290 , 100 , 20 , 20 ,( 170 , 170 , 170 ) if tour % 2 == 0 else _F )
def plateau ():
for i in range ( 8 ):
for j in range ( 8 ): fill_rect ( 3 + j * 27 , 3 + i * 27 , 27 , 27 , get_font ([ j , i ]))
def d_p ( p_x = 0 , p_y = 0 , pion = 0 ): return [ 3 + 27 * p_x + pion , 3 + 27 * p_y + pion ]
def get_font ( p ): return (( 119 , 149 , 86 ) if p [ 0 ] % 2 == 0 else ( 235 , 236 , 208 )) if p [ 1 ] % 2 != 0 else ( 235 , 236 , 208 ) if p [ 0 ] % 2 == 0 else ( 119 , 149 , 86 )
def get_pion_color ( p ): return ( 170 , 170 , 170 ) if gpiopo ( p ). split ( _C )[ 1 ] == ' w ' else ( 0 ,) * 3
def roque ( sender_pos , target_pos ):
pion = gpiopo ( sender_pos ). split ( _C )
if pion [ 0 ] != _I : return _A
diff = abs ( sender_pos [ 0 ] - target_pos [ 0 ])
if pion [ 1 ] == ' w ' :
if 2 <= diff <= 4 and not k_w_m and ( target_pos == ( 7 , 7 ) and not t2_w_m or target_pos == ( 0 , 7 ) and not t1_w_m ) and nopibta ( sender_pos , target_pos , 1 ):
if target_pos == ( 0 , 7 ): popi [ 7 ][ 2 ], popi [ 7 ][ 3 ] = popi [ sender_pos [ 1 ]][ sender_pos [ 0 ]], popi [ 7 ][ 0 ]; popi [ 7 ][ 0 ], popi [ sender_pos [ 1 ]][ sender_pos [ 0 ]] = '' , '' ; return _B
return _A
def legit_move ( sender_pos , target_pos ):
pion = gpiopo ( sender_pos ). split ( _C )
if pion [ 0 ] == ' pawn ' :
if pion [ 1 ] == ' b ' :
dist = 2 if sender_pos [ 1 ] == 1 else 1
if 0 < target_pos [ 1 ] - sender_pos [ 1 ] <= dist and sender_pos [ 0 ] == target_pos [ 0 ]: return _B
return _A
else :
dist =- 2 if sender_pos [ 1 ] == 6 else - 1
if dist <= target_pos [ 1 ] - sender_pos [ 1 ] < 0 and sender_pos [ 0 ] == target_pos [ 0 ]: return _B
return _A
if pion [ 0 ] == ' rook ' :
if sender_pos [ 0 ] == target_pos [ 0 ] or sender_pos [ 1 ] == target_pos [ 1 ]: return _B
return _A
if pion [ 0 ] == ' knight ' :
diff_x , diff_y = abs ( sender_pos [ 0 ] - target_pos [ 0 ]), abs ( sender_pos [ 1 ] - target_pos [ 1 ])
if diff_x == 1 and diff_y == 2 or diff_x == 2 and diff_y == 1 : return _B
return _A
if pion [ 0 ] == ' bishop ' :
if abs ( target_pos [ 0 ] - sender_pos [ 0 ]) == abs ( target_pos [ 1 ] - sender_pos [ 1 ]): return _B
return _A
if pion [ 0 ] == _R :
if abs ( target_pos [ 0 ] - sender_pos [ 0 ]) == abs ( target_pos [ 1 ] - sender_pos [ 1 ]) or ( sender_pos [ 0 ] == target_pos [ 0 ] or sender_pos [ 1 ] == target_pos [ 1 ]): return _B
return _A
if pion [ 0 ] == _I :
if abs ( sender_pos [ 0 ] - target_pos [ 0 ]) < 2 and abs ( sender_pos [ 1 ] - target_pos [ 1 ]) < 2 : return _B
return _A
def nopibta ( sender_pos , target_pos , rock = 0 ):
global eat_pion ; all_pos_between_target = []; pion = gpiopo ( sender_pos ). split ( _C )
if gpiopo ( target_pos ) != '' and pion [ 1 ] == gpiopo ( target_pos ). split ( _C )[ 1 ] and not rock : return _A
for i in range ( target_pos [ 1 ], sender_pos [ 1 ]) if target_pos [ 1 ] + 1 - sender_pos [ 1 ] < 0 else range ( sender_pos [ 1 ] +- 1 * ( target_pos [ 1 ] + 1 - sender_pos [ 1 ] == 0 ), target_pos [ 1 ] + 1 ):
for j in range ( target_pos [ 0 ], sender_pos [ 0 ]) if target_pos [ 0 ] + 1 - sender_pos [ 0 ] < 0 else range ( sender_pos [ 0 ] +- 1 * ( target_pos [ 0 ] + 1 - sender_pos [ 0 ] == 0 ), target_pos [ 0 ] + 1 ):
if not rock :
if legit_move ( sender_pos ,[ j , i ]) and list ( sender_pos ) != [ j , i ] and list ( target_pos ) != [ j , i ]:
if pion [ 0 ] == _R or pion [ 0 ] == _I :
if abs ( target_pos [ 0 ] - sender_pos [ 0 ]) == abs ( target_pos [ 1 ] - sender_pos [ 1 ]):
if abs ( j - sender_pos [ 0 ]) == abs ( i - sender_pos [ 1 ]): all_pos_between_target . append ([ j , i ])
if sender_pos [ 0 ] == target_pos [ 0 ] or sender_pos [ 1 ] == target_pos [ 1 ]: all_pos_between_target . append ([ j , i ])
else : all_pos_between_target . append ([ j , i ])
elif list ( sender_pos ) != [ j , i ] and list ( target_pos ) != [ j , i ]: all_pos_between_target . append ([ j , i ])
print ( all_pos_between_target )
for i in range ( len ( all_pos_between_target )):
if gpiopo ( all_pos_between_target [ i ]) != '' : return _A
if gpiopo ( target_pos ) != '' and pion [ 1 ] != gpiopo ( target_pos ). split ( _C )[ 1 ]: eat_pion = 1
return _B
def king_is_vulnerable ():
all_moves = []
for k in range ( len ( gpoofpi ( _G ))):
print ( k )
for i in range ( 8 ):
for j in range ( 8 ):
if legit_move ( gpoofpi ( _G )[ k ],[ j , i ]) and nopibta ( gpoofpi ( _G )[ k ],[ j , i ]) and list ( gpoofpi ( _G )[ k ]) != [ j , i ]: all_moves . append ([ j , i ])
king_w_pos = list ( gpoofpi ( _Q )[ 0 ]); king_b_pos = list ( gpoofpi ( _M )[ 0 ]); print ( all_moves , king_w_pos , king_b_pos )
if king_w_pos in all_moves or king_b_pos in all_moves : return _B
return _A
def all_conditions_to_move ( i_p , t_p ):
global k_w_m , k_b_m , t1_w_m , t1_b_m , t2_w_m , t2_b_m , roque_done
if nopibta ( i_p , t_p ) and i_p != t_p and legit_move ( i_p , t_p ):
if i_p == [ 0 , 0 ]: t1_b_m = _B
if i_p == [ 3 , 0 ]: k_b_m = _B
if i_p == [ 7 , 0 ]: t2_b_m = _B
if i_p == [ 0 , 7 ]: t1_w_m = _B
if i_p == [ 4 , 7 ]: k_w_m = _B
if i_p == [ 7 , 7 ]: t2_w_m = _B
return _B
if roque ( tuple ( i_p ), tuple ( t_p )): roque_done = _B ; return _B
print ( roque ( tuple ( i_p ), tuple ( t_p ))); print ( i_p , t_p ); return _A
def get_old_pos ( key ): return [ pos [ 0 ] + ( - 1 if key == 3 else + 1 if key != 1 and key != 2 else 0 ), pos [ 1 ] + ( - 1 if key == 2 else + 1 if key != 0 and key != 3 else 0 )]
def update_pos_pion ( old_p , p , rock = 0 ):
if not rock : fill_rect ( d_p ( old_p [ 0 ])[ 0 ], d_p ( 0 , old_p [ 1 ])[ 1 ], 27 , 27 , get_font ( old_p )); fill_rect ( d_p ( p [ 0 ])[ 0 ], d_p ( 0 , p [ 1 ])[ 1 ], 27 , 27 ,( 186 , 202 , 43 )); fill_rect ( d_p ( p [ 0 ])[ 0 ] + 3 , d_p ( 0 , p [ 1 ])[ 1 ] + 3 , 21 , 21 , get_font ( p )); draw_pion ( eval ( gpiopo ( p ). split ( _C )[ 0 ]), d_p ( p [ 0 ], 0 , 3 )[ 0 ], d_p ( 0 , p [ 1 ], 3 )[ 1 ], get_font ( p ), get_pion_color ( p ))
else : default_pions ()
def mvcu ( key , select_mode = 0 , leave_select_mode = 0 ):
global pion_selected , initial_pos , roque_done
if leave_select_mode :
if all_conditions_to_move ( initial_pos , pos ): print ( ' 1 ' , popi ); swpopi ( initial_pos , pos , 1 * eat_pion , 1 * roque_done ); print ( ' 2 ' , popi ); update_pos_pion ( initial_pos , pos , 1 * roque_done ); roque_done = 0 ; print ( ' 3 ' , popi )
else :
if select_mode : fill_rect ( d_p ( pos [ 0 ])[ 0 ], d_p ( 0 , pos [ 1 ])[ 1 ], 27 , 27 ,( 206 , 222 , 63 )); draw_pion ( eval ( gpiopo ( pos ). split ( _C )[ 0 ]), d_p ( pos [ 0 ], 0 , 3 )[ 0 ], d_p ( 0 , pos [ 1 ], 3 )[ 1 ],( 206 , 222 , 63 ), get_pion_color ( pos )); initial_pos = [ pos [ 0 ], pos [ 1 ]]; pion_selected = _B
if not select_mode and not pion_selected :
old_pos = get_old_pos ( key ); fill_rect ( d_p ( old_pos [ 0 ])[ 0 ], d_p ( 0 , old_pos [ 1 ])[ 1 ], 27 , 27 , get_font ( old_pos ))
if gpiopo ( old_pos ) != '' : draw_pion ( eval ( gpiopo ( old_pos ). split ( _C )[ 0 ]), d_p ( old_pos [ 0 ], 0 , 3 )[ 0 ], d_p ( 0 , old_pos [ 1 ], 3 )[ 1 ], get_font ( old_pos ), get_pion_color ( old_pos ))
if not select_mode :
fill_rect ( d_p ( pos [ 0 ])[ 0 ], d_p ( 0 , pos [ 1 ])[ 1 ], 27 , 27 ,( 186 , 202 , 43 )); fill_rect ( d_p ( pos [ 0 ])[ 0 ] + 3 , d_p ( 0 , pos [ 1 ])[ 1 ] + 3 , 21 , 21 , get_font ( pos ))
if gpiopo ( pos ) != '' : draw_pion ( eval ( gpiopo ( pos ). split ( _C )[ 0 ]), d_p ( pos [ 0 ], 0 , 3 )[ 0 ], d_p ( 0 , pos [ 1 ], 3 )[ 1 ], get_font ( pos ), get_pion_color ( pos ))
debug ( initial_pos , pos ); pion_selected = _A
def legit_turn ( t ):
team_pion = gpiopo ( pos ). split ( _C )[ 1 ]
if team_pion == ' w ' and t % 2 == 0 or team_pion == ' b ' and t % 2 != 0 : return _B
return _A
def chess ():
gui (); global pos , lky , mvpi
while not keydown ( 5 ):
if keydown ( 3 ) and pos [ 0 ] < 7 and lky != 3 : pos [ 0 ] += 1 ; mvcu ( 3 ); lky = 3
if keydown ( 0 ) and pos [ 0 ] > 0 and lky != 0 : pos [ 0 ] -= 1 ; mvcu ( 0 ); lky = 0
if keydown ( 1 ) and pos [ 1 ] > 0 and lky != 1 : pos [ 1 ] -= 1 ; mvcu ( 1 ); lky = 1
if keydown ( 2 ) and pos [ 1 ] < 7 and lky != 2 : pos [ 1 ] += 1 ; mvcu ( 2 ); lky = 2
if keydown ( 52 ) and lky != 52 :
if not mvpi and gpiopo ( pos ) != '' and legit_turn ( tour ): mvcu ( 42 , 1 ); mvpi = _B
elif mvpi : mvcu ( 42 , 0 , 1 ); mvpi = _A
lky = 52
if not ( keydown ( 0 ) or keydown ( 1 ) or keydown ( 2 ) or keydown ( 3 ) or keydown ( 52 )): lky = _H
chess ()