{"id":95,"date":"2025-12-05T16:33:19","date_gmt":"2025-12-05T16:33:19","guid":{"rendered":"https:\/\/theroyalscode.com\/students\/l_rankins\/?p=95"},"modified":"2025-12-05T16:33:19","modified_gmt":"2025-12-05T16:33:19","slug":"message-14-mlaggness","status":"publish","type":"post","link":"https:\/\/theroyalscode.com\/students\/l_rankins\/2025\/12\/05\/message-14-mlaggness\/","title":{"rendered":"MESSAGE 14: MLAGGNESS"},"content":{"rendered":"\n<p><strong>Today I made Tetris <\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from colors import Colors\nimport pygame\nfrom position import Position\n\nclass Block:\n\tdef __init__(self, id):\n\t\tself.id = id\n\t\tself.cells = {}\n\t\tself.cell_size = 30\n\t\tself.row_offset = 0\n\t\tself.column_offset = 0\n\t\tself.rotation_state = 0\n\t\tself.colors = Colors.get_cell_colors()\n\n\tdef move(self, rows, columns):\n\t\tself.row_offset += rows\n\t\tself.column_offset += columns\n\n\tdef get_cell_positions(self):\n\t\ttiles = self.cells&#91;self.rotation_state]\n\t\tmoved_tiles = &#91;]\n\t\tfor position in tiles:\n\t\t\tposition = Position(position.row + self.row_offset, position.column + self.column_offset)\n\t\t\tmoved_tiles.append(position)\n\t\treturn moved_tiles\n\n\tdef rotate(self):\n\t\tself.rotation_state += 1\n\t\tif self.rotation_state == len(self.cells):\n\t\t\tself.rotation_state = 0\n\n\tdef undo_rotation(self):\n\t\tself.rotation_state -= 1\n\t\tif self.rotation_state == -1:\n\t\t\tself.rotation_state = len(self.cells) - 1\n\n\tdef draw(self, screen, offset_x, offset_y):\n\t\ttiles = self.get_cell_positions()\n\t\tfor tile in tiles:\n\t\t\ttile_rect = pygame.Rect(offset_x + tile.column * self.cell_size, \n\t\t\t\toffset_y + tile.row * self.cell_size, self.cell_size -1, self.cell_size -1)\n\t\t\tpygame.draw.rect(screen, self.colors&#91;self.id], tile_rect)<\/code><\/pre>\n\n\n\n<p><strong>This is the code that draws what the blocks will look like and the color it also sets how it looks while rotated<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from block import Block\nfrom position import Position\n\nclass LBlock(Block):\n\tdef __init__(self):\n\t\tsuper().__init__(id = 1)\n\t\tself.cells = {\n\t\t\t0: &#91;Position(0, 2), Position(1, 0), Position(1, 1), Position(1, 2)],\n\t\t\t1: &#91;Position(0, 1), Position(1, 1), Position(2, 1), Position(2, 2)],\n\t\t\t2: &#91;Position(1, 0), Position(1, 1), Position(1, 2), Position(2, 0)],\n\t\t\t3: &#91;Position(0, 0), Position(0, 1), Position(1, 1), Position(2, 1)]\n\t\t}\n\t\tself.move(0, 3)\n\nclass JBlock(Block):\n    def __init__(self):\n        super().__init__(id = 2)\n        self.cells = {\n            0: &#91;Position(0, 0), Position(1, 0), Position(1, 1), Position(1, 2)],\n            1: &#91;Position(0, 1), Position(0, 2), Position(1, 1), Position(2, 1)],\n            2: &#91;Position(1, 0), Position(1, 1), Position(1, 2), Position(2, 2)],\n            3: &#91;Position(0, 1), Position(1, 1), Position(2, 0), Position(2, 1)]\n        }\n        self.move(0, 3)\n\nclass IBlock(Block):\n    def __init__(self):\n        super().__init__(id = 3)\n        self.cells = {\n            0: &#91;Position(1, 0), Position(1, 1), Position(1, 2), Position(1, 3)],\n            1: &#91;Position(0, 2), Position(1, 2), Position(2, 2), Position(3, 2)],\n            2: &#91;Position(2, 0), Position(2, 1), Position(2, 2), Position(2, 3)],\n            3: &#91;Position(0, 1), Position(1, 1), Position(2, 1), Position(3, 1)]\n        }\n        self.move(-1, 3)\n\nclass OBlock(Block):\n    def __init__(self):\n        super().__init__(id = 4)\n        self.cells = {\n            0: &#91;Position(0, 0), Position(0, 1), Position(1, 0), Position(1, 1)]\n        }\n        self.move(0, 4)\n\nclass SBlock(Block):\n    def __init__(self):\n        super().__init__(id = 5)\n        self.cells = {\n            0: &#91;Position(0, 1), Position(0, 2), Position(1, 0), Position(1, 1)],\n            1: &#91;Position(0, 1), Position(1, 1), Position(1, 2), Position(2, 2)],\n            2: &#91;Position(1, 1), Position(1, 2), Position(2, 0), Position(2, 1)],\n            3: &#91;Position(0, 0), Position(1, 0), Position(1, 1), Position(2, 1)]\n        }\n        self.move(0, 3)\n\nclass TBlock(Block):\n    def __init__(self):\n        super().__init__(id = 6)\n        self.cells = {\n            0: &#91;Position(0, 1), Position(1, 0), Position(1, 1), Position(1, 2)],\n            1: &#91;Position(0, 1), Position(1, 1), Position(1, 2), Position(2, 1)],\n            2: &#91;Position(1, 0), Position(1, 1), Position(1, 2), Position(2, 1)],\n            3: &#91;Position(0, 1), Position(1, 0), Position(1, 1), Position(2, 1)]\n        }\n        self.move(0, 3)\n\nclass ZBlock(Block):\n    def __init__(self):\n        super().__init__(id = 7)\n        self.cells = {\n            0: &#91;Position(0, 0), Position(0, 1), Position(1, 1), Position(1, 2)],\n            1: &#91;Position(0, 2), Position(1, 1), Position(1, 2), Position(2, 1)],\n            2: &#91;Position(1, 0), Position(1, 1), Position(2, 1), Position(2, 2)],\n            3: &#91;Position(0, 1), Position(1, 0), Position(1, 1), Position(2, 0)]\n        }\n        self.move(0, 3)<\/code><\/pre>\n\n\n\n<p><strong>This is the code that changes the Position of the blocks when you use the arrow keys<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Colors:\n\tdark_grey = (26, 31, 40)\n\tgreen = (47, 230, 23)\n\tred = (232, 18, 18)\n\torange = (226, 116, 17)\n\tyellow = (237, 234, 4)\n\tpurple = (166, 0, 247)\n\tcyan = (21, 204, 209)\n\tblue = (13, 64, 216)\n\twhite = (255, 255, 255)\n\tdark_blue = (44, 44, 127)\n\tlight_blue = (59, 85, 162)\n\n\t@classmethod\n\tdef get_cell_colors(cls):\n\t\treturn &#91;cls.dark_grey, cls.green, cls.red, cls.orange, cls.yellow, cls.purple, cls.cyan, cls.blue]\n<\/code><\/pre>\n\n\n\n<p><strong>This is the code that the blocks code randomly draws from for the colors of the blocks<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from grid import Grid\nfrom blocks import *\nimport random\nimport pygame\n\nclass Game:\n\tdef __init__(self):\n\t\tself.grid = Grid()\n\t\tself.blocks = &#91;IBlock(), JBlock(), LBlock(), OBlock(), SBlock(), TBlock(), ZBlock()]\n\t\tself.current_block = self.get_random_block()\n\t\tself.next_block = self.get_random_block()\n\t\tself.game_over = False\n\t\tself.score = 0\n\t\tself.rotate_sound = pygame.mixer.Sound(\"Sounds\/rotate.mp3\")\n\t\tself.clear_sound = pygame.mixer.Sound(\"Sounds\/clear.mp3\")\n\n\t\tpygame.mixer.music.load(\"Sounds\/music.mp3\")\n\t\tpygame.mixer.music.play(-1)\n\n\tdef update_score(self, lines_cleared, move_down_points):\n\t\tif lines_cleared == 1:\n\t\t\tself.score += 100\n\t\telif lines_cleared == 2:\n\t\t\tself.score += 300\n\t\telif lines_cleared == 3:\n\t\t\tself.score += 500\n\t\tself.score += move_down_points\n\n\tdef get_random_block(self):\n\t\tif len(self.blocks) == 0:\n\t\t\tself.blocks = &#91;IBlock(), JBlock(), LBlock(), OBlock(), SBlock(), TBlock(), ZBlock()]\n\t\tblock = random.choice(self.blocks)\n\t\tself.blocks.remove(block)\n\t\treturn block\n\n\tdef move_left(self):\n\t\tself.current_block.move(0, -1)\n\t\tif self.block_inside() == False or self.block_fits() == False:\n\t\t\tself.current_block.move(0, 1)\n\n\tdef move_right(self):\n\t\tself.current_block.move(0, 1)\n\t\tif self.block_inside() == False or self.block_fits() == False:\n\t\t\tself.current_block.move(0, -1)\n\n\tdef move_down(self):\n\t\tself.current_block.move(1, 0)\n\t\tif self.block_inside() == False or self.block_fits() == False:\n\t\t\tself.current_block.move(-1, 0)\n\t\t\tself.lock_block()\n\n\tdef lock_block(self):\n\t\ttiles = self.current_block.get_cell_positions()\n\t\tfor position in tiles:\n\t\t\tself.grid.grid&#91;position.row]&#91;position.column] = self.current_block.id\n\t\tself.current_block = self.next_block\n\t\tself.next_block = self.get_random_block()\n\t\trows_cleared = self.grid.clear_full_rows()\n\t\tif rows_cleared > 0:\n\t\t\tself.clear_sound.play()\n\t\t\tself.update_score(rows_cleared, 0)\n\t\tif self.block_fits() == False:\n\t\t\tself.game_over = True\n\n\tdef reset(self):\n\t\tself.grid.reset()\n\t\tself.blocks = &#91;IBlock(), JBlock(), LBlock(), OBlock(), SBlock(), TBlock(), ZBlock()]\n\t\tself.current_block = self.get_random_block()\n\t\tself.next_block = self.get_random_block()\n\t\tself.score = 0\n\n\tdef block_fits(self):\n\t\ttiles = self.current_block.get_cell_positions()\n\t\tfor tile in tiles:\n\t\t\tif self.grid.is_empty(tile.row, tile.column) == False:\n\t\t\t\treturn False\n\t\treturn True\n\n\tdef rotate(self):\n\t\tself.current_block.rotate()\n\t\tif self.block_inside() == False or self.block_fits() == False:\n\t\t\tself.current_block.undo_rotation()\n\t\telse:\n\t\t\tself.rotate_sound.play()\n\n\tdef block_inside(self):\n\t\ttiles = self.current_block.get_cell_positions()\n\t\tfor tile in tiles:\n\t\t\tif self.grid.is_inside(tile.row, tile.column) == False:\n\t\t\t\treturn False\n\t\treturn True\n\n\tdef draw(self, screen):\n\t\tself.grid.draw(screen)\n\t\tself.current_block.draw(screen, 11, 11)\n\n\t\tif self.next_block.id == 3:\n\t\t\tself.next_block.draw(screen, 255, 290)\n\t\telif self.next_block.id == 4:\n\t\t\tself.next_block.draw(screen, 255, 280)\n\t\telse:\n\t\t\tself.next_block.draw(screen, 270, 270)<\/code><\/pre>\n\n\n\n<p><strong>This is the code that draws all the bricks, play sounds and decide the rotated look of the bricks<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import pygame\nfrom colors import Colors\n\nclass Grid:\n\tdef __init__(self):\n\t\tself.num_rows = 20\n\t\tself.num_cols = 10\n\t\tself.cell_size = 30\n\t\tself.grid = &#91;&#91;0 for j in range(self.num_cols)] for i in range(self.num_rows)]\n\t\tself.colors = Colors.get_cell_colors()\n\n\tdef print_grid(self):\n\t\tfor row in range(self.num_rows):\n\t\t\tfor column in range(self.num_cols):\n\t\t\t\tprint(self.grid&#91;row]&#91;column], end = \" \")\n\t\t\tprint()\n\n\tdef is_inside(self, row, column):\n\t\tif row >= 0 and row &lt; self.num_rows and column >= 0 and column &lt; self.num_cols:\n\t\t\treturn True\n\t\treturn False\n\n\tdef is_empty(self, row, column):\n\t\tif self.grid&#91;row]&#91;column] == 0:\n\t\t\treturn True\n\t\treturn False\n\n\tdef is_row_full(self, row):\n\t\tfor column in range(self.num_cols):\n\t\t\tif self.grid&#91;row]&#91;column] == 0:\n\t\t\t\treturn False\n\t\treturn True\n\n\tdef clear_row(self, row):\n\t\tfor column in range(self.num_cols):\n\t\t\tself.grid&#91;row]&#91;column] = 0\n\n\tdef move_row_down(self, row, num_rows):\n\t\tfor column in range(self.num_cols):\n\t\t\tself.grid&#91;row+num_rows]&#91;column] = self.grid&#91;row]&#91;column]\n\t\t\tself.grid&#91;row]&#91;column] = 0\n\n\tdef clear_full_rows(self):\n\t\tcompleted = 0\n\t\tfor row in range(self.num_rows-1, 0, -1):\n\t\t\tif self.is_row_full(row):\n\t\t\t\tself.clear_row(row)\n\t\t\t\tcompleted += 1\n\t\t\telif completed > 0:\n\t\t\t\tself.move_row_down(row, completed)\n\t\treturn completed\n\n\tdef reset(self):\n\t\tfor row in range(self.num_rows):\n\t\t\tfor column in range(self.num_cols):\n\t\t\t\tself.grid&#91;row]&#91;column] = 0\n\n\tdef draw(self, screen):\n\t\tfor row in range(self.num_rows):\n\t\t\tfor column in range(self.num_cols):\n\t\t\t\tcell_value = self.grid&#91;row]&#91;column]\n\t\t\t\tcell_rect = pygame.Rect(column*self.cell_size + 11, row*self.cell_size + 11,\n\t\t\t\tself.cell_size -1, self.cell_size -1)\n\t\t\t\tpygame.draw.rect(screen, self.colors&#91;cell_value], cell_rect)\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>import pygame\nfrom colors import Colors\n\nclass Grid:\n\tdef __init__(self):\n\t\tself.num_rows = 20\n\t\tself.num_cols = 10\n\t\tself.cell_size = 30\n\t\tself.grid = &#91;&#91;0 for j in range(self.num_cols)] for i in range(self.num_rows)]\n\t\tself.colors = Colors.get_cell_colors()\n\n\tdef print_grid(self):\n\t\tfor row in range(self.num_rows):\n\t\t\tfor column in range(self.num_cols):\n\t\t\t\tprint(self.grid&#91;row]&#91;column], end = \" \")\n\t\t\tprint()\n\n\tdef is_inside(self, row, column):\n\t\tif row >= 0 and row &lt; self.num_rows and column >= 0 and column &lt; self.num_cols:\n\t\t\treturn True\n\t\treturn False\n\n\tdef is_empty(self, row, column):\n\t\tif self.grid&#91;row]&#91;column] == 0:\n\t\t\treturn True\n\t\treturn False\n\n\tdef is_row_full(self, row):\n\t\tfor column in range(self.num_cols):\n\t\t\tif self.grid&#91;row]&#91;column] == 0:\n\t\t\t\treturn False\n\t\treturn True\n\n\tdef clear_row(self, row):\n\t\tfor column in range(self.num_cols):\n\t\t\tself.grid&#91;row]&#91;column] = 0\n\n\tdef move_row_down(self, row, num_rows):\n\t\tfor column in range(self.num_cols):\n\t\t\tself.grid&#91;row+num_rows]&#91;column] = self.grid&#91;row]&#91;column]\n\t\t\tself.grid&#91;row]&#91;column] = 0\n\n\tdef clear_full_rows(self):\n\t\tcompleted = 0\n\t\tfor row in range(self.num_rows-1, 0, -1):\n\t\t\tif self.is_row_full(row):\n\t\t\t\tself.clear_row(row)\n\t\t\t\tcompleted += 1\n\t\t\telif completed > 0:\n\t\t\t\tself.move_row_down(row, completed)\n\t\treturn completed\n\n\tdef reset(self):\n\t\tfor row in range(self.num_rows):\n\t\t\tfor column in range(self.num_cols):\n\t\t\t\tself.grid&#91;row]&#91;column] = 0\n\n\tdef draw(self, screen):\n\t\tfor row in range(self.num_rows):\n\t\t\tfor column in range(self.num_cols):\n\t\t\t\tcell_value = self.grid&#91;row]&#91;column]\n\t\t\t\tcell_rect = pygame.Rect(column*self.cell_size + 11, row*self.cell_size + 11,\n\t\t\t\tself.cell_size -1, self.cell_size -1)\n\t\t\t\tpygame.draw.rect(screen, self.colors&#91;cell_value], cell_rect)<\/code><\/pre>\n\n\n\n<p><strong>This one draws the grid that the bricks are in<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import pygame,sys\nfrom game import Game\nfrom colors import Colors\n\npygame.init()\n\ntitle_font = pygame.font.Font(None, 40)\nscore_surface = title_font.render(\"Score\", True, Colors.white)\nnext_surface = title_font.render(\"Next\", True, Colors.white)\ngame_over_surface = title_font.render(\"GAME OVER\", True, Colors.white)\n\nscore_rect = pygame.Rect(320, 55, 170, 60)\nnext_rect = pygame.Rect(320, 215, 170, 180)\n\nscreen = pygame.display.set_mode((500, 620))\npygame.display.set_caption(\"Python Tetris\")\n\nclock = pygame.time.Clock()\n\ngame = Game()\n\nGAME_UPDATE = pygame.USEREVENT\npygame.time.set_timer(GAME_UPDATE, 200)\n\nwhile True:\n\tfor event in pygame.event.get():\n\t\tif event.type == pygame.QUIT:\n\t\t\tpygame.quit()\n\t\t\tsys.exit()\n\t\tif event.type == pygame.KEYDOWN:\n\t\t\tif game.game_over == True:\n\t\t\t\tgame.game_over = False\n\t\t\t\tgame.reset()\n\t\t\tif event.key == pygame.K_LEFT and game.game_over == False:\n\t\t\t\tgame.move_left()\n\t\t\tif event.key == pygame.K_RIGHT and game.game_over == False:\n\t\t\t\tgame.move_right()\n\t\t\tif event.key == pygame.K_DOWN and game.game_over == False:\n\t\t\t\tgame.move_down()\n\t\t\t\tgame.update_score(0, 1)\n\t\t\tif event.key == pygame.K_UP and game.game_over == False:\n\t\t\t\tgame.rotate()\n\t\tif event.type == GAME_UPDATE and game.game_over == False:\n\t\t\tgame.move_down()\n\n\t#Drawing\n\tscore_value_surface = title_font.render(str(game.score), True, Colors.white)\n\n\tscreen.fill(Colors.dark_blue)\n\tscreen.blit(score_surface, (365, 20, 50, 50))\n\tscreen.blit(next_surface, (375, 180, 50, 50))\n\n\tif game.game_over == True:\n\t\tscreen.blit(game_over_surface, (320, 450, 50, 50))\n\n\tpygame.draw.rect(screen, Colors.light_blue, score_rect, 0, 10)\n\tscreen.blit(score_value_surface, score_value_surface.get_rect(centerx = score_rect.centerx, \n\t\tcentery = score_rect.centery))\n\tpygame.draw.rect(screen, Colors.light_blue, next_rect, 0, 10)\n\tgame.draw(screen)\n\n\tpygame.display.update()\n\tclock.tick(60)<\/code><\/pre>\n\n\n\n<p><strong>This one is the main, it pulls all the other codes together into one thing, it also makes the bricks disappear when you get a row and the game over and the score<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Position:\n\tdef __init__(self, row, column):\n\t\tself.row = row\n\t\tself.column = column<\/code><\/pre>\n\n\n\n<p><strong>This is just the Position of the rows and columns<\/strong><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Today I made Tetris This is the code that draws what the blocks will look like and the color it [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-95","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/theroyalscode.com\/students\/l_rankins\/wp-json\/wp\/v2\/posts\/95","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/theroyalscode.com\/students\/l_rankins\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/theroyalscode.com\/students\/l_rankins\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/theroyalscode.com\/students\/l_rankins\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/theroyalscode.com\/students\/l_rankins\/wp-json\/wp\/v2\/comments?post=95"}],"version-history":[{"count":1,"href":"https:\/\/theroyalscode.com\/students\/l_rankins\/wp-json\/wp\/v2\/posts\/95\/revisions"}],"predecessor-version":[{"id":96,"href":"https:\/\/theroyalscode.com\/students\/l_rankins\/wp-json\/wp\/v2\/posts\/95\/revisions\/96"}],"wp:attachment":[{"href":"https:\/\/theroyalscode.com\/students\/l_rankins\/wp-json\/wp\/v2\/media?parent=95"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/theroyalscode.com\/students\/l_rankins\/wp-json\/wp\/v2\/categories?post=95"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/theroyalscode.com\/students\/l_rankins\/wp-json\/wp\/v2\/tags?post=95"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}