For old time's sake here is the Processing/Java version, I coded up to see if it was much faster:
int GRIDSIZE = 25; int CANVASSIZE = 600; float sz; color[] grid; color green; color red; int offset(int x,int y){ return x * GRIDSIZE + y; } void setup() { size(600, 600); frameRate(1000); noFill(); noStroke(); grid = new int[GRIDSIZE*GRIDSIZE]; sz = CANVASSIZE / GRIDSIZE; red = color(200,100,100); green = color(100,200,100); for(int x = 0; x < GRIDSIZE; x++){ for(int y = 0; y < GRIDSIZE; y++){ grid[offset(x,y)] = x < GRIDSIZE/2 ? red : green; fill(grid[offset(x,y)]); rect(x * sz, y * sz, sz, sz); } } } void swapEm(int x1,int y1,int x2,int y2){ color a = grid[offset(x1,y1)]; color b = grid[offset(x2,y2)]; //fill(255); grid[offset(x1,y1)] = b; fill(b); rect(x1 * sz, y1 * sz, sz, sz); grid[offset(x2,y2)] = a; fill(a); rect(x2 * sz, y2 * sz, sz, sz); } void swapVert(int x,int y) { int y1 = y; int y2 = y >= GRIDSIZE-1 ? 0 : y + 1; swapEm(x,y1,x,y2); } void swapHoriz(int x,int y) { int x1 = x; int x2 = x >= GRIDSIZE-1 ? 0 : x + 1; swapEm(x1,y,x2,y); } void draw() { int x = int(random(0,GRIDSIZE)); int y = int(random(0,GRIDSIZE)); if(random(1) <= .5) { swapVert(x,y); } else { swapHoriz(x,y); } }