Увеличение квадрата в 2D-списке при уменьшении всех остальных квадратов, не задействованных — Python

#python #pandas #numpy #pycharm #chess

#python #pandas #numpy #pycharm #шахматы

Вопрос:

у меня есть 2D-список, и я пытаюсь обновить значение ячейки, в то время как мне нужно уменьшить значения других ячеек, которые я не увеличиваю.

у меня есть 2D-список под названием

 PAWN = [
    [0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0]
]
 

И в моем коде я обновляю все квадраты, которые включают ход пешки, например, g3, h4, матрица будет обновляться следующим образом, добавляя 0,1 для хода, и это работает довольно хорошо.

 PAWN = [
       A  B  C  D  E  F  G  H
   8  [0, 0, 0, 0, 0, 0, 0, 0],
   7  [0, 0, 0, 0, 0, 0, 0, 0],
   6  [0, 0, 0, 0, 0, 0, 0, 0],
   5  [0, 0, 0, 0, 0, 0, 0, 0],
   4  [0, 0, 0, 0, 0, 0, 0, 0.1],
   3  [0, 0, 0, 0, 0, 0, 0.1, 0],
   2  [0, 0, 0, 0, 0, 0, 0, 0],
   1  [0, 0, 0, 0, 0, 0, 0, 0]
]
 

Вот фрагмент моего кода:

 white_moves = ['g3', 'h4']
    for moves in white_moves:
        delta = 0.1
        if len(moves) == 2: # for example g3
            y = moves[0]   #y = g
            x = int(moves[1]) #x = 3

            coordinate = {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g', 7: 'h'}
            c = coordinate.values()
            for key, value in coordinate.items():
                if y == value:
                    indice_colonna = key
                
            for letter in c:  
                if letter == y:  # if value in dictionary is equal to my y

   
                    file = open('../data/tables/pedone.csv', 'r') #reading from csv file
                    reader = csv.reader(file)
                    PAWN = list(reader)
                    file.close()
                    new_pawn = PAWN    
    
                    new_pawn[8-x][indice_colonna] = round(float(PAWN[8-x][indice_colonna])   delta, 1) #here im incrementing the value of square [g][3]
    
    
                    new_pawn = open("../data/tables/pedone.csv", 'w', newline='') #updating that file
                    writer = csv.writer(new_pawn)
                    writer.writerows(PAWN)
                    new_pawn.close()
                    break
 

Как я могу уменьшить все остальные квадраты? из строки 0 в 8 и столбца 0 в 8, но избегая уменьшения также квадрата g3? у меня возникли проблемы с разделением этих двух операций

вот что я пробовал:

 rows = 8
columns = 8

for i in range(rows):
    for j in range(columns):
        pedone[i][j] = -0.1
        pedone[8-x][indice_colonna] =   2*0.1 #trying to add 2x the value 
 

но не работает, какие-либо предложения?

Ответ №1:

В вашем цикле, пытающемся добавить значение в 2 раза, вы перезаписываете всю матрицу каждый раз, когда выполняете итерацию, и устанавливаете только одно значение.2. Вам нужно будет разделить их, а затем применить операцию. Кроме того, если бы вы увеличивали значение, оно увеличивалось бы каждый раз, когда вы проходите через цикл.

Это потребует от вас считывания CSV-файла в матрицу в начале и записи его в конце, а не повторной записи в него, если только вы не хотите вычитать значение при каждом возможном перемещении, а не только один раз.

 rows = 8
columns = 8

# read CSV into pedone

for i in range(rows):
    for j in range(columns):
        pedone[i][j] -= 0.1

# and then enter your loop:
for moves in white_moves
    ...
        pedone[8-x][indice_colonna]  = 2 * 0.1

# write pedone back to CSV

 

Комментарии:

1. к сожалению, у меня будет огромная база данных ходов, поэтому я думаю, что нехорошо обновлять 2 * дельта выбранного хода, мне нужно что-то, что делает и то, и другое…

Ответ №2:

Проблема здесь в том, что вы оба удаляете -0.1 из каждой ячейки (что нормально) и на каждой итерации добавляете 2*0.1 в целевую ячейку. Однако вы хотите добавить 2*0.1 только один раз!

Попробуй это:

 rows = 8
columns = 8

pedone[8-x][indice_colonna]  = 2*0.1 #trying to add 2x the value  ONE TIME ONLY

for i in range(rows):
    for j in range(columns):
        pedone[i][j] = -0.1
 

Комментарии:

1. спасибо, теперь это имеет смысл, но все же это не лучшее решение, есть способ сообщить python: «обновите эту строку / col /, уменьшив все остальные?»

2. что-то вроде «удалить из строк и столбцов, строка = 3 и столбцы = g», но для всех возможных перемещений в white_moves

3. Хорошо, там тоже была опечатка. Вы написали = 2*0.1 , что означает «присвоить 0.2» вместо = 2*0.1 того, что означает обновить значение. Попробуйте сейчас.