Python Forum
Multiple classes in another class - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Multiple classes in another class (/thread-4784.html)



Multiple classes in another class - Dargonoth - Sep-08-2017

I am new to the Python world and am having a bit of trouble trying to figure out a solution. Hopefully someone here can help this newbie out.

I am trying to make a simple game for practice in learning how to use classes. I have created a Tile class and a Board class. The board class is creating multiple Tiles but I seem to be having trouble changing an attribute of the Tile from the Board class.

tile.py
class Tile:
    """ Class for the tiles in the game. """

    def __init__(self):
        """ Initialize the tiles with colors set to 0. """
        self.red = 0
        self.green = 0
        self.blue = 0

    def get_color(self):
        """ Returns the tile color in RGB. """
        return self.red, self.green, self.blue

    def change_color(self, color):
        """ Change the tile color depending on current state. """
        # Color is 0, 1, or 2 for RGB.
        if color == 0:
            if self.red == 0:
                self.red = 255
            elif self.red == 255:
                self.red = 0
        elif color == 1:
            if self.green == 0:
                self.green = 255
            elif self.green == 255:
                self.green = 0
        elif color == 2:
            if self.blue == 0:
                self.blue = 255
            elif self.blue == 255:
                self.blue = 0
board.py
from tile import Tile

class Board:
    """ Class for the game board. """
    def __init__(self, size):
        self.size = size
        self.board = [[Tile] * self.size for i in range(self.size)]
        self.board_won = False

    def change_tile_color(self, row, col, color):
        temp_row, temp_col = [row - 1, row, row + 1], [col - 1, col, col + 1]
        row_set, col_set = [], []
        for i in range(3):
            if 0 <= temp_row[i] <= self.size - 1:
                row_set.append(temp_row[i])
            if 0 <= temp_col[i] <= self.size - 1:
                col_set.append(temp_col[i])
        for r in row_set:
            for c in col_set:
                self.board[r][c].change_color(color)


b = Board(5)
b.change_tile_color(2, 4, 0)
when I run board.py I get
Error:
TypeError: change_color() missing 1 required positional argument: 'color'
I am using Python 3.6.2. I have tried using super() also, but don't think I am doing it correctly.


RE: Multiple classes in another class - Larz60+ - Sep-08-2017

You call method
'change_tile_color' in class board,
from which (line 20) you attempt to call method change_color of class Tile,
but you never instantiate class tile in class Board.
To do this you need a tile = Tile() in Board.
I would put that in the __init__ mathod of Board.
then line 20 of Board now becomes:
self.board[r][c].tile.change_color(color)



RE: Multiple classes in another class - Larz60+ - Sep-08-2017

After looking at this a bit more, I see you are embedding 'Tile' into self.board.
but Tile still has not been instantiated. This is just the address of class Tile
I'm not really sure what you are trying to do here.
Perhaps you could explain a bit more.


RE: Multiple classes in another class - Dargonoth - Sep-08-2017

@ Larz60+

Thanks for the quick response. That seemed to solve the issue.
Been using super() in all the books I have been reading but board is not a type of tile so didn't think that was the answer.

Leave it to a simple syntax error on my part. That's usually the issue, but not familiar enough with it to spot it on my own.
Thanks again!! Big Grin

I changed line 7 in board.py to:
self.board = [[Tile()] * self.size for i in range(self.size)]
not getting an error now. but doing further testing to make sure it is working correctly

Ok this still not acting the way I want. I am creating a Lightout game. Only this one has 3 different colors to it (RGB). So if you click on a tile on the board, that tile and all tiles around it change color. After using a looping print statement. I see nothing is changing. Why?

(Sep-08-2017, 12:26 PM)Larz60+ Wrote: After looking at this a bit more, I see you are embedding 'Tile' into self.board.
but Tile still has not been instantiated. This is just the address of class Tile
I'm not really sure what you are trying to do here.
Perhaps you could explain a bit more.

Ok this still not acting the way I want. I am creating a Lightout game. Only this one has 3 different colors to it (RGB). So if you click on a tile on the board, that tile and all tiles around it change color. After using a looping print statement. I see nothing is changing. Why?