1.
程式碼:
color[]c={#FFFFF2,#E32936,#29BCE3,#29E330,#FAEF0D};
void setup() {
size(600, 500);
for (int k=0; k<15; k++) {
hole[0][k]=int(random(1,5));
hole[1][k]=int(random(1,5));
hole[2][k]=int(random(1,5));
/* hole[3][k]=1;
hole[4][k]=1;
hole[5][k]=1;
hole[6][k]=1;
hole[7][k]=1;
hole[8][k]=1;
hole[9][k]=1;
hole[10][k]=1;
hole[11][k]=1;*/
}
}
// hole[i-1][j] hole[i-1][j+1]
//hole[i][j]鄰居有:hole[i][j-1] hole[i][j+1] i有奇數排
// hole[i+1][j] hole[i+1][j+1]
// hole[i-1][j-1] hole[i-1][j]
//hole[i][j]鄰居有:hole[i][j-1] hole[i][j+1] i有偶數排
// hole[i+1][j-1] hole[i+1][j]
void mousePressed() {
for (int i=0; i<13; i++) {
for (int j=0; j<15; j++) {
float now = dist( r+j*r, r/2+i*sqrt(3)*r/2, mouseX, mouseY);
if(i%2==0) now = dist( r/2+j*r, r/2+i*sqrt(3)*r/2, mouseX, mouseY);
if (now<r/2) {
int num = findNow(i,j,hole[i][j]);
if(num>=3)killNow(i,j,hole[i][j]);
}
}
}
}
int findNow(int i,int j,int now){
if(i<0 || j<0 || i>=13 || j>=15) return 0;
int total=0;
if(hole[i][j]==now){
hole[i][j]=0;
total=1;
if(i%2==1){
total += findNow(i-1,j,now);
total += findNow(i-1,j+1,now);
total += findNow(i,j-1,now);
total += findNow(i,j+1,now);
total += findNow(i+1,j,now);
total += findNow(i+1,j+1,now);
}else{
total += findNow(i-1,j-1,now);
total += findNow(i-1,j,now);
total += findNow(i,j-1,now);
total += findNow(i,j+1,now);
total += findNow(i+1,j-1,now);
total += findNow(i+1,j,now);
}
hole[i][j]=now;
}
return total;
}
void killNow(int i,int j,int now){
if(i<0 || j<0 || i>=13 || j>=15) return ;
if(hole[i][j]==now){
hole[i][j]=0;
if(i%2==1){
killNow(i-1,j,now);
killNow(i-1,j+1,now);
killNow(i,j-1,now);
killNow(i,j+1,now);
killNow(i+1,j,now);
killNow(i+1,j+1,now);
}else{
killNow(i-1,j-1,now);
killNow(i-1,j,now);
killNow(i,j-1,now);
killNow(i,j+1,now);
killNow(i+1,j-1,now);
killNow(i+1,j,now);
}
}
}
int x=300, y=500;
float angle1=0, angle2=0;
boolean bulletFlying=false;
float bulletX, bulletY;//發射球的x,y座標
float bulletVX, bulletVY;//發射球的x,y方向座標
int [][] hole = new int[13][15];
int r=40;//球的直徑
int B=0;//上方球的總數
void draw() {
background(#FFFFF2);
fill(0, 0, 0);
ellipse(x, y, 80, 80);
strokeWeight(40);
strokeCap(SQUARE);
line(x, y, x+80*cos(angle1), y+80*sin(angle1));
strokeWeight(1);
for (int i=0; i<13; i++) {
for (int j=0; j<15; j++) {
if (hole[i][j]==0) continue;//noFill();
else fill(c[hole[i][j]]);
if (i%2==0) ellipse(r/2+j*r, r/2+i*sqrt(3)*r/2, r, r);
else ellipse(r+j*r, r/2+i*sqrt(3)*r/2, r, r);
}
}
if (bulletFlying) {
bulletX+= bulletVX;
bulletY+= bulletVY;
fill(255, 255, 0);
ellipse(bulletX, bulletY, r, r);
if (bulletX > 585) bulletVX=-bulletVX;
if (bulletX < 15) bulletVX=-bulletVX;
if (bulletY < 15 || touch_yellow_ball() ) {
//bulletVY=0;bulletVX=0;
put_ball_in_hole();
bulletFlying=false;
}
}
}
boolean touch_yellow_ball() {
for (int i=0; i<13; i++) {
for (int j=0; j<15; j++) {
if ( hole[i][j]==1 && dist(bulletX, bulletY, r/2+j*r, r/2+i*sqrt(3)*r/2)<r/1.3) return true;
}
}
return false;
}
void put_ball_in_hole() {
float nearest = 99999;
int nowI=0, nowJ=0;
for (int i=0; i<13; i++) {
for (int j=0; j<15; j++) {
float now = dist( r+j*r, r/2+i*sqrt(3)*r/2, bulletX, bulletY);
if(i%2==0) now = dist( r/2+j*r, r/2+i*sqrt(3)*r/2, bulletX, bulletY);
if (now<nearest && hole[i][j]==0) {
nearest = now;
nowI=i;
nowJ=j;
}
}
}
hole[nowI][nowJ]=1;
}
void keyPressed() {
if (keyCode==UP) angle1-=0.05;
if (keyCode==DOWN) angle1+=0.05;
if (key==' ') {
bulletFlying=true;
bulletX=x;
bulletY=y;
bulletVX=cos(angle1)*5;
bulletVY=sin(angle1)*5;
}
}
沒有留言:
張貼留言