画竜点睛を衝く@mapyo

日々やった事をつらつらと書くブログです

ぷよぷよプログラム

かなーり前に作ったぷよぷよのプログラムを公開してみる。

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("");
		}
	}
}