Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Issue with 2D array in python

I am working on a text-based chess project in python, and I have set up a pretty nice looking chess board in my output console. But whenever I try to place a piece somewhere, it fills up the entire file.

The code I used is here:

import os
global arrowKey
global speed
newchar = ''
arrowKey = {'\x1b[A': 'up'}
class Pieces:
    Black_rook = '♜'
    Black_knight = '♞'
    Black_bishop = '♝'
    Black_queen = '♛'
    Black_king = '♚'
    Black_pawn = '♟︎'
    White_rook = '♖'
    White_knight = '♘'
    White_bishop = '♗'
    White_queen = '♕'
    White_king = '♔'
    White_pawn = '♙'
class Array:
    def __init__(self, x=16, y=8, board=None):
        self.pos = ()
        self.x = x
        self.y = y
        grid = [' ' + '_' * self.x]
        for _ in range(y):
            row = ['|']
            for _ in range(x):
                row.append(' ')
            row.append('|')
            grid.append(row)
        grid.append(' ' + '‾' * self.x)
        self.grid = grid
        if board != None:
            self.grid = board
    def reload(self, say=None):
        os.system('clear')
        if say != None:
            print(say)
        p = ''
        for i in self.grid:
            p = p + ''.join([x for x in i]) + '\n'
        print(p)
    def insert(self, char, x, y):
        self.pos = (x, y)
        self.grid[y][x] = char
    def move(self, direction, char):
        poslist = []
        for y, i in enumerate(self.grid):
            for x, j in enumerate(i):
                if j == char:
                    poslist.append((x, y))
        count = 0
        for posx, posy in poslist:
            if direction == 'down':
                if self.grid[posy + 1][posx] != '‾':
                    self.insert(' ', posx, posy)
                    self.insert(char, posx, posy + 1)
                    self.pos = (posx, posy + 1)
            if direction == 'up':
                if self.grid[posy - 1][posx] != '_':
                    self.insert(' ', posx, posy)
                    self.insert(char, posx, posy - 1)
                    self.pos = (posx, posy - 1)
            if direction == 'left':
                if self.grid[posy][posx - 1] != '|':
                    self.insert(' ', posx, posy)
                    self.insert(char, posx - 1, posy)
                    self.pos = (posx - 1, posy)
            if direction == 'right':
                if self.grid[posy][posx + 1] != '|':
                    self.insert(' ', posx, posy)
                    self.insert(char, posx + 1, posy)
                    self.pos = (posx + 1, posy)
            count += 1
    def getpos(self, char):
        poslist = []
        for y, i in enumerate(self.grid):
            for x, j in enumerate(i):
                if j == char:
                    poslist.append((x, y))
        return poslist
class Chess(Array):
    def __init__(self):
        row = list(''.join(['.' for i in range(8)]))
        board = [row for i in range(8)]
        super().__init__(board=board)
    def reload(self):
        p = ''
        nums = [i + 1 for i in range(8)]
        nums.reverse()
        for x, i in enumerate(self.grid):
            i = [f'{z} ' for z in i]
            p += f'{nums[x]}  {"".join(i)}\n'
        add = [i + ' ' for i in list('ABCDEFG')]
        add.append('H')
        p += '   ' + ''.join(add) + '\n'
        print(p)
    def move(self, move:str):
        move = move.split(' ')
    def placepiece(self, piece, pos):
        pos = list(pos)
        ykey = [i for i in range(8)]
        ykey.reverse()
        x = [x for x, i in enumerate('ABCDEF') if i == pos[0]][0]
        y = ykey[int(pos[1]) - 1]
        x = int(x)
        return x, y
board = Chess()
x, y = board.placepiece(Pieces.White_pawn, 'E4')
board.grid[y][x] = Pieces.White_pawn
print(board.grid)
board.reload()

I expected to get a white pawn character at E4 on the array, but it filled up the entire file like this. Could someone help me with this? I have used 2D arrays in many other projects before, but never encountered this issue. I am happy to elaborate further on anything you need me to.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

The problem is in

class Chess(Array):
    def __init__(self):
        row = list(''.join(['.' for i in range(8)]))
        board = [row for i in range(8)]
        super().__init__(board=board)

You are creating a single list and referencing it multiple times in board.

Change to: board = [row.copy() for i in range(8)]

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading