import com.nttdocomo.ui.*; import java.util.Random; //ブロック並べゲーム「Stack(VeryHardMode)」 by Y.K //HardModeからの強化点 //・CPUがリーチをしていた場合には、(これまでは、リーチに関わらずランダムでブロックを置いていたが)一定の確率で勝負を決める。 //・プログラム自体を改善。 public class Stackvh extends IApplication{ public void start(){ StackvhCanvas c; Display.setCurrent(c=new StackvhCanvas()); c.exe(); } } class StackvhCanvas extends Canvas{ private static boolean keySelected=false;//コマンドキーに対するフラグ int X=0,Y=8;//カーソル位置を示すX座標とY座標 boolean action=true;//プレイヤーの順番か? boolean scene=false;//プレイ中か、休止中か。 boolean reachX;//プレイヤーがX軸において2つ以上連続してブロックを置いているか? boolean reachY;//プレイヤーがY軸において3つ連続してブロックを置いているか? boolean reachXc;//CPUがX軸において3つ連続してブロックを置いているか? boolean reachYc;//CPUがY軸において3つ連続してブロックを置いているか? boolean begining=true;//タイトル画面の描写 //paintメソッドは使わない public void paint(Graphics g){} void exe(){ Graphics g=getGraphics(); int HEIGHT=120,WIDTH=120;//画面ピクセル数 int i=0,j=0,a=0,b=0,o=0; Random random=new Random(); int[][] block=new int[11][10];//ブロックの状態を表す変数 setSoftLabel(SOFT_KEY_1,"終了"); setSoftLabel(SOFT_KEY_2,"スタート"); //ここから半永久ループ(ゲームのメインルーチン) while(true){ if(scene){ //CPUの思考ルーチン END: while(action==false){ //この処理によって、CPUの間抜け度を決定する。剰余を求める値が多いほど間抜けに a=(random.nextInt()>>>1)%3; //上の剰余計算の結果が0だった場合のみ、リーチの状態を見ておき場所を決定する if(a==0){ //CPUが縦のリーチをしていた場合 if(reachYc){ for(j=0;j<10;j++){ a=0; for(i=0;i<10;i++){ if(block[i][j]==2){ if(++a>2){ if(i>2){ if(block[i-3][j]==0){ block[i-3][j]=2; reachYc=false; action=true; break END; } } } } else{ a=0; } } } } //CPUが横のリーチをしていた場合 if(reachXc){ for(i=9;i>=0;i--){ a=0; for(j=9;j>=0;j--){ if(block[i][j]==2){ if(++a>2){ if(j<7){ if(block[i][j+3]==0&&block[i+1][j+3]>0){ block[i][j+3]=2; reachXc=false; action=true; break END; } } if(j>0){ if(block[i][j-1]==0&&block[i+1][j-1]>0){ block[i][j-1]=2; reachXc=false; action=true; break END; } } } } else{ a=0; } } } } //プレイヤーが縦のリーチをしていた場合 if(reachY){ for(j=0;j<10;j++){ a=0; for(i=0;i<10;i++){ if(block[i][j]==1){ if(++a>2){ if(i>2){ if(block[i-3][j]==0){ block[i-3][j]=2; reachY=false; action=true; break END; } } } } else{ a=0; } } } } //プレイヤーが横のリーチをしていた場合 if(reachX){ for(i=9;i>=0;i--){ a=0; for(j=9;j>=0;j--){ if(block[i][j]==1){ if(++a>1){ if(j<8){ if(block[i][j+2]==0&&block[i+1][j+2]>0){ block[i][j+2]=2; reachX=false; action=true; break END; } } if(j>0){ if(block[i][j-1]==0&&block[i+1][j-1]>0){ block[i][j-1]=2; reachX=false; action=true; break END; } } } } else{ a=0; } } } } } //剰余計算が0以外だった場合は、ランダムで置き場所を決定する a=(random.nextInt()>>>1)%10; b=(random.nextInt()>>>1)%10; if(block[a][b]==0&&block[a+1][b]>0){ block[a][b]=2; action=true; } } //プレイヤー if(action){ if(keySelected){ if(block[Y+1][X]>0&&block[Y][X]==0){ block[Y][X]=1; action=false; } keySelected=false; } } g.lock(); //塗りつぶし g.setColor(g.getColorOfName(g.WHITE)); g.fillRect(0,0,WIDTH,HEIGHT); //block変数のフラグを調べてブロック表示&&X軸を調べて勝利判定&&リーチ判定(CPU&&Player)&&ドロー判定 o=0; for(i=9;i>=0;i--){ a=0;b=0; for(j=9;j>=0;j--){ if(block[i][j]>0){ o++; if(block[i][j]==1){ g.setColor(g.getColorOfName(g.RED)); b=0; if(++a>3){ g.drawString("YouWin!",40,10); scene=false; } if(a==2){ reachX=true; } } else if(block[i][j]==2){ g.setColor(g.getColorOfName(g.BLUE)); a=0; if(++b>3){ g.drawString("YouLose..",40,20); scene=false; } if(b==3){ reachXc=true; } } else if(block[i][j]==3){ g.setColor(g.getColorOfName(g.GREEN)); a=0;b=0; } g.drawRect(j*12,i*12,11,11); } else{ a=0;b=0;o=0; } } } //Y軸を調べて勝利判定&&リーチ判定 if(scene){ for(j=0;j<10;j++){ a=0;b=0; for(i=0;i<10;i++){ if(block[i][j]==1){ b=0; if(++a>3){ g.setColor(g.getColorOfName(g.RED)); g.drawString("PlayerWin!",30,20); scene=false; } else if(a==3){ reachY=true; } } else if(block[i][j]==2){ a=0; if(++b>3){ g.setColor(g.getColorOfName(g.BLUE)); g.drawString("CPUWin!",40,20); scene=false; } else if(b==3){ reachYc=true; } } else{ a=0;b=0; } } } //ドロー判定 if(scene){ g.setColor(g.getColorOfName(g.BLACK)); if(o>99){ g.drawString("Drow..",40,20); scene=false; } } } //カーソル表示 g.setColor(g.getColorOfName(g.BLACK)); g.drawRect(X*12,Y*12,11,11); //地面線表示 g.drawLine(0,HEIGHT,WIDTH,HEIGHT); g.unlock(true); } //初期化 else{ reachX=false; reachY=false; reachXc=false; reachYc=false; //0==None,1==Player,2==CPU,3==障害物 //Y列11列目は地面を表すので1を入れておく for(i=0;i=9) Y=9; } else if(param==Display.KEY_LEFT){ X--; if(X<=0) X=0; } else if(param==Display.KEY_RIGHT){ X++; if(X>=9) X=9; } else if(param==Display.KEY_SELECT){ keySelected=true; } } if(param==Display.KEY_SOFT1){ IApplication.getCurrentApp().terminate(); } else if(param==Display.KEY_SOFT2){ scene=true; } } } }