Python Код, работающий вне функции и класса, но не внутри - PullRequest
0 голосов
/ 08 мая 2020

Пытаюсь сделать игру Connect 4. Вот мой код:

board = {}

for i in range(1,8):
    board[f'{i}_column'] = {}

    for a in range(1,7):
        board[f'{i}_column'][f'{i}x{a}_position'] = 'Empty'

class Checker:
    def __init__(self,color):
        self.color = color

    def find_column_amount(self,column):
        self.column_num = 0
        self.column_full = False
        for i in range(0,6):
            if board[f'{column}_column'][f'{column}x{6-i}_position'] != 'Empty':
                self.column_num += 1
            else:
                pass
        if self.column_num >= 6:
            self.column_full = True

    def place(self,column):
        self.find_column_amount(column)
        if self.column_full == False:
            if column <= 7 and column > 0:
                board[f'{column}_column'][f'{column}x{6-self.column_num}_position'] = self.color.title()
                else:
                print('You\'re out of the range!')
        else:
            print(f'Column {column} is full!\nTry another one!')

    def check_win(self):
        for d in range(1,7):
            for c in range(1,5):
                for b in range(c,c+4):
                    vars()[f'value_{b-c+1}'] = board[f'{b}_column'][f'{b}x{d}_position']

                if value_1 == value_2 == value_3 == value_4 and (value_1 and value_2 and value_3 and value_4) != 'Empty':
                    self.win()

    def win(self):
        print('You won!')

Чтобы проверить, сработало ли это, я запустил это:

p1 = Checker('red')
p1.place(1)
p1.place(2)
p1.place(3)
p1.place(4)
p1.check_win()

Я пробовал этот код, но он не работал. Неправильно была функция check_win. Я протестировал код вне функции и изменил self.win () на print («Вы выиграли!»), И он сработал.

for d in range(1,7):
    for c in range(1,5):
        for b in range(c,c+4):
            vars()[f'value_{b-c+1}'] = board[f'{b}_column'][f'{b}x{d}_position']

        if value_1 == value_2 == value_3 == value_4 and (value_1 and value_2 and value_3 and value_4) != 'Empty':
            print('You won!')

Результат был следующим:

You won!

Когда я снова подключил его к функции, это не сработало. Я не знаю, что делаю не так. Может кто подскажет, как это исправить?

1 Ответ

0 голосов
/ 08 мая 2020

Я просто быстро просмотрел этот код и заменил все, от чего у меня заболела голова, на более простой код, который делает то, что, похоже, пытался сделать исходный код. (Это определенно можно упростить еще больше, но я просто искал низко висящие плоды, чтобы заставить его работать.) Кажется, теперь работает, и было быстрее просто переписать эти фрагменты кода, чем пытаться их отлаживать.

board = [[None for a in range(7)] for i in range(8)]


class Checker:
    def __init__(self, color):
        self.color = color

    def find_column_amount(self, column):
        self.column_num = 0
        self.column_full = False
        for i in range(0, 6):
            if board[column][6-i] is not None:
                self.column_num += 1
            else:
                pass
        if self.column_num >= 6:
            self.column_full = True

    def place(self, column):
        self.find_column_amount(column)
        if not self.column_full:
            if column <= 7 and column > 0:
                board[column][6-self.column_num] = self.color.title()
            else:
                print('You\'re out of the range!')
        else:
            print(f'Column {column} is full!\nTry another one!')

    def check_win(self):
        for d in range(1, 7):
            for c in range(1, 5):
                values = {board[b][d] for b in range(c, c+4)}
                if len(values) == 1 and values.pop() is not None:
                    self.win()

    def win(self):
        print('You won!')


p1 = Checker('red')
p1.place(1)
p1.place(2)
p1.place(3)
p1.place(4)
p1.check_win()  # prints "You won!" now
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...