Замена одного конкретного элемента внутри 2dArray в numPy - PullRequest
1 голос
/ 23 сентября 2019

Я пытаюсь написать сценарий игры на линкоре (то есть когда вы говорите «B4», а враг говорит «HIT»)

На самом деле я пытаюсь позволить ПК случайным образом выбрать позицию корабля.Все в порядке, но теперь мне нужно изменить значение выбранного поля в "X" или что-то другое.

from random import *
import numpy as np

def nuovaPartita():

    campo = np.arange(100).reshape(10,10)
    navi = [
        [True, True],
        [True, True],
        [True, True],
        [True, True],
        [True, True, True],
        [True, True, True],
        [True, True, True],
        [True, True, True, True],
        [True, True, True, True],
        [True, True, True, True, True]
    ]

    direzioni = [0,1,2,3]



    for x in navi:
        posTrovata = False
        while posTrovata == False:

            lenNave = len(x)
            scegliCasella = choice(choice(campo))
            scegliDirezione = choice(direzioni)
            posCasella = np.where(campo == scegliCasella)

            R = int(posCasella[0])
            C = int(posCasella[1])
            print("============================\nHo scelto la casella: {}\nLunghezza nave: {}".format(scegliCasella, lenNave))

            if scegliDirezione == 0:                     
                print("Vado in alto")
                chunk = campo[R-(lenNave - 1): R+1, C]
                if int(chunk.shape[0]) < lenNave:
                    print("Assolutamente")
                    posTrovata = False
                else: 
                    posTrovata = True
                    print("La nave si trova nelle caselle")
                    print(chunk)

            elif scegliDirezione == 1:
                print("Vado a destra")
                chunk = campo[R, C: C + lenNave ]
                if int(chunk.shape[0]) < lenNave:
                    print("Assolutamente")
                    posTrovata = False
                else: 
                    posTrovata = True
                    print("La nave si trova nelle caselle")
                    print(chunk)


            elif scegliDirezione == 2:
                print("Vado in basso")
                chunk = campo[R: R+lenNave, C]
                if int(chunk.shape[0]) < lenNave:
                    print("Assolutamente")
                    posTrovata = False
                else: 
                    posTrovata = True
                    print("La nave si trova nelle caselle")
                    print(chunk)


            elif scegliDirezione == 3:
                print("Vado a sinistra")
                chunk = campo[R, C - lenNave: C]
                if int(chunk.shape[0]) < lenNave:
                    print("Assolutamente")
                    posTrovata = False
                else: 
                    posTrovata = True
                    print("La nave si trova nelle caselle")
                    print(chunk)


    print(campo)


def main():
    nuovaPartita()


if __name__ == "__main__":

    main()

Теперь, если я отображаю поле (названное "campo"), я получаю это

[[ 0  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]]

Теперь предположим, что у меня есть военный корабль на [54, 55, 56, 57] и военный корабль на [31, 41, 51], как я могу заменить эти поля int, например, на «x«

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Добавление этого фрагмента кода

if posTrovata == True:
                for x in chunk:
                    rCas = int(np.where(campo == int(x))[0])
                    cCas = int(np.where(campo == int(x))[1])
                    campo[rCas][cCas] = 100

возвращает

TypeError: only size-1 arrays can be converted to Python scalars
0 голосов
/ 23 сентября 2019

Вы можете просто изменить значение в campo, открыв его индекс.campo - это список списков, поэтому доступ к номеру 56 можно получить, обратившись к значению по индексу 6 списка по индексу 5, например:

campo[5][6] = 'x'

Вы можете даже обобщить это на:

def update_campo(campo, number):
    campo[number // 10][number % 10] = 'x'
    return campo

for i in range(56, 60):
    campo = update_campo(campo, i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...