diff --git a/src/main/java/dotsandboxes/DotsAndBoxesUI.java~ b/src/main/java/dotsandboxes/DotsAndBoxesUI.java~
new file mode 100644
index 0000000000000000000000000000000000000000..9456da2afe1eb7703e3960455ba76cbfa95f423b
--- /dev/null
+++ b/src/main/java/dotsandboxes/DotsAndBoxesUI.java~
@@ -0,0 +1,200 @@
+package dotsandboxes;
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.event.MouseInputAdapter;
+import java.util.ArrayList;
+
+public class DotsAndBoxesUI {
+
+    static final int lineLength = 32;
+    static final int margin = 10;
+    static final int gap = 0;
+    static final int dotDiameter = 6;
+
+    // The coordinate of the top or left of a the painting area for this row/col
+    private static int corner(int col) {
+        return margin + col * (gap + lineLength + gap + dotDiameter);
+    }
+
+    /** Colours for the different players. Only goes up to 5. */
+    static final Color[] playerColours = { Color.WHITE, Color.RED, Color.BLUE, Color.GREEN, Color.PINK, Color.ORANGE };
+
+    final DotsAndBoxesGrid grid;
+    final JPanel anchorPane;
+    final Canvas canvas;
+    final JLabel label;
+
+    private void updateLabel() {
+        label.setForeground(playerColours[grid.getPlayer()]);
+        label.setText(String.format("Player %d's turn", grid.getPlayer()));
+    }
+
+    public DotsAndBoxesUI(final DotsAndBoxesGrid grid) {
+        this.grid = grid;
+        anchorPane = new JPanel(new BorderLayout());
+
+        label = new JLabel("Dots and Boxes by Yash Raosaheb Aringale");
+        updateLabel();
+
+        canvas = new DABCanvas();
+
+        anchorPane.add(canvas, BorderLayout.CENTER);
+        anchorPane.add(label, BorderLayout.NORTH);
+
+        grid.addConsumer((g) -> {
+            updateLabel();
+            canvas.repaint();
+        });
+    }
+
+    /** A component that paints and handles clicks on the game */
+    class DABCanvas extends Canvas {
+
+        final ArrayList<Horizontal> horizontals = new ArrayList<>();
+        final ArrayList<Vertical> verticals = new ArrayList<>();
+        final ArrayList<Box> boxes = new ArrayList<>();
+
+        /** Represents a horizontal line. */
+        record Horizontal(int col, int row) {
+            Rectangle rect() {
+                int x = corner(col) + dotDiameter + gap;
+                int y = corner(row);
+                return new Rectangle(x, y, lineLength, dotDiameter);
+            }
+
+            /** Whether or not this line contains this point */
+            boolean contains(int x, int y) {
+                return rect().contains(x, y);
+            }
+
+            /** Paints this element, based on the passed in grid */
+            public void draw(DotsAndBoxesGrid grid, Graphics2D g2d) {
+                g2d.setColor(grid.getHorizontal(col, row) ? Color.DARK_GRAY : Color.LIGHT_GRAY);
+                g2d.fill(this.rect());
+            }
+        }
+
+        /** Represents a horizontal line. */
+        record Vertical(int col, int row) {
+            Rectangle rect() {
+                int x = corner(col);
+                int y = corner(row) + dotDiameter + gap;
+                return new Rectangle(x, y, dotDiameter, lineLength);
+            }
+
+            /** Whether or not this line contains this point */
+            boolean contains(int x, int y) {
+                return rect().contains(x, y);
+            }
+
+            /** Paints this element, based on the passed in grid */
+            public void draw(DotsAndBoxesGrid grid, Graphics2D g2d) {
+                g2d.setColor(grid.getVertical(col, row) ? Color.DARK_GRAY : Color.LIGHT_GRAY);
+                g2d.fill(this.rect());
+            }
+        }
+
+        /** represents a box */
+        record Box(int col, int row) {
+            Rectangle rect() {
+                int x = corner(col) + dotDiameter + gap;
+                int y = corner(row) + dotDiameter + gap;
+                return new Rectangle(x, y, lineLength, lineLength);
+            }
+
+            /** Whether or not this line contains this point */
+            boolean contains(int x, int y) {
+                return rect().contains(x, y);
+            }
+
+            /** Paints this element, based on the passed in grid */
+            public void draw(DotsAndBoxesGrid grid, Graphics2D g2d) {
+                g2d.setColor(playerColours[grid.getBoxOwner(col, row)]);
+                g2d.fill(this.rect());
+            }
+        }
+
+
+        public DABCanvas() {
+            // Size the canvas to just contain the elements
+            int width = corner(grid.width) + margin;
+            int height = corner(grid.height) + margin;
+            this.setPreferredSize(new Dimension(width, height));
+
+            // Create records for the boxes
+            for (int row = 0; row < grid.height - 1; row++) {
+                for (int col = 0; col < grid.width - 1; col++) {
+                    boxes.add(new Box(col, row));
+                }
+            }
+
+            // Create records for horizontals
+            for (int row = 0; row < grid.height; row++) {
+                for (int col = 0; col < grid.width - 1; col++) {
+                    horizontals.add(new Horizontal(col, row));
+                }
+            }
+
+            // Create records for verticals
+            for (int row = 0; row < grid.height - 1; row++) {
+                for (int col = 0; col < grid.width; col++) {
+                    verticals.add(new Vertical(col, row));
+                }
+            }
+
+            addMouseListener(new MouseInputAdapter() {
+                @Override public void mousePressed(MouseEvent e) {
+                    for (Horizontal h : horizontals) {
+                        if (h.contains(e.getX(), e.getY())) {
+                            grid.drawHorizontal(h.col(), h.row(), grid.getPlayer());
+                        }
+                    }
+
+                    for (Vertical v : verticals) {
+                        if (v.contains(e.getX(), e.getY())) {
+                            grid.drawVertical(v.col(), v.row(), grid.getPlayer());
+                        }
+                    }
+                }        
+            });
+
+        }
+
+        @Override public void paint(Graphics g) {
+            Graphics2D g2d = (Graphics2D)g;
+            g.clearRect(0, 0, this.getWidth(), this.getHeight());
+            g2d.setColor(Color.WHITE);
+            g.fillRect(0, 0, this.getWidth(), this.getHeight());
+
+            // Paint the boxes
+            for (Box b : boxes) {
+                b.draw(grid, g2d);
+            }
+
+            // Paint the horizontals
+            for (Horizontal h : horizontals) {
+                h.draw(grid, g2d);
+            }
+
+            // Paint the boxes
+            for (Vertical v : verticals) {
+                v.draw(grid, g2d);
+            }
+
+            // Draw the dots
+            for (int row = 0; row < grid.height; row++) {
+                for (int col = 0; col < grid.width; col++) {
+                    g2d.setColor(Color.BLACK);
+                    g2d.fillOval(corner(col), corner(row), dotDiameter, dotDiameter);
+                }
+            }
+        }
+
+    }
+
+
+
+
+}