Sunday, April 19, 2020

Create Towers of Hanoi with python using stacks

Source: GeeksforGeeks
class Node:    def __init__(self, value, next_node=None):        self.value = value        self.next_node = next_node
    def get_value(self):        return self.value

    def get_next_node(self):        return self.next_node

    def set_next_node(self, next_node):        self.next_node = next_node

class Stack:    def __init__(self, name):        self.size = 0        self.top_item = None        self.limit = 1000        self.name = name
    def push(self, value):        if self.has_space():            item = Node(value)            item.set_next_node(self.top_item)            self.top_item = item
            self.size += 1        else:            print("No more room!")
    def pop(self):        if self.size > 0:            item_to_remove = self.top_item
            self.top_item = item_to_remove.get_next_node()            self.size -= 1            return item_to_remove.get_value()        print("This stack is totally empty.")
    def peek(self):        if self.size > 0:            return self.top_item.get_value()        print("Nothing to see here!")
    def has_space(self):        return self.limit > self.size

    def is_empty(self):        return self.size == 0
    def get_size(self):        return self.size

    def get_name(self):        return self.name

    def print_items(self):        pointer = self.top_item
        print_list = []        while (pointer):            print_list.append(pointer.get_value())            pointer = pointer.get_next_node()        print_list.reverse()        print("{0} Stack: {1}".format(self.get_name(), print_list))


print("\nLet's play Towers of Hanoi!!")
# Create the Stacksstacks = []left_stack = Stack('Left')middle_stack = Stack('Middle')right_stack = Stack('Right')stacks.append(left_stack)stacks.append(middle_stack)stacks.append(right_stack)
# Set up the Gamenum_disks = int(input('\nHow many disks do you want to play with?\n'))while num_disks < 3:    num_disks = int(input('\nEnter a number greater than or equal to 3\n'))for i in range(num_disks, 0, -1):    left_stack.push(i)num_optimal_moves = 2 ** num_disks - 1print("\nThe fastest you can solve this game is in {0} moves".format(num_optimal_moves))

# Get User Inputdef get_input():    choices = [stack.get_name()[0] for stack in stacks]    while True:        for i in range(len(stacks)):            name = stacks[i].get_name()            letter = choices[i]            print('Enter {0} for {1}'.format(letter, name))        user_input = input()        if user_input in choices:            for i in range(len(stacks)):                if user_input == choices[i]:                    return stacks[i]

# Play the Game
num_user_moves = 0while (right_stack.get_size() != num_disks):    print("\n\n\n...Current Stacks...")    for i in stacks:        i.print_items()    while True:        print("\nWhich stack do you want to move from?\n")        from_stack = get_input()        if len(from_stack) == 0:            print('\n\nInvalid Move. Try Again')    print("\nWhich stack do you want to move to?\n")    to_stack = get_input
    elif len(to_stack) == 0 or to_stack.peak() > from_stack.peak():    disk = from_stack.pop()    to_stack.push(disk)    num_user_moves += 1    breakelse:    print('\n\nInvalid Move. Try Again')print("\n\nYou completed the game in {0} moves, and the optimal number of moves is {1}".format(num_user_moves,                                                                                               num_optimal_moves))

No comments:

Post a Comment