Advertisement
max2201111

takto ne, moc nizkourovnove

May 14th, 2024
695
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.87 KB | Science | 0 0
  1. import numpy as np
  2. from itertools import permutations, combinations
  3.  
  4. def generate_positions():
  5.     ozn = [(i, j) for j in range(1, 9) for i in range(1, 9)]
  6.     ozn_dict = {8 * (j - 1) + i: chr(i + ord('a') - 1) + str(j) for j in range(1, 9) for i in range(1, 9)}
  7.    
  8.     p = np.zeros((64, 64, 64), dtype=int)
  9.     q = np.zeros((64, 64, 64), dtype=int)
  10.    
  11.     m = 0
  12.     for i in range(64):
  13.         for j in range(64):
  14.             for k in range(64):
  15.                 y1, x1 = divmod(i, 8)
  16.                 y2, x2 = divmod(j, 8)
  17.                 y3, x3 = divmod(k, 8)
  18.                
  19.                 if i == j or i == k or j == k:
  20.                     p[i, j, k] = -2000
  21.                 elif abs(y1 - y2) <= 1 and abs(x1 - x2) <= 1:
  22.                     p[i, j, k] = -2000
  23.                 elif (y2 == y3 and (y1 != y3 or (x2 - x1) * (x2 - x3) < 0)) or \
  24.                      (x2 == x3 and (x1 != x3 or (y2 - y1) * (y2 - y3) < 0)) or \
  25.                      (y2 - y3 == x2 - x3 and (y2 - y1 != x2 - x1 or (x1 - x3) * (x1 - x2) > 0)) or \
  26.                      (y2 - y3 == x3 - x2 and (y2 - y1 != x1 - x2 or (x1 - x3) * (x1 - x2) > 0)):
  27.                     p[i, j, k] = -2000
  28.                 else:
  29.                     m += 1
  30.    
  31.     print(f"Celkem {m} pripustnych pozic pro bileho")
  32.    
  33.     n, n2, n3, n4 = 0, 0, 0, 0
  34.     for i in range(64):
  35.         for j in range(64):
  36.             for k in range(64):
  37.                 y1, x1 = divmod(i, 8)
  38.                 y2, x2 = divmod(j, 8)
  39.                 y3, x3 = divmod(k, 8)
  40.                
  41.                 if i == j or i == k or j == k:
  42.                     q[i, j, k] = -2000
  43.                 elif abs(y1 - y2) <= 1 and abs(x1 - x2) <= 1:
  44.                     q[i, j, k] = -2000
  45.                 else:
  46.                     sach = 0
  47.                     if (y2 == y3 and (y1 != y3 or (x2 - x1) * (x2 - x3) < 0)) or \
  48.                        (x2 == x3 and (x1 != x3 or (y2 - y1) * (y2 - y3) < 0)) or \
  49.                        (y2 - y3 == x2 - x3 and (y2 - y1 != x2 - x1 or (x1 - x3) * (x1 - x2) > 0)) or \
  50.                        (y2 - y3 == x3 - x2 and (y2 - y1 != x1 - x2 or (x1 - x3) * (x1 - x2) > 0)):
  51.                         sach = 1
  52.                    
  53.                     if q[i, j, k] == 0:
  54.                         tahu = 0
  55.                         for t1 in range(-1, 2):
  56.                             for t2 in range(-1, 2):
  57.                                 if t1 != 0 or t2 != 0:
  58.                                     x4, y4 = x2 + t1, y2 + t2
  59.                                     if 0 <= x4 < 8 and 0 <= y4 < 8 and (abs(x4 - x1) > 1 or abs(y4 - y1) > 1):
  60.                                         if (x4 == x3 and y4 == y3) or p[y1 * 8 + x1, y4 * 8 + x4, y3 * 8 + x3] == 0:
  61.                                             tahu += 1
  62.                                         if x4 == x3 and y4 == y3:
  63.                                             q[i, j, k] = 332
  64.                                             n4 += 1
  65.                         if tahu == 0 and sach == 1:
  66.                             q[y1 * 8 + x1, y2 * 8 + x2, y3 * 8 + x3] = -1000
  67.                             n2 += 1
  68.                         elif tahu == 0:
  69.                             q[i, j, k] = 333
  70.                             n3 += 1
  71.                         else:
  72.                             n += 1
  73.    
  74.     print(f"Celkem {n} pripustnych pozic pro cerneho")
  75.     print(f"Celkem {n2} pozice, kde je cerny v matu")
  76.     print(f"Celkem {n3} pozice, kde je cerny v patu")
  77.     print(f"Celkem {n4} pozice, kde cerny muze vzit vez")
  78.    
  79.     return p, q, ozn_dict
  80.  
  81. def main():
  82.     pieces = ['K', 'k', 'Q', 'B']
  83.     p, q, ozn_dict = generate_positions()
  84.    
  85.     tahy = 0
  86.     while tahy < 500:
  87.         tahy += 1
  88.         n2 = 0
  89.        
  90.         if tahy % 2 != 0:
  91.             for i in range(64):
  92.                 for j in range(64):
  93.                     for k in range(64):
  94.                         if p[i, j, k] == 0:
  95.                             y1, x1 = divmod(i, 8)
  96.                             y2, x2 = divmod(j, 8)
  97.                             y3, x3 = divmod(k, 8)
  98.                             lzemat = 0
  99.                             for t1 in range(-1, 2):
  100.                                 for t2 in range(-1, 2):
  101.                                     if t1 != 0 or t2 != 0:
  102.                                         x4, y4 = x1 + t1, y1 + t2
  103.                                         if 0 <= x4 < 8 and 0 <= y4 < 8:
  104.                                             if q[y4 * 8 + x4, y2 * 8 + x2, y3 * 8 + x3] == -1001 + tahy:
  105.                                                 lzemat = 1
  106.                            
  107.                             for s1 in range(-1, 2):
  108.                                 for s2 in range(-1, 2):
  109.                                     if (s1 == 0 or s2 == 0 or s1 == s2 or s1 == -s2) and (s1 != 0 or s2 != 0):
  110.                                         x4, y4 = x3, y3
  111.                                         tahu = 1
  112.                                         while tahu:
  113.                                             x4 += s1
  114.                                             y4 += s2
  115.                                             if x4 < 0 or x4 >= 8 or y4 < 0 or y4 >= 8 or (x1 == x4 and y1 == y4):
  116.                                                 tahu = 0
  117.                                             elif q[y1 * 8 + x1, y2 * 8 + x2, y4 * 8 + x4] == -1001 + tahy:
  118.                                                 lzemat = 1
  119.                             if lzemat:
  120.                                 n2 += 1
  121.                                 p[i, j, k] = 1000 - tahy
  122.         else:
  123.             for i in range(64):
  124.                 for j in range(64):
  125.                     for k in range(64):
  126.                         if q[i, j, k] == 0:
  127.                             y1, x1 = divmod(i, 8)
  128.                             y2, x2 = divmod(j, 8)
  129.                             y3, x3 = divmod(k, 8)
  130.                             lzemat = 0
  131.                             tahu = 0
  132.                             for t1 in range(-1, 2):
  133.                                 for t2 in range(-1, 2):
  134.                                     if t1 != 0 or t2 != 0:
  135.                                         x4, y4 = x2 + t1, y2 + t2
  136.                                         if 0 <= x4 < 8 and 0 <= y4 < 8 and (abs(x4 - x1) > 1 or abs(y4 - y1) > 1):
  137.                                             if p[y1 * 8 + x1, y4 * 8 + x4, y3 * 8 + x3] >= 0:
  138.                                                 tahu += 1
  139.                                             if p[y1 * 8 + x1, y4 * 8 + x4, y3 * 8 + x3] >= 1000 - tahy:
  140.                                                 lzemat += 1
  141.                             if lzemat == tahu:
  142.                                 n2 += 1
  143.                                 q[i, j, k] = -1000 + tahy
  144.        
  145.         print(f"V hloubce {tahy} nalezeno {n2} novych reseni")
  146.         if n2 == 0:
  147.             break
  148.  
  149. if __name__ == "__main__":
  150.     main()
  151.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement