From 2e124593f3d8740db48f96c2276fea2c24519787 Mon Sep 17 00:00:00 2001 From: ShriramShagi Date: Sun, 18 Jul 2021 12:10:29 +0530 Subject: [PATCH 1/4] import updates --- Visualiser.py | 36 +++++------------------------------- app.py | 2 +- sort.py | 40 +--------------------------------------- 3 files changed, 7 insertions(+), 71 deletions(-) diff --git a/Visualiser.py b/Visualiser.py index 4a9707b..9457ef3 100644 --- a/Visualiser.py +++ b/Visualiser.py @@ -1,33 +1,7 @@ import pygame import os -import sys - -from Algorithms.nodes.nodes import * -from Algorithms.nodes.button import * -from Algorithms.prims import prims -from Algorithms.astar import astar -from Algorithms.dijkstra import dijkstra -from Algorithms.kruskal import kruskal -from Algorithms.sidewinder import sidewinder -from Algorithms.recursive_backtracking import backtrack -from Algorithms.ellers import ellers -from Algorithms.aldous_broder import aldous -from Algorithms.wilson import wilson -from Algorithms.hunt_and_kill import hunt -from Algorithms.growing_tree import tree -from Algorithms.binary_tree import binary -from Algorithms.recursive_division import division - -FILEPATH = os.getcwd() - -WIDTH = 1584 -COLUMNS = 99 - -HEIGHT = 784 -ROWS = 49 - -GREY = (128,128,128) -WHITE = (255,255,255) + +from Visualiser import * stage = 3 rainbow = [(255, 0, 0), (255, 255, 0), (0, 255, 0), (0, 0, 255), (75, 0, 130), (150, 0, 255)] @@ -38,7 +12,7 @@ WIN = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Visualiser") -pygame.display.set_icon(pygame.image.load(os.path.join(FILEPATH, 'Fonts', 'icon.png'))) +pygame.display.set_icon(pygame.image.load(ICON)) def make_grid(): grid = [] @@ -245,7 +219,7 @@ def helppage(k=False): Quit = False inv = False - background1 = pygame.image.load(os.path.join(FILEPATH, 'Fonts', 'Help1.png')) + background1 = pygame.image.load(HELP1) nextpage = button((0, 0, 0), 1440, 350, 75, 100, FILEPATH, (0, 0, 0), text='>') while not Quit: @@ -281,7 +255,7 @@ def helppage2(): inv1 = False page = 1 - background2 = pygame.image.load(os.path.join(FILEPATH, 'Fonts', 'Help2.png')) + background2 = pygame.image.load(HELP2) prevpage = button((0, 0, 0), 1440, 350, 75, 100, FILEPATH, (0, 0, 0), text='<') while not Quit: diff --git a/app.py b/app.py index 449cdce..06d8d76 100644 --- a/app.py +++ b/app.py @@ -2,7 +2,7 @@ import os import sort -from Algorithms.nodes.button import * +from Visualiser import button import Visualiser os.environ['SDL_VIDEO_CENTERED'] = '1' diff --git a/sort.py b/sort.py index 24f31d1..6c4cf38 100644 --- a/sort.py +++ b/sort.py @@ -1,51 +1,13 @@ import pygame import os -from Algorithms.nodes.lines import Line -from Algorithms.nodes.button import button - -from Sorts.bead import bead -from Sorts.bitonic import bitonic -from Sorts.bogo import bogo -from Sorts.bubble import bubble -from Sorts.bucket import bucket -from Sorts.cocktail import cocktail -from Sorts.comb import comb -from Sorts.counting import counting -from Sorts.cycle import cycle -from Sorts.double import double -from Sorts.gnome import gnome -from Sorts.heap import heap -from Sorts.insertion import insertion -from Sorts.merge import iterativemerge -from Sorts.oddeven import oddeven -from Sorts.pancake import pancake -from Sorts.pigeon import pigeon -from Sorts.quick import quick -from Sorts.radix import radix -from Sorts.shell import shell -from Sorts.selection import selection -from Sorts.sleep import sleepsort -from Sorts.stooge import stooge -from Sorts.wiggle import wiggle - +from Visualiser import * from random import shuffle, randint, choice - pygame.init() -FILEPATH = os.getcwd() - # infoObject = pygame.display.Info() -WIDTH = 1584 -COLUMNS = 256 - -HEIGHT = 784 - -WHITE = (255,255,255) -BLACK = (0,0,0) - WIN = pygame.display.set_mode((1584, 784)) pygame.display.set_caption("Visualiser: Edit") From 12d59173687314a42faec792737343df1d3ff30c Mon Sep 17 00:00:00 2001 From: ShriramShagi Date: Sun, 18 Jul 2021 12:11:33 +0530 Subject: [PATCH 2/4] old files --- Algorithms/__init__.py | 11 - Algorithms/aldous_broder.py | 203 -------------- Algorithms/algorithms.md | 42 --- Algorithms/astar.py | 73 ----- Algorithms/bfs.py | 26 -- Algorithms/binary_tree.py | 71 ----- Algorithms/dijkstra.py | 73 ----- Algorithms/ellers.py | 159 ----------- Algorithms/growing_tree.py | 135 --------- Algorithms/hunt_and_kill.py | 184 ------------ Algorithms/kruskal.py | 109 -------- Algorithms/nodes/__init__.py | 3 - Algorithms/nodes/button.py | 61 ---- Algorithms/nodes/lines.py | 89 ------ Algorithms/nodes/nodes.py | 401 --------------------------- Algorithms/prims.py | 109 -------- Algorithms/recursive_backtracking.py | 119 -------- Algorithms/recursive_division.py | 97 ------- Algorithms/sidewinder.py | 76 ----- Algorithms/wilson.py | 204 -------------- Sorts/__init__.py | 0 Sorts/algorithms.md | 57 ---- Sorts/bead.py | 46 --- Sorts/bitonic.py | 82 ------ Sorts/bogo.py | 42 --- Sorts/bubble.py | 44 --- Sorts/bucket.py | 79 ------ Sorts/cocktail.py | 72 ----- Sorts/comb.py | 56 ---- Sorts/counting.py | 44 --- Sorts/cycle.py | 72 ----- Sorts/double.py | 52 ---- Sorts/gnome.py | 42 --- Sorts/heap.py | 67 ----- Sorts/insertion.py | 45 --- Sorts/merge.py | 79 ------ Sorts/oddeven.py | 65 ----- Sorts/pancake.py | 63 ----- Sorts/pigeon.py | 49 ---- Sorts/quick.py | 115 -------- Sorts/radix.py | 55 ---- Sorts/selection.py | 45 --- Sorts/shell.py | 62 ----- Sorts/sleep.py | 41 --- Sorts/stooge.py | 57 ---- Sorts/wiggle.py | 34 --- 46 files changed, 3710 deletions(-) delete mode 100644 Algorithms/__init__.py delete mode 100644 Algorithms/aldous_broder.py delete mode 100644 Algorithms/algorithms.md delete mode 100644 Algorithms/astar.py delete mode 100644 Algorithms/bfs.py delete mode 100644 Algorithms/binary_tree.py delete mode 100644 Algorithms/dijkstra.py delete mode 100644 Algorithms/ellers.py delete mode 100644 Algorithms/growing_tree.py delete mode 100644 Algorithms/hunt_and_kill.py delete mode 100644 Algorithms/kruskal.py delete mode 100644 Algorithms/nodes/__init__.py delete mode 100644 Algorithms/nodes/button.py delete mode 100644 Algorithms/nodes/lines.py delete mode 100644 Algorithms/nodes/nodes.py delete mode 100644 Algorithms/prims.py delete mode 100644 Algorithms/recursive_backtracking.py delete mode 100644 Algorithms/recursive_division.py delete mode 100644 Algorithms/sidewinder.py delete mode 100644 Algorithms/wilson.py delete mode 100644 Sorts/__init__.py delete mode 100644 Sorts/algorithms.md delete mode 100644 Sorts/bead.py delete mode 100644 Sorts/bitonic.py delete mode 100644 Sorts/bogo.py delete mode 100644 Sorts/bubble.py delete mode 100644 Sorts/bucket.py delete mode 100644 Sorts/cocktail.py delete mode 100644 Sorts/comb.py delete mode 100644 Sorts/counting.py delete mode 100644 Sorts/cycle.py delete mode 100644 Sorts/double.py delete mode 100644 Sorts/gnome.py delete mode 100644 Sorts/heap.py delete mode 100644 Sorts/insertion.py delete mode 100644 Sorts/merge.py delete mode 100644 Sorts/oddeven.py delete mode 100644 Sorts/pancake.py delete mode 100644 Sorts/pigeon.py delete mode 100644 Sorts/quick.py delete mode 100644 Sorts/radix.py delete mode 100644 Sorts/selection.py delete mode 100644 Sorts/shell.py delete mode 100644 Sorts/sleep.py delete mode 100644 Sorts/stooge.py delete mode 100644 Sorts/wiggle.py diff --git a/Algorithms/__init__.py b/Algorithms/__init__.py deleted file mode 100644 index 278849f..0000000 --- a/Algorithms/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -from .aldous_broder import aldous -from .astar import astar -from .binary_tree import binary -from .dijkstra import dijkstra -from .ellers import ellers -from .growing_tree import tree -from .hunt_and_kill import hunt -from .kruskal import kruskal -from .prims import prims -from .recursive_backtracking import backtrack -from .nodes import * \ No newline at end of file diff --git a/Algorithms/aldous_broder.py b/Algorithms/aldous_broder.py deleted file mode 100644 index 1f03982..0000000 --- a/Algorithms/aldous_broder.py +++ /dev/null @@ -1,203 +0,0 @@ -import pygame -from random import randint, choice - -extra_vis = False - -row = 24 -col = 49 - -clk = pygame.time.Clock() - -def drawedge(draw, edge, grid, mode): - """Connect the nodes(By removing barrier) - - Args: - draw (func): Draws on screen - edge (tuple): cordinates of the ends of the edge - grid (2D list): Nodes on the screen - mode (int): fast 1/0 slow - """ - # Get - x1, y1, x2, y2, x, y = getcoordinate(edge) - - grid[x1*2][y1*2].remove_barrier() - grid[x][y].remove_barrier() - grid[x2*2][y2*2].remove_barrier() - - - if mode == 0: - draw() - -def flash(draw, node, grid, mode): - """draw the node on iteration - - Args: - draw (func): Draws on screen - node (tuple): cordinates of the node - grid (2D list): Nodes on the screen - mode (int): fast 1/0 slow - """ - x1, y1 = node - for rw in grid: - for node in rw: - if node.getwil1(): - node.reset() - - grid[x1*2][y1*2].wil1() - if mode == 0: - draw() - -def getcoordinate(edge): - """Get coordinates of the edge node between two nodes - - Args: - edge (tuple): tuple of tuplescontaining two nodes - """ - a, b = edge - x1, y1 = a - x2, y2 = b - if x1 == x2: - if y1 > y2: - y = y1*2 - 1 - else: - y = y1*2 + 1 - x = x1 * 2 - elif y1 == y2: - if x1 > x2: - x = x1*2 - 1 - else: - x = x1*2 + 1 - y = y1 * 2 - return(x1, y1, x2, y2, x, y) - -def getnextnode(node): - """Get a random neighbouring node - - Args: - node (tuple): x, y of the node - - Returns: - tuple: a random neighbouring node - """ - x, y = node - neighbours = [] - if x < row: - neighbours.append((x+1, y)) - if x > 0: - neighbours.append((x-1, y)) - if y < col: - neighbours.append((x, y+1)) - if y > 0: - neighbours.append((x, y-1)) - - return choice(neighbours) - -def getrandom(node, visited): - """Get random neighbouring node which is not visited - - Args: - node (tuple): x, y of the node - visited (list): list of tuples of visited node - - Returns: - list: first index as neighbours and second index as the node - """ - try: - x, y = node - except: - return [] - neighbours = [] - if x < row: - if (x+1, y) not in visited: - neighbours.append((x+1, y)) - if x > 0: - if (x-1, y) not in visited: - neighbours.append((x-1, y)) - if y < col: - if (x, y+1) not in visited: - neighbours.append((x, y+1)) - if y > 0: - if (x, y-1) not in visited: - neighbours.append((x, y-1)) - - return neighbours, node - -def checkprev(node): - """Check if node exists - - Args: - node (tuple): x, y of tuple if node exists - - Returns: - boolean: true if exists false otherise - """ - try: - x, y = node - return True - except: - return False - -''' Function takes an average of 11000 iterations to complete NOT RECOMMENDED TO RUN''' -def aldous(draw, grid, mode): - ''' Function takes an average of 11000 iterations to complete NOT RECOMMENDED TO RUN''' - r = len(grid) - c = len(grid[0]) - run = True - global extra_vis - for row in grid: - for node in row: - node.reset() - node.invert() - - if mode == 0: - draw() - i = 0 - x = randint(0, r//2-1) - y = randint(0, c//2-1) - prev = (x,y) - visited = list() - - count = 0 - - nextnode = None - while len(visited) < (c//2 + 1)*(r//2 + 1) and run: - # while c != 625: - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_BACKSPACE: - if mode == 0: - mode = 1 - else: - mode = 0 - if event.key == pygame.K_ESCAPE: - run = False - if count <= 10: - nextnode = getnextnode(prev) - else: - n = [] - while len(n) == 0: - prev = choice(visited) - - n = getrandom(prev, visited) - nextnode = n[-1] - count = 0 - - temp = grid - flash(draw, nextnode, grid, mode) - grid = temp - - if nextnode in visited: - count += 1 - if mode == 0: - draw() - else: - visited.append(nextnode) - drawedge(draw, (prev, nextnode), grid, mode) - prev = nextnode - - if mode == 1: - draw() - - return True \ No newline at end of file diff --git a/Algorithms/algorithms.md b/Algorithms/algorithms.md deleted file mode 100644 index e2cef76..0000000 --- a/Algorithms/algorithms.md +++ /dev/null @@ -1,42 +0,0 @@ ->Path Finding: -1) [A* Path finding algorithm](astar.py) -1) [Dijkstra algorithm](dijkstra.py) - ->Maze: -1) [Prim's algorithm](prims.py) -1) [Kruskal's algorithm](kruskal.py) -1) [Sidewinder algorithm](sidewinder.py) -1) [Eller's algorithm](ellers.py) -1) [Recursive backtracking algorithm](recursive_backtracking.py) -1) [Aldous Broder algorithm (Modified)](aldous_broder.py) -1) [Wilson's algorithm](wilson.py) -1) [Hunt and Kill algorithm](hunt_and_kill.py) (Modified) -1) [Growing Tree algorithm](growing_tree.py) (newest and random choices combined) -1) [Binary Tree algorithm](binary_tree.py) -1) [Recursive division algorithm](recursive_division.py) - -# Keys - -> Maze Generation: - -| Key | Function | -|--- |--- | -| 1 | Prim's algorithm | -| 2 | Kruskal's algorithm | -| 3 | Sidewinder algorithm | -| 4 | Recursive backtracking algorithm | -| 5 | Aldous Broder algorithm | -| 6 | Hunt and Kill algorithm | -| 7 | Growing Tree algorithm | -| 8 | Binary Tree algorithm | -| 9 | Recursive Division algorithm | -| 0 | Wilson's algorithm| -| q | Eller's algorithm| - -> Path Finding: - -| Key | Function | -|--- |--- | -| z | A* algorithm | -| x | Dijkstra algorithm | -| | | diff --git a/Algorithms/astar.py b/Algorithms/astar.py deleted file mode 100644 index 292531e..0000000 --- a/Algorithms/astar.py +++ /dev/null @@ -1,73 +0,0 @@ -import pygame -from queue import PriorityQueue - -def reconstruct(came, end, draw): - while end in came: - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False - end = came[end] - end.make_path() - draw() - - -def astar(draw, grid, start, end, mode): - pygame.init() - count = 0 - openset = PriorityQueue() - openset.put((0, count, start)) - camefrom = {} - gscore = {node : float('inf') for row in grid for node in row} - gscore[start] = 0 - fscore = {node : float('inf') for row in grid for node in row} - fscore[start] = h(start.get_pos(), end.get_pos()) - - opensethash = {start} - - for row in grid: - for node in row: - node.update_neighbours(grid) - - while not openset.empty(): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_BACKSPACE: - if mode == 0: - mode = 1 - else: - mode = 0 - - current = openset.get()[2] - opensethash.remove(current) - - if current == end: - reconstruct(camefrom, end, draw) - end.make_end() - start.make_start() - return True - - for neighbour in current.neighbours: - tempgscore = gscore[current] + 1 - if tempgscore < gscore[neighbour]: - camefrom[neighbour] = current - gscore[neighbour] = tempgscore - fscore[neighbour] = tempgscore + h(neighbour.get_pos(), end.get_pos()) - if neighbour not in opensethash: - count += 1 - openset.put((fscore[neighbour], count, neighbour)) - opensethash.add(neighbour) - neighbour.make_open() - if mode == 0: - draw() - - if current != start: - current.make_closed() - - return True - -def h(p, q): # L distance - x1, y1 = p - x2, y2 = q - return abs(x1 - x2) + abs(y1 - y2) \ No newline at end of file diff --git a/Algorithms/bfs.py b/Algorithms/bfs.py deleted file mode 100644 index 5ab2808..0000000 --- a/Algorithms/bfs.py +++ /dev/null @@ -1,26 +0,0 @@ -import pygame -from queue import PriorityQueue - -def reconstruct(came, end, draw): - while end in came: - end = came[end] - end.make_path() - draw() - - -def astar(draw, grid, start, end, mode): - pygame.init() - run = True - - while run: - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_BACKSPACE: - if mode == 0: - mode = 1 - else: - mode = 0 - - return True diff --git a/Algorithms/binary_tree.py b/Algorithms/binary_tree.py deleted file mode 100644 index 50d5d84..0000000 --- a/Algorithms/binary_tree.py +++ /dev/null @@ -1,71 +0,0 @@ -import pygame -from random import randint - -# clk = pygame.time.Clock() -row = 24 -col = 49 - -def rand(): - return randint(0,1) - -def binary(draw, grid, mode): - run = True - l = len(grid) - for rw in grid: - for node in rw: - node.reset() - node.invert() - if mode == 0: - draw() - current = None - for j in grid[0]: - j.remove_barrier() - if mode == 0: - draw() - - i = 1 - while run and i != row + 1: - # clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - run = False - if event.key == pygame.K_BACKSPACE: - if mode == 0: - mode = 1 - else: - mode = 0 - for j in range(col+ 1): - - current = (i, j) - if rand() == 1: - drawedge(draw, grid, current, mode, 'north') - - else: - if movewest(current): - drawedge(draw, grid, current, mode, 'west') - else: - drawedge(draw, grid, current, mode, 'north') - i += 1 - if mode == 1: - draw() - - return True - -def movewest(node): - x, y = node - if y < col: - return True - return False - -def drawedge(draw, grid, current, mode, direc): - x, y = current - grid[x*2][y*2].remove_barrier() - if direc == 'north': - grid[x*2-1][y*2].remove_barrier() - elif direc == 'west': - grid[x*2][y*2+1].remove_barrier() - if mode == 0: - draw() \ No newline at end of file diff --git a/Algorithms/dijkstra.py b/Algorithms/dijkstra.py deleted file mode 100644 index db08164..0000000 --- a/Algorithms/dijkstra.py +++ /dev/null @@ -1,73 +0,0 @@ -import pygame -from queue import PriorityQueue - -def reconstruct(came, end, draw): - while end in came: - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False - end = came[end] - end.make_path() - draw() - -def h(p, q): # L distance - x1, y1 = p - x2, y2 = q - return abs(x1 - x2) + abs(y1 - y2) - -def dijkstra(draw, grid, start, end, mode): - pygame.init() - count = 0 - openset = PriorityQueue() - openset.put((0, count, start)) - camefrom = {} - gscore = {node : float('inf') for row in grid for node in row} - gscore[start] = 0 - fscore = {node : float('inf') for row in grid for node in row} - fscore[start] = h(start.get_pos(), end.get_pos()) - - opensethash = {start} - - for row in grid: - for node in row: - node.update_neighbours(grid) - - while not openset.empty(): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_BACKSPACE: - if mode == 0: - mode = 1 - else: - mode = 0 - - current = openset.get()[2] - opensethash.remove(current) - - if current == end: - reconstruct(camefrom, end, draw) - end.make_end() - start.make_start() - - return True - - for neighbour in current.neighbours: - tempgscore = gscore[current] + 1 - if tempgscore < gscore[neighbour]: - camefrom[neighbour] = current - gscore[neighbour] = tempgscore - fscore[neighbour] = tempgscore + h(neighbour.get_pos(), end.get_pos()) - if neighbour not in opensethash: - count += 1 - openset.put((fscore, count, neighbour)) - opensethash.add(neighbour) - neighbour.make_open() - if mode == 0: - draw() - - if current != start: - current.make_closed() - - return True \ No newline at end of file diff --git a/Algorithms/ellers.py b/Algorithms/ellers.py deleted file mode 100644 index a705cad..0000000 --- a/Algorithms/ellers.py +++ /dev/null @@ -1,159 +0,0 @@ -import pygame -from random import randint, choice - -clk = pygame.time.Clock() -row = 24 -col = 49 - - -def getboolean(): - if randint(0, 1) == 0: - return True - return False - - -class Cell: - def __init__(self, a, b, s): - self.x = a - self.y = b - self.right = False - self.left = False - self.down = False - self.sets = set() - self.setno = s - - -def joinright(draw, grid, r, mode): - for i in range(1, len(r)): - if r[i].setno == r[i-1].setno: - r[i-1].right = False - r[i].left = False - continue - if getboolean(): - r[i-1].right = True - r[i].left = True - j = r[i].setno - k = r[i-1].setno - for items in r: - if items.setno == j: - items.setno = k - else: - r[i-1].right = False - r[i].left = False - drawright(draw, grid, r, mode) - return r - -def drawright(draw, grid, r, mode): - for items in r: - if items.right: - grid[items.x*2][items.y*2].reset() - if items.y*2+1 < 99: - grid[items.x*2][items.y*2+1].reset() - elif items.left: - grid[items.x*2][items.y*2].reset() - if items.y*2-1 > 0: - grid[items.x*2][items.y*2-1].reset() - else: - grid[items.x*2][items.y*2].reset() - if items.y*2+1 < 99: - grid[items.x*2][items.y*2+1].barrier() - - if mode == 0: - draw() - -def sortcell(cell): - l = {} - for node in cell: - if f'{node.setno}' in l.keys(): - l[f'{node.setno}'].append(node) - else: - l[f'{node.setno}'] = [node] - return l - -def joindown(draw, grid, current, mode): - a = sortcell(current) - for val in a.values(): - l = len(val) - if l == 1: - val[-1].down = True - drawdown(draw, grid, val[-1].x, val[-1].y, val[-1], mode) - else: - r = randint(1, l) - while r != 0: - g = choice(val) - g.down = True - r-=1 - drawdown(draw, grid, g.x, g.y, g, mode) - return current - -def setmanager(current, nextrow): - for i in range(len(current)): - if current[i].down == True: - nextrow[i].setno = current[i].setno - return nextrow - -def drawdown(draw, grid, x, y, node, mode): - if node.down == True: - grid[x*2][y*2].reset() - if x*2+1 < 48: - grid[x*2+1][y*2].reset() - if mode == 0: - draw() - -def ellers(draw, grid, mode): - run = True - for rw in grid: - for node in rw: - node.reset() - node.invert() - if mode == 0: - draw() - - s = 1 - celllist = [] - for b in range(row+1): - celllist.append([]) - for j in range(col+1): - celllist[b].append(Cell(b, j, s)) - s += 1 - - i = 0 - currrow = celllist[i] - while i < row: - clk.tick(30) - # i += 1 - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_CAPSLOCK: - if mode == 0: - mode = 1 - else: - mode = 0 - - currrow = joinright(draw, grid, currrow, mode) - - currrow = joindown(draw, grid, currrow, mode) - currrow = setmanager(current=currrow, nextrow = celllist[i+1]) - i+=1 - joinrightlast(draw, grid, currrow, mode) - if mode == 1: - draw() - - return True - -def joinrightlast(draw, grid, r, mode): - for i in range(1, len(r)): - if r[i].setno == r[i-1].setno: - r[i-1].right = False - r[i].left = False - else: - r[i-1].right = True - r[i].left = True - j = r[i].setno - k = r[i-1].setno - for items in r: - if items.setno == j: - items.setno = k - drawright(draw, grid, r, mode) \ No newline at end of file diff --git a/Algorithms/growing_tree.py b/Algorithms/growing_tree.py deleted file mode 100644 index 91b7b4a..0000000 --- a/Algorithms/growing_tree.py +++ /dev/null @@ -1,135 +0,0 @@ -import pygame -from random import randint, choice - -# clk = pygame.time.Clock() -row = 24 -col = 49 - -def noneb(stack, visited): - # x, y = node - neighbours = [] - for node in stack: - count = 0 - x, y = node - if (x+1, y) in visited and x < row: - count += 1 - if (x-1, y) in visited and x > 0: - count += 1 - if (x, y+1) in visited and y < row: - count += 1 - if (x, y-1) in visited and y > 0: - count += 1 - if count == 4: - neighbours.append(node) - return neighbours - -def update(node, visited): - n = [] - x, y = node - if x < row and x > 0: # down - n.append((x + 1, y)) - n.append((x - 1, y)) - elif x == 0: - n.append((x + 1, y)) - elif x == row: - n.append((x - 1, y)) - if y < col and y > 0: # down - n.append((x, y + 1)) - n.append((x, y - 1)) - elif y == 0: - n.append((x, y + 1)) - elif y == col: - n.append((x, y - 1)) - for nodes in visited: - if nodes in n: - n.remove(nodes) - return n - -def check(n): - if len(n) != 0: - return True - return False - -def drawsquare(draw, grid, spot, prev, mode, color = ''): - x1, y1 = prev - x2, y2 = spot - if x1 == x2: - if y1 > y2: - y = y1*2 - 1 - else: - y = y1*2 + 1 - x = x1 * 2 - elif y1 == y2: - if x1 > x2: - x = x1*2 - 1 - else: - x = x1*2 + 1 - y = y1 * 2 - - if color != '': - grid[x][y].tracker() - grid[x2*2][y2*2].tracker() - else: - grid[x][y].remove_barrier() - grid[x2*2][y2*2].remove_barrier() - if mode == 0: - draw() - -def tree(draw, grid, mode): - run = True - l = len(grid) - for rw in grid: - for node in rw: - node.reset() - node.invert() - if mode == 0: - draw() - - stack = [] - x = randint(0, row-1) - y = randint(0, col-1) - stack.append((x, y)) - visited = {(x, y)} - c = 0 - - while run and c != 1249: - # clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - run = False - if event.key == pygame.K_BACKSPACE: - if mode == 0: - mode = 1 - else: - mode = 0 - # try: - n = update(stack[-1], visited) - nebless = noneb(stack, visited) - - for nodes in stack: - if nodes in nebless: - stack.remove(nodes) - - if not stack: - break - - if check(n): - spot = choice(n) - prev = stack[-1] - stack.append(spot) - visited.add(spot) - drawsquare(draw, grid, spot, prev, mode, color='') - c += 1 - - else: - a = choice(stack) - stack.remove(a) - stack.append(a) - - if mode == 1: - draw() - - return True \ No newline at end of file diff --git a/Algorithms/hunt_and_kill.py b/Algorithms/hunt_and_kill.py deleted file mode 100644 index 5b129ab..0000000 --- a/Algorithms/hunt_and_kill.py +++ /dev/null @@ -1,184 +0,0 @@ -import pygame -from random import randint, choice, shuffle - -row = 24 -col = 49 -clk = pygame.time.Clock() - -def update(node, visited): - n = [] - x, y = node - if x < row and x > 0: # down - n.append((x + 1, y)) - n.append((x - 1, y)) - elif x == 0: - n.append((x + 1, y)) - elif x == row: - n.append((x - 1, y)) - if y < col and y > 0: # down - n.append((x, y + 1)) - n.append((x, y - 1)) - elif y == 0: - n.append((x, y + 1)) - elif y == col: - n.append((x, y - 1)) - for nodes in visited: - if nodes in n: - n.remove(nodes) - return n - -def neighbours(visited): - n = [] - for node in visited: - fresh = [] - x, y = node - if x < row and x > 0: # down - fresh.append((x + 1, y)) - fresh.append((x - 1, y)) - elif x == 0: - fresh.append((x + 1, y)) - elif x == row: - fresh.append((x - 1, y)) - if y < col and y > 0: # down - fresh.append((x, y + 1)) - fresh.append((x, y - 1)) - elif y == 0: - fresh.append((x, y + 1)) - elif y == col: - fresh.append((x, y - 1)) - for nodes in visited: - if nodes in fresh: - fresh.remove(nodes) - n.extend(fresh) - return n - -def drawedge(draw, grid, node, visited, mode): - x, y = node - neigh = [(x+1, y), (x-1, y), (x, y+1), (x, y-1)] - shuffle(neigh) - for spot in neigh: - if spot in visited: - break - drawsquare(draw, grid, spot, node, mode) - - -def gohunt(draw, grid, n, i, visited, mode): - # if mode == 0: - # drawrow(draw, grid, i, mode) - for j in range(col+1): - if (i, j) in n: - return (i, j) - return None - -def drawrow(draw, grid, row, mode): - row *= 2 - for rw in grid: - for node in rw: - if node.if_open_prev(): - node.do_open_prev() - for nodes in grid[row]: - nodes.open_prev() - - if mode == 0: - draw() - - -def drawsquare(draw, grid, spot, prev, mode): - x1, y1 = prev - x2, y2 = spot - if x1 == x2: - if y1 > y2: - y = y1*2 - 1 - else: - y = y1*2 + 1 - x = x1 * 2 - elif y1 == y2: - if x1 > x2: - x = x1*2 - 1 - else: - x = x1*2 + 1 - y = y1 * 2 - - grid[x1*2][y1*2].remove_barrier() - grid[x][y].remove_barrier() - grid[x2*2][y2*2].remove_barrier() - if mode == 0: - draw() - -def check(n): - if len(n) != 0: - return True - return False - -def getrow(visited): - i = 0 - run = True - for i in range(row + 1): - for j in range(col + 1): - if (i, j) not in visited: - run = False - if not run: - break - return i - -def hunt(draw, grid, mode): - run = True - l = len(grid) - for rw in grid: - for node in rw: - node.reset() - node.invert() - if mode == 0: - draw() - - i = 0 - stack = [] - x = randint(0, row-1) - y = randint(0, col-1) - stack.append((x, y)) - visited = {(x, y)} - store = stack[-1] - if mode == 0: - draw() - - while run: - # clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - run = False - if event.key == pygame.K_BACKSPACE: - if mode == 0: - mode = 1 - else: - mode = 0 - n = update(stack[-1], visited) - - if check(n): - spot = choice(n) - prev = stack[-1] - stack.append(spot) - visited.add(spot) - drawsquare(draw, grid, spot, prev, mode) - else: - stack = [] - n = neighbours(visited) - i = getrow(visited) - while True: - new = gohunt(draw, grid, n, i, visited, mode) - i += 1 - if new != None: - break - if new == None and i == row + 1: - run = False - break - if run: - stack.append(new) - visited.add(new) - drawedge(draw, grid, new, visited, mode) - if mode == 1: - draw() - - return True diff --git a/Algorithms/kruskal.py b/Algorithms/kruskal.py deleted file mode 100644 index fa1405c..0000000 --- a/Algorithms/kruskal.py +++ /dev/null @@ -1,109 +0,0 @@ -import pygame -from random import randint, choice, shuffle - -row = 24 -col = 49 -GREEN = (0,255,0) -# clk = pygame.time.Clock() - -def findparent(v, parent): - if parent[v] == v: - return v - return findparent(parent[v], parent) - -def getcoordinate(edge): - a, b = edge - x1, y1 = a - x2, y2 = b - if x1 == x2: - if y1 > y2: - y = y1*2 - 1 - else: - y = y1*2 + 1 - x = x1 * 2 - elif y1 == y2: - if x1 > x2: - x = x1*2 - 1 - else: - x = x1*2 + 1 - y = y1 * 2 - return(x1, y1, x2, y2, x, y) - -def drawedge(draw, edge, grid, mode): - x1, y1, x2, y2, x, y = getcoordinate(edge) - - grid[x1*2][y1*2].remove_barrier() - grid[x][y].remove_barrier() - grid[x2*2][y2*2].remove_barrier() - if mode == 0: - draw() - -def flash(draw, edge, grid, mode): - x1, y1, x2, y2, x, y = getcoordinate(edge) - - grid[x1*2][y1*2].getwil1() - grid[x][y].getwil1() - grid[x2*2][y2*2].getwil1() - if mode == 0: - draw() - -def kruskal(draw, grid, mode): - pygame.init() - r = len(grid) - c = len(grid[0]) - for rw in grid: - for node in rw: - node.reset() - node.invert() - if mode == 0: - draw() - - edgelist = [] - for i in range(row + 1): - for j in range(col + 1): - if i == row and j == col: - continue - elif j == col: - edgelist.append(((i, j), (i+1, j))) - elif i == row: - edgelist.append(((i, j), (i, j+1))) - else: - edgelist.append(((i, j), (i+1, j))) - edgelist.append(((i, j), (i, j+1))) - shuffle(edgelist) - - parent = [i for i in range((c//2 + 1)*(r//2 + 1))] - - count = 0 - while count != (c//2 + 1)*(r//2 + 1) - 1: - # clk.tick(45) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_BACKSPACE: - if mode == 0: - mode = 1 - else: - mode = 0 - try: - current = edgelist.pop() - except: - break - x1, y1 = current[0] - x2, y2 = current[1] - - sourceparent = findparent(y1*(r//2 + 1) - ((c//2 + 1) - x1), parent) - destparent = findparent(y2*(r//2 + 1) - ((c//2 + 1) - x2), parent) - temp = grid - grid = temp - - if sourceparent != destparent: - flash(draw, current, grid, mode) - drawedge(draw, current, grid, mode) - count += 1 - parent[sourceparent] = destparent - - if mode == 1: - draw() - return True \ No newline at end of file diff --git a/Algorithms/nodes/__init__.py b/Algorithms/nodes/__init__.py deleted file mode 100644 index 73e0670..0000000 --- a/Algorithms/nodes/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .button import button -from .lines import Line -from .nodes import Nodes \ No newline at end of file diff --git a/Algorithms/nodes/button.py b/Algorithms/nodes/button.py deleted file mode 100644 index 651cdaa..0000000 --- a/Algorithms/nodes/button.py +++ /dev/null @@ -1,61 +0,0 @@ -import pygame -import os - -class button(): - def __init__(self, color, x,y,width,height, FILEPATH, textcolor, text='', size=60): - """Button Class - - Args: - color (tuple): Color (r, g, b) - x (int): Button top left coordinate - y (int): Button top left y coordinate - width (int): Button width in px - height (int): Button height in px - FILEPATH (str): File path for fonts file - textcolor (tuple): Text color in (r, g, b) - text (str, optional): Text inside button. Defaults to ''. - size (int, optional): Font size. Defaults to 60. - """ - self.color = color - self.x = x - self.y = y - self.width = width - self.height = height - self.text = text - self.filepath = FILEPATH - self.textcolor = textcolor - self.size = size - - def draw(self,win,outline=None): - """Call this method to draw the button on the screen - - Args: - win (pygame.Surface): Surface on which buttons are drawn - outline (tuple, optional): Button outline color(r, g, b). Defaults to None. - """ - if outline: - # To draw an outline draw a darker, larger rectangle behind the actual Button - # Size of the button is 4px hardcoded - pygame.draw.rect(win, outline, (self.x-2,self.y-2,self.width+4,self.height+4),0) - - pygame.draw.rect(win, self.color, (self.x,self.y,self.width,self.height),0) - - if self.text != '': - # Print text if mentioned - font = pygame.font.Font(os.path.join(self.filepath, 'Fonts', 'MaidenOrange.ttf'), self.size) - text = font.render(self.text, 1, self.textcolor) - win.blit(text, (self.x + (self.width/2 - text.get_width()/2), self.y + (self.height/2 - text.get_height()/2)+10)) - - def isOver(self, pos): - """Check if mouse is on top of the button or not to give hover effects. - - Args: - pos (tuple): position of (x, y) of mouse pointer. - - Returns: - Boolean: True if mouse is on top of button False otherwise. - """ - if pos[0] > self.x and pos[0] < self.x + self.width: - if pos[1] > self.y and pos[1] < self.y + self.height: - return True - return False \ No newline at end of file diff --git a/Algorithms/nodes/lines.py b/Algorithms/nodes/lines.py deleted file mode 100644 index 1d7c175..0000000 --- a/Algorithms/nodes/lines.py +++ /dev/null @@ -1,89 +0,0 @@ -import pygame - -RED = (255,0,0) -GREEN = (0,255,0) -BLACK = (0,0,0) -# BLACK = (128,128,128) - - -W = 1584 -H = 784 - -WIDTH = 1584/256 - -HEIGHT = 784/256 - -class Line(): - def __init__(self, x, no): - """Draw lines for sorting - - Args: - x (int): X coordinate - no (int): position number - """ - self.value = x - self.color = BLACK - self.flash = 0 - self.no = no - self.x = (no)*WIDTH - - def make_red(self): - """Change line color to red - """ - self.color = RED - self.flash = 1 - - def make_green(self): - """Change line color to Green - """ - self.color = GREEN - self.flash = 1 - - def reset(self): - """Change line color to Black - """ - self.color = BLACK - self.flash = 0 - - def change(self, val): - """Change the x coordinate and position value - - Args: - val (int): Position Value - """ - self.no = val - self.x = (val)*WIDTH - - def move(self, val): - k = self.no+1 - self.no = val-1 - self.x = (val-1)*WIDTH - return k - - def evalu(self, val): - """set value - - Args: - val (int): Value - """ - self.value = val - - def posvalue(self): - """Get position value and number - - Returns: - tuple: (position, no) - """ - return (self.value, self.no) - - def draw(self, win): - """Draw line on specified position - - Args: - win (pygame.Surface): Surface on which to draw - """ - if self.flash > 0: - self.flash -= 1 - elif self.flash == 0: - self.color = BLACK - pygame.draw.rect(win, self.color, (self.x, H-HEIGHT*self.value, WIDTH, HEIGHT*self.value)) diff --git a/Algorithms/nodes/nodes.py b/Algorithms/nodes/nodes.py deleted file mode 100644 index 54c26f8..0000000 --- a/Algorithms/nodes/nodes.py +++ /dev/null @@ -1,401 +0,0 @@ -import pygame -from pygame import gfxdraw - -RED = (255,0,0) -GREEN = (0,255,0) -BLUE = (0,0,255) -YELLOW = (255,255,0) -WHITE = (255,255,255) -BLACK = (0,0,0) -PURPLE = (128,0,128) -ORANGE = (255,165,0) -GREY = (128,128,128) -TURQUOISE = (64,224,208) -LIGHTGREEN = (50,205,50) -LIGHTRED = (255, 127, 127) -LIGHTGREEN2 = (55,205,55) -LIGHTRED2 = (255, 130, 130) - - -class Nodes: - def __init__(self, row, col, width, total_rows, total_cols, mode): - """Graph node class for maze generation and path finding - - Args: - row (int): Row number of the node - col (int): Column number of the node - width (int): Width of each cell(considering squares have height as same as width) - total_rows (int): Total rows in the screen - total_cols (int): Total columns in the screen - mode (int): Speed of visualization -> Fast 1/0 Slow - """ - self.row = row - self.col = col - self.y = row * width - self.x = col * width - self.colour = WHITE - self.neighbours = [] - self.neighbournodes = [] - self.width = width - self.total_rows = total_rows - self.total_cols = total_cols - self.mode = mode - self.animator = 1 - self.prevcolour = None - - def get_pos(self): - """Get position of the current node - - Returns: - tuple: (row, column) - """ - return self.row, self.col - - def is_closed(self): - """Check if the node has been visited(Path Finding) - - Returns: - Bool: True if node is red false otherwise - """ - return self.colour == RED - - def is_open(self): - """Check if the node has not been visited(Path Finding) - - Returns: - Bool: True if node is white false otherwise - """ - return self.colour == GREEN - - def is_barrier(self): - """Check if the node is a wall(Path Finding) - - Returns: - Bool: True if node is black false otherwise - """ - return self.colour == BLACK - - def is_start(self): - """Check if the node is start node (Path Finding) - - Returns: - Bool: True if node is orange false otherwise - """ - return self.colour == ORANGE - - def is_end(self): - """Check if the node is end node (Path Finding) - - Returns: - Bool: True if node is Turquoise false otherwise - """ - return self.colour == TURQUOISE - - def reset(self): - """Reset Node - """ - self.colour = WHITE - self.animator = 7 - - def make_closed(self): - """Mark node as visited - """ - self.colour = RED - self.animator = 7 - - def make_open(self): - """Mark node as to be visited next - """ - self.colour = GREEN - self.animator = 7 - - def make_barrier(self): - """Mark node as barrier - """ - self.colour = BLACK - self.animator = 7 - - def barrier(self): - """Mark node as barrier without animation - """ - self.colour = BLACK - - def make_start(self): - """Set node as start node for pathfinding - """ - self.colour = ORANGE - self.animator = 7 - - def make_end(self): - """Set node as end node for pathfinding - """ - self.colour = TURQUOISE - self.animator = 7 - - def make_path(self): - """Mark node as part of the path - """ - self.colour = PURPLE - self.animator = 7 - - def remove_barrier(self): - """Remove barrier and make way - """ - self.colour = WHITE - self.animator = 8 - - def leader(self): - """Mark node at current iteration in backtracking - """ - self.colour = GREEN - - def tracker(self): - """Set yello color on nodes in stack in backtracking - """ - self.colour = YELLOW - self.animator = 8 - - def wil1(self): - """Marker for node in current iteration in wilson's algo - """ - self.colour = LIGHTGREEN2 - self.animator = 1 - - def wil2(self): - """Marker for visited set in wilson's algo - """ - self.colour = LIGHTRED2 - self.animator = 1 - - def open_prev(self): - """Set previous color for flash animation - """ - self.prevcolour = self.colour - self.colour = LIGHTGREEN - - def if_open_prev(self): - """Check if flash is enabled - - Returns: - Boolean: True if flash color else false - """ - return self.colour == LIGHTGREEN - - def do_open_prev(self): - """set back original color after flash - """ - if self.prevcolour: - self.colour = self.prevcolour - self.prevcolour = None - - def getwil1(self): - """Wilson algo exclusive - - Returns: - bool: True if color is light green - """ - return self.colour == LIGHTGREEN2 - - def getwil2(self): - """Wilson algo exclusive - - Returns: - bool: True if color is light red - """ - return self.colour == LIGHTRED2 - - def draw(self, win): - """Draw nodes - - Args: - win (pygame.Surface): Surface on which node is drawn - """ - noskip = True - if self.mode == 1 and (self.colour == RED or self.colour == GREEN): - self.colour = WHITE - if self.animator == 8: - pygame.draw.rect(win, LIGHTGREEN, (self.x, self.y, self.width, self.width)) - # self.aa_round_rect(win, LIGHTGREEN, (self.x, self.y, self.width, self.width), 30) - noskip = False - if self.animator == 7 and (self.colour != WHITE or self.colour != YELLOW): - pygame.draw.rect(win, WHITE, (self.x, self.y, self.width, self.width)) - # self.aa_round_rect(win, WHITE, (self.x, self.y, self.width, self.width), 30) - gap = self.width / self.animator - pos = (self.width - gap) / 2 - if noskip: - pygame.draw.rect(win, self.colour, (self.x + pos, self.y + pos, gap, gap)) - # self.aa_round_rect(win, self.colour, (self.x, self.y, self.width, self.width), 30) - if self.animator > 1: - self.animator -= 1 - if self.prevcolour: - self.colour = self.prevcolour - self.prevcolour = None - - def drawwil(self, win): - """Wilson exclusive draw function for drawing random path nodes - - Args: - win (pygame.Surface): Surface on which node is drawn - """ - noskip = True - if self.mode == 1 and (self.colour == RED or self.colour == GREEN): - self.colour = WHITE - if self.animator == 8: - pygame.draw.rect(win, LIGHTGREEN, (self.x, self.y, self.width, self.width)) - # self.round_rect(win, LIGHTGREEN, (self.x, self.y, self.width, self.width)) - noskip = False - if self.animator == 7 and (self.colour != WHITE or self.colour != LIGHTRED): - pygame.draw.rect(win, WHITE, (self.x, self.y, self.width, self.width)) - # self.round_rect(win, WHITE, (self.x, self.y, self.width, self.width)) - gap = self.width / self.animator - pos = (self.width - gap) / 2 - if noskip: - pygame.draw.rect(win, self.colour, (self.x + pos, self.y + pos, gap, gap)) - # self.round_rect(win, self.colour, (self.x, self.y, self.width, self.width)) - - if self.animator > 1: - self.animator -= 1 - if self.prevcolour: - self.colour = self.prevcolour - self.prevcolour = None - - def invert(self): - """Invert colors black and white - """ - if self.colour == BLACK: - self.colour = WHITE - elif self.colour == WHITE: - self.colour = BLACK - - def update_neighbours(self, grid): - """Add neighbours to current node - - Args: - grid (list of lists): All node objects on the screen in 2D list - """ - self.neighbours = [] - if self.row < self.total_rows - 1 and not grid[self.row + 1][self.col].is_barrier(): # down - self.neighbours.append(grid[self.row + 1][self.col]) - - if self.row > 0 and not grid[self.row - 1][self.col].is_barrier(): # up - self.neighbours.append(grid[self.row - 1][self.col]) - - if self.col < self.total_cols - 1 and not grid[self.row][self.col + 1].is_barrier(): # right - self.neighbours.append(grid[self.row][self.col + 1]) - - if self.col > 0 and not grid[self.row][self.col - 1].is_barrier(): # left - self.neighbours.append(grid[self.row][self.col - 1]) - - def neighbour_node(self, grid): - """Add neighbours to current node - - Args: - grid (list of lists): All node objects on the screen in 2D list - """ - self.neighbournodes = [] - if self.row % 2 == 1 and self.col % 2 == 1: - if self.row < self.total_rows - 1: # down - self.neighbours.append(grid[self.row + 2][self.col]) - - if self.row > 0: # up - self.neighbours.append(grid[self.row - 2][self.col]) - - if self.col < self.total_cols - 1: # right - self.neighbours.append(grid[self.row][self.col + 2]) - - if self.col > 0: # left - self.neighbours.append(grid[self.row][self.col - 2]) - - def __lt__(self, other): - """Magic function - """ - return False - - - - def draw_rounded_rect(self, surface, color, rect, corner_radius): - ''' Draw a rectangle with rounded corners. - Would prefer this: - pygame.draw.rect(surface, color, rect, border_radius=corner_radius) - but this option is not yet supported in my version of pygame so do it ourselves. - - We use anti-aliased circles to make the corners smoother - Works for pygame 2.0.0+ - ''' - if rect.width < 2 * corner_radius or rect.height < 2 * corner_radius: - raise ValueError(f"Both height (rect.height) and width (rect.width) must be > 2 * corner radius ({corner_radius})") - - # need to use anti aliasing circle drawing routines to smooth the corners - pygame.gfxdraw.aacircle(surface, rect.left+corner_radius, rect.top+corner_radius, corner_radius, color) - pygame.gfxdraw.aacircle(surface, rect.right-corner_radius-1, rect.top+corner_radius, corner_radius, color) - pygame.gfxdraw.aacircle(surface, rect.left+corner_radius, rect.bottom-corner_radius-1, corner_radius, color) - pygame.gfxdraw.aacircle(surface, rect.right-corner_radius-1, rect.bottom-corner_radius-1, corner_radius, color) - - pygame.gfxdraw.filled_circle(surface, rect.left+corner_radius, rect.top+corner_radius, corner_radius, color) - pygame.gfxdraw.filled_circle(surface, rect.right-corner_radius-1, rect.top+corner_radius, corner_radius, color) - pygame.gfxdraw.filled_circle(surface, rect.left+corner_radius, rect.bottom-corner_radius-1, corner_radius, color) - pygame.gfxdraw.filled_circle(surface, rect.right-corner_radius-1, rect.bottom-corner_radius-1, corner_radius, color) - - rect_tmp = pygame.Rect(rect) - - rect_tmp.width -= 2 * corner_radius - rect_tmp.center = rect.center - pygame.draw.rect(surface, color, rect_tmp) - - rect_tmp.width = rect.width - rect_tmp.height -= 2 * corner_radius - rect_tmp.center = rect.center - pygame.draw.rect(surface, color, rect_tmp) - - - def round_rect(self, surface, color, rect, rad=20, border=0, inside=(0,0,0,0)): - """ - Draw a rect with rounded corners to surface. Argument rad can be specified - to adjust curvature of edges (given in pixels). An optional border - width can also be supplied; if not provided the rect will be filled. - Both the color and optional interior color (the inside argument) support - alpha. - """ - rect = pygame.Rect(rect) - zeroed_rect = rect.copy() - zeroed_rect.topleft = 0,0 - image = pygame.Surface(rect.size).convert_alpha() - image.fill((0,0,0,0)) - self._render_region(image, zeroed_rect, color, rad) - if border: - zeroed_rect.inflate_ip(-2*border, -2*border) - self._render_region(image, zeroed_rect, inside, rad) - surface.blit(image, rect) - - - def _render_region(self, image, rect, color, rad): - """Helper function for round_rect.""" - corners = rect.inflate(-2*rad, -2*rad) - for attribute in ("topleft", "topright", "bottomleft", "bottomright"): - pygame.draw.circle(image, color, getattr(corners,attribute), rad) - image.fill(color, rect.inflate(-2*rad,0)) - image.fill(color, rect.inflate(0,-2*rad)) - - - def aa_round_rect(self, surface, color, rect, rad=20, border=0, inside=(0,0,0)): - """ - Draw an antialiased rounded rect on the target surface. Alpha is not - supported in this implementation but other than that usage is identical to - round_rect. - """ - rect = pygame.Rect(rect) - self._aa_render_region(surface, rect, color, rad) - if border: - rect.inflate_ip(-2*border, -2*border) - self._aa_render_region(surface, rect, inside, rad) - - - def _aa_render_region(self, image, rect, color, rad): - """Helper function for aa_round_rect.""" - corners = rect.inflate(-2*rad-1, -2*rad-1) - for attribute in ("topleft", "topright", "bottomleft", "bottomright"): - x, y = getattr(corners, attribute) - gfxdraw.aacircle(image, x, y, rad, color) - gfxdraw.filled_circle(image, x, y, rad, color) - image.fill(color, rect.inflate(-2*rad,0)) - image.fill(color, rect.inflate(0,-2*rad)) \ No newline at end of file diff --git a/Algorithms/prims.py b/Algorithms/prims.py deleted file mode 100644 index 5100ac4..0000000 --- a/Algorithms/prims.py +++ /dev/null @@ -1,109 +0,0 @@ -import pygame -from random import choice, shuffle, randint - -row = 24 -col = 49 - -def getneighbour(node, visited): - x, y = node - neighbours = [] - popy = [] - if x < row: - if (x+1, y) in visited: - popy.append((x+1, y)) - else: - neighbours.append((x+1, y)) - if x > 0: - if (x-1, y) in visited: - popy.append((x-1, y)) - else: - neighbours.append((x-1, y)) - if y < col: - if (x, y+1) in visited: - popy.append((x, y+1)) - else: - neighbours.append((x, y+1)) - if y > 0: - if (x, y-1) in visited: - popy.append((x, y-1)) - else: - neighbours.append((x, y-1)) - - return neighbours, popy - -def drawedge(draw, edge, grid, mode): - x1, y1, x2, y2, x, y = getcoordinate(edge) - - grid[x1*2][y1*2].remove_barrier() - grid[x][y].remove_barrier() - grid[x2*2][y2*2].remove_barrier() - if mode == 0: - draw() - -def getcoordinate(edge): - a, b = edge - x1, y1 = a - x2, y2 = b - if x1 == x2: - if y1 > y2: - y = y1*2 - 1 - else: - y = y1*2 + 1 - x = x1 * 2 - elif y1 == y2: - if x1 > x2: - x = x1*2 - 1 - else: - x = x1*2 + 1 - y = y1 * 2 - return(x1, y1, x2, y2, x, y) - - -def prims(draw, grid, mode): - r = len(grid) - c = len(grid[0]) - for row in grid: - for node in row: - node.reset() - node.invert() - if mode == 0: - draw() - - x = randint(0, r//2-1) - y = randint(0, c//2-1) - start = (x, y) - visited = {start} - tovisit, p = getneighbour(start, visited) - tovisit = set(tovisit) - count = 1 - - while count < (c//2 + 1)*(r//2 + 1) : - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_BACKSPACE: - if mode == 0: - mode = 1 - else: - mode = 0 - - p = [] - n = [] - nextnode = choice(list(tovisit)) - n , p = getneighbour(nextnode, visited) - tovisit.remove(nextnode) - visited.add(nextnode) - count += 1 - - for nodes in n: - if nodes != None: - tovisit.add(nodes) - - drawedge(draw, (choice(p), nextnode), grid, mode) - - - if mode == 1: - draw() - - return True \ No newline at end of file diff --git a/Algorithms/recursive_backtracking.py b/Algorithms/recursive_backtracking.py deleted file mode 100644 index d3121f7..0000000 --- a/Algorithms/recursive_backtracking.py +++ /dev/null @@ -1,119 +0,0 @@ -import pygame -from random import randint, choice - -row = 24 -col = 49 -clk = pygame.time.Clock() - -def update(node, visited): - n = [] - x, y = node - if x < row and x > 0: # down - n.append((x + 1, y)) - n.append((x - 1, y)) - elif x == 0: - n.append((x + 1, y)) - elif x == row: - n.append((x - 1, y)) - if y < col and y > 0: # down - n.append((x, y + 1)) - n.append((x, y - 1)) - elif y == 0: - n.append((x, y + 1)) - elif y == col: - n.append((x, y - 1)) - for nodes in visited: - if nodes in n: - n.remove(nodes) - return n - -def check(n): - if len(n) != 0: - return True - return False - -def drawsquare(draw, grid, spot, prev, mode, color = ''): - x1, y1 = prev - x2, y2 = spot - if x1 == x2: - if y1 > y2: - y = y1*2 - 1 - else: - y = y1*2 + 1 - x = x1 * 2 - elif y1 == y2: - if x1 > x2: - x = x1*2 - 1 - else: - x = x1*2 + 1 - y = y1 * 2 - - if color != '': - grid[x][y].tracker() - grid[x2*2][y2*2].tracker() - else: - grid[x][y].remove_barrier() - grid[x2*2][y2*2].remove_barrier() - if mode == 0: - draw() - -def backtrack(draw, grid, mode): - global store - pygame.init() - run = True - for rw in grid: - for node in rw: - node.reset() - node.invert() - if mode == 0: - draw() - - stack = [] - x = randint(0, row-1) - y = randint(0, col-1) - stack.append((x, y)) - visited = {(x, y)} - # grid[x*2][y*2].remove_barrier() - store = stack[-1] - if mode == 0: - draw() - - while stack and run: - # clk.tick(20) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - run = False - if event.key == pygame.K_BACKSPACE: - if mode == 0: - mode = 1 - else: - mode = 0 - for rw in grid: - for node in rw: - if node.is_closed(): - node.reset() - break - if run: - n = update(stack[-1], visited) - - if check(n): - spot = choice(n) - prev = stack[-1] - stack.append(spot) - visited.add(spot) - drawsquare(draw, grid, spot, prev, mode, color='Red') - - else: - a = stack.pop() - if stack: - prev = stack[-1] - drawsquare(draw, grid, a, prev, mode) - c, d = store - grid[c*2][d*2].remove_barrier() - - if mode == 1: - draw() - return True \ No newline at end of file diff --git a/Algorithms/recursive_division.py b/Algorithms/recursive_division.py deleted file mode 100644 index e652af6..0000000 --- a/Algorithms/recursive_division.py +++ /dev/null @@ -1,97 +0,0 @@ -import pygame -from random import randint, choice, randrange - -row = 50 -col = 100 -mode = 0 - -def division(draw, grid, m): - global mode - run = True - for rw in grid: - for node in rw: - node.reset() - - - while run: - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - run = False - if event.key == pygame.K_BACKSPACE: - if mode == 0: - mode = 1 - else: - mode = 0 - recurs(draw, grid, row-1, -1, -1, col-1) - run = False - if mode == 1: - draw() - mode = 0 - - return True - -def recurs(draw, grid, top, bottom, left, right): - global mode - for event in pygame.event.get(): - if event.type == pygame.QUIT: - exit() - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - exit() - if event.key == pygame.K_BACKSPACE: - if mode == 0: - mode = 1 - else: - mode = 0 - start_range = bottom + 2 - end_range = top - 1 - y = randrange(start_range, end_range, 2) - - for column in range(left + 1, right): - grid[y][column].barrier() - if mode == 0: - draw() - - start_range = left + 2 - end_range = right - 1 - x = randrange(start_range, end_range, 2) - - for row in range(bottom + 1, top): - grid[row][x].barrier() - if mode == 0: - draw() - - wall = randrange(4) - if wall != 0: - gap = randrange(left + 1, x, 2) - grid[y][gap].remove_barrier() - - if wall != 1: - gap = randrange(x + 1, right, 2) - grid[y][gap].remove_barrier() - - if wall != 2: - gap = randrange(bottom + 1, y, 2) - grid[gap][x].remove_barrier() - - if wall != 3: - gap = randrange(y + 1, top, 2) - grid[gap][x].remove_barrier() - if mode == 0: - draw() - - if top > y + 3 and x > left + 3: - recurs(draw, grid, top, y, left, x) - - if top > y + 3 and x + 3 < right: - recurs(draw, grid, top, y, x, right) - - if bottom + 3 < y and x + 3 < right: - recurs(draw, grid, y, bottom, x, right) - - if bottom + 3 < y and x > left + 3: - recurs(draw, grid, y, bottom, left, x) - \ No newline at end of file diff --git a/Algorithms/sidewinder.py b/Algorithms/sidewinder.py deleted file mode 100644 index 9fb3ae0..0000000 --- a/Algorithms/sidewinder.py +++ /dev/null @@ -1,76 +0,0 @@ -import pygame -from random import shuffle, randint, choice - -row = 24 -col = 49 - -def rand(): - return randint(0,1) - -def movenorth(draw, grid, node, mode): - x, y = node - - grid[x*2-1][y*2].remove_barrier() - if mode == 0: - draw() - -def connectset(draw, grid, run, mode): - for node in run: - x, y = node - grid[x*2][y*2].remove_barrier() - if node != run[-1]: - if y != len(grid[x]) - 1: - grid[x*2][y*2+1].remove_barrier() - if mode == 0: - draw() - -def sidewinder(draw, grid, mode): - pygame.init() - run = [] - - for rw in grid: - for node in rw: - node.reset() - node.invert() - if mode == 0: - draw() - - current = None - for j in grid[0]: - j.remove_barrier() - if mode == 0: - draw() - i = 1 - - while i != row + 1: - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_BACKSPACE: - if mode == 0: - mode = 1 - else: - mode = 0 - - - for j in range(col+ 1): - - current = (i, j) - run.append(current) - if rand() == 1: - node = choice(run) - movenorth(draw, grid, node, mode) - connectset(draw, grid, run, mode) - run = [] - else: - continue - if len(run) != 0: - node = choice(run) - movenorth(draw, grid, node, mode) - connectset(draw, grid, run, mode) - run = [] - i += 1 - if mode == 1: - draw() - return True diff --git a/Algorithms/wilson.py b/Algorithms/wilson.py deleted file mode 100644 index ea57d8f..0000000 --- a/Algorithms/wilson.py +++ /dev/null @@ -1,204 +0,0 @@ -import pygame -from random import randint, shuffle, choice - -row = 24 -col = 49 -LIGHTGREEN = (55,205,55) -LIGHTRED = (255, 130, 130) - -d = ['n', 's', 'e', 'w'] -clk = pygame.time.Clock() - -def drawedge(draw, edge, grid, mode): - x1, y1, x2, y2, x, y = getcoordinate(edge) - - grid[x1*2][y1*2].remove_barrier() - grid[x][y].remove_barrier() - grid[x2*2][y2*2].remove_barrier() - if mode == 0: - draw() - -def drawedgetemp(draw, edge, grid, mode): - x1, y1, x2, y2, x, y = getcoordinate(edge) - - grid[x][y].wil2() - if mode == 0: - draw() - -def getcoordinate(edge): - a, b = edge - x1, y1 = a - x2, y2 = b - if x1 == x2: - if y1 > y2: - y = y1*2 - 1 - else: - y = y1*2 + 1 - x = x1 * 2 - elif y1 == y2: - if x1 > x2: - x = x1*2 - 1 - else: - x = x1*2 + 1 - y = y1 * 2 - return(x1, y1, x2, y2, x, y) - -def getedge(draw, frm, to, direc, grid, mode): - if direc == 'n': - edge = (to, frm) - elif direc == 's': - edge = (frm, to) - elif direc == 'e': - edge = (frm, to) - elif direc == 'w': - edge = (to, frm) - drawedge(draw, edge, grid, mode) - -def north(node): - x, y = node - if y > 0: - return (x, y-1) - return None - -def east(node): - x, y = node - if x < row: - return (x+1, y) - return None - -def south(node): - x, y = node - if y < col: - return (x, y+1) - return None - -def west(node): - x, y = node - if x > 0: - return (x-1, y) - return None - -def wilson(draw, grid, mode): - run = True - directions = {'n': north, 'e': east, 's' : south, 'w': west} - for rw in grid: - for node in rw: - node.reset() - node.invert() - if mode == 0: - draw() - nodelist = [(i,j) for i in range(row+1) for j in range(col+1)] - shuffle(nodelist) - - edgelist = [] - for i in range(row + 1): - for j in range(col + 1): - if i == row and j == col: - continue - elif j == col: - edgelist.append(((i, j), (i+1, j))) - elif i == row: - edgelist.append(((i, j), (i, j+1))) - else: - edgelist.append(((i, j), (i+1, j))) - edgelist.append(((i, j), (i, j+1))) - - path = False - span = [] - cache = { - "node" : [], - "dir" : [] - } - x = randint(0, row) - y = randint(0, col) - span.append((x, y)) - nodelist.remove((x, y)) - ex = 0 - - grid[x*2][y*2].remove_barrier() - if mode == 0: - draw() - - start = choice(nodelist) - prev = start - - while run: - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_BACKSPACE: - if mode == 0: - mode = 1 - else: - mode = 0 - if path: - direc = cache['dir'][cache['node'].index(start)] - nextnode = directions[direc](start) - getedge(draw, start, nextnode, direc, grid, mode) - span.append(start) - nodelist.remove(start) - if nextnode in span: - path = False - try: - start = choice(nodelist) - prev = start - cache['dir'] = [] - cache['node'] = [] - except: - run = False - continue - else: - start = nextnode - else: - while True: - direc = choice(d) - nextnode = directions[direc](prev) - if nextnode: - break - - if prev in cache['node']: - index = cache['node'].index(prev) - cache['node'].pop(index) - cache['dir'].pop(index) - - cache['node'].append(prev) - cache['dir'].append(direc) - drawmap(draw, grid, cache, edgelist, mode) - prev = nextnode - - if nextnode in span: - drawwil(draw, grid, cache, mode) - path = True - - if mode == 0: - draw() - - if mode == 1: - draw() - return True - -def drawmap(draw, grid, cache, edgelist, mode): - x1, y1 = cache['node'][-1] - grid[x1*2][y1*2].wil1() - if len(cache['node']) > 1: - x2, y2 = cache['node'][-2] - grid[x2*2][y2*2].wil2() - if ((x1, y1), (x2, y2)) in edgelist: - edge = ((x1, y1), (x2, y2)) - elif ((x2, y2), (x1, y1)) in edgelist: - edge = ((x2, y2), (x1, y1)) - if mode == 0: - drawedgetemp(draw, edge, grid, mode) - - if mode == 0: - draw() - -def drawwil(draw, grid, cache, mode): - for rw in grid: - for node in rw: - if node.colour == LIGHTGREEN or node.colour == LIGHTRED: - node.make_barrier() - - - \ No newline at end of file diff --git a/Sorts/__init__.py b/Sorts/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/Sorts/algorithms.md b/Sorts/algorithms.md deleted file mode 100644 index 8be7a3b..0000000 --- a/Sorts/algorithms.md +++ /dev/null @@ -1,57 +0,0 @@ ->Sorting: -1) [Bead / Gravity Sort](bead.py) -1) [Bitonic Sort](bitonic.py) -1) [Bogo / Stupid Sort](Bogo.py) -1) [Bubble Sort](bubble.py) -1) [Bucket / Bin Sort](bucket.py) -1) [Cocktail Shaker / Bidirectional Bubble / Ripple / Shuttle Sort](cocktail.py) -1) [Comb Sort](comb.py) -1) [Counting Sort](counting.py) -1) [Cycle Sort](cycle.py) -1) [Double Sort](double.py) -1) [Gnome / Dubbed Stupid Sort](gnome.py) -1) [Heap Sort](heap.py) -1) [Insertion Sort](insertion.py) -1) [Merge Sort](iterativemerge.py) -1) [Odd Even / Brick Sort](oddeven.py) -1) [Pancake Sort](pancake.py) -1) [Pigeonhole Sort](pigeon.py) -1) [Quick Sort](quick.py) -1) [Radix Sort](radix.py) -1) [Shell Sort](shell.py) -1) [Selection Sort](selection.py) -1) [Sleep Sort](sleep.py) -1) [Stooge Sort](stooge.py) -1) [Wiggle Sort](wiggle.py) - -# Keys - -> Sorting: - -| Key | Function | -|--- |--- | -| Space | Shuffle | -| 1 | Bead Sort | -| 2 | Bitonic Sort | -| 3 | Bolo Sort | -| 4 | Bubble Sort | -| 5 | Bucket Sort | -| 6 | Cocktail Shaker Sort | -| 7 | Comb Sort | -| 8 | Counting Sort | -| 9 | Cycle Sort | -| 0 | Double Sort | -| q | Gnome Sort | -| w | Heap Sort | -| e | Insertion Sort | -| r | Merge Sort | -| t | Odd Even Sort | -| y | Pancake Sort | -| u | Pigeonhole Sort | -| i | Quick Sort | -| o | Radix Sort | -| p | Selection Sort | -| a | Shell Sort | -| s | Sleep Sort | -| d | Stooge Sort | -| f | Wiggle Sort| \ No newline at end of file diff --git a/Sorts/bead.py b/Sorts/bead.py deleted file mode 100644 index 60f7dfd..0000000 --- a/Sorts/bead.py +++ /dev/null @@ -1,46 +0,0 @@ -import pygame - -clk = pygame.time.Clock() - -def bead(draw, grid): - temp = [i.value for i in grid] - run = True - slow = True - - length = len(grid) - i = 0 - while i < length: - if not slow: - clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - - for a, (upper, lower) in enumerate(zip(temp, temp[1:])): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - if upper > lower: - temp[a] -= upper - lower - temp[a + 1] += upper - lower - for node in range(length): - if grid[node].value != temp[node]: - grid[node].value = temp[node] - grid[node].make_red() - if slow: - draw() - if not slow: - draw() - i += 1 - - return True, True \ No newline at end of file diff --git a/Sorts/bitonic.py b/Sorts/bitonic.py deleted file mode 100644 index 5083c4f..0000000 --- a/Sorts/bitonic.py +++ /dev/null @@ -1,82 +0,0 @@ -import pygame - -clk = pygame.time.Clock() -l = 0 - -def bitonic(draw, grid): - global l - temp = [i.value for i in grid] - # temp = temp[:256] - run = True - slow = True - - length = len(temp) - l = length - i = 0 - while i < 1: - if not slow: - clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - bitonic_sort(draw, grid,temp, 0, length, 1, slow) - i += 1 - - return True, True - - -def compAndSwap(draw, grid, temp, i, j, dire, slow): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - exit() - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - if (dire == 1 and temp[i] > temp[j]) or (dire == 0 and temp[i] < temp[j]): - temp[i], temp[j] = temp[j], temp[i] - for node in range(l): - if grid[node].value != temp[node]: - grid[node].value = temp[node] - grid[node].make_red() - if slow: - draw() - -def bitonic_merge(draw, grid, temp, low, cnt, dire, slow): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - exit() - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - if cnt > 1: - k = int(cnt / 2) - for i in range(low, low + k): - compAndSwap(draw, grid, temp, i, i + k, dire, slow) - bitonic_merge(draw, grid, temp, low, k, dire, slow) - bitonic_merge(draw, grid, temp, low + k, k, dire, slow) - if not slow: - draw() - -def bitonic_sort(draw, grid, temp, low, cnt, dire, slow): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - exit() - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - if cnt > 1: - k = int(cnt / 2) - bitonic_sort(draw, grid, temp, low, k, 1, slow) - bitonic_sort(draw, grid, temp, low + k, k, 0, slow) - bitonic_merge(draw, grid, temp, low, cnt, dire, slow) diff --git a/Sorts/bogo.py b/Sorts/bogo.py deleted file mode 100644 index d7ea023..0000000 --- a/Sorts/bogo.py +++ /dev/null @@ -1,42 +0,0 @@ -import pygame -import random - -clk = pygame.time.Clock() - -def bogo(draw, grid): - temp = [i.value for i in grid] - run = True - slow = True - - length = len(grid) - - while True: - if not slow: - clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return (False, False) - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return (True, False) - # if event.key == pygame.K_BACKSPACE: - # slow = not slow - def is_sorted(temp): - if len(temp) < 2: - return True - for i in range(len(temp) - 1): - if temp[i] > temp[i + 1]: - return False - return True - - if not is_sorted(temp): - random.shuffle(temp) - for node in range(length): - if grid[node].value != temp[node]: - grid[node].value = temp[node] - if slow: - draw() - else: - return (True, True) - - return (True, True) \ No newline at end of file diff --git a/Sorts/bubble.py b/Sorts/bubble.py deleted file mode 100644 index 33708d6..0000000 --- a/Sorts/bubble.py +++ /dev/null @@ -1,44 +0,0 @@ -import pygame - -clk = pygame.time.Clock() - -def bubble(draw, grid): - run = True - slow = True - - length = len(grid) - i = 0 - while i < length-1: - if not slow: - clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - swapped = False - for j in range(length-1 - i): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - if grid[j].value > grid[j+1].value: - swapped = True - grid[j].value, grid[j+1].value = grid[j+1].value, grid[j].value - grid[j].make_red() - grid[j+1].make_red() - if slow: - draw() - if not swapped: - break - if not slow: - draw() - i += 1 - return True, True \ No newline at end of file diff --git a/Sorts/bucket.py b/Sorts/bucket.py deleted file mode 100644 index 668df6a..0000000 --- a/Sorts/bucket.py +++ /dev/null @@ -1,79 +0,0 @@ -import pygame - -clk = pygame.time.Clock() - -def bucket(draw, grid): - temp = [i.value for i in grid] - run = True - slow = True - bucket_size = 16 - - while True: - if not slow: - clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - - minval, maxval = (min(temp), max(temp)) - bucket_count = (maxval - minval) // bucket_size + 1 - buckets = [[] for _ in range(int(bucket_count))] - - for i in range(len(temp)): - buckets[int((temp[i] - minval) // bucket_size)].append(temp[i]) - - ind = 0 - for i in range(len(buckets)): - if not slow: - clk.tick(10) - else: - clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - a = [buckets[i][j] for j in range(len(buckets[i]))] - for node in a: - grid[ind].value = node - grid[ind].make_red() - ind += 1 - if slow: - draw() - if not slow: - draw() - - ind = 0 - for i in range(len(buckets)): - if not slow: - clk.tick(10) - else: - clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - a = sorted(buckets[i][j] for j in range(len(buckets[i]))) - for node in a: - grid[ind].value = node - grid[ind].make_red() - ind += 1 - if slow: - draw() - if not slow: - draw() - break - - return True, True \ No newline at end of file diff --git a/Sorts/cocktail.py b/Sorts/cocktail.py deleted file mode 100644 index 7e1e9b5..0000000 --- a/Sorts/cocktail.py +++ /dev/null @@ -1,72 +0,0 @@ -import pygame - -clk = pygame.time.Clock() - -def cocktail(draw, grid): - temp = [i.value for i in grid] - run = True - slow = True - - length = len(grid) - - for i in range(len(temp) - 1, 0, -1): - if not slow: - clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - - swapped = False - - for j in range(i, 0, -1): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - if temp[j] < temp[j - 1]: - temp[j], temp[j - 1] = temp[j - 1], temp[j] - swapped = True - grid[j].value = temp[j] - grid[j - 1].value = temp[j - 1] - grid[j].make_red() - grid[j - 1].make_red() - if slow: - draw() - if not slow: - draw() - - - for j in range(i): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - if temp[j] > temp[j + 1]: - temp[j], temp[j + 1] = temp[j + 1], temp[j] - swapped = True - grid[j].value = temp[j] - grid[j + 1].value = temp[j + 1] - grid[j].make_red() - grid[j + 1].make_red() - if slow: - draw() - if not slow: - draw() - - if not swapped: - break - - return True, True \ No newline at end of file diff --git a/Sorts/comb.py b/Sorts/comb.py deleted file mode 100644 index 6c5633c..0000000 --- a/Sorts/comb.py +++ /dev/null @@ -1,56 +0,0 @@ -import pygame - -clk = pygame.time.Clock() - -def comb(draw, grid): - temp = [i.value for i in grid] - run = True - slow = True - - n = len(temp) - gap = n - swp = True - - while gap !=1 or swp == 1: - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - - gap = getNextGap(gap) - swp = False - - for i in range(0, n-gap): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - if temp[i] > temp[i + gap]: - temp[i], temp[i + gap]=temp[i + gap], temp[i] - grid[i].value = temp[i] - grid[i + gap].value = temp[i + gap] - grid[i].make_red() - grid[i + gap].make_red() - if slow: - draw() - swp = True - if not slow: - draw() - - - return True, True - -def getNextGap(gap): - - gap = (gap * 10)/13 - if gap < 1: - return 1 - return int(gap) \ No newline at end of file diff --git a/Sorts/counting.py b/Sorts/counting.py deleted file mode 100644 index f092ffa..0000000 --- a/Sorts/counting.py +++ /dev/null @@ -1,44 +0,0 @@ -import pygame - -clk = pygame.time.Clock() - -def counting(draw, grid): - temp = [i.value for i in grid] - run = True - slow = True - - temp_len = len(temp) - temp_max = max(temp) - temp_min = min(temp) - - counting_arr_length = temp_max + 1 - temp_min - counting_arr = [0] * counting_arr_length - - for number in temp: - counting_arr[number - temp_min] += 1 - - for i in range(1, counting_arr_length): - counting_arr[i] = counting_arr[i] + counting_arr[i - 1] - - ordered = [0] * temp_len - - for i in reversed(range(0, temp_len)): - if not slow: - clk.tick(5) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - grid[counting_arr[temp[i] - temp_min] - 1].value = temp[i] - grid[counting_arr[temp[i] - temp_min] - 1].make_red() - if slow: - draw() - counting_arr[temp[i] - temp_min] -= 1 - if not slow: - draw() - - return True, True \ No newline at end of file diff --git a/Sorts/cycle.py b/Sorts/cycle.py deleted file mode 100644 index 5d9de16..0000000 --- a/Sorts/cycle.py +++ /dev/null @@ -1,72 +0,0 @@ -import pygame - -clk = pygame.time.Clock() - -def cycle(draw, grid): - temp = [i.value for i in grid] - run = True - slow = True - - length = len(temp) - - for cycle_start in range(0, length - 1): - if not slow: - clk.tick(5) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - - item = temp[cycle_start] - - pos = cycle_start - for i in range(cycle_start + 1, length): - if temp[i] < item: - pos += 1 - - if pos == cycle_start: - continue - - while item == temp[pos]: - pos += 1 - - temp[pos], item = item, temp[pos] - grid[pos].value = temp[pos] - grid[pos].make_red() - if slow: - draw() - - while pos != cycle_start: - if not slow: - clk.tick(5) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - - pos = cycle_start - for i in range(cycle_start + 1, length): - if temp[i] < item: - pos += 1 - - while item == temp[pos]: - pos += 1 - - temp[pos], item = item, temp[pos] - grid[pos].value = temp[pos] - grid[pos].make_red() - if slow: - draw() - - if not slow: - draw() - - return True, True \ No newline at end of file diff --git a/Sorts/double.py b/Sorts/double.py deleted file mode 100644 index 55d965e..0000000 --- a/Sorts/double.py +++ /dev/null @@ -1,52 +0,0 @@ -import pygame - -clk = pygame.time.Clock() - -def double(draw, grid): - temp = [i.value for i in grid] - run = True - slow = True - - length = len(temp) - i = 0 - for i in range(0, int(((length - 1) / 2) + 1)): - if not slow: - clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - - for j in range(0, length - 1): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - if (temp[j + 1] < temp[j]): - temp[j + 1], temp[j] = temp[j], temp[j + 1] - grid[j].value = temp [j] - grid[j].make_red() - grid[j + 1].value = temp[j + 1] - grid[j + 1].make_red() - if slow: - draw() - - if (temp[length - 1 - j] < temp[length - 2 - j]): - temp[length - 1 - j], temp[length - 2 - j] = temp[length - 2 - j], temp[length - 1 - j] - grid[length - 1 - j].value = temp[length - 1 - j] - grid[length - 1 - j].make_red() - grid[length - 2 - j].value = temp[length - 2 - j] - grid[length - 2 - j].make_red() - if slow: - draw() - if not slow: - draw() - return True, True \ No newline at end of file diff --git a/Sorts/gnome.py b/Sorts/gnome.py deleted file mode 100644 index e03d7c0..0000000 --- a/Sorts/gnome.py +++ /dev/null @@ -1,42 +0,0 @@ -import pygame - -clk = pygame.time.Clock() - -def gnome(draw, grid): - temp = [i.value for i in grid] - run = True - slow = False - - length = len(grid) - i = 1 - while i < length: - if not slow: - clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - if temp[i - 1] <= temp[i]: - i += 1 - else: - temp[i - 1], temp[i] = temp[i], temp[i - 1] - grid[i].value = temp[i] - grid[i].make_red() - grid[i - 1].value = temp[i - 1] - grid[i - 1].make_red() - if slow: - draw() - - i -= 1 - if i == 0: - i = 1 - if not slow: - grid[i].make_red() - grid[i - 1].make_red() - draw() - - return True, True \ No newline at end of file diff --git a/Sorts/heap.py b/Sorts/heap.py deleted file mode 100644 index cfb18d9..0000000 --- a/Sorts/heap.py +++ /dev/null @@ -1,67 +0,0 @@ -import pygame - -clk = pygame.time.Clock() - -def heap(draw, grid): - temp = [i.value for i in grid] - run = True - slow = True - - length = len(temp) - for i in range(length // 2 - 1, -1, -1): - heapify(draw, grid, temp, i, length, slow) - - for i in range(length - 1, 0, -1): - - if not slow: - clk.tick(20) - else: - clk.tick(10) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - - temp[0], temp[i] = temp[i], temp[0] - grid[0].value = temp[0] - grid[0].make_red() - grid[i].value = temp[i] - grid[i].make_red() - if slow: - draw() - heapify(draw, grid, temp, 0, i, slow) - if not slow: - draw() - - return True, True - - -def heapify(draw, grid, temp, index, heap_size, slow): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - exit() - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_BACKSPACE: - slow = not slow - largest = index - left_index = 2 * index + 1 - right_index = 2 * index + 2 - if left_index < heap_size and temp[left_index] > temp[largest]: - largest = left_index - - if right_index < heap_size and temp[right_index] > temp[largest]: - largest = right_index - - if largest != index: - temp[largest], temp[index] = temp[index], temp[largest] - grid[largest].value = temp[largest] - grid[largest].make_red() - grid[index].value = temp[index] - grid[index].make_red() - if slow: - draw() - heapify(draw, grid, temp, largest, heap_size, slow) \ No newline at end of file diff --git a/Sorts/insertion.py b/Sorts/insertion.py deleted file mode 100644 index c4f4b5e..0000000 --- a/Sorts/insertion.py +++ /dev/null @@ -1,45 +0,0 @@ -import pygame - -clk = pygame.time.Clock() - -def insertion(draw, grid): - temp = [i.value for i in grid] - run = True - slow = True - - length = len(grid) - - for i in range(1, length): - if not slow: - clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - - i_index = i - while (i_index > 0 and temp[i_index - 1] > temp[i_index]): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - temp[i_index], temp[i_index - 1] = temp[i_index - 1], temp[i_index], - grid[i_index].value = temp[i_index] - grid[i_index].make_red() - grid[i_index - 1].value = temp[i_index - 1] - grid[i_index - 1].make_red() - if slow: - draw() - i_index -= 1 - if not slow: - draw() - - return True, True \ No newline at end of file diff --git a/Sorts/merge.py b/Sorts/merge.py deleted file mode 100644 index 8209590..0000000 --- a/Sorts/merge.py +++ /dev/null @@ -1,79 +0,0 @@ -import pygame - - - - -clk = pygame.time.Clock() -BLACK = (0,0,0) - -def iterativemerge(draw, grid): - temp = [i.value for i in grid] - run = True - slow = True - - length = len(grid) - i = 2 - while i < length: - # if not slow: - # clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - - for d in range(0, length, i): - - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - if 100//i > 15: - clk.tick(100//i) - else: - clk.tick(20) - l = d - h = d + i - 1 - m = (l + h + 1) // 2 - temp = merge1(draw, temp, l, m, h, grid, slow) - for node in range(length): - if grid[node].value != temp[node]: - grid[node].value = temp[node] - # grid[node].make_green() - # draw() - - if i * 2 >= len(temp): - m = d - temp = merge1(draw, temp, 0, m, len(temp) - 1, grid, slow) - for node in range(0, len(temp)): - grid[node].value = temp[node] - i *= 2 - draw() - return True, False - -def merge1(draw, temp, l, m, h, grid, slow): - result = [] - left, right = temp[l : m], temp[m : h + 1] - while left and right: - pygame.event.pump() - if left[0] <= right[0]: - t = left.pop(0) - else: - t = right.pop(0) - result.append(t) - grid[temp.index(t)].make_red() - if slow: - draw() - if not slow: - draw() - - temp[l : h + 1] = result + left + right - return temp - diff --git a/Sorts/oddeven.py b/Sorts/oddeven.py deleted file mode 100644 index e2694e3..0000000 --- a/Sorts/oddeven.py +++ /dev/null @@ -1,65 +0,0 @@ -import pygame - -clk = pygame.time.Clock() - -def oddeven(draw, grid): - temp = [i.value for i in grid] - run = True - slow = True - - length = len(grid) - isSorted = 0 - while isSorted == 0: - if not slow: - clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - - isSorted = 1 - for i in range(1, length-1, 2): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - if temp[i] > temp[i+1]: - temp[i], temp[i+1] = temp[i+1], temp[i] - grid[i].value = temp[i] - grid[i].make_red() - grid[i+1].value = temp[i+1] - grid[i+1].make_red() - if slow: - draw() - isSorted = 0 - - for i in range(0, length-1, 2): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - if temp[i] > temp[i+1]: - temp[i], temp[i+1] = temp[i+1], temp[i] - grid[i].value = temp[i] - grid[i].make_red() - grid[i+1].value = temp[i+1] - grid[i+1].make_red() - if slow: - draw() - isSorted = 0 - if not slow: - draw() - - return True, True \ No newline at end of file diff --git a/Sorts/pancake.py b/Sorts/pancake.py deleted file mode 100644 index 3aa12ca..0000000 --- a/Sorts/pancake.py +++ /dev/null @@ -1,63 +0,0 @@ -import pygame - -clk = pygame.time.Clock() - -def pancake(draw, grid): - temp = [i.value for i in grid] - run = True - slow = True - - length = len(grid) - l = length - while length > 1: - if not slow: - clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - mi = temp.index(max(temp[0:length])) - - temp = temp[mi::-1] + temp[mi + 1 : len(temp)] - for node in range(l): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - if grid[node].value != temp[node]: - grid[node].value = temp[node] - grid[node].make_red() - if slow: - draw() - - temp = temp[length - 1 :: -1] + temp[length : len(temp)] - for node in range(l): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - if grid[node].value != temp[node]: - grid[node].value = temp[node] - grid[node].make_red() - if slow: - draw() - length -= 1 - if not slow: - draw() - - - - - return True, True \ No newline at end of file diff --git a/Sorts/pigeon.py b/Sorts/pigeon.py deleted file mode 100644 index 974f618..0000000 --- a/Sorts/pigeon.py +++ /dev/null @@ -1,49 +0,0 @@ -import pygame - -clk = pygame.time.Clock() - -def pigeon(draw, grid): - temp = [i.value for i in grid] - slow = False - - min_val = min(temp) - max_val = max(temp) - - size = max_val - min_val + 1 - holes = [0] * size - - for x in temp: - holes[x - min_val] += 1 - i = 0 - for count in range(size): - if not slow: - clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - while holes[count] > 0: - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - holes[count] -= 1 - temp[i] = count + min_val - grid[i].value = temp[i] - grid[i].make_red() - if slow: - draw() - i += 1 - if not slow: - draw() - - - return True, True \ No newline at end of file diff --git a/Sorts/quick.py b/Sorts/quick.py deleted file mode 100644 index 3391ed1..0000000 --- a/Sorts/quick.py +++ /dev/null @@ -1,115 +0,0 @@ -import pygame - -clk = pygame.time.Clock() -t = [] -# def quick(draw, grid): -# global t -# temp = [i.value for i in grid] -# t = grid -# run = True -# slow = True - - -# a = qsort(draw, grid, slow) -# for i, nodes in enumerate(a): -# nodes.make_red() -# n = nodes.move(i+1) -# if slow: -# draw() - -# return True, True - -# def qsort(draw, grid, slow): -# for event in pygame.event.get(): -# if event.type == pygame.QUIT: -# exit() -# if event.type == pygame.KEYDOWN: -# if event.key == pygame.K_BACKSPACE: -# slow = not slow -# length = len(grid) -# if length <= 1: -# return grid -# else: - -# pivot = grid.pop() - -# greater, lesser = [], [] -# for element in grid: -# if element.value > pivot.value: -# greater.append(element) -# else: -# lesser.append(element) -# a = qsort(draw, lesser, slow) + [pivot] + qsort(draw, greater, slow) -# for i, nodes in enumerate(a): -# nodes.make_red() -# n = nodes.move(i+1) -# if slow: -# draw() -# if not slow: -# draw() -# return a - -def partition(draw, grid, temp, low, high, slow): - i = (low - 1) # index of smaller element - pivot = temp[high] # pivot - - for j in range(low, high): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - exit() - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_BACKSPACE: - slow = not slow - - if temp[j] <= pivot: - i += 1 - temp[i], temp[j] = temp[j], temp[i] - grid[i].value, grid[j].value = temp[i], temp[j] - grid[i].make_red() - grid[j].make_red() - if slow: - draw() - - temp[i + 1], temp[high] = temp[high], temp[i + 1] - grid[i + 1].value, grid[high].value = temp[i + 1], temp[high] - grid[i + 1].make_red() - grid[high].make_red() - draw() - - return (i + 1) - -def quickSort(draw, grid, temp, low, high, slow): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - if low < high: - pi = partition(draw, grid, temp, low, high, slow) - - # Separately sort elements before - # partition and after partition - quickSort(draw, grid, temp, low, pi-1, slow) - quickSort(draw, grid, temp, pi + 1, high, slow) - -def quick(draw, grid): - temp = [i.value for i in grid] - run = True - slow = True - - length = len(grid) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - - quickSort(draw, grid, temp, 0, length-1, slow) - - return True, True \ No newline at end of file diff --git a/Sorts/radix.py b/Sorts/radix.py deleted file mode 100644 index 8184879..0000000 --- a/Sorts/radix.py +++ /dev/null @@ -1,55 +0,0 @@ -import pygame - -clk = pygame.time.Clock() - -def radix(draw, grid): - temp = [i.value for i in grid] - run = True - slow = True - - RADIX = 10 - placement = 1 - max_digit = max(temp) - length = len(grid) - - while placement < max_digit: - if not slow: - clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - - buckets = [list() for _ in range(RADIX)] - # split list_of_ints between the buckets - for i in temp: - tmp = int((i / placement) % RADIX) - buckets[tmp].append(i) - # put each buckets' contents into temp - a = 0 - for b in range(RADIX): - for i in buckets[b]: - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - temp[a] = i - grid[a].value = temp[a] - grid[a].make_red() - if slow: - draw() - a += 1 - if not slow: - draw() - # move to next - placement *= RADIX - - return True, True \ No newline at end of file diff --git a/Sorts/selection.py b/Sorts/selection.py deleted file mode 100644 index 12a13e4..0000000 --- a/Sorts/selection.py +++ /dev/null @@ -1,45 +0,0 @@ -import pygame - -clk = pygame.time.Clock() - -def selection(draw, grid): - run = True - slow = True - - length = len(grid) - i = 0 - while i < length-1: - if not slow: - clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - l = i - for k in range(i + 1, length): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - if grid[k].value < grid[l].value: - l = k - if slow: - grid[k].make_red() - grid[l].make_red() - draw() - if l != i: - grid[l].value, grid[i].value = grid[i].value, grid[l].value - grid[l].make_red() - grid[i].make_red() - draw() - i += 1 - - return True, True \ No newline at end of file diff --git a/Sorts/shell.py b/Sorts/shell.py deleted file mode 100644 index 1969507..0000000 --- a/Sorts/shell.py +++ /dev/null @@ -1,62 +0,0 @@ -import pygame - -clk = pygame.time.Clock() - -def shell(draw, grid): - temp = [i.value for i in grid] - run = True - slow = True - - length = len(grid) - - gaps = [701, 301, 132, 57, 23, 10, 4, 1] - - for gap in gaps: - - if not slow: - clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - - for i in range(gap, length): - - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - - j = i - while j >= gap and temp[j] < temp[j - gap]: - - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - - temp[j], temp[j - gap] = temp[j - gap], temp[j] - grid[j].value, grid[j - gap].value = temp[j], temp[j - gap] - grid[j].make_red() - grid[j - gap].make_red() - if slow: - draw() - j -= gap - if not slow: - draw() - - - - return True, True \ No newline at end of file diff --git a/Sorts/sleep.py b/Sorts/sleep.py deleted file mode 100644 index 5c9a2ed..0000000 --- a/Sorts/sleep.py +++ /dev/null @@ -1,41 +0,0 @@ -from threading import Timer -from time import sleep -import pygame - -clk = pygame.time.Clock() - -def sleepsort(draw, grid): - temp = [i.value for i in grid] - run = True - - sleepsort.result = [] - - def append_to_result(x, grid, draw): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - exit() - - sleepsort.result.append(x) - ind = sleepsort.result.index(x) - grid[ind].value = x - grid[ind].make_red() - draw() - - - mx = temp[0] - for value in temp: - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - - if mx < value: - mx = value - Timer(value, append_to_result, [value, grid, draw]).start() - - pygame.time.wait((mx + 1)) - - return True, True - diff --git a/Sorts/stooge.py b/Sorts/stooge.py deleted file mode 100644 index dd7f0f1..0000000 --- a/Sorts/stooge.py +++ /dev/null @@ -1,57 +0,0 @@ -import pygame - -clk = pygame.time.Clock() - -def stooge(draw, grid): - temp = [i.value for i in grid] - run = True - slow = True - - length = len(temp) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - - stoogecal(draw, grid, temp, 0, length-1, slow) - if not slow: - draw() - - return True, True - -def stoogecal(draw, grid, temp, i, h, slow): - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False, False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True, False - if event.key == pygame.K_BACKSPACE: - slow = not slow - if i >= h: - return - - if temp[i] > temp[h]: - temp[i], temp[h] = temp[h], temp[i] - grid[h].value, grid[i].value = temp[h], temp[i] - grid[h].make_red() - grid[i].make_red() - if slow: - draw() - - - if h - i + 1 > 2: - t = (int)((h - i + 1) / 3) - - - stoogecal(draw, grid, temp, i, (h - t), slow) - - - stoogecal(draw, grid, temp, i + t, (h), slow) - - - stoogecal(draw, grid, temp, i, (h - t), slow) \ No newline at end of file diff --git a/Sorts/wiggle.py b/Sorts/wiggle.py deleted file mode 100644 index 2a8962a..0000000 --- a/Sorts/wiggle.py +++ /dev/null @@ -1,34 +0,0 @@ -import pygame - -clk = pygame.time.Clock() - -def wiggle(draw, grid): - temp = [i.value for i in grid] - run = True - slow = True - - length = len(grid) - i = 0 - while i < length: - if not slow: - clk.tick(30) - for event in pygame.event.get(): - if event.type == pygame.QUIT: - return False - if event.type == pygame.KEYDOWN: - if event.key == pygame.K_ESCAPE: - return True - if event.key == pygame.K_BACKSPACE: - slow = not slow - - if (i % 2 == 1) == (grid[i - 1].value > grid[i].value): - grid[i - 1].value, grid[i].value = grid[i].value, grid[i - 1].value - grid[i - 1].make_red() - grid[i].make_red() - if not slow: - draw() - if slow: - draw() - i += 1 - - return True \ No newline at end of file From ebf388d3bab44aa1db0ec05a54a8c1921872dd30 Mon Sep 17 00:00:00 2001 From: ShriramShagi Date: Sun, 18 Jul 2021 12:12:41 +0530 Subject: [PATCH 3/4] Changes -FIxed file structure -Constants file -Import fixes --- Visualiser/Algorithms/Maze/__init__.py | 11 + Visualiser/Algorithms/Maze/aldous_broder.py | 201 +++++++++ Visualiser/Algorithms/Maze/algorithms.md | 42 ++ Visualiser/Algorithms/Maze/bfs.py | 26 ++ Visualiser/Algorithms/Maze/binary_tree.py | 69 ++++ Visualiser/Algorithms/Maze/ellers.py | 158 +++++++ Visualiser/Algorithms/Maze/growing_tree.py | 133 ++++++ Visualiser/Algorithms/Maze/hunt_and_kill.py | 184 +++++++++ Visualiser/Algorithms/Maze/kruskal.py | 107 +++++ Visualiser/Algorithms/Maze/prims.py | 108 +++++ .../Algorithms/Maze/recursive_backtracking.py | 120 ++++++ .../Algorithms/Maze/recursive_division.py | 97 +++++ Visualiser/Algorithms/Maze/sidewinder.py | 76 ++++ Visualiser/Algorithms/Maze/wilson.py | 204 +++++++++ Visualiser/Algorithms/Path/__init__.py | 2 + Visualiser/Algorithms/Path/astar.py | 73 ++++ Visualiser/Algorithms/Path/dijkstra.py | 73 ++++ Visualiser/Algorithms/Sort/__init__.py | 24 ++ Visualiser/Algorithms/Sort/algorithms.md | 57 +++ Visualiser/Algorithms/Sort/bead.py | 46 +++ Visualiser/Algorithms/Sort/bitonic.py | 82 ++++ Visualiser/Algorithms/Sort/bogo.py | 42 ++ Visualiser/Algorithms/Sort/bubble.py | 44 ++ Visualiser/Algorithms/Sort/bucket.py | 79 ++++ Visualiser/Algorithms/Sort/cocktail.py | 72 ++++ Visualiser/Algorithms/Sort/comb.py | 56 +++ Visualiser/Algorithms/Sort/counting.py | 44 ++ Visualiser/Algorithms/Sort/cycle.py | 72 ++++ Visualiser/Algorithms/Sort/double.py | 52 +++ Visualiser/Algorithms/Sort/gnome.py | 42 ++ Visualiser/Algorithms/Sort/heap.py | 67 +++ Visualiser/Algorithms/Sort/insertion.py | 45 ++ Visualiser/Algorithms/Sort/merge.py | 79 ++++ Visualiser/Algorithms/Sort/oddeven.py | 65 +++ Visualiser/Algorithms/Sort/pancake.py | 63 +++ Visualiser/Algorithms/Sort/pigeon.py | 49 +++ Visualiser/Algorithms/Sort/quick.py | 115 ++++++ Visualiser/Algorithms/Sort/radix.py | 55 +++ Visualiser/Algorithms/Sort/selection.py | 45 ++ Visualiser/Algorithms/Sort/shell.py | 62 +++ Visualiser/Algorithms/Sort/sleep.py | 41 ++ Visualiser/Algorithms/Sort/stooge.py | 57 +++ Visualiser/Algorithms/Sort/wiggle.py | 34 ++ Visualiser/Algorithms/__init__.py | 3 + Visualiser/Utils/__init__.py | 3 + Visualiser/Utils/button.py | 61 +++ Visualiser/Utils/lines.py | 78 ++++ Visualiser/Utils/nodes.py | 388 ++++++++++++++++++ Visualiser/__init__.py | 3 + Visualiser/constants.py | 43 ++ 50 files changed, 3752 insertions(+) create mode 100644 Visualiser/Algorithms/Maze/__init__.py create mode 100644 Visualiser/Algorithms/Maze/aldous_broder.py create mode 100644 Visualiser/Algorithms/Maze/algorithms.md create mode 100644 Visualiser/Algorithms/Maze/bfs.py create mode 100644 Visualiser/Algorithms/Maze/binary_tree.py create mode 100644 Visualiser/Algorithms/Maze/ellers.py create mode 100644 Visualiser/Algorithms/Maze/growing_tree.py create mode 100644 Visualiser/Algorithms/Maze/hunt_and_kill.py create mode 100644 Visualiser/Algorithms/Maze/kruskal.py create mode 100644 Visualiser/Algorithms/Maze/prims.py create mode 100644 Visualiser/Algorithms/Maze/recursive_backtracking.py create mode 100644 Visualiser/Algorithms/Maze/recursive_division.py create mode 100644 Visualiser/Algorithms/Maze/sidewinder.py create mode 100644 Visualiser/Algorithms/Maze/wilson.py create mode 100644 Visualiser/Algorithms/Path/__init__.py create mode 100644 Visualiser/Algorithms/Path/astar.py create mode 100644 Visualiser/Algorithms/Path/dijkstra.py create mode 100644 Visualiser/Algorithms/Sort/__init__.py create mode 100644 Visualiser/Algorithms/Sort/algorithms.md create mode 100644 Visualiser/Algorithms/Sort/bead.py create mode 100644 Visualiser/Algorithms/Sort/bitonic.py create mode 100644 Visualiser/Algorithms/Sort/bogo.py create mode 100644 Visualiser/Algorithms/Sort/bubble.py create mode 100644 Visualiser/Algorithms/Sort/bucket.py create mode 100644 Visualiser/Algorithms/Sort/cocktail.py create mode 100644 Visualiser/Algorithms/Sort/comb.py create mode 100644 Visualiser/Algorithms/Sort/counting.py create mode 100644 Visualiser/Algorithms/Sort/cycle.py create mode 100644 Visualiser/Algorithms/Sort/double.py create mode 100644 Visualiser/Algorithms/Sort/gnome.py create mode 100644 Visualiser/Algorithms/Sort/heap.py create mode 100644 Visualiser/Algorithms/Sort/insertion.py create mode 100644 Visualiser/Algorithms/Sort/merge.py create mode 100644 Visualiser/Algorithms/Sort/oddeven.py create mode 100644 Visualiser/Algorithms/Sort/pancake.py create mode 100644 Visualiser/Algorithms/Sort/pigeon.py create mode 100644 Visualiser/Algorithms/Sort/quick.py create mode 100644 Visualiser/Algorithms/Sort/radix.py create mode 100644 Visualiser/Algorithms/Sort/selection.py create mode 100644 Visualiser/Algorithms/Sort/shell.py create mode 100644 Visualiser/Algorithms/Sort/sleep.py create mode 100644 Visualiser/Algorithms/Sort/stooge.py create mode 100644 Visualiser/Algorithms/Sort/wiggle.py create mode 100644 Visualiser/Algorithms/__init__.py create mode 100644 Visualiser/Utils/__init__.py create mode 100644 Visualiser/Utils/button.py create mode 100644 Visualiser/Utils/lines.py create mode 100644 Visualiser/Utils/nodes.py create mode 100644 Visualiser/__init__.py create mode 100644 Visualiser/constants.py diff --git a/Visualiser/Algorithms/Maze/__init__.py b/Visualiser/Algorithms/Maze/__init__.py new file mode 100644 index 0000000..55f7aab --- /dev/null +++ b/Visualiser/Algorithms/Maze/__init__.py @@ -0,0 +1,11 @@ +from .prims import prims +from .kruskal import kruskal +from .sidewinder import sidewinder +from .recursive_backtracking import backtrack +from .ellers import ellers +from .aldous_broder import aldous +from .wilson import wilson +from .hunt_and_kill import hunt +from .growing_tree import tree +from .binary_tree import binary +from .recursive_division import division \ No newline at end of file diff --git a/Visualiser/Algorithms/Maze/aldous_broder.py b/Visualiser/Algorithms/Maze/aldous_broder.py new file mode 100644 index 0000000..6901b96 --- /dev/null +++ b/Visualiser/Algorithms/Maze/aldous_broder.py @@ -0,0 +1,201 @@ +import pygame + +from random import randint, choice +from ...constants import MAZE_ABSOLUTE_ROWS, MAZE_ABSOLUTE_COLUMNS + +extra_vis = False +clk = pygame.time.Clock() + +def drawedge(draw, edge, grid, mode): + """Connect the nodes(By removing barrier) + + Args: + draw (func): Draws on screen + edge (tuple): cordinates of the ends of the edge + grid (2D list): Nodes on the screen + mode (int): fast 1/0 slow + """ + # Get + x1, y1, x2, y2, x, y = getcoordinate(edge) + + grid[x1*2][y1*2].remove_barrier() + grid[x][y].remove_barrier() + grid[x2*2][y2*2].remove_barrier() + + + if mode == 0: + draw() + +def flash(draw, node, grid, mode): + """draw the node on iteration + + Args: + draw (func): Draws on screen + node (tuple): cordinates of the node + grid (2D list): Nodes on the screen + mode (int): fast 1/0 slow + """ + x1, y1 = node + for rw in grid: + for node in rw: + if node.getwil1(): + node.reset() + + grid[x1*2][y1*2].wil1() + if mode == 0: + draw() + +def getcoordinate(edge): + """Get coordinates of the edge node between two nodes + + Args: + edge (tuple): tuple of tuplescontaining two nodes + """ + a, b = edge + x1, y1 = a + x2, y2 = b + if x1 == x2: + if y1 > y2: + y = y1*2 - 1 + else: + y = y1*2 + 1 + x = x1 * 2 + elif y1 == y2: + if x1 > x2: + x = x1*2 - 1 + else: + x = x1*2 + 1 + y = y1 * 2 + return(x1, y1, x2, y2, x, y) + +def getnextnode(node): + """Get a random neighbouring node + + Args: + node (tuple): x, y of the node + + Returns: + tuple: a random neighbouring node + """ + x, y = node + neighbours = [] + if x < MAZE_ABSOLUTE_ROWS: + neighbours.append((x+1, y)) + if x > 0: + neighbours.append((x-1, y)) + if y < MAZE_ABSOLUTE_COLUMNS: + neighbours.append((x, y+1)) + if y > 0: + neighbours.append((x, y-1)) + + return choice(neighbours) + +def getrandom(node, visited): + """Get random neighbouring node which is not visited + + Args: + node (tuple): x, y of the node + visited (list): list of tuples of visited node + + Returns: + list: first index as neighbours and second index as the node + """ + try: + x, y = node + except: + return [] + neighbours = [] + if x < MAZE_ABSOLUTE_ROWS: + if (x+1, y) not in visited: + neighbours.append((x+1, y)) + if x > 0: + if (x-1, y) not in visited: + neighbours.append((x-1, y)) + if y < MAZE_ABSOLUTE_COLUMNS: + if (x, y+1) not in visited: + neighbours.append((x, y+1)) + if y > 0: + if (x, y-1) not in visited: + neighbours.append((x, y-1)) + + return neighbours, node + +def checkprev(node): + """Check if node exists + + Args: + node (tuple): x, y of tuple if node exists + + Returns: + boolean: true if exists false otherise + """ + try: + x, y = node + return True + except: + return False + +''' Function takes an average of 11000 iterations to complete NOT RECOMMENDED TO RUN''' +def aldous(draw, grid, mode): + ''' Function takes an average of 11000 iterations to complete NOT RECOMMENDED TO RUN''' + r = len(grid) + c = len(grid[0]) + run = True + global extra_vis + for rows in grid: + for node in rows: + node.reset() + node.invert() + + if mode == 0: + draw() + i = 0 + x = randint(0, r//2-1) + y = randint(0, c//2-1) + prev = (x,y) + visited = list() + + count = 0 + + nextnode = None + while len(visited) < (c//2 + 1)*(r//2 + 1) and run: + # while c != 625: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_BACKSPACE: + if mode == 0: + mode = 1 + else: + mode = 0 + if event.key == pygame.K_ESCAPE: + run = False + if count <= 10: + nextnode = getnextnode(prev) + else: + n = [] + while len(n) == 0: + prev = choice(visited) + + n = getrandom(prev, visited) + nextnode = n[-1] + count = 0 + + temp = grid + flash(draw, nextnode, grid, mode) + grid = temp + + if nextnode in visited: + count += 1 + if mode == 0: + draw() + else: + visited.append(nextnode) + drawedge(draw, (prev, nextnode), grid, mode) + prev = nextnode + + if mode == 1: + draw() + + return True \ No newline at end of file diff --git a/Visualiser/Algorithms/Maze/algorithms.md b/Visualiser/Algorithms/Maze/algorithms.md new file mode 100644 index 0000000..e2cef76 --- /dev/null +++ b/Visualiser/Algorithms/Maze/algorithms.md @@ -0,0 +1,42 @@ +>Path Finding: +1) [A* Path finding algorithm](astar.py) +1) [Dijkstra algorithm](dijkstra.py) + +>Maze: +1) [Prim's algorithm](prims.py) +1) [Kruskal's algorithm](kruskal.py) +1) [Sidewinder algorithm](sidewinder.py) +1) [Eller's algorithm](ellers.py) +1) [Recursive backtracking algorithm](recursive_backtracking.py) +1) [Aldous Broder algorithm (Modified)](aldous_broder.py) +1) [Wilson's algorithm](wilson.py) +1) [Hunt and Kill algorithm](hunt_and_kill.py) (Modified) +1) [Growing Tree algorithm](growing_tree.py) (newest and random choices combined) +1) [Binary Tree algorithm](binary_tree.py) +1) [Recursive division algorithm](recursive_division.py) + +# Keys + +> Maze Generation: + +| Key | Function | +|--- |--- | +| 1 | Prim's algorithm | +| 2 | Kruskal's algorithm | +| 3 | Sidewinder algorithm | +| 4 | Recursive backtracking algorithm | +| 5 | Aldous Broder algorithm | +| 6 | Hunt and Kill algorithm | +| 7 | Growing Tree algorithm | +| 8 | Binary Tree algorithm | +| 9 | Recursive Division algorithm | +| 0 | Wilson's algorithm| +| q | Eller's algorithm| + +> Path Finding: + +| Key | Function | +|--- |--- | +| z | A* algorithm | +| x | Dijkstra algorithm | +| | | diff --git a/Visualiser/Algorithms/Maze/bfs.py b/Visualiser/Algorithms/Maze/bfs.py new file mode 100644 index 0000000..0756caf --- /dev/null +++ b/Visualiser/Algorithms/Maze/bfs.py @@ -0,0 +1,26 @@ +# import pygame +# from queue import PriorityQueue + +# def reconstruct(came, end, draw): +# while end in came: +# end = came[end] +# end.make_path() +# draw() + + +# def astar(draw, grid, start, end, mode): +# pygame.init() +# run = True + +# while run: +# for event in pygame.event.get(): +# if event.type == pygame.QUIT: +# return False +# if event.type == pygame.KEYDOWN: +# if event.key == pygame.K_BACKSPACE: +# if mode == 0: +# mode = 1 +# else: +# mode = 0 + +# return True diff --git a/Visualiser/Algorithms/Maze/binary_tree.py b/Visualiser/Algorithms/Maze/binary_tree.py new file mode 100644 index 0000000..546d571 --- /dev/null +++ b/Visualiser/Algorithms/Maze/binary_tree.py @@ -0,0 +1,69 @@ +import pygame + +from random import randint +from ...constants import MAZE_ABSOLUTE_ROWS, MAZE_ABSOLUTE_COLUMNS + +def rand(): + return randint(0,1) + +def binary(draw, grid, mode): + run = True + l = len(grid) + for rw in grid: + for node in rw: + node.reset() + node.invert() + if mode == 0: + draw() + current = None + for j in grid[0]: + j.remove_barrier() + if mode == 0: + draw() + + i = 1 + while run and i != MAZE_ABSOLUTE_ROWS + 1: + # clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + run = False + if event.key == pygame.K_BACKSPACE: + if mode == 0: + mode = 1 + else: + mode = 0 + for j in range(MAZE_ABSOLUTE_COLUMNS+ 1): + + current = (i, j) + if rand() == 1: + drawedge(draw, grid, current, mode, 'north') + + else: + if movewest(current): + drawedge(draw, grid, current, mode, 'west') + else: + drawedge(draw, grid, current, mode, 'north') + i += 1 + if mode == 1: + draw() + + return True + +def movewest(node): + x, y = node + if y < MAZE_ABSOLUTE_COLUMNS: + return True + return False + +def drawedge(draw, grid, current, mode, direction): + x, y = current + grid[x*2][y*2].remove_barrier() + if direction == 'north': + grid[x*2-1][y*2].remove_barrier() + elif direction == 'west': + grid[x*2][y*2+1].remove_barrier() + if mode == 0: + draw() \ No newline at end of file diff --git a/Visualiser/Algorithms/Maze/ellers.py b/Visualiser/Algorithms/Maze/ellers.py new file mode 100644 index 0000000..c74c167 --- /dev/null +++ b/Visualiser/Algorithms/Maze/ellers.py @@ -0,0 +1,158 @@ +import pygame + +from random import randint, choice +from ...constants import MAZE_ABSOLUTE_ROWS, MAZE_ABSOLUTE_COLUMNS + +clk = pygame.time.Clock() + +def getboolean(): + if randint(0, 1) == 0: + return True + return False + + +class Cell: + def __init__(self, a, b, s): + self.x = a + self.y = b + self.right = False + self.left = False + self.down = False + self.sets = set() + self.setno = s + + +def joinright(draw, grid, r, mode): + for i in range(1, len(r)): + if r[i].setno == r[i-1].setno: + r[i-1].right = False + r[i].left = False + continue + if getboolean(): + r[i-1].right = True + r[i].left = True + j = r[i].setno + k = r[i-1].setno + for items in r: + if items.setno == j: + items.setno = k + else: + r[i-1].right = False + r[i].left = False + drawright(draw, grid, r, mode) + return r + +def drawright(draw, grid, r, mode): + for items in r: + if items.right: + grid[items.x*2][items.y*2].reset() + if items.y*2+1 < 99: + grid[items.x*2][items.y*2+1].reset() + elif items.left: + grid[items.x*2][items.y*2].reset() + if items.y*2-1 > 0: + grid[items.x*2][items.y*2-1].reset() + else: + grid[items.x*2][items.y*2].reset() + if items.y*2+1 < 99: + grid[items.x*2][items.y*2+1].barrier() + + if mode == 0: + draw() + +def sortcell(cell): + l = {} + for node in cell: + if f'{node.setno}' in l.keys(): + l[f'{node.setno}'].append(node) + else: + l[f'{node.setno}'] = [node] + return l + +def joindown(draw, grid, current, mode): + a = sortcell(current) + for val in a.values(): + l = len(val) + if l == 1: + val[-1].down = True + drawdown(draw, grid, val[-1].x, val[-1].y, val[-1], mode) + else: + r = randint(1, l) + while r != 0: + g = choice(val) + g.down = True + r-=1 + drawdown(draw, grid, g.x, g.y, g, mode) + return current + +def setmanager(current, nextrow): + for i in range(len(current)): + if current[i].down == True: + nextrow[i].setno = current[i].setno + return nextrow + +def drawdown(draw, grid, x, y, node, mode): + if node.down == True: + grid[x*2][y*2].reset() + if x*2+1 < 48: + grid[x*2+1][y*2].reset() + if mode == 0: + draw() + +def ellers(draw, grid, mode): + run = True + for rw in grid: + for node in rw: + node.reset() + node.invert() + if mode == 0: + draw() + + s = 1 + celllist = [] + for b in range(MAZE_ABSOLUTE_ROWS+1): + celllist.append([]) + for j in range(MAZE_ABSOLUTE_COLUMNS+1): + celllist[b].append(Cell(b, j, s)) + s += 1 + + i = 0 + currrow = celllist[i] + while i < MAZE_ABSOLUTE_ROWS: + clk.tick(30) + # i += 1 + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_CAPSLOCK: + if mode == 0: + mode = 1 + else: + mode = 0 + + currrow = joinright(draw, grid, currrow, mode) + + currrow = joindown(draw, grid, currrow, mode) + currrow = setmanager(current=currrow, nextrow = celllist[i+1]) + i+=1 + joinrightlast(draw, grid, currrow, mode) + if mode == 1: + draw() + + return True + +def joinrightlast(draw, grid, r, mode): + for i in range(1, len(r)): + if r[i].setno == r[i-1].setno: + r[i-1].right = False + r[i].left = False + else: + r[i-1].right = True + r[i].left = True + j = r[i].setno + k = r[i-1].setno + for items in r: + if items.setno == j: + items.setno = k + drawright(draw, grid, r, mode) \ No newline at end of file diff --git a/Visualiser/Algorithms/Maze/growing_tree.py b/Visualiser/Algorithms/Maze/growing_tree.py new file mode 100644 index 0000000..24a6e78 --- /dev/null +++ b/Visualiser/Algorithms/Maze/growing_tree.py @@ -0,0 +1,133 @@ +import pygame + +from random import randint, choice +from ...constants import MAZE_ABSOLUTE_ROWS as row, MAZE_ABSOLUTE_COLUMNS as col + + +def noneb(stack, visited): + neighbours = [] + for node in stack: + count = 0 + x, y = node + if (x+1, y) in visited and x < row: + count += 1 + if (x-1, y) in visited and x > 0: + count += 1 + if (x, y+1) in visited and y < row: + count += 1 + if (x, y-1) in visited and y > 0: + count += 1 + if count == 4: + neighbours.append(node) + return neighbours + +def update(node, visited): + n = [] + x, y = node + if x < row and x > 0: # down + n.append((x + 1, y)) + n.append((x - 1, y)) + elif x == 0: + n.append((x + 1, y)) + elif x == row: + n.append((x - 1, y)) + if y < col and y > 0: # down + n.append((x, y + 1)) + n.append((x, y - 1)) + elif y == 0: + n.append((x, y + 1)) + elif y == col: + n.append((x, y - 1)) + for nodes in visited: + if nodes in n: + n.remove(nodes) + return n + +def check(n): + if len(n) != 0: + return True + return False + +def drawsquare(draw, grid, spot, prev, mode, color = ''): + x1, y1 = prev + x2, y2 = spot + if x1 == x2: + if y1 > y2: + y = y1*2 - 1 + else: + y = y1*2 + 1 + x = x1 * 2 + elif y1 == y2: + if x1 > x2: + x = x1*2 - 1 + else: + x = x1*2 + 1 + y = y1 * 2 + + if color != '': + grid[x][y].tracker() + grid[x2*2][y2*2].tracker() + else: + grid[x][y].remove_barrier() + grid[x2*2][y2*2].remove_barrier() + if mode == 0: + draw() + +def tree(draw, grid, mode): + run = True + l = len(grid) + for rw in grid: + for node in rw: + node.reset() + node.invert() + if mode == 0: + draw() + + stack = [] + x = randint(0, row-1) + y = randint(0, col-1) + stack.append((x, y)) + visited = {(x, y)} + c = 0 + + while run and c != 1249: + # clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + run = False + if event.key == pygame.K_BACKSPACE: + if mode == 0: + mode = 1 + else: + mode = 0 + # try: + n = update(stack[-1], visited) + nebless = noneb(stack, visited) + + for nodes in stack: + if nodes in nebless: + stack.remove(nodes) + + if not stack: + break + + if check(n): + spot = choice(n) + prev = stack[-1] + stack.append(spot) + visited.add(spot) + drawsquare(draw, grid, spot, prev, mode, color='') + c += 1 + + else: + a = choice(stack) + stack.remove(a) + stack.append(a) + + if mode == 1: + draw() + + return True \ No newline at end of file diff --git a/Visualiser/Algorithms/Maze/hunt_and_kill.py b/Visualiser/Algorithms/Maze/hunt_and_kill.py new file mode 100644 index 0000000..e057eb3 --- /dev/null +++ b/Visualiser/Algorithms/Maze/hunt_and_kill.py @@ -0,0 +1,184 @@ +import pygame + +from random import randint, choice, shuffle +from ...constants import MAZE_ABSOLUTE_ROWS as row, MAZE_ABSOLUTE_COLUMNS as col + +clk = pygame.time.Clock() + +def update(node, visited): + n = [] + x, y = node + if x < row and x > 0: # down + n.append((x + 1, y)) + n.append((x - 1, y)) + elif x == 0: + n.append((x + 1, y)) + elif x == row: + n.append((x - 1, y)) + if y < col and y > 0: # down + n.append((x, y + 1)) + n.append((x, y - 1)) + elif y == 0: + n.append((x, y + 1)) + elif y == col: + n.append((x, y - 1)) + for nodes in visited: + if nodes in n: + n.remove(nodes) + return n + +def neighbours(visited): + n = [] + for node in visited: + fresh = [] + x, y = node + if x < row and x > 0: # down + fresh.append((x + 1, y)) + fresh.append((x - 1, y)) + elif x == 0: + fresh.append((x + 1, y)) + elif x == row: + fresh.append((x - 1, y)) + if y < col and y > 0: # down + fresh.append((x, y + 1)) + fresh.append((x, y - 1)) + elif y == 0: + fresh.append((x, y + 1)) + elif y == col: + fresh.append((x, y - 1)) + for nodes in visited: + if nodes in fresh: + fresh.remove(nodes) + n.extend(fresh) + return n + +def drawedge(draw, grid, node, visited, mode): + x, y = node + neigh = [(x+1, y), (x-1, y), (x, y+1), (x, y-1)] + shuffle(neigh) + for spot in neigh: + if spot in visited: + break + drawsquare(draw, grid, spot, node, mode) + + +def gohunt(draw, grid, n, i, visited, mode): + # if mode == 0: + # drawrow(draw, grid, i, mode) + for j in range(col+1): + if (i, j) in n: + return (i, j) + return None + +def drawrow(draw, grid, row, mode): + row *= 2 + for rw in grid: + for node in rw: + if node.if_open_prev(): + node.do_open_prev() + for nodes in grid[row]: + nodes.open_prev() + + if mode == 0: + draw() + + +def drawsquare(draw, grid, spot, prev, mode): + x1, y1 = prev + x2, y2 = spot + if x1 == x2: + if y1 > y2: + y = y1*2 - 1 + else: + y = y1*2 + 1 + x = x1 * 2 + elif y1 == y2: + if x1 > x2: + x = x1*2 - 1 + else: + x = x1*2 + 1 + y = y1 * 2 + + grid[x1*2][y1*2].remove_barrier() + grid[x][y].remove_barrier() + grid[x2*2][y2*2].remove_barrier() + if mode == 0: + draw() + +def check(n): + if len(n) != 0: + return True + return False + +def getrow(visited): + i = 0 + run = True + for i in range(row + 1): + for j in range(col + 1): + if (i, j) not in visited: + run = False + if not run: + break + return i + +def hunt(draw, grid, mode): + run = True + l = len(grid) + for rw in grid: + for node in rw: + node.reset() + node.invert() + if mode == 0: + draw() + + i = 0 + stack = [] + x = randint(0, row-1) + y = randint(0, col-1) + stack.append((x, y)) + visited = {(x, y)} + store = stack[-1] + if mode == 0: + draw() + + while run: + # clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + run = False + if event.key == pygame.K_BACKSPACE: + if mode == 0: + mode = 1 + else: + mode = 0 + n = update(stack[-1], visited) + + if check(n): + spot = choice(n) + prev = stack[-1] + stack.append(spot) + visited.add(spot) + drawsquare(draw, grid, spot, prev, mode) + else: + stack = [] + n = neighbours(visited) + i = getrow(visited) + while True: + new = gohunt(draw, grid, n, i, visited, mode) + i += 1 + if new != None: + break + if new == None and i == row + 1: + run = False + break + if run: + stack.append(new) + visited.add(new) + drawedge(draw, grid, new, visited, mode) + if mode == 1: + draw() + + return True diff --git a/Visualiser/Algorithms/Maze/kruskal.py b/Visualiser/Algorithms/Maze/kruskal.py new file mode 100644 index 0000000..bcf3ae8 --- /dev/null +++ b/Visualiser/Algorithms/Maze/kruskal.py @@ -0,0 +1,107 @@ +import pygame +from random import randint, choice, shuffle +from ...constants import MAZE_ABSOLUTE_ROWS as row, MAZE_ABSOLUTE_COLUMNS as col + +# clk = pygame.time.Clock() + +def findparent(v, parent): + if parent[v] == v: + return v + return findparent(parent[v], parent) + +def getcoordinate(edge): + a, b = edge + x1, y1 = a + x2, y2 = b + if x1 == x2: + if y1 > y2: + y = y1*2 - 1 + else: + y = y1*2 + 1 + x = x1 * 2 + elif y1 == y2: + if x1 > x2: + x = x1*2 - 1 + else: + x = x1*2 + 1 + y = y1 * 2 + return(x1, y1, x2, y2, x, y) + +def drawedge(draw, edge, grid, mode): + x1, y1, x2, y2, x, y = getcoordinate(edge) + + grid[x1*2][y1*2].remove_barrier() + grid[x][y].remove_barrier() + grid[x2*2][y2*2].remove_barrier() + if mode == 0: + draw() + +def flash(draw, edge, grid, mode): + x1, y1, x2, y2, x, y = getcoordinate(edge) + + grid[x1*2][y1*2].getwil1() + grid[x][y].getwil1() + grid[x2*2][y2*2].getwil1() + if mode == 0: + draw() + +def kruskal(draw, grid, mode): + pygame.init() + r = len(grid) + c = len(grid[0]) + for rw in grid: + for node in rw: + node.reset() + node.invert() + if mode == 0: + draw() + + edgelist = [] + for i in range(row + 1): + for j in range(col + 1): + if i == row and j == col: + continue + elif j == col: + edgelist.append(((i, j), (i+1, j))) + elif i == row: + edgelist.append(((i, j), (i, j+1))) + else: + edgelist.append(((i, j), (i+1, j))) + edgelist.append(((i, j), (i, j+1))) + shuffle(edgelist) + + parent = [i for i in range((c//2 + 1)*(r//2 + 1))] + + count = 0 + while count != (c//2 + 1)*(r//2 + 1) - 1: + # clk.tick(45) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_BACKSPACE: + if mode == 0: + mode = 1 + else: + mode = 0 + try: + current = edgelist.pop() + except: + break + x1, y1 = current[0] + x2, y2 = current[1] + + sourceparent = findparent(y1*(r//2 + 1) - ((c//2 + 1) - x1), parent) + destparent = findparent(y2*(r//2 + 1) - ((c//2 + 1) - x2), parent) + temp = grid + grid = temp + + if sourceparent != destparent: + flash(draw, current, grid, mode) + drawedge(draw, current, grid, mode) + count += 1 + parent[sourceparent] = destparent + + if mode == 1: + draw() + return True \ No newline at end of file diff --git a/Visualiser/Algorithms/Maze/prims.py b/Visualiser/Algorithms/Maze/prims.py new file mode 100644 index 0000000..75604f1 --- /dev/null +++ b/Visualiser/Algorithms/Maze/prims.py @@ -0,0 +1,108 @@ +import pygame + +from random import choice, shuffle, randint +from ...constants import MAZE_ABSOLUTE_ROWS as row, MAZE_ABSOLUTE_COLUMNS as col + +def getneighbour(node, visited): + x, y = node + neighbours = [] + popy = [] + if x < row: + if (x+1, y) in visited: + popy.append((x+1, y)) + else: + neighbours.append((x+1, y)) + if x > 0: + if (x-1, y) in visited: + popy.append((x-1, y)) + else: + neighbours.append((x-1, y)) + if y < col: + if (x, y+1) in visited: + popy.append((x, y+1)) + else: + neighbours.append((x, y+1)) + if y > 0: + if (x, y-1) in visited: + popy.append((x, y-1)) + else: + neighbours.append((x, y-1)) + + return neighbours, popy + +def drawedge(draw, edge, grid, mode): + x1, y1, x2, y2, x, y = getcoordinate(edge) + + grid[x1*2][y1*2].remove_barrier() + grid[x][y].remove_barrier() + grid[x2*2][y2*2].remove_barrier() + if mode == 0: + draw() + +def getcoordinate(edge): + a, b = edge + x1, y1 = a + x2, y2 = b + if x1 == x2: + if y1 > y2: + y = y1*2 - 1 + else: + y = y1*2 + 1 + x = x1 * 2 + elif y1 == y2: + if x1 > x2: + x = x1*2 - 1 + else: + x = x1*2 + 1 + y = y1 * 2 + return(x1, y1, x2, y2, x, y) + + +def prims(draw, grid, mode): + r = len(grid) + c = len(grid[0]) + for row in grid: + for node in row: + node.reset() + node.invert() + if mode == 0: + draw() + + x = randint(0, r//2-1) + y = randint(0, c//2-1) + start = (x, y) + visited = {start} + tovisit, p = getneighbour(start, visited) + tovisit = set(tovisit) + count = 1 + + while count < (c//2 + 1)*(r//2 + 1) : + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_BACKSPACE: + if mode == 0: + mode = 1 + else: + mode = 0 + + p = [] + n = [] + nextnode = choice(list(tovisit)) + n , p = getneighbour(nextnode, visited) + tovisit.remove(nextnode) + visited.add(nextnode) + count += 1 + + for nodes in n: + if nodes != None: + tovisit.add(nodes) + + drawedge(draw, (choice(p), nextnode), grid, mode) + + + if mode == 1: + draw() + + return True \ No newline at end of file diff --git a/Visualiser/Algorithms/Maze/recursive_backtracking.py b/Visualiser/Algorithms/Maze/recursive_backtracking.py new file mode 100644 index 0000000..ebdfd72 --- /dev/null +++ b/Visualiser/Algorithms/Maze/recursive_backtracking.py @@ -0,0 +1,120 @@ +import pygame + +from random import randint, choice + +from ...constants import MAZE_ABSOLUTE_ROWS as row, MAZE_ABSOLUTE_COLUMNS as col + +clk = pygame.time.Clock() + +def update(node, visited): + n = [] + x, y = node + if x < row and x > 0: # down + n.append((x + 1, y)) + n.append((x - 1, y)) + elif x == 0: + n.append((x + 1, y)) + elif x == row: + n.append((x - 1, y)) + if y < col and y > 0: # down + n.append((x, y + 1)) + n.append((x, y - 1)) + elif y == 0: + n.append((x, y + 1)) + elif y == col: + n.append((x, y - 1)) + for nodes in visited: + if nodes in n: + n.remove(nodes) + return n + +def check(n): + if len(n) != 0: + return True + return False + +def drawsquare(draw, grid, spot, prev, mode, color = ''): + x1, y1 = prev + x2, y2 = spot + if x1 == x2: + if y1 > y2: + y = y1*2 - 1 + else: + y = y1*2 + 1 + x = x1 * 2 + elif y1 == y2: + if x1 > x2: + x = x1*2 - 1 + else: + x = x1*2 + 1 + y = y1 * 2 + + if color != '': + grid[x][y].tracker() + grid[x2*2][y2*2].tracker() + else: + grid[x][y].remove_barrier() + grid[x2*2][y2*2].remove_barrier() + if mode == 0: + draw() + +def backtrack(draw, grid, mode): + global store + pygame.init() + run = True + for rw in grid: + for node in rw: + node.reset() + node.invert() + if mode == 0: + draw() + + stack = [] + x = randint(0, row-1) + y = randint(0, col-1) + stack.append((x, y)) + visited = {(x, y)} + # grid[x*2][y*2].remove_barrier() + store = stack[-1] + if mode == 0: + draw() + + while stack and run: + # clk.tick(20) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + run = False + if event.key == pygame.K_BACKSPACE: + if mode == 0: + mode = 1 + else: + mode = 0 + for rw in grid: + for node in rw: + if node.is_closed(): + node.reset() + break + if run: + n = update(stack[-1], visited) + + if check(n): + spot = choice(n) + prev = stack[-1] + stack.append(spot) + visited.add(spot) + drawsquare(draw, grid, spot, prev, mode, color='Red') + + else: + a = stack.pop() + if stack: + prev = stack[-1] + drawsquare(draw, grid, a, prev, mode) + c, d = store + grid[c*2][d*2].remove_barrier() + + if mode == 1: + draw() + return True \ No newline at end of file diff --git a/Visualiser/Algorithms/Maze/recursive_division.py b/Visualiser/Algorithms/Maze/recursive_division.py new file mode 100644 index 0000000..e652af6 --- /dev/null +++ b/Visualiser/Algorithms/Maze/recursive_division.py @@ -0,0 +1,97 @@ +import pygame +from random import randint, choice, randrange + +row = 50 +col = 100 +mode = 0 + +def division(draw, grid, m): + global mode + run = True + for rw in grid: + for node in rw: + node.reset() + + + while run: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + run = False + if event.key == pygame.K_BACKSPACE: + if mode == 0: + mode = 1 + else: + mode = 0 + recurs(draw, grid, row-1, -1, -1, col-1) + run = False + if mode == 1: + draw() + mode = 0 + + return True + +def recurs(draw, grid, top, bottom, left, right): + global mode + for event in pygame.event.get(): + if event.type == pygame.QUIT: + exit() + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + exit() + if event.key == pygame.K_BACKSPACE: + if mode == 0: + mode = 1 + else: + mode = 0 + start_range = bottom + 2 + end_range = top - 1 + y = randrange(start_range, end_range, 2) + + for column in range(left + 1, right): + grid[y][column].barrier() + if mode == 0: + draw() + + start_range = left + 2 + end_range = right - 1 + x = randrange(start_range, end_range, 2) + + for row in range(bottom + 1, top): + grid[row][x].barrier() + if mode == 0: + draw() + + wall = randrange(4) + if wall != 0: + gap = randrange(left + 1, x, 2) + grid[y][gap].remove_barrier() + + if wall != 1: + gap = randrange(x + 1, right, 2) + grid[y][gap].remove_barrier() + + if wall != 2: + gap = randrange(bottom + 1, y, 2) + grid[gap][x].remove_barrier() + + if wall != 3: + gap = randrange(y + 1, top, 2) + grid[gap][x].remove_barrier() + if mode == 0: + draw() + + if top > y + 3 and x > left + 3: + recurs(draw, grid, top, y, left, x) + + if top > y + 3 and x + 3 < right: + recurs(draw, grid, top, y, x, right) + + if bottom + 3 < y and x + 3 < right: + recurs(draw, grid, y, bottom, x, right) + + if bottom + 3 < y and x > left + 3: + recurs(draw, grid, y, bottom, left, x) + \ No newline at end of file diff --git a/Visualiser/Algorithms/Maze/sidewinder.py b/Visualiser/Algorithms/Maze/sidewinder.py new file mode 100644 index 0000000..8d03a91 --- /dev/null +++ b/Visualiser/Algorithms/Maze/sidewinder.py @@ -0,0 +1,76 @@ +import pygame + +from random import shuffle, randint, choice +from ...constants import MAZE_ABSOLUTE_ROWS as row, MAZE_ABSOLUTE_COLUMNS as col + + +def rand(): + return randint(0,1) + +def movenorth(draw, grid, node, mode): + x, y = node + + grid[x*2-1][y*2].remove_barrier() + if mode == 0: + draw() + +def connectset(draw, grid, run, mode): + for node in run: + x, y = node + grid[x*2][y*2].remove_barrier() + if node != run[-1]: + if y != len(grid[x]) - 1: + grid[x*2][y*2+1].remove_barrier() + if mode == 0: + draw() + +def sidewinder(draw, grid, mode): + pygame.init() + run = [] + + for rw in grid: + for node in rw: + node.reset() + node.invert() + if mode == 0: + draw() + + current = None + for j in grid[0]: + j.remove_barrier() + if mode == 0: + draw() + i = 1 + + while i != row + 1: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_BACKSPACE: + if mode == 0: + mode = 1 + else: + mode = 0 + + + for j in range(col+ 1): + + current = (i, j) + run.append(current) + if rand() == 1: + node = choice(run) + movenorth(draw, grid, node, mode) + connectset(draw, grid, run, mode) + run = [] + else: + continue + if len(run) != 0: + node = choice(run) + movenorth(draw, grid, node, mode) + connectset(draw, grid, run, mode) + run = [] + i += 1 + if mode == 1: + draw() + return True diff --git a/Visualiser/Algorithms/Maze/wilson.py b/Visualiser/Algorithms/Maze/wilson.py new file mode 100644 index 0000000..ea57d8f --- /dev/null +++ b/Visualiser/Algorithms/Maze/wilson.py @@ -0,0 +1,204 @@ +import pygame +from random import randint, shuffle, choice + +row = 24 +col = 49 +LIGHTGREEN = (55,205,55) +LIGHTRED = (255, 130, 130) + +d = ['n', 's', 'e', 'w'] +clk = pygame.time.Clock() + +def drawedge(draw, edge, grid, mode): + x1, y1, x2, y2, x, y = getcoordinate(edge) + + grid[x1*2][y1*2].remove_barrier() + grid[x][y].remove_barrier() + grid[x2*2][y2*2].remove_barrier() + if mode == 0: + draw() + +def drawedgetemp(draw, edge, grid, mode): + x1, y1, x2, y2, x, y = getcoordinate(edge) + + grid[x][y].wil2() + if mode == 0: + draw() + +def getcoordinate(edge): + a, b = edge + x1, y1 = a + x2, y2 = b + if x1 == x2: + if y1 > y2: + y = y1*2 - 1 + else: + y = y1*2 + 1 + x = x1 * 2 + elif y1 == y2: + if x1 > x2: + x = x1*2 - 1 + else: + x = x1*2 + 1 + y = y1 * 2 + return(x1, y1, x2, y2, x, y) + +def getedge(draw, frm, to, direc, grid, mode): + if direc == 'n': + edge = (to, frm) + elif direc == 's': + edge = (frm, to) + elif direc == 'e': + edge = (frm, to) + elif direc == 'w': + edge = (to, frm) + drawedge(draw, edge, grid, mode) + +def north(node): + x, y = node + if y > 0: + return (x, y-1) + return None + +def east(node): + x, y = node + if x < row: + return (x+1, y) + return None + +def south(node): + x, y = node + if y < col: + return (x, y+1) + return None + +def west(node): + x, y = node + if x > 0: + return (x-1, y) + return None + +def wilson(draw, grid, mode): + run = True + directions = {'n': north, 'e': east, 's' : south, 'w': west} + for rw in grid: + for node in rw: + node.reset() + node.invert() + if mode == 0: + draw() + nodelist = [(i,j) for i in range(row+1) for j in range(col+1)] + shuffle(nodelist) + + edgelist = [] + for i in range(row + 1): + for j in range(col + 1): + if i == row and j == col: + continue + elif j == col: + edgelist.append(((i, j), (i+1, j))) + elif i == row: + edgelist.append(((i, j), (i, j+1))) + else: + edgelist.append(((i, j), (i+1, j))) + edgelist.append(((i, j), (i, j+1))) + + path = False + span = [] + cache = { + "node" : [], + "dir" : [] + } + x = randint(0, row) + y = randint(0, col) + span.append((x, y)) + nodelist.remove((x, y)) + ex = 0 + + grid[x*2][y*2].remove_barrier() + if mode == 0: + draw() + + start = choice(nodelist) + prev = start + + while run: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_BACKSPACE: + if mode == 0: + mode = 1 + else: + mode = 0 + if path: + direc = cache['dir'][cache['node'].index(start)] + nextnode = directions[direc](start) + getedge(draw, start, nextnode, direc, grid, mode) + span.append(start) + nodelist.remove(start) + if nextnode in span: + path = False + try: + start = choice(nodelist) + prev = start + cache['dir'] = [] + cache['node'] = [] + except: + run = False + continue + else: + start = nextnode + else: + while True: + direc = choice(d) + nextnode = directions[direc](prev) + if nextnode: + break + + if prev in cache['node']: + index = cache['node'].index(prev) + cache['node'].pop(index) + cache['dir'].pop(index) + + cache['node'].append(prev) + cache['dir'].append(direc) + drawmap(draw, grid, cache, edgelist, mode) + prev = nextnode + + if nextnode in span: + drawwil(draw, grid, cache, mode) + path = True + + if mode == 0: + draw() + + if mode == 1: + draw() + return True + +def drawmap(draw, grid, cache, edgelist, mode): + x1, y1 = cache['node'][-1] + grid[x1*2][y1*2].wil1() + if len(cache['node']) > 1: + x2, y2 = cache['node'][-2] + grid[x2*2][y2*2].wil2() + if ((x1, y1), (x2, y2)) in edgelist: + edge = ((x1, y1), (x2, y2)) + elif ((x2, y2), (x1, y1)) in edgelist: + edge = ((x2, y2), (x1, y1)) + if mode == 0: + drawedgetemp(draw, edge, grid, mode) + + if mode == 0: + draw() + +def drawwil(draw, grid, cache, mode): + for rw in grid: + for node in rw: + if node.colour == LIGHTGREEN or node.colour == LIGHTRED: + node.make_barrier() + + + \ No newline at end of file diff --git a/Visualiser/Algorithms/Path/__init__.py b/Visualiser/Algorithms/Path/__init__.py new file mode 100644 index 0000000..3b571cf --- /dev/null +++ b/Visualiser/Algorithms/Path/__init__.py @@ -0,0 +1,2 @@ +from .astar import astar +from .dijkstra import dijkstra \ No newline at end of file diff --git a/Visualiser/Algorithms/Path/astar.py b/Visualiser/Algorithms/Path/astar.py new file mode 100644 index 0000000..292531e --- /dev/null +++ b/Visualiser/Algorithms/Path/astar.py @@ -0,0 +1,73 @@ +import pygame +from queue import PriorityQueue + +def reconstruct(came, end, draw): + while end in came: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False + end = came[end] + end.make_path() + draw() + + +def astar(draw, grid, start, end, mode): + pygame.init() + count = 0 + openset = PriorityQueue() + openset.put((0, count, start)) + camefrom = {} + gscore = {node : float('inf') for row in grid for node in row} + gscore[start] = 0 + fscore = {node : float('inf') for row in grid for node in row} + fscore[start] = h(start.get_pos(), end.get_pos()) + + opensethash = {start} + + for row in grid: + for node in row: + node.update_neighbours(grid) + + while not openset.empty(): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_BACKSPACE: + if mode == 0: + mode = 1 + else: + mode = 0 + + current = openset.get()[2] + opensethash.remove(current) + + if current == end: + reconstruct(camefrom, end, draw) + end.make_end() + start.make_start() + return True + + for neighbour in current.neighbours: + tempgscore = gscore[current] + 1 + if tempgscore < gscore[neighbour]: + camefrom[neighbour] = current + gscore[neighbour] = tempgscore + fscore[neighbour] = tempgscore + h(neighbour.get_pos(), end.get_pos()) + if neighbour not in opensethash: + count += 1 + openset.put((fscore[neighbour], count, neighbour)) + opensethash.add(neighbour) + neighbour.make_open() + if mode == 0: + draw() + + if current != start: + current.make_closed() + + return True + +def h(p, q): # L distance + x1, y1 = p + x2, y2 = q + return abs(x1 - x2) + abs(y1 - y2) \ No newline at end of file diff --git a/Visualiser/Algorithms/Path/dijkstra.py b/Visualiser/Algorithms/Path/dijkstra.py new file mode 100644 index 0000000..db08164 --- /dev/null +++ b/Visualiser/Algorithms/Path/dijkstra.py @@ -0,0 +1,73 @@ +import pygame +from queue import PriorityQueue + +def reconstruct(came, end, draw): + while end in came: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False + end = came[end] + end.make_path() + draw() + +def h(p, q): # L distance + x1, y1 = p + x2, y2 = q + return abs(x1 - x2) + abs(y1 - y2) + +def dijkstra(draw, grid, start, end, mode): + pygame.init() + count = 0 + openset = PriorityQueue() + openset.put((0, count, start)) + camefrom = {} + gscore = {node : float('inf') for row in grid for node in row} + gscore[start] = 0 + fscore = {node : float('inf') for row in grid for node in row} + fscore[start] = h(start.get_pos(), end.get_pos()) + + opensethash = {start} + + for row in grid: + for node in row: + node.update_neighbours(grid) + + while not openset.empty(): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_BACKSPACE: + if mode == 0: + mode = 1 + else: + mode = 0 + + current = openset.get()[2] + opensethash.remove(current) + + if current == end: + reconstruct(camefrom, end, draw) + end.make_end() + start.make_start() + + return True + + for neighbour in current.neighbours: + tempgscore = gscore[current] + 1 + if tempgscore < gscore[neighbour]: + camefrom[neighbour] = current + gscore[neighbour] = tempgscore + fscore[neighbour] = tempgscore + h(neighbour.get_pos(), end.get_pos()) + if neighbour not in opensethash: + count += 1 + openset.put((fscore, count, neighbour)) + opensethash.add(neighbour) + neighbour.make_open() + if mode == 0: + draw() + + if current != start: + current.make_closed() + + return True \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/__init__.py b/Visualiser/Algorithms/Sort/__init__.py new file mode 100644 index 0000000..11ffde1 --- /dev/null +++ b/Visualiser/Algorithms/Sort/__init__.py @@ -0,0 +1,24 @@ +from .bead import bead +from .bitonic import bitonic +from .bogo import bogo +from .bubble import bubble +from .bucket import bucket +from .cocktail import cocktail +from .comb import comb +from .counting import counting +from .cycle import cycle +from .double import double +from .gnome import gnome +from .heap import heap +from .insertion import insertion +from .merge import iterativemerge +from .oddeven import oddeven +from .pancake import pancake +from .pigeon import pigeon +from .quick import quick +from .radix import radix +from .shell import shell +from .selection import selection +from .sleep import sleepsort +from .stooge import stooge +from .wiggle import wiggle \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/algorithms.md b/Visualiser/Algorithms/Sort/algorithms.md new file mode 100644 index 0000000..8be7a3b --- /dev/null +++ b/Visualiser/Algorithms/Sort/algorithms.md @@ -0,0 +1,57 @@ +>Sorting: +1) [Bead / Gravity Sort](bead.py) +1) [Bitonic Sort](bitonic.py) +1) [Bogo / Stupid Sort](Bogo.py) +1) [Bubble Sort](bubble.py) +1) [Bucket / Bin Sort](bucket.py) +1) [Cocktail Shaker / Bidirectional Bubble / Ripple / Shuttle Sort](cocktail.py) +1) [Comb Sort](comb.py) +1) [Counting Sort](counting.py) +1) [Cycle Sort](cycle.py) +1) [Double Sort](double.py) +1) [Gnome / Dubbed Stupid Sort](gnome.py) +1) [Heap Sort](heap.py) +1) [Insertion Sort](insertion.py) +1) [Merge Sort](iterativemerge.py) +1) [Odd Even / Brick Sort](oddeven.py) +1) [Pancake Sort](pancake.py) +1) [Pigeonhole Sort](pigeon.py) +1) [Quick Sort](quick.py) +1) [Radix Sort](radix.py) +1) [Shell Sort](shell.py) +1) [Selection Sort](selection.py) +1) [Sleep Sort](sleep.py) +1) [Stooge Sort](stooge.py) +1) [Wiggle Sort](wiggle.py) + +# Keys + +> Sorting: + +| Key | Function | +|--- |--- | +| Space | Shuffle | +| 1 | Bead Sort | +| 2 | Bitonic Sort | +| 3 | Bolo Sort | +| 4 | Bubble Sort | +| 5 | Bucket Sort | +| 6 | Cocktail Shaker Sort | +| 7 | Comb Sort | +| 8 | Counting Sort | +| 9 | Cycle Sort | +| 0 | Double Sort | +| q | Gnome Sort | +| w | Heap Sort | +| e | Insertion Sort | +| r | Merge Sort | +| t | Odd Even Sort | +| y | Pancake Sort | +| u | Pigeonhole Sort | +| i | Quick Sort | +| o | Radix Sort | +| p | Selection Sort | +| a | Shell Sort | +| s | Sleep Sort | +| d | Stooge Sort | +| f | Wiggle Sort| \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/bead.py b/Visualiser/Algorithms/Sort/bead.py new file mode 100644 index 0000000..60f7dfd --- /dev/null +++ b/Visualiser/Algorithms/Sort/bead.py @@ -0,0 +1,46 @@ +import pygame + +clk = pygame.time.Clock() + +def bead(draw, grid): + temp = [i.value for i in grid] + run = True + slow = True + + length = len(grid) + i = 0 + while i < length: + if not slow: + clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + + for a, (upper, lower) in enumerate(zip(temp, temp[1:])): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + if upper > lower: + temp[a] -= upper - lower + temp[a + 1] += upper - lower + for node in range(length): + if grid[node].value != temp[node]: + grid[node].value = temp[node] + grid[node].make_red() + if slow: + draw() + if not slow: + draw() + i += 1 + + return True, True \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/bitonic.py b/Visualiser/Algorithms/Sort/bitonic.py new file mode 100644 index 0000000..5083c4f --- /dev/null +++ b/Visualiser/Algorithms/Sort/bitonic.py @@ -0,0 +1,82 @@ +import pygame + +clk = pygame.time.Clock() +l = 0 + +def bitonic(draw, grid): + global l + temp = [i.value for i in grid] + # temp = temp[:256] + run = True + slow = True + + length = len(temp) + l = length + i = 0 + while i < 1: + if not slow: + clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + bitonic_sort(draw, grid,temp, 0, length, 1, slow) + i += 1 + + return True, True + + +def compAndSwap(draw, grid, temp, i, j, dire, slow): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + exit() + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + if (dire == 1 and temp[i] > temp[j]) or (dire == 0 and temp[i] < temp[j]): + temp[i], temp[j] = temp[j], temp[i] + for node in range(l): + if grid[node].value != temp[node]: + grid[node].value = temp[node] + grid[node].make_red() + if slow: + draw() + +def bitonic_merge(draw, grid, temp, low, cnt, dire, slow): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + exit() + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + if cnt > 1: + k = int(cnt / 2) + for i in range(low, low + k): + compAndSwap(draw, grid, temp, i, i + k, dire, slow) + bitonic_merge(draw, grid, temp, low, k, dire, slow) + bitonic_merge(draw, grid, temp, low + k, k, dire, slow) + if not slow: + draw() + +def bitonic_sort(draw, grid, temp, low, cnt, dire, slow): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + exit() + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + if cnt > 1: + k = int(cnt / 2) + bitonic_sort(draw, grid, temp, low, k, 1, slow) + bitonic_sort(draw, grid, temp, low + k, k, 0, slow) + bitonic_merge(draw, grid, temp, low, cnt, dire, slow) diff --git a/Visualiser/Algorithms/Sort/bogo.py b/Visualiser/Algorithms/Sort/bogo.py new file mode 100644 index 0000000..d7ea023 --- /dev/null +++ b/Visualiser/Algorithms/Sort/bogo.py @@ -0,0 +1,42 @@ +import pygame +import random + +clk = pygame.time.Clock() + +def bogo(draw, grid): + temp = [i.value for i in grid] + run = True + slow = True + + length = len(grid) + + while True: + if not slow: + clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return (False, False) + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return (True, False) + # if event.key == pygame.K_BACKSPACE: + # slow = not slow + def is_sorted(temp): + if len(temp) < 2: + return True + for i in range(len(temp) - 1): + if temp[i] > temp[i + 1]: + return False + return True + + if not is_sorted(temp): + random.shuffle(temp) + for node in range(length): + if grid[node].value != temp[node]: + grid[node].value = temp[node] + if slow: + draw() + else: + return (True, True) + + return (True, True) \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/bubble.py b/Visualiser/Algorithms/Sort/bubble.py new file mode 100644 index 0000000..33708d6 --- /dev/null +++ b/Visualiser/Algorithms/Sort/bubble.py @@ -0,0 +1,44 @@ +import pygame + +clk = pygame.time.Clock() + +def bubble(draw, grid): + run = True + slow = True + + length = len(grid) + i = 0 + while i < length-1: + if not slow: + clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + swapped = False + for j in range(length-1 - i): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + if grid[j].value > grid[j+1].value: + swapped = True + grid[j].value, grid[j+1].value = grid[j+1].value, grid[j].value + grid[j].make_red() + grid[j+1].make_red() + if slow: + draw() + if not swapped: + break + if not slow: + draw() + i += 1 + return True, True \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/bucket.py b/Visualiser/Algorithms/Sort/bucket.py new file mode 100644 index 0000000..668df6a --- /dev/null +++ b/Visualiser/Algorithms/Sort/bucket.py @@ -0,0 +1,79 @@ +import pygame + +clk = pygame.time.Clock() + +def bucket(draw, grid): + temp = [i.value for i in grid] + run = True + slow = True + bucket_size = 16 + + while True: + if not slow: + clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + + minval, maxval = (min(temp), max(temp)) + bucket_count = (maxval - minval) // bucket_size + 1 + buckets = [[] for _ in range(int(bucket_count))] + + for i in range(len(temp)): + buckets[int((temp[i] - minval) // bucket_size)].append(temp[i]) + + ind = 0 + for i in range(len(buckets)): + if not slow: + clk.tick(10) + else: + clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + a = [buckets[i][j] for j in range(len(buckets[i]))] + for node in a: + grid[ind].value = node + grid[ind].make_red() + ind += 1 + if slow: + draw() + if not slow: + draw() + + ind = 0 + for i in range(len(buckets)): + if not slow: + clk.tick(10) + else: + clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + a = sorted(buckets[i][j] for j in range(len(buckets[i]))) + for node in a: + grid[ind].value = node + grid[ind].make_red() + ind += 1 + if slow: + draw() + if not slow: + draw() + break + + return True, True \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/cocktail.py b/Visualiser/Algorithms/Sort/cocktail.py new file mode 100644 index 0000000..7e1e9b5 --- /dev/null +++ b/Visualiser/Algorithms/Sort/cocktail.py @@ -0,0 +1,72 @@ +import pygame + +clk = pygame.time.Clock() + +def cocktail(draw, grid): + temp = [i.value for i in grid] + run = True + slow = True + + length = len(grid) + + for i in range(len(temp) - 1, 0, -1): + if not slow: + clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + + swapped = False + + for j in range(i, 0, -1): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + if temp[j] < temp[j - 1]: + temp[j], temp[j - 1] = temp[j - 1], temp[j] + swapped = True + grid[j].value = temp[j] + grid[j - 1].value = temp[j - 1] + grid[j].make_red() + grid[j - 1].make_red() + if slow: + draw() + if not slow: + draw() + + + for j in range(i): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + if temp[j] > temp[j + 1]: + temp[j], temp[j + 1] = temp[j + 1], temp[j] + swapped = True + grid[j].value = temp[j] + grid[j + 1].value = temp[j + 1] + grid[j].make_red() + grid[j + 1].make_red() + if slow: + draw() + if not slow: + draw() + + if not swapped: + break + + return True, True \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/comb.py b/Visualiser/Algorithms/Sort/comb.py new file mode 100644 index 0000000..6c5633c --- /dev/null +++ b/Visualiser/Algorithms/Sort/comb.py @@ -0,0 +1,56 @@ +import pygame + +clk = pygame.time.Clock() + +def comb(draw, grid): + temp = [i.value for i in grid] + run = True + slow = True + + n = len(temp) + gap = n + swp = True + + while gap !=1 or swp == 1: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + + gap = getNextGap(gap) + swp = False + + for i in range(0, n-gap): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + if temp[i] > temp[i + gap]: + temp[i], temp[i + gap]=temp[i + gap], temp[i] + grid[i].value = temp[i] + grid[i + gap].value = temp[i + gap] + grid[i].make_red() + grid[i + gap].make_red() + if slow: + draw() + swp = True + if not slow: + draw() + + + return True, True + +def getNextGap(gap): + + gap = (gap * 10)/13 + if gap < 1: + return 1 + return int(gap) \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/counting.py b/Visualiser/Algorithms/Sort/counting.py new file mode 100644 index 0000000..f092ffa --- /dev/null +++ b/Visualiser/Algorithms/Sort/counting.py @@ -0,0 +1,44 @@ +import pygame + +clk = pygame.time.Clock() + +def counting(draw, grid): + temp = [i.value for i in grid] + run = True + slow = True + + temp_len = len(temp) + temp_max = max(temp) + temp_min = min(temp) + + counting_arr_length = temp_max + 1 - temp_min + counting_arr = [0] * counting_arr_length + + for number in temp: + counting_arr[number - temp_min] += 1 + + for i in range(1, counting_arr_length): + counting_arr[i] = counting_arr[i] + counting_arr[i - 1] + + ordered = [0] * temp_len + + for i in reversed(range(0, temp_len)): + if not slow: + clk.tick(5) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + grid[counting_arr[temp[i] - temp_min] - 1].value = temp[i] + grid[counting_arr[temp[i] - temp_min] - 1].make_red() + if slow: + draw() + counting_arr[temp[i] - temp_min] -= 1 + if not slow: + draw() + + return True, True \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/cycle.py b/Visualiser/Algorithms/Sort/cycle.py new file mode 100644 index 0000000..5d9de16 --- /dev/null +++ b/Visualiser/Algorithms/Sort/cycle.py @@ -0,0 +1,72 @@ +import pygame + +clk = pygame.time.Clock() + +def cycle(draw, grid): + temp = [i.value for i in grid] + run = True + slow = True + + length = len(temp) + + for cycle_start in range(0, length - 1): + if not slow: + clk.tick(5) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + + item = temp[cycle_start] + + pos = cycle_start + for i in range(cycle_start + 1, length): + if temp[i] < item: + pos += 1 + + if pos == cycle_start: + continue + + while item == temp[pos]: + pos += 1 + + temp[pos], item = item, temp[pos] + grid[pos].value = temp[pos] + grid[pos].make_red() + if slow: + draw() + + while pos != cycle_start: + if not slow: + clk.tick(5) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + + pos = cycle_start + for i in range(cycle_start + 1, length): + if temp[i] < item: + pos += 1 + + while item == temp[pos]: + pos += 1 + + temp[pos], item = item, temp[pos] + grid[pos].value = temp[pos] + grid[pos].make_red() + if slow: + draw() + + if not slow: + draw() + + return True, True \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/double.py b/Visualiser/Algorithms/Sort/double.py new file mode 100644 index 0000000..55d965e --- /dev/null +++ b/Visualiser/Algorithms/Sort/double.py @@ -0,0 +1,52 @@ +import pygame + +clk = pygame.time.Clock() + +def double(draw, grid): + temp = [i.value for i in grid] + run = True + slow = True + + length = len(temp) + i = 0 + for i in range(0, int(((length - 1) / 2) + 1)): + if not slow: + clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + + for j in range(0, length - 1): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + if (temp[j + 1] < temp[j]): + temp[j + 1], temp[j] = temp[j], temp[j + 1] + grid[j].value = temp [j] + grid[j].make_red() + grid[j + 1].value = temp[j + 1] + grid[j + 1].make_red() + if slow: + draw() + + if (temp[length - 1 - j] < temp[length - 2 - j]): + temp[length - 1 - j], temp[length - 2 - j] = temp[length - 2 - j], temp[length - 1 - j] + grid[length - 1 - j].value = temp[length - 1 - j] + grid[length - 1 - j].make_red() + grid[length - 2 - j].value = temp[length - 2 - j] + grid[length - 2 - j].make_red() + if slow: + draw() + if not slow: + draw() + return True, True \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/gnome.py b/Visualiser/Algorithms/Sort/gnome.py new file mode 100644 index 0000000..e03d7c0 --- /dev/null +++ b/Visualiser/Algorithms/Sort/gnome.py @@ -0,0 +1,42 @@ +import pygame + +clk = pygame.time.Clock() + +def gnome(draw, grid): + temp = [i.value for i in grid] + run = True + slow = False + + length = len(grid) + i = 1 + while i < length: + if not slow: + clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + if temp[i - 1] <= temp[i]: + i += 1 + else: + temp[i - 1], temp[i] = temp[i], temp[i - 1] + grid[i].value = temp[i] + grid[i].make_red() + grid[i - 1].value = temp[i - 1] + grid[i - 1].make_red() + if slow: + draw() + + i -= 1 + if i == 0: + i = 1 + if not slow: + grid[i].make_red() + grid[i - 1].make_red() + draw() + + return True, True \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/heap.py b/Visualiser/Algorithms/Sort/heap.py new file mode 100644 index 0000000..cfb18d9 --- /dev/null +++ b/Visualiser/Algorithms/Sort/heap.py @@ -0,0 +1,67 @@ +import pygame + +clk = pygame.time.Clock() + +def heap(draw, grid): + temp = [i.value for i in grid] + run = True + slow = True + + length = len(temp) + for i in range(length // 2 - 1, -1, -1): + heapify(draw, grid, temp, i, length, slow) + + for i in range(length - 1, 0, -1): + + if not slow: + clk.tick(20) + else: + clk.tick(10) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + + temp[0], temp[i] = temp[i], temp[0] + grid[0].value = temp[0] + grid[0].make_red() + grid[i].value = temp[i] + grid[i].make_red() + if slow: + draw() + heapify(draw, grid, temp, 0, i, slow) + if not slow: + draw() + + return True, True + + +def heapify(draw, grid, temp, index, heap_size, slow): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + exit() + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_BACKSPACE: + slow = not slow + largest = index + left_index = 2 * index + 1 + right_index = 2 * index + 2 + if left_index < heap_size and temp[left_index] > temp[largest]: + largest = left_index + + if right_index < heap_size and temp[right_index] > temp[largest]: + largest = right_index + + if largest != index: + temp[largest], temp[index] = temp[index], temp[largest] + grid[largest].value = temp[largest] + grid[largest].make_red() + grid[index].value = temp[index] + grid[index].make_red() + if slow: + draw() + heapify(draw, grid, temp, largest, heap_size, slow) \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/insertion.py b/Visualiser/Algorithms/Sort/insertion.py new file mode 100644 index 0000000..c4f4b5e --- /dev/null +++ b/Visualiser/Algorithms/Sort/insertion.py @@ -0,0 +1,45 @@ +import pygame + +clk = pygame.time.Clock() + +def insertion(draw, grid): + temp = [i.value for i in grid] + run = True + slow = True + + length = len(grid) + + for i in range(1, length): + if not slow: + clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + + i_index = i + while (i_index > 0 and temp[i_index - 1] > temp[i_index]): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + temp[i_index], temp[i_index - 1] = temp[i_index - 1], temp[i_index], + grid[i_index].value = temp[i_index] + grid[i_index].make_red() + grid[i_index - 1].value = temp[i_index - 1] + grid[i_index - 1].make_red() + if slow: + draw() + i_index -= 1 + if not slow: + draw() + + return True, True \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/merge.py b/Visualiser/Algorithms/Sort/merge.py new file mode 100644 index 0000000..8209590 --- /dev/null +++ b/Visualiser/Algorithms/Sort/merge.py @@ -0,0 +1,79 @@ +import pygame + + + + +clk = pygame.time.Clock() +BLACK = (0,0,0) + +def iterativemerge(draw, grid): + temp = [i.value for i in grid] + run = True + slow = True + + length = len(grid) + i = 2 + while i < length: + # if not slow: + # clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + + for d in range(0, length, i): + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + if 100//i > 15: + clk.tick(100//i) + else: + clk.tick(20) + l = d + h = d + i - 1 + m = (l + h + 1) // 2 + temp = merge1(draw, temp, l, m, h, grid, slow) + for node in range(length): + if grid[node].value != temp[node]: + grid[node].value = temp[node] + # grid[node].make_green() + # draw() + + if i * 2 >= len(temp): + m = d + temp = merge1(draw, temp, 0, m, len(temp) - 1, grid, slow) + for node in range(0, len(temp)): + grid[node].value = temp[node] + i *= 2 + draw() + return True, False + +def merge1(draw, temp, l, m, h, grid, slow): + result = [] + left, right = temp[l : m], temp[m : h + 1] + while left and right: + pygame.event.pump() + if left[0] <= right[0]: + t = left.pop(0) + else: + t = right.pop(0) + result.append(t) + grid[temp.index(t)].make_red() + if slow: + draw() + if not slow: + draw() + + temp[l : h + 1] = result + left + right + return temp + diff --git a/Visualiser/Algorithms/Sort/oddeven.py b/Visualiser/Algorithms/Sort/oddeven.py new file mode 100644 index 0000000..e2694e3 --- /dev/null +++ b/Visualiser/Algorithms/Sort/oddeven.py @@ -0,0 +1,65 @@ +import pygame + +clk = pygame.time.Clock() + +def oddeven(draw, grid): + temp = [i.value for i in grid] + run = True + slow = True + + length = len(grid) + isSorted = 0 + while isSorted == 0: + if not slow: + clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + + isSorted = 1 + for i in range(1, length-1, 2): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + if temp[i] > temp[i+1]: + temp[i], temp[i+1] = temp[i+1], temp[i] + grid[i].value = temp[i] + grid[i].make_red() + grid[i+1].value = temp[i+1] + grid[i+1].make_red() + if slow: + draw() + isSorted = 0 + + for i in range(0, length-1, 2): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + if temp[i] > temp[i+1]: + temp[i], temp[i+1] = temp[i+1], temp[i] + grid[i].value = temp[i] + grid[i].make_red() + grid[i+1].value = temp[i+1] + grid[i+1].make_red() + if slow: + draw() + isSorted = 0 + if not slow: + draw() + + return True, True \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/pancake.py b/Visualiser/Algorithms/Sort/pancake.py new file mode 100644 index 0000000..3aa12ca --- /dev/null +++ b/Visualiser/Algorithms/Sort/pancake.py @@ -0,0 +1,63 @@ +import pygame + +clk = pygame.time.Clock() + +def pancake(draw, grid): + temp = [i.value for i in grid] + run = True + slow = True + + length = len(grid) + l = length + while length > 1: + if not slow: + clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + mi = temp.index(max(temp[0:length])) + + temp = temp[mi::-1] + temp[mi + 1 : len(temp)] + for node in range(l): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + if grid[node].value != temp[node]: + grid[node].value = temp[node] + grid[node].make_red() + if slow: + draw() + + temp = temp[length - 1 :: -1] + temp[length : len(temp)] + for node in range(l): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + if grid[node].value != temp[node]: + grid[node].value = temp[node] + grid[node].make_red() + if slow: + draw() + length -= 1 + if not slow: + draw() + + + + + return True, True \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/pigeon.py b/Visualiser/Algorithms/Sort/pigeon.py new file mode 100644 index 0000000..974f618 --- /dev/null +++ b/Visualiser/Algorithms/Sort/pigeon.py @@ -0,0 +1,49 @@ +import pygame + +clk = pygame.time.Clock() + +def pigeon(draw, grid): + temp = [i.value for i in grid] + slow = False + + min_val = min(temp) + max_val = max(temp) + + size = max_val - min_val + 1 + holes = [0] * size + + for x in temp: + holes[x - min_val] += 1 + i = 0 + for count in range(size): + if not slow: + clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + while holes[count] > 0: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + holes[count] -= 1 + temp[i] = count + min_val + grid[i].value = temp[i] + grid[i].make_red() + if slow: + draw() + i += 1 + if not slow: + draw() + + + return True, True \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/quick.py b/Visualiser/Algorithms/Sort/quick.py new file mode 100644 index 0000000..3391ed1 --- /dev/null +++ b/Visualiser/Algorithms/Sort/quick.py @@ -0,0 +1,115 @@ +import pygame + +clk = pygame.time.Clock() +t = [] +# def quick(draw, grid): +# global t +# temp = [i.value for i in grid] +# t = grid +# run = True +# slow = True + + +# a = qsort(draw, grid, slow) +# for i, nodes in enumerate(a): +# nodes.make_red() +# n = nodes.move(i+1) +# if slow: +# draw() + +# return True, True + +# def qsort(draw, grid, slow): +# for event in pygame.event.get(): +# if event.type == pygame.QUIT: +# exit() +# if event.type == pygame.KEYDOWN: +# if event.key == pygame.K_BACKSPACE: +# slow = not slow +# length = len(grid) +# if length <= 1: +# return grid +# else: + +# pivot = grid.pop() + +# greater, lesser = [], [] +# for element in grid: +# if element.value > pivot.value: +# greater.append(element) +# else: +# lesser.append(element) +# a = qsort(draw, lesser, slow) + [pivot] + qsort(draw, greater, slow) +# for i, nodes in enumerate(a): +# nodes.make_red() +# n = nodes.move(i+1) +# if slow: +# draw() +# if not slow: +# draw() +# return a + +def partition(draw, grid, temp, low, high, slow): + i = (low - 1) # index of smaller element + pivot = temp[high] # pivot + + for j in range(low, high): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + exit() + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_BACKSPACE: + slow = not slow + + if temp[j] <= pivot: + i += 1 + temp[i], temp[j] = temp[j], temp[i] + grid[i].value, grid[j].value = temp[i], temp[j] + grid[i].make_red() + grid[j].make_red() + if slow: + draw() + + temp[i + 1], temp[high] = temp[high], temp[i + 1] + grid[i + 1].value, grid[high].value = temp[i + 1], temp[high] + grid[i + 1].make_red() + grid[high].make_red() + draw() + + return (i + 1) + +def quickSort(draw, grid, temp, low, high, slow): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + if low < high: + pi = partition(draw, grid, temp, low, high, slow) + + # Separately sort elements before + # partition and after partition + quickSort(draw, grid, temp, low, pi-1, slow) + quickSort(draw, grid, temp, pi + 1, high, slow) + +def quick(draw, grid): + temp = [i.value for i in grid] + run = True + slow = True + + length = len(grid) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + + quickSort(draw, grid, temp, 0, length-1, slow) + + return True, True \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/radix.py b/Visualiser/Algorithms/Sort/radix.py new file mode 100644 index 0000000..8184879 --- /dev/null +++ b/Visualiser/Algorithms/Sort/radix.py @@ -0,0 +1,55 @@ +import pygame + +clk = pygame.time.Clock() + +def radix(draw, grid): + temp = [i.value for i in grid] + run = True + slow = True + + RADIX = 10 + placement = 1 + max_digit = max(temp) + length = len(grid) + + while placement < max_digit: + if not slow: + clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + + buckets = [list() for _ in range(RADIX)] + # split list_of_ints between the buckets + for i in temp: + tmp = int((i / placement) % RADIX) + buckets[tmp].append(i) + # put each buckets' contents into temp + a = 0 + for b in range(RADIX): + for i in buckets[b]: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + temp[a] = i + grid[a].value = temp[a] + grid[a].make_red() + if slow: + draw() + a += 1 + if not slow: + draw() + # move to next + placement *= RADIX + + return True, True \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/selection.py b/Visualiser/Algorithms/Sort/selection.py new file mode 100644 index 0000000..12a13e4 --- /dev/null +++ b/Visualiser/Algorithms/Sort/selection.py @@ -0,0 +1,45 @@ +import pygame + +clk = pygame.time.Clock() + +def selection(draw, grid): + run = True + slow = True + + length = len(grid) + i = 0 + while i < length-1: + if not slow: + clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + l = i + for k in range(i + 1, length): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + if grid[k].value < grid[l].value: + l = k + if slow: + grid[k].make_red() + grid[l].make_red() + draw() + if l != i: + grid[l].value, grid[i].value = grid[i].value, grid[l].value + grid[l].make_red() + grid[i].make_red() + draw() + i += 1 + + return True, True \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/shell.py b/Visualiser/Algorithms/Sort/shell.py new file mode 100644 index 0000000..1969507 --- /dev/null +++ b/Visualiser/Algorithms/Sort/shell.py @@ -0,0 +1,62 @@ +import pygame + +clk = pygame.time.Clock() + +def shell(draw, grid): + temp = [i.value for i in grid] + run = True + slow = True + + length = len(grid) + + gaps = [701, 301, 132, 57, 23, 10, 4, 1] + + for gap in gaps: + + if not slow: + clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + + for i in range(gap, length): + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + + j = i + while j >= gap and temp[j] < temp[j - gap]: + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + + temp[j], temp[j - gap] = temp[j - gap], temp[j] + grid[j].value, grid[j - gap].value = temp[j], temp[j - gap] + grid[j].make_red() + grid[j - gap].make_red() + if slow: + draw() + j -= gap + if not slow: + draw() + + + + return True, True \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/sleep.py b/Visualiser/Algorithms/Sort/sleep.py new file mode 100644 index 0000000..5c9a2ed --- /dev/null +++ b/Visualiser/Algorithms/Sort/sleep.py @@ -0,0 +1,41 @@ +from threading import Timer +from time import sleep +import pygame + +clk = pygame.time.Clock() + +def sleepsort(draw, grid): + temp = [i.value for i in grid] + run = True + + sleepsort.result = [] + + def append_to_result(x, grid, draw): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + exit() + + sleepsort.result.append(x) + ind = sleepsort.result.index(x) + grid[ind].value = x + grid[ind].make_red() + draw() + + + mx = temp[0] + for value in temp: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + + if mx < value: + mx = value + Timer(value, append_to_result, [value, grid, draw]).start() + + pygame.time.wait((mx + 1)) + + return True, True + diff --git a/Visualiser/Algorithms/Sort/stooge.py b/Visualiser/Algorithms/Sort/stooge.py new file mode 100644 index 0000000..dd7f0f1 --- /dev/null +++ b/Visualiser/Algorithms/Sort/stooge.py @@ -0,0 +1,57 @@ +import pygame + +clk = pygame.time.Clock() + +def stooge(draw, grid): + temp = [i.value for i in grid] + run = True + slow = True + + length = len(temp) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + + stoogecal(draw, grid, temp, 0, length-1, slow) + if not slow: + draw() + + return True, True + +def stoogecal(draw, grid, temp, i, h, slow): + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False, False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True, False + if event.key == pygame.K_BACKSPACE: + slow = not slow + if i >= h: + return + + if temp[i] > temp[h]: + temp[i], temp[h] = temp[h], temp[i] + grid[h].value, grid[i].value = temp[h], temp[i] + grid[h].make_red() + grid[i].make_red() + if slow: + draw() + + + if h - i + 1 > 2: + t = (int)((h - i + 1) / 3) + + + stoogecal(draw, grid, temp, i, (h - t), slow) + + + stoogecal(draw, grid, temp, i + t, (h), slow) + + + stoogecal(draw, grid, temp, i, (h - t), slow) \ No newline at end of file diff --git a/Visualiser/Algorithms/Sort/wiggle.py b/Visualiser/Algorithms/Sort/wiggle.py new file mode 100644 index 0000000..2a8962a --- /dev/null +++ b/Visualiser/Algorithms/Sort/wiggle.py @@ -0,0 +1,34 @@ +import pygame + +clk = pygame.time.Clock() + +def wiggle(draw, grid): + temp = [i.value for i in grid] + run = True + slow = True + + length = len(grid) + i = 0 + while i < length: + if not slow: + clk.tick(30) + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + return True + if event.key == pygame.K_BACKSPACE: + slow = not slow + + if (i % 2 == 1) == (grid[i - 1].value > grid[i].value): + grid[i - 1].value, grid[i].value = grid[i].value, grid[i - 1].value + grid[i - 1].make_red() + grid[i].make_red() + if not slow: + draw() + if slow: + draw() + i += 1 + + return True \ No newline at end of file diff --git a/Visualiser/Algorithms/__init__.py b/Visualiser/Algorithms/__init__.py new file mode 100644 index 0000000..f51dfc5 --- /dev/null +++ b/Visualiser/Algorithms/__init__.py @@ -0,0 +1,3 @@ +from .Maze import * +from .Sort import * +from .Path import * \ No newline at end of file diff --git a/Visualiser/Utils/__init__.py b/Visualiser/Utils/__init__.py new file mode 100644 index 0000000..73e0670 --- /dev/null +++ b/Visualiser/Utils/__init__.py @@ -0,0 +1,3 @@ +from .button import button +from .lines import Line +from .nodes import Nodes \ No newline at end of file diff --git a/Visualiser/Utils/button.py b/Visualiser/Utils/button.py new file mode 100644 index 0000000..651cdaa --- /dev/null +++ b/Visualiser/Utils/button.py @@ -0,0 +1,61 @@ +import pygame +import os + +class button(): + def __init__(self, color, x,y,width,height, FILEPATH, textcolor, text='', size=60): + """Button Class + + Args: + color (tuple): Color (r, g, b) + x (int): Button top left coordinate + y (int): Button top left y coordinate + width (int): Button width in px + height (int): Button height in px + FILEPATH (str): File path for fonts file + textcolor (tuple): Text color in (r, g, b) + text (str, optional): Text inside button. Defaults to ''. + size (int, optional): Font size. Defaults to 60. + """ + self.color = color + self.x = x + self.y = y + self.width = width + self.height = height + self.text = text + self.filepath = FILEPATH + self.textcolor = textcolor + self.size = size + + def draw(self,win,outline=None): + """Call this method to draw the button on the screen + + Args: + win (pygame.Surface): Surface on which buttons are drawn + outline (tuple, optional): Button outline color(r, g, b). Defaults to None. + """ + if outline: + # To draw an outline draw a darker, larger rectangle behind the actual Button + # Size of the button is 4px hardcoded + pygame.draw.rect(win, outline, (self.x-2,self.y-2,self.width+4,self.height+4),0) + + pygame.draw.rect(win, self.color, (self.x,self.y,self.width,self.height),0) + + if self.text != '': + # Print text if mentioned + font = pygame.font.Font(os.path.join(self.filepath, 'Fonts', 'MaidenOrange.ttf'), self.size) + text = font.render(self.text, 1, self.textcolor) + win.blit(text, (self.x + (self.width/2 - text.get_width()/2), self.y + (self.height/2 - text.get_height()/2)+10)) + + def isOver(self, pos): + """Check if mouse is on top of the button or not to give hover effects. + + Args: + pos (tuple): position of (x, y) of mouse pointer. + + Returns: + Boolean: True if mouse is on top of button False otherwise. + """ + if pos[0] > self.x and pos[0] < self.x + self.width: + if pos[1] > self.y and pos[1] < self.y + self.height: + return True + return False \ No newline at end of file diff --git a/Visualiser/Utils/lines.py b/Visualiser/Utils/lines.py new file mode 100644 index 0000000..0c7d7e3 --- /dev/null +++ b/Visualiser/Utils/lines.py @@ -0,0 +1,78 @@ +import pygame + +from ..constants import * + +class Line(): + def __init__(self, x, no): + """Draw lines for sorting + + Args: + x (int): X coordinate + no (int): position number + """ + self.value = x + self.color = BLACK + self.flash = 0 + self.no = no + self.x = (no)*LINE_WIDTH + + def make_red(self): + """Change line color to red + """ + self.color = RED + self.flash = 1 + + def make_green(self): + """Change line color to Green + """ + self.color = GREEN + self.flash = 1 + + def reset(self): + """Change line color to Black + """ + self.color = BLACK + self.flash = 0 + + def change(self, val): + """Change the x coordinate and position value + + Args: + val (int): Position Value + """ + self.no = val + self.x = (val)*LINE_WIDTH + + def move(self, val): + k = self.no+1 + self.no = val-1 + self.x = (val-1)*LINE_WIDTH + return k + + def evalu(self, val): + """set value + + Args: + val (int): Value + """ + self.value = val + + def posvalue(self): + """Get position value and number + + Returns: + tuple: (position, no) + """ + return (self.value, self.no) + + def draw(self, win): + """Draw line on specified position + + Args: + win (pygame.Surface): Surface on which to draw + """ + if self.flash > 0: + self.flash -= 1 + elif self.flash == 0: + self.color = BLACK + pygame.draw.rect(win, self.color, (self.x, HEIGHT-LINE_HEIGHT*self.value, WIDTH, LINE_HEIGHT*self.value)) diff --git a/Visualiser/Utils/nodes.py b/Visualiser/Utils/nodes.py new file mode 100644 index 0000000..57abe25 --- /dev/null +++ b/Visualiser/Utils/nodes.py @@ -0,0 +1,388 @@ +import pygame + +from pygame import gfxdraw +from ..constants import * + + +class Nodes: + def __init__(self, row, col, width, total_rows, total_cols, mode): + """Graph node class for maze generation and path finding + + Args: + row (int): Row number of the node + col (int): Column number of the node + width (int): Width of each cell(considering squares have height as same as width) + total_rows (int): Total rows in the screen + total_cols (int): Total columns in the screen + mode (int): Speed of visualization -> Fast 1/0 Slow + """ + self.row = row + self.col = col + self.y = row * width + self.x = col * width + self.colour = WHITE + self.neighbours = [] + self.neighbournodes = [] + self.width = width + self.total_rows = total_rows + self.total_cols = total_cols + self.mode = mode + self.animator = 1 + self.prevcolour = None + + def get_pos(self): + """Get position of the current node + + Returns: + tuple: (row, column) + """ + return self.row, self.col + + def is_closed(self): + """Check if the node has been visited(Path Finding) + + Returns: + Bool: True if node is red false otherwise + """ + return self.colour == RED + + def is_open(self): + """Check if the node has not been visited(Path Finding) + + Returns: + Bool: True if node is white false otherwise + """ + return self.colour == GREEN + + def is_barrier(self): + """Check if the node is a wall(Path Finding) + + Returns: + Bool: True if node is black false otherwise + """ + return self.colour == BLACK + + def is_start(self): + """Check if the node is start node (Path Finding) + + Returns: + Bool: True if node is orange false otherwise + """ + return self.colour == ORANGE + + def is_end(self): + """Check if the node is end node (Path Finding) + + Returns: + Bool: True if node is Turquoise false otherwise + """ + return self.colour == TURQUOISE + + def reset(self): + """Reset Node + """ + self.colour = WHITE + self.animator = 7 + + def make_closed(self): + """Mark node as visited + """ + self.colour = RED + self.animator = 7 + + def make_open(self): + """Mark node as to be visited next + """ + self.colour = GREEN + self.animator = 7 + + def make_barrier(self): + """Mark node as barrier + """ + self.colour = BLACK + self.animator = 7 + + def barrier(self): + """Mark node as barrier without animation + """ + self.colour = BLACK + + def make_start(self): + """Set node as start node for pathfinding + """ + self.colour = ORANGE + self.animator = 7 + + def make_end(self): + """Set node as end node for pathfinding + """ + self.colour = TURQUOISE + self.animator = 7 + + def make_path(self): + """Mark node as part of the path + """ + self.colour = PURPLE + self.animator = 7 + + def remove_barrier(self): + """Remove barrier and make way + """ + self.colour = WHITE + self.animator = 8 + + def leader(self): + """Mark node at current iteration in backtracking + """ + self.colour = GREEN + + def tracker(self): + """Set yello color on nodes in stack in backtracking + """ + self.colour = YELLOW + self.animator = 8 + + def wil1(self): + """Marker for node in current iteration in wilson's algo + """ + self.colour = LIGHTGREEN2 + self.animator = 1 + + def wil2(self): + """Marker for visited set in wilson's algo + """ + self.colour = LIGHTRED2 + self.animator = 1 + + def open_prev(self): + """Set previous color for flash animation + """ + self.prevcolour = self.colour + self.colour = LIGHTGREEN + + def if_open_prev(self): + """Check if flash is enabled + + Returns: + Boolean: True if flash color else false + """ + return self.colour == LIGHTGREEN + + def do_open_prev(self): + """set back original color after flash + """ + if self.prevcolour: + self.colour = self.prevcolour + self.prevcolour = None + + def getwil1(self): + """Wilson algo exclusive + + Returns: + bool: True if color is light green + """ + return self.colour == LIGHTGREEN2 + + def getwil2(self): + """Wilson algo exclusive + + Returns: + bool: True if color is light red + """ + return self.colour == LIGHTRED2 + + def draw(self, win): + """Draw nodes + + Args: + win (pygame.Surface): Surface on which node is drawn + """ + noskip = True + if self.mode == 1 and (self.colour == RED or self.colour == GREEN): + self.colour = WHITE + if self.animator == 8: + pygame.draw.rect(win, LIGHTGREEN, (self.x, self.y, self.width, self.width)) + # self.aa_round_rect(win, LIGHTGREEN, (self.x, self.y, self.width, self.width), 30) + noskip = False + if self.animator == 7 and (self.colour != WHITE or self.colour != YELLOW): + pygame.draw.rect(win, WHITE, (self.x, self.y, self.width, self.width)) + # self.aa_round_rect(win, WHITE, (self.x, self.y, self.width, self.width), 30) + gap = self.width / self.animator + pos = (self.width - gap) / 2 + if noskip: + pygame.draw.rect(win, self.colour, (self.x + pos, self.y + pos, gap, gap)) + # self.aa_round_rect(win, self.colour, (self.x, self.y, self.width, self.width), 30) + if self.animator > 1: + self.animator -= 1 + if self.prevcolour: + self.colour = self.prevcolour + self.prevcolour = None + + def drawwil(self, win): + """Wilson exclusive draw function for drawing random path nodes + + Args: + win (pygame.Surface): Surface on which node is drawn + """ + noskip = True + if self.mode == 1 and (self.colour == RED or self.colour == GREEN): + self.colour = WHITE + if self.animator == 8: + pygame.draw.rect(win, LIGHTGREEN, (self.x, self.y, self.width, self.width)) + # self.round_rect(win, LIGHTGREEN, (self.x, self.y, self.width, self.width)) + noskip = False + if self.animator == 7 and (self.colour != WHITE or self.colour != LIGHTRED): + pygame.draw.rect(win, WHITE, (self.x, self.y, self.width, self.width)) + # self.round_rect(win, WHITE, (self.x, self.y, self.width, self.width)) + gap = self.width / self.animator + pos = (self.width - gap) / 2 + if noskip: + pygame.draw.rect(win, self.colour, (self.x + pos, self.y + pos, gap, gap)) + # self.round_rect(win, self.colour, (self.x, self.y, self.width, self.width)) + + if self.animator > 1: + self.animator -= 1 + if self.prevcolour: + self.colour = self.prevcolour + self.prevcolour = None + + def invert(self): + """Invert colors black and white + """ + if self.colour == BLACK: + self.colour = WHITE + elif self.colour == WHITE: + self.colour = BLACK + + def update_neighbours(self, grid): + """Add neighbours to current node + + Args: + grid (list of lists): All node objects on the screen in 2D list + """ + self.neighbours = [] + if self.row < self.total_rows - 1 and not grid[self.row + 1][self.col].is_barrier(): # down + self.neighbours.append(grid[self.row + 1][self.col]) + + if self.row > 0 and not grid[self.row - 1][self.col].is_barrier(): # up + self.neighbours.append(grid[self.row - 1][self.col]) + + if self.col < self.total_cols - 1 and not grid[self.row][self.col + 1].is_barrier(): # right + self.neighbours.append(grid[self.row][self.col + 1]) + + if self.col > 0 and not grid[self.row][self.col - 1].is_barrier(): # left + self.neighbours.append(grid[self.row][self.col - 1]) + + def neighbour_node(self, grid): + """Add neighbours to current node + + Args: + grid (list of lists): All node objects on the screen in 2D list + """ + self.neighbournodes = [] + if self.row % 2 == 1 and self.col % 2 == 1: + if self.row < self.total_rows - 1: # down + self.neighbours.append(grid[self.row + 2][self.col]) + + if self.row > 0: # up + self.neighbours.append(grid[self.row - 2][self.col]) + + if self.col < self.total_cols - 1: # right + self.neighbours.append(grid[self.row][self.col + 2]) + + if self.col > 0: # left + self.neighbours.append(grid[self.row][self.col - 2]) + + def __lt__(self, other): + """Magic function + """ + return False + + + + def draw_rounded_rect(self, surface, color, rect, corner_radius): + ''' Draw a rectangle with rounded corners. + Would prefer this: + pygame.draw.rect(surface, color, rect, border_radius=corner_radius) + but this option is not yet supported in my version of pygame so do it ourselves. + + We use anti-aliased circles to make the corners smoother + Works for pygame 2.0.0+ + ''' + if rect.width < 2 * corner_radius or rect.height < 2 * corner_radius: + raise ValueError(f"Both height (rect.height) and width (rect.width) must be > 2 * corner radius ({corner_radius})") + + # need to use anti aliasing circle drawing routines to smooth the corners + pygame.gfxdraw.aacircle(surface, rect.left+corner_radius, rect.top+corner_radius, corner_radius, color) + pygame.gfxdraw.aacircle(surface, rect.right-corner_radius-1, rect.top+corner_radius, corner_radius, color) + pygame.gfxdraw.aacircle(surface, rect.left+corner_radius, rect.bottom-corner_radius-1, corner_radius, color) + pygame.gfxdraw.aacircle(surface, rect.right-corner_radius-1, rect.bottom-corner_radius-1, corner_radius, color) + + pygame.gfxdraw.filled_circle(surface, rect.left+corner_radius, rect.top+corner_radius, corner_radius, color) + pygame.gfxdraw.filled_circle(surface, rect.right-corner_radius-1, rect.top+corner_radius, corner_radius, color) + pygame.gfxdraw.filled_circle(surface, rect.left+corner_radius, rect.bottom-corner_radius-1, corner_radius, color) + pygame.gfxdraw.filled_circle(surface, rect.right-corner_radius-1, rect.bottom-corner_radius-1, corner_radius, color) + + rect_tmp = pygame.Rect(rect) + + rect_tmp.width -= 2 * corner_radius + rect_tmp.center = rect.center + pygame.draw.rect(surface, color, rect_tmp) + + rect_tmp.width = rect.width + rect_tmp.height -= 2 * corner_radius + rect_tmp.center = rect.center + pygame.draw.rect(surface, color, rect_tmp) + + + def round_rect(self, surface, color, rect, rad=20, border=0, inside=(0,0,0,0)): + """ + Draw a rect with rounded corners to surface. Argument rad can be specified + to adjust curvature of edges (given in pixels). An optional border + width can also be supplied; if not provided the rect will be filled. + Both the color and optional interior color (the inside argument) support + alpha. + """ + rect = pygame.Rect(rect) + zeroed_rect = rect.copy() + zeroed_rect.topleft = 0,0 + image = pygame.Surface(rect.size).convert_alpha() + image.fill((0,0,0,0)) + self._render_region(image, zeroed_rect, color, rad) + if border: + zeroed_rect.inflate_ip(-2*border, -2*border) + self._render_region(image, zeroed_rect, inside, rad) + surface.blit(image, rect) + + + def _render_region(self, image, rect, color, rad): + """Helper function for round_rect.""" + corners = rect.inflate(-2*rad, -2*rad) + for attribute in ("topleft", "topright", "bottomleft", "bottomright"): + pygame.draw.circle(image, color, getattr(corners,attribute), rad) + image.fill(color, rect.inflate(-2*rad,0)) + image.fill(color, rect.inflate(0,-2*rad)) + + + def aa_round_rect(self, surface, color, rect, rad=20, border=0, inside=(0,0,0)): + """ + Draw an antialiased rounded rect on the target surface. Alpha is not + supported in this implementation but other than that usage is identical to + round_rect. + """ + rect = pygame.Rect(rect) + self._aa_render_region(surface, rect, color, rad) + if border: + rect.inflate_ip(-2*border, -2*border) + self._aa_render_region(surface, rect, inside, rad) + + + def _aa_render_region(self, image, rect, color, rad): + """Helper function for aa_round_rect.""" + corners = rect.inflate(-2*rad-1, -2*rad-1) + for attribute in ("topleft", "topright", "bottomleft", "bottomright"): + x, y = getattr(corners, attribute) + gfxdraw.aacircle(image, x, y, rad, color) + gfxdraw.filled_circle(image, x, y, rad, color) + image.fill(color, rect.inflate(-2*rad,0)) + image.fill(color, rect.inflate(0,-2*rad)) \ No newline at end of file diff --git a/Visualiser/__init__.py b/Visualiser/__init__.py new file mode 100644 index 0000000..f0de37e --- /dev/null +++ b/Visualiser/__init__.py @@ -0,0 +1,3 @@ +from .Algorithms import * +from .Utils import * +from .constants import * \ No newline at end of file diff --git a/Visualiser/constants.py b/Visualiser/constants.py new file mode 100644 index 0000000..887dd39 --- /dev/null +++ b/Visualiser/constants.py @@ -0,0 +1,43 @@ +# -------------------------------------------------- +# Colours +# -------------------------------------------------- + +RED = (255,0,0) +GREEN = (0,255,0) +BLUE = (0,0,255) +YELLOW = (255,255,0) +WHITE = (255,255,255) +BLACK = (0,0,0) +PURPLE = (128,0,128) +ORANGE = (255,165,0) +GREY = (128,128,128) +TURQUOISE = (64,224,208) +LIGHTGREEN = (50,205,50) +LIGHTRED = (255, 127, 127) +LIGHTGREEN2 = (55,205,55) +LIGHTRED2 = (255, 130, 130) + +# -------------------------------------------------- +# DIMENTIONS +# -------------------------------------------------- + +WIDTH = 1584 +COLUMNS = 99 + +HEIGHT = 784 +ROWS = 49 + +MAZE_ABSOLUTE_ROWS, MAZE_ABSOLUTE_COLUMNS = 24, 49 + +# -------------------------------------------------- +# SORTING LINE DIMENTIONS +# -------------------------------------------------- + +LINE_WIDTH = 1584/256 +LINE_HEIGHT = 784/256 + +import os +FILEPATH = os.getcwd() +ICON = os.path.join(FILEPATH, 'Fonts', 'icon.png') +HELP1 = os.path.join(FILEPATH, 'Fonts', 'Help1.png') +HELP2 = os.path.join(FILEPATH, 'Fonts', 'Help2.png') \ No newline at end of file From 4b82e794a33d29df929b8594a24516c60984cdde Mon Sep 17 00:00:00 2001 From: ShriramShagi Date: Sun, 18 Jul 2021 12:12:54 +0530 Subject: [PATCH 4/4] hotfix --- Visualiser/Algorithms/Maze/wilson.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Visualiser/Algorithms/Maze/wilson.py b/Visualiser/Algorithms/Maze/wilson.py index ea57d8f..f48877e 100644 --- a/Visualiser/Algorithms/Maze/wilson.py +++ b/Visualiser/Algorithms/Maze/wilson.py @@ -1,10 +1,8 @@ import pygame + from random import randint, shuffle, choice -row = 24 -col = 49 -LIGHTGREEN = (55,205,55) -LIGHTRED = (255, 130, 130) +from ...constants import MAZE_ABSOLUTE_ROWS as row, MAZE_ABSOLUTE_COLUMNS as col, LIGHTGREEN, LIGHTRED d = ['n', 's', 'e', 'w'] clk = pygame.time.Clock()