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()