Сохраните текущее состояние рекурсивного цикла в файл.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Сохраните текущее состояние рекурсивного цикла в файл.

Сообщение Anonymous »

Я создал игру-головоломку, которая решается сама собой, используя грубую силу. Моя решающая функция, кажется, работает нормально. Он проходит через все мои фрагменты и даже запускает новый экземпляр, если значение «is_valid» истинно, и восстанавливает предыдущий экземпляр, если оно неверно. Это мой код решателя.

Код: Выделить всё

def solve(board, pieces_used_unused, positions, position_index, ax, prev_match_counter=0):
global match_counter

if match_counter >= TOTAL_MATCHES:
return True

if position_index == len(positions):  # If all positions are processed
return False

row, col = positions[position_index]

for i, piece in enumerate(pieces_used_unused['unused']):
# Check edge and corner constraints for pieces with 0 patterns
if piece.sides.count(0) == 2:
if not is_corner_position(row, col):
continue
elif 0 in piece.sides:
if not is_edge_position(row, col):
continue
elif is_edge_position(row, col):
continue

for _ in range(4): # Try all four rotations
if is_valid(board, piece, row, col):
matches = count_matches(board, piece, row, col)
match_counter += matches

board[row][col] = piece

pieces_used_unused['used'].append(piece)
remaining_pieces = pieces_used_unused['unused'][:i] + pieces_used_unused['unused'][i + 1:]
pieces_used_unused['unused'] = remaining_pieces

print_board(board)
if match_counter > prev_match_counter: # Save the state only if match_counter is bigger than previously saved match_counter
save_state(board, pieces_used_unused, positions, position_index + 1, match_counter)
prev_match_counter = match_counter

if solve(board, pieces_used_unused, positions, position_index + 1, ax, prev_match_counter):
return True

match_counter -= matches
board[row][col] = None

pieces_used_unused['unused'].insert(i, piece)
pieces_used_unused['used'].pop()

print_board(board)

piece.rotate() # Rotate the piece for the next attempt

return False
Моя проблема в том, что если мое приложение завершается по ошибке из-за сбоя компьютера, я хочу начать с того места, где оно осталось. Итак, я попробовал это:

Код: Выделить всё

def save_state(board, pieces_used_unused, positions, position_index, match_counter):
state = {
'board': [[{'id': piece.id, 'sides': piece.sides} if piece else None for piece in row] for row in board],
'pieces_used_unused': {
'used': [{'id': piece.id, 'sides': piece.sides} for piece in pieces_used_unused['used']],
'unused': [{'id': piece.id, 'sides': piece.sides} for piece in pieces_used_unused['unused']]
},
'positions': positions,
'position_index': position_index,
'match_counter': match_counter
}
with open('puzzle_state.json', 'w') as f:
json.dump(state, f)
и добавил сюда вызов моего решателя:

Код: Выделить всё

# snip
pieces_used_unused['unused'] = remaining_pieces

print_board(board)
if match_counter > prev_match_counter: # Save the state only if match_counter is bigger than previously saved match_counter
save_state(board, pieces_used_unused, positions, position_index + 1, match_counter)
prev_match_counter = match_counter
#snip

Но он никогда не догонит то, что было до поломки. Фактически, «for i, Piece in enumerate(pieces_used_unused['unused']):» просто пробегает все неиспользованные части и завершает головоломку без решения, что неверно. Возможно, я добрый человек, мог бы помочь мне понять, что нужно сделать, чтобы это стало возможным. Так сказать, мои последние кусочки головоломки. ;)

Подробнее здесь: https://stackoverflow.com/questions/793 ... ps-to-file
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»