かなーり前に作ったぷよぷよのプログラムを公開してみる。
PuyoPJ.java
public class PuyoPJ { /** * @param args */ public static void main(String[] args) { // ぷよぷよの初期化 PuyoStage puyo = new PuyoStage(); //メイン処理 while(puyo.deleteFlag == false){ //ぷよぷよの削除 puyo.puyoDelete(); //ぷよぷよを落とす puyo.puyoDown(); //結果の出力 puyo.outputPuyo(); } System.out.println("終わり!"); } }
PuyoStage.java
public class PuyoStage { private int rowMax; //行のMax private int columnMax; //列のMax private char puyoField[][]; //ぷよぷよの色とかの配置 private int deleteArray[][]; //削除用配列 private int sequenceNum; //連続色個数 private char checkColor; //チェック用に色を格納する変数 private int deleteNum=0; //連鎖回数 public boolean deleteFlag; //ぷよを消したかどうかの判定 enum Direction {UP, DOWN, LEFT, RIGHT}; //コンストラクタ PuyoStage(){ deleteFlag=false; inputPuyo(); } //ぷよぷよの状態の入力 private void inputPuyo(){ //ぷよぷよの色の入力 puyoField = new char[][]{ {' ',' ','G','Y','R','R'}, {'R','Y','Y','G','Y','G'}, {'G','Y','G','Y','R','R'}, {'R','Y','G','Y','R','G'}, {'Y','G','Y','R','Y','G'}, {'G','Y','R','Y','R','G'}, {'Y','G','Y','R','Y','R'}, {'Y','G','Y','R','Y','R'}, {'Y','R','R','G','R','G'}, {'R','Y','G','Y','G','G'}, {'G','R','Y','G','Y','R'}, {'G','R','Y','G','Y','R'}, {'G','R','Y','G','Y','R'} }; //列、行の最大値の入力 rowMax = 13; columnMax = 6; //初期状態の出力 System.out.println("初期状態を出力します。"); for(int i=0; i<rowMax; i++){ for(int j=0; j<columnMax; j++){ System.out.print(puyoField[i][j]); } System.out.println(""); } } //ぷよぷよの削除 public void puyoDelete(){ for(int i=0;i<rowMax;i++){ for(int j=0;j<columnMax;j++){ deletMain(i,j); } } } //削除メイン処理 private void deletMain(int i, int j) { //連続している色のカウントリセット sequenceNum = 0; //ぷよがなければチェックしない。 if(puyoField[i][j]==' ') return; //チェックカラーのセット checkColor = puyoField[i][j]; //削除チェック配列の初期化 deleteArray = new int[rowMax][columnMax]; for(int x=rowMax-1; x>=0; x--){ for(int y=0; y<columnMax; y++){ deleteArray[x][y]=0; } } //削除チェック deleteSub(i,j,Direction.RIGHT); //隣り合ったぷよぷよが4つ以上ある場合に消す。 if(sequenceNum > 3){ //チェック用配列が1以上の場所にあるぷよを消す for(int l=0; l<rowMax; l++){ for(int m=0; m<columnMax; m++){ //削除対象かのチェック if(deleteArray[l][m]>0){ //削除対象であればスペースを代入 puyoField[l][m] = ' '; } } } } } //削除サブ処理 private void deleteSub(int i, int j, PuyoStage.Direction direction) { //一度チェックしたかの確認 if(deleteArray[i][j]!=0){ return; } //色が同じかどうかのチェック if(checkColor==puyoField[i][j]){ sequenceNum++; }else{ return; } //一度チェックしたかの確認 if(deleteArray[i][j]!=0){ return; } else{ deleteArray[i][j]++; } //右のチェック if(j<columnMax-1 && direction!=Direction.LEFT){ deleteSub(i, j+1, Direction.RIGHT); } //下のチェック if(i<rowMax-1) { deleteSub(i+1, j, Direction.DOWN); } //左のチェック if(j>0 && direction!=Direction.RIGHT) { deleteSub(i, j-1, Direction.LEFT); } return; } //消えて開いた箇所にぷよぷよを落とす public void puyoDown() { //spaceのチェック for(int i=rowMax-1; i>0; i--){ for(int j=0; j<columnMax; j++){ //sapceがあれば、上にぷよぷよがあるかチェックし、あれば下に落とす。 if(puyoField[i][j] == ' '){ boolean downFlag = false; for(int x=i-1; x>=0 && downFlag == false; x--){ if(puyoField[x][j]!=' '){ downFlag = true; puyoField[i][j] = puyoField[x][j]; puyoField[x][j] = ' '; } } } } } } //ぷよぷよの状態の出力 public void outputPuyo() { deleteFlag = true; //終了チェック用のフラグの初期化 deleteNum++; //連鎖回数のカウント //結果の出力 System.out.println("------------------"); System.out.println(deleteNum + "連鎖の結果を出力します。"); for(int i=0; i<rowMax; i++){ for(int j=0; j<columnMax; j++){ System.out.print(puyoField[i][j]); //フィールドにまだぷよが残っているかの確認 if(puyoField[i][j]!=' '){ deleteFlag=false; } } System.out.println(""); } } }