int BOARDSIZE = 3; float SPACING; float RADIUS; float CORNER; Spot spots[][] = new Spot[10][10]; int shuffle = 0; void keyPressed(){ if(key >= '3' && key <= '9'){ BOARDSIZE = key - '0'; reset(); } else BOARDSIZE = 3; if(key == ' '){ reset(); } } void reset(){ RADIUS = (500 / BOARDSIZE) / 2; SPACING = RADIUS * 2; CORNER = RADIUS; RADIUS *= .8; for(int i = 0; i < BOARDSIZE;i++){ for(int j = 0; j < BOARDSIZE;j++){ spots[i][j] = new Spot(j,i); // println("made "+i+" "+j); } } shuffle = 100; } void setup(){ size(500,500); reset(); } boolean gameIsWon = false; void draw(){ if(shuffle-- > 0){ int x = floor(random(BOARDSIZE)); int y = floor(random(BOARDSIZE)); spots[x][y].toggle(true); } gameIsWon = checkForWin(); background(50,50,100); for(int i = 0; i < BOARDSIZE;i++){ for(int j = 0; j < BOARDSIZE;j++){ Spot s = spots[i][j]; s.draw(); } } } boolean checkForWin(){ for(int i = 0; i < BOARDSIZE;i++){ for(int j = 0; j < BOARDSIZE;j++){ Spot s = spots[i][j]; if(!s.lit) return false; } } return true; } void mousePressed(){ for(int i = 0; i < BOARDSIZE;i++){ for(int j = 0; j < BOARDSIZE;j++){ Spot s = spots[i][j]; if(s.isMouseIn()){ clickToggle(i,j); } } } } void clickToggle(int x, int y){ checkToggle(x,y); checkToggle(x-1,y); checkToggle(x+1,y); checkToggle(x,y-1); checkToggle(x,y+1); } void checkToggle(int x, int y){ if(inBoard(x,y)) spots[x][y].toggle(true); } boolean inBoard(int i, int j){ return (i >= 0 && i < BOARDSIZE && j >= 0 && j < BOARDSIZE) ; } class Spot { boolean lit = true; float x,y,dx,dy; float angle = -PI/2; float anglespeed; Spot(float px, float py){ x = px; y = py; dx = CORNER + x * SPACING; dy = CORNER + y * SPACING; } void toggle(boolean spin){ lit = !lit; if(spin){ if(lit) kick(); else anglespeed = 0; } } void kick(){ anglespeed += random(.05,.2); } void draw(){ if(gameIsWon) { stroke(255); anglespeed = .05; } else { stroke(0); } if(anglespeed > 0){ anglespeed -= .001; angle += anglespeed; } strokeWeight(2); noFill(); ellipse(dx,dy,RADIUS*2,RADIUS*2); drawStar(dx,dy,RADIUS,angle); } boolean isMouseIn(){ if(dist(dx,dy,mouseX,mouseY) < RADIUS){ return true; } return false; } void drawStar(float x, float y, float size, float angle) { if(lit) fill(255, 255, 0); else fill(30,30,0); noStroke(); pushMatrix(); translate(x, y); beginShape(); vertex(cos(angle) * size, sin(angle)*size); vertex(cos(angle + TWO_PI*.4) * size, sin(angle+ TWO_PI*.4)*size); vertex(cos(angle + TWO_PI*.8) * size, sin(angle+ TWO_PI*.8)*size); vertex(cos(angle + TWO_PI*.2) * size, sin(angle+ TWO_PI*.2)*size); vertex(cos(angle + TWO_PI*.6) * size, sin(angle+ TWO_PI*.6)*size); endShape(CLOSE); popMatrix(); } }