This tiny Flow clone, in just under 100 lines of Processing (~4000 characters). Click on a circle and drag a path to another circle of the same color. Once all circles are connected, you win! (Due to how click/drag works on phones, please play this on a computer)
The code uses a two dimensional array to encode the board, where zeros represent empty spots and other numbers represent the locations of circles. Negative numbers encode the “pipes”, or connections between circles.
You can edit and run this code on the KTBYTE Coder
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
int[][] board = { {0, 1, 0, 0, 0, 0, 0, 2}, {0, 3, 0, 0, 0, 0, 4, 0}, {0, 0, 0, 0, 5, 0, 6, 0}, {0, 0, 0, 6, 0, 0, 2, 0}, {0, 0, 0, 1, 7, 0, 0, 0}, {0, 3, 4, 0, 0, 0, 7, 0}, {0, 0, 0, 0, 5, 0, 0, 0}, {8, 0, 0, 0, 0, 0, 0, 8} }; int gw = 50,startx, starty, curx, cury; boolean selected = false, won = false; color numToColor(int num) { if (num==1) return color(0, 0, 255); if (num==2) return color(255, 0, 0); if (num==3) return color(255, 100, 0); if (num==4) return color(0, 255, 0); if (num==5) return color(0, 255, 255); if (num==6) return color(255, 0, 255); if (num==7) return color(255, 255, 0); if (num==8) return color(50, 0, 100); return color(255); } void setup() { size(400,400); size(board[0].length*gw, board.length*gw); ellipseMode(CORNER); } void drawboard() { for (int j=0;j<board.length;j++) { for (int i=0;i<board[j].length;i++) { int x = i*gw,y = j*gw; fill(0); stroke(100); rect(x, y, gw, gw); fill(numToColor(board[j][i])); if (board[j][i]>0) ellipse(x, y, gw, gw); if (board[j][i]<0) { //pipes are less than 0 boolean left = false, right = false, above = false, below = false; if( i > 0 && abs(board[j][i])==abs(board[j][i-1])) left = true; if( j > 0 && abs(board[j][i])==abs(board[j-1][i])) above = true; if( i < board.length-1 && abs(board[j][i])==abs(board[j][i+1])) right = true; if( j < board.length-1 && abs(board[j][i])==abs(board[j+1][i])) below = true; fill(numToColor(-board[j][i])); noStroke(); rect(x+gw/4, y+gw/4, gw/2, gw/2); if(above && below) rect(x+gw/4, y, gw/2, gw); if(left && right) rect(x, y+gw/4, gw, gw/2); if(above && left) { rect(x, y+gw/4, gw/2, gw/2); rect(x+gw/4, y, gw/2, gw/2); } if(above && right) {rect(x+gw/2, y+gw/4, gw/2, gw/2); rect(x+gw/4, y, gw/2, gw/2); } if(below && left) { rect(x, y+gw/4, gw/2, gw/2); rect(x+gw/4, y+gw/2, gw/2, gw/2); } if(below && right) {rect(x+gw/2, y+gw/4, gw/2, gw/2); rect(x+gw/4, y+gw/2, gw/2, gw/2); } } } } } void checkwin() { won = true; for (int j=0;j<board.length;j++) for (int i=0;i<board[j].length;i++) { boolean foundpipe = false; if (board[j][i]>0) { for (int m=0;m<board.length;m++) for (int k=0;k<board[m].length;k++) if (board[m][k]==-board[j][i]) foundpipe = true; if (foundpipe ==false) won = false; } } } void draw() { background(0); drawboard(); if (!won) { if (mousePressed && !selected) { startx = int(mouseX / gw); starty = int(mouseY / gw); curx=startx; cury=starty; if (board[starty][startx] > 0) selected = true; } if (mousePressed==false && selected==true) { selected = false; int endx = -1, endy = -1; for (int j=0;j<board.length;j++) { for (int i=0;i<board[j].length;i++) { if ( !(i==startx && j==starty) && board[j][i] == board[starty][startx]) { endx = i; endy = j; } } } if ( (curx == endx && cury == endy + 1) || (curx == endx && cury == endy - 1) || (curx == endx + 1 && cury == endy) || (curx == endx - 1 && cury == endy)) checkwin(); else { for (int j=0;j<board.length;j++) { for(int i=0;i<board[j].length;i++) if(board[j][i]==-board[starty][startx]) board[j][i]=0; } } } if (mousePressed==true && selected==true) { int x = int(mouseX/gw), y = int(mouseY/gw); if (x>=0 && y >= 0 && y<board.length&&x<board[0].length && board[y][x]==0) { if ( (x == curx + 1 && y == cury) || (x==curx-1&&y==cury) || (x == curx && y == cury + 1) || (x == curx && y == cury - 1)) { board[y][x] = -board[starty][startx]; curx = x; cury = y; } } } } else { fill(255); textAlign(CENTER); textSize(40); text("YOU WON", 0, height/2-50, width, height); } } |
Video tutorial for this code: