少しでも、プログラミング興味を持ってもらえると嬉しいです。
そこで、ブロック崩しを高機能化してみました。
どうぞ、楽しんでみてください。
分裂するボール、すぐ壊れないブロック
//TakasakiTechnical High School
//IT Club
//2016/08/20
//場面数
int max_ban=2,ban=0;
//ウインドウの大きさ
int yoko=400,tate=600;
//ボールの最大個数
int max_ball=11;
//現在のボールの個数
int balls=1;
//ボールの半径を5
int r=5;
//ボールの最初の位置
float x0=200,y0=350;
//ボールの座標
float[] x={x0,0,0,0,0,0,0,0,0,0,0};
float[] y={y0,0,0,0,0,0,0,0,0,0,0};
//ボールの使用状況配列
boolean[] ballon={true,false,false,false,false,false,false,false,false,false,false};
//float x=x0,y=y0;
//移動方向の初期値
//float dx=2,dy=2;
float[] dx={2,0,0,0,0,0,0,0,0,0,0};
float[] dy={2,0,0,0,0,0,0,0,0,0,0};
//ラケットの半分の長さ
float rtw=25;
float rtx,rty=550;
//ブロックの段数
int blkno=10;
//ブロック(block)の幅
int blkw=40;
//上下の間隔
int blksp=30;
//残りのブロック数
int blkre;
//ブロックの配置用配列
int[][][] blk={
{ {1,0,1,0,1,0,1,0,1,0},
{0,1,0,1,0,1,0,1,0,1},
{1,0,1,3,1,3,1,0,1,0},
{0,1,0,1,3,1,0,1,0,1},
{1,0,1,0,1,0,1,0,1,0},
{0,1,0,1,0,1,0,1,0,1},
{1,0,1,0,1,0,1,0,1,0},
{3,3,3,0,0,0,0,3,3,3},
{1,0,1,0,1,0,1,0,1,0},
{0,1,0,1,0,1,0,1,0,1}},
{ {1,1,1,1,1,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0,0},
{1,1,1,1,1,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0,0},
{1,1,1,1,1,1,1,1,1,1},
{0,0,3,0,0,0,0,3,0,0},
{1,1,1,1,1,1,1,1,1,1},
{0,0,0,0,3,3,0,0,0,0},
{1,1,1,1,1,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0,0}},
{ {1,0,1,0,1,0,1,0,1,0},
{0,1,0,1,0,1,0,1,0,1},
{1,1,0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1,0,0},
{1,0,1,0,1,0,1,0,1,0},
{3,1,0,1,3,3,0,1,3,1},
{1,1,0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1,0,0},
{1,1,1,1,1,1,1,1,1,1},
{1,2,2,2,2,2,2,2,2,1}}};
//メッセージのフォントの大きさ
int msgp=24;
//中断時のモード指定
//1ならば継続、0ならば終了
int mode;
void setup()
{
size(yoko,tate);
//カラーモードの設定
//RGBの各色を256まで使えるようにする
colorMode(RGB,255);
//背景色を黒にする
smooth();
frameRate(120);
}
void draw()
{
int i,j,byd,byy,lastball=0;
background(0,0,0);
fill(248,252,13);/*黄色で塗りつぶす*/
stroke(248,252,13);/*線も黄色で*/
// ellipse(x,y,2*r,2*r);/*ボールを描く*/
for(i=0;i<max_ball;i++){
if(ballon[i]==true){
ellipse(x[i],y[i],2*r,2*r);
}
}
fill(255,255,255);
rtx = mouseX;
//ラケットを描く
stroke(255,255,255);/*線を白く*/
line(rtx - rtw,rty,rtx + rtw,rty);/*ラケットを描く*/
//ブロックを描く
blkre=0;
stroke(255,255,255);/*線を白く*/
for(i=0;i<blkno;i++){
for(j=0;j<blkno;j++){
if( blk[ban][i][j] != 0 ){
if( blk[ban][i][j]==1)
stroke(255,255,255);/*白*/
if( blk[ban][i][j]==2)
stroke(0,255,0);/*緑*/
if( blk[ban][i][j]==3)
stroke(255,0,0);/*赤*/
/* line(j*blkw,(i+1)*blksp,(j+1)*blkw,(i+1)*blksp);
*/ rect(j*blkw,(i+1)*blksp,blkw,2);
blkre++;
}
}
}
//壁あたり判定
for(i=0;i<max_ball;i++){
if(ballon[i]==true){
if( x[i]+dx[i]+r > yoko)//右の壁の判断
dx[i] = -dx[i];
if( x[i]+dx[i]-r < 0)//左の壁の判断
dx[i] = -dx[i];
// if( y[i]+dy[i]+r > tate)//下の壁の判断
// dy[i]=-dy[i];
if( y[i]+dy[i]-r < 0)//上の壁の判断
dy[i]=-dy[i];
}
}
//ラケットの上面あたり判定
for(i=0;i<max_ball;i++){
if(ballon[i]==true){
if( y[i]+r >= rty && y[i]+r <= rty+dy[i] && x[i]>=rtx - rtw && x[i]<=rtx+ rtw){
dy[i] = -dy[i];
}
}
}
//ブロックのあたり判定
for(i=0;i<max_ball;i++){
if(ballon[i]==true){
byd=int(y[i] / blksp);
byy=int(y[i] % blksp);
if( byd >= 1 && byd <= blkno && byy <= r){/*上のブロックにぶつかる*/
if(blk[ban][byd-1][int(x[i]/blkw)] >=1 && blk[ban][byd-1][int(x[i]/blkw)] < 3){
dy[i] = -dy[i];
blk[ban][byd-1][int(x[i]/blkw)]=blk[ban][byd-1][int(x[i]/blkw)]-1;
}else if( blk[ban][byd-1][int(x[i]/blkw)] == 3){ //ボールの分裂処理
dy[i]=-dy[i];
balls++;
ballon[balls-1]=true;
x[balls-1]=x[i];
y[balls-1]=y[i];
dx[balls-1]=-dx[i];
dy[balls-1]=-dy[i];
blk[ban][byd-1][int(x[i]/blkw)] =blk[ban][byd-1][int(x[i]/blkw)]-1;
}
}
if( byd < blkno && byy >= blksp-r){/*下のブロックにぶつかる*/
if(blk[ban][byd][int(x[i]/blkw)] >=1 && blk[ban][byd][int(x[i]/blkw)] < 3){
dy[i] = -dy[i];
blk[ban][byd][int(x[i]/blkw)]=blk[ban][byd][int(x[i]/blkw)]-1;
}else if( blk[ban][byd][int(x[i]/blkw)] == 3){ //ボールの分裂処理
dy[i]=-dy[i];
balls++;
ballon[balls-1]=true;
x[balls-1]=x[i];
y[balls-1]=y[i];
dx[balls-1]=-dx[i];
dy[balls-1]=-dy[i];
blk[ban][byd][int(x[i]/blkw)] =blk[ban][byd][int(x[i]/blkw)]-1;
}
}
}
}
for(i=0;i<max_ball;i++){
if(ballon[i]==true){
x[i] +=dx[i];
y[i] +=dy[i];
}
}
//ボールのミス処理
for(i=0;i<max_ball;i++){
if(y[i] >= tate){
ballon[i]=false;
}
//残っているボールの数を調べる
if(ballon[i]==true)
lastball++;
}
//すべてのボールをミスした時の処理
if(lastball ==0){
mode=1;
//ボール配列の開始状態に戻す
x[0]=x0;
y[0]=y0;
dx[0]=2;
dy[0]=2;
ballon[0]=true;
balls=1;
for(i=1;i<max_ball;i++){
x[i]=0;
y[i]=0;
dx[i]=0;
dy[i]=0;
ballon[i]=false;
}
fill(256,100,100);
textSize(msgp);
textAlign(CENTER);
text("Miss Miss!",yoko/2,tate/2);
text("Press Mouse Left-Button",yoko/2,tate/2+msgp);
noLoop();
}
//ブロックをすべて消した時の処理
if( blkre==0){
mode=0;
ban++;
//ボール配列の開始状態に戻す
x[0]=x0;
y[0]=y0;
dx[0]=2;
dy[0]=2;
ballon[0]=true;
balls=1;
for(i=1;i<max_ball;i++){
x[i]=0;
y[i]=0;
dx[i]=0;
dy[i]=0;
ballon[i]=false;
}
fill(62,240,53);
textSize(msgp*2);
textAlign(CENTER);
text("Clear Clear!",yoko/2,tate/2);
textSize(msgp);
text("Press Mouse Left-Button",yoko/2,tate/2+msgp*2);
noLoop();
}
}
void mousePressed()
{
if(mouseButton == LEFT) {
//マウスの左ボタンを押したときの処理
if(mode==1)/*1ならば継続*/
loop();
else if(ban <= max_ban){
loop();
}
else exit();
}
}