コマンドプロンプト表示でコンソールテトリス作ってます
あと一歩というところで積んでしまいました
ヒントをください
まずsquare[22][12];という配列を作り
この配列の要素の数字が1もしくは2だったら表示
0だったら非表示にするという関数があります
要素が2の場合動いているブロックのことで
ブロックが止まったら1になるという仕様です
2を作った理由は当たり判定を作るのに
2の下や右が1だったら動かせないという感じにしたかったからです
それで当たり判定まではうまくいったのですが
スピン後にブロックが重なったら弾いて何段か戻す
例えば下にブロックがありそこにIテトリミノを回転させたら
Iテトリミノは上にブロックが当たらない位置まで戻されるという
仕様にしたいのですがうまくいきません
何かいい手はありますか?
お知恵をお貸しください
よろしくお願いします
追記
まずブロックの出現の方法ですが
こんな風に書いています
int Tetrimino::ZTetrimino(int ypos, int xpos, int transform) { if (transform % 2 == 0) { for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) { a = ypos + i + move; b = xpos + j; if (a >= 0) { if(!((i==0 && j == 2) || (i == 1 && j == 0))) square[a][b] = 2; } } } } else { for (i = 0; i < 3; i++) { for (j = 0; j < 2; j++) { a = ypos + i + move; b = xpos + j; if (a >= 0) { if (!((i == 0 && j == 0) || (i == 2 && j == 1))) square[a][b] = 2; } } } } return 4; // Zの戻り値は4、Iは1のように順番に振り分けてる //なので個の戻り値を拾って今なんのテトリミノか判断している }
全部こんな感じです
左上から順に2にしていくイメージです
ちなみにですがsquare[][]などの変数は継承元のクラスで静的に宣言しています
あとはfor文でsquare[i][j] == 0以上だったら"■"を0だったら" "を表示するでjのループが終わったら
改行を挟むという感じです
main関数のメインループでmoveを増やしてそのあとtetriminoの戻り値でなんのブロックか判断して
その関数を呼び出す
moveでy軸が増えるのでy軸が一個増えた値でtetrimino関数スタート
で当たり判定関数があります
当たり判定はsquare[][]の値が2の周りに1があれば0~7までの戻り値を返す
// return 0 = 判定なし
// return 1 = 下
// return 2 = 右
// return 3 = 左
// return 4 = 下と右
// return 5 = 下と左
// return 6 = 左と右
// return 7 = 下と左と右
で個の戻り値で判断して1か4か5か7だったら
moveを増やさないという感じで判定しています
ざっとこんな感じです
さらに追記
ブロックが重なってたらsquare[][]が3になります。
ですがここからブロックが重なってたらどうするかがわかりません。
弾くにしても何マス弾けばいいかがわからないです。
ブロックごとに、このブロックがこうめり込んでたらブロックが全部表示できる位置まで
戻すということも考えましたがブロックが7x回転後の形があるのでソースが長くなると思いやめました。
何かいい判定方法はないでしょうか?