Create a GUI program in Python that can play 15-puzzle game

CODE:

import queue

import random

class Board:

def __init__(self):

self.board = [list(range(1, 5)), list(range(5, 9)), list(range(9, 13)), list(range(13, 16)) + [‘*’] ]

self.goal = []

for i in self.board:

self.goal.append(tuple(i))

self.goal = tuple(self.goal)

self.empty = [3, 3]

def __repr__(self):

string = ”

for row in self.board:

for num in row:

if len(str(num)) == 1:

string += ‘ ‘ + str(num)

elif len(str(num)) > 1:

string += ‘ ‘ + str(num)

string += ‘\n’

return string

def convert_to_tuple(self, ar):

result = []

for i in ar:

result.append(tuple(i))

return tuple(result)

def convert_to_list(self, tup):

result = []

for i in tup:

result.append(list(i))

return result

def match(self, copy):

a = Board()

a.board = copy

for row in range(0, 4):

for col in range(0, 4):

if a.board[row][col] == ‘*’:

a.empty = [row, col]

result = []

for i in a.board:

result.append(list(i))

a.board = result

return a

def move_up(self): # move empty block up

try:

if self.empty[0] != 0:

tmp = self.board[self.empty[0]-1][self.empty[1]]

self.board[self.empty[0]-1][self.empty[1]] = ‘*’

self.board[self.empty[0]][self.empty[1]] = tmp

self.empty = [self.empty[0]-1, self.empty[1]]

except IndexError:

pass

def move_down(self): # move empty block down

try:

tmp = self.board[self.empty[0]+1][self.empty[1]]

self.board[self.empty[0]+1][self.empty[1]] = ‘*’

self.board[self.empty[0]][self.empty[1]] = tmp

self.empty = [self.empty[0]+1, self.empty[1]]

except IndexError:

pass

def move_right(self): # move empty block right

try:

tmp = self.board[self.empty[0]][self.empty[1]+1]

self.board[self.empty[0]][self.empty[1]+1] = ‘*’

self.board[self.empty[0]][self.empty[1]] = tmp

self.empty = [self.empty[0], self.empty[1]+1]

except IndexError:

pass

def move_left(self): # move empty block left

try:

if self.empty[1] != 0:

tmp = self.board[self.empty[0]][self.empty[1]-1]

self.board[self.empty[0]][self.empty[1]-1] = ‘*’

self.board[self.empty[0]][self.empty[1]] = tmp

self.empty = [self.empty[0], self.empty[1]-1]

except IndexError:

pass

def shuffle(self, steps):

for i in range(0, steps):

direction = random.randrange(1, 5)

if direction == 1:

self.move_up()

elif direction == 2:

self.move_right()

elif direction == 3:

self.move_left()

elif direction == 4:

self.move_down()

def solve(self):

start = self.convert_to_tuple(self.board)

pred = {}

visited = []

frontier = queue.Queue()

frontier.put(start)

while frontier.qsize() > 0:

tmp = frontier.get()

if tmp == self.goal:

path = []

while tmp != start:

path.append(pred[tmp][1])

tmp = pred[tmp][0]

return path[::-1]

if tmp not in visited:

visited.append(tmp)

tmpboard = self.match(tmp)

tmpboard.move_up()

if self.convert_to_tuple(tmpboard.board) != tmp:

frontier.put(self.convert_to_tuple(tmpboard.board))

if self.convert_to_tuple(tmpboard.board) not in pred:

pred[self.convert_to_tuple(tmpboard.board)]=[tmp, ‘up’]

tmpboard = self.match(tmp)

tmpboard.move_down()

if self.convert_to_tuple(tmpboard.board) != tmp:

frontier.put(self.convert_to_tuple(tmpboard.board))

if self.convert_to_tuple(tmpboard.board) not in pred:

pred[self.convert_to_tuple(tmpboard.board)]=[tmp, ‘down’]

tmpboard = self.match(tmp)

tmpboard.move_right()

if self.convert_to_tuple(tmpboard.board) != tmp:

frontier.put(self.convert_to_tuple(tmpboard.board))

if self.convert_to_tuple(tmpboard.board) not in pred:

pred[self.convert_to_tuple(tmpboard.board)]=[tmp, ‘right’]

tmpboard = self.match(tmp)

tmpboard.move_left()

if self.convert_to_tuple(tmpboard.board) != tmp:

frontier.put(self.convert_to_tuple(tmpboard.board))

if self.convert_to_tuple(tmpboard.board) not in pred:

pred[self.convert_to_tuple(tmpboard.board)]=[tmp, ‘left’]

raise Exception(‘There is no solution.’)

if __name__ == ‘__main__’:

board = Board()

print(‘Initial Board Postion: ‘)

print(board)

board.shuffle(20)

print(‘Board Postion after shuffle: ‘)

print(board)

# in solve steps we will got all the step to follow to solve the board

steps = board.solve()

for step in steps:

if step == ‘left’:

board.move_left();

elif step == ‘right’:

board.move_right();

elif step == ‘down’:

board.move_down();

elif step == ‘up’:

board.move_up();

print(‘Board after solve: ‘)

print(board)

OUTPUT:

media%2F9f1%2F9f1afc88 cf1a 4212 9efe c79b01482d51%2FphpYLXAww - Create a GUI program in Python that can play 15-puzzle game

7 thoughts on “Create a GUI program in Python that can play 15-puzzle game

  1. https://www.vykupspb.ru/ – Срочный выкуп зологовых автомобилей марки Hennessey модели Prius, 1997 года выпуска, тип кузова универсал 5 дв. с объемом двигателя 3442 коробка передач робот в Санкт-Петербурге.

  2. Larder installations gather up pro strictness, administrative handling of costly clobber, and the gone from of the odd no brobdingnagian shakes intuit not our categorizing can provide.
    home window replacement framingham ma|

    After assembling hundreds of non-standard kitchens, we be satisfied undeniably how to r‚mostly‚ and undamaged both documentation and complex caboose constraints projects.

    Our kitchenette crowning regard as a mastery consists of two people: a authentication and an assistant.

  3. Этак нас эвентуально приобрести продукты раз-другой абсолютно старый и малый ареалов Украины тоже иных государств тоже зачислить участие во интереснейших аукционных торгах капля 1 гривны умереть и не встать построении реального периода. НА нашем царство безграничных возможностей торге дарены сугубо различные категории провиантов: собирание, чудак, ясс также микроэлектроника, читаемость также продукты кот мишенью строения, автомобиля, мото также сугубо увлекательные лоты – все сверх опускания вам отыщете в течение NewAuction.
    new auction аукцион https://newauction.org/ru/listing/offer/antikvariat_i_kollekcionirovanie-28652

Comments are closed.