にしのクエスト2

情報処理技術者試験と資格学校講師の日常

20221224103753

Unityで学ぶプログラミング  テトリス的を作る(11)ブロックを消す

こんにちは!

テトリス的なものを作っていきます。長い連載になります
で、気長にお付き合いください。

なお、プログラムの内容は難しいので、初心者には向きませ
ん。いきなり作るのは厳しいのでよろしくお願いします。
また、説明も大幅に省いていきます。

最後に注意事項
ご紹介するのはあくまで「テトリス的」です。そのものでは
ありませんし、非常にシンプルに遊べるだけのものです。

連載終了後に、より詳しい技術的な解説&追加機能を加えた
電子書籍を発行する予定ですので、よろしくお願いします。


今回はブロックの回転部分Update修正
このままだと、どんどん動かせちゃうので、update部分
を次のように修正してください

 
void Update()
{
//時間の加算
delta += Time.deltaTime;
 
//時間経過後
if(delta>=span){

//自然移動下に行けるかチェックして
if(ChkBlk(x,y+1)==0){
//重なってないなら移動
MoveBlk(x,y+1);
//時間をリセット
delta=0;
}else{
//そうじゃなければ
//ブロックを固定して
LockBlk();
//次のブロックを作成し
makeBlk();
//描画し直す
Render();
//時間をリセット
delta=0;
}
 

//右を押した場合
if(Input.GetKey(KeyCode.RightArrow)&&ChkBlk(x-1,y)!=1){
//重なってないなら移動
MoveBlk(x-1,y);
//時間をリセット
delta=0;
}
//左を押した場合
if(Input.GetKey(KeyCode.LeftArrow)&&ChkBlk(x+1,y)!=1){
//重なってないなら移動
MoveBlk(x+1,y);
//時間をリセット
delta=0;
}
//回転させる場合(スペースキー)
if(Input.GetKey(KeyCode.Space)){
//回転して
TurnBlk();
//時間をリセット
delta=0;
}
 
}

ブロックを消していきます!
chkLines()を作成していきましょう!

void chkLines(){
int i,j,k;
//繰り返す
while(true){
for(j=0;j<21;j++){
comp=1;
for(i=2;i<14;i++){
if(stage[i,j]==0){
comp=0;
}
}
if(comp==1){break;}
}
if(comp==0){break;}
 
 
 
for(i=1;i<12;i++){
stage[i,j]=0;
}
 
//上の列を下におろす
for(k=j;k>0;k--){
for(i=2;i<14;i++){
stage[i,k]=stage[i,k-1];
}
}
}

}

再帰処理を使っています。
横1列を捜査して。
1列でも揃っていれば、一段おろす。
さらに確認して・・・
揃っている列がなければ、抜けるという処理です(難しいよ)

void LockBlk(){
int i,j;
//フィールドの状態を記録
for(i=2;i<14;i++){
for(j=0;j<21;j++){
stage[i,j]=field[i,j];
}
}
chkLines();
}

LockBlkに chkLines();を追加します。


※やばい、LockBlk()とRender()のiの
 範囲が2から14でしたね!

 直してください!

f:id:koharuwest:20210207113034p:plain

 

f:id:koharuwest:20210207113052p:plain

消えたね!

次回は、ゲームオーバーの判定!

 

f:id:koharuwest:20210117110657p:plain


それではよきプログラミングライフを!
またね。

Unityで学ぶプログラミング  テトリス的を作る(10)ブロックの回転

こんにちは!

テトリス的なものを作っていきます。長い連載になります
で、気長にお付き合いください。

なお、プログラムの内容は難しいので、初心者には向きませ
ん。いきなり作るのは厳しいのでよろしくお願いします。
また、説明も大幅に省いていきます。

最後に注意事項
ご紹介するのはあくまで「テトリス的」です。そのものでは
ありませんし、非常にシンプルに遊べるだけのものです。

連載終了後に、より詳しい技術的な解説&追加機能を加えた
電子書籍を発行する予定ですので、よろしくお願いします。


今回はブロックを回転させます
スペースキーを押すと、回転するようにしましょう。
なので、update部分に次のようなものを追加して。

//回転させる場合(スペースキー)
if(Input.GetKey(KeyCode.Space)){
TurnBlk();
}

新しくTurnBlkのプログラムを書いていきます。
このロジックについては、ちょっと説明が長くなるので、省
略します(調べてみてね)が、ステージの変数の値を広めに
取っていることで、壁際でエラーが発生しなくなっています。

これが私の工夫でございます。
これで、次々ブロックが積み重なっていきます。

int TurnBlk(){
int i,j;

//ブロックを一時セーブ
for(i=0;i<4;i++){
for(j=0;j<4;j++){
blktmp[i,j]=blk[i,j];
}
}

//ブロックを回転させる
for(i=0;i<4;i++){
for(j=0;j<4;j++){
blk[i,j]=blktmp[3-j,i];
}
}

//重なりがあれば元に戻す
if(ChkBlk(x,y)==1){
for(i=0;i<4;i++){
for(j=0;j<4;j++){
blk[i,j]=blktmp[i,j];
}
}
return 1;
}

//ブロックを消して再描画
for(i=0;i<4;i++){
for(j=0;j<4;j++){
field[i+x,j+y]-=blktmp[i,j];
field[i+x,j+y]+=blk[i,j];
}
}
Render();
return 0;
}


f:id:koharuwest:20210131225206p:plain
次回は、ブロックを消してみたいと思います!

 

f:id:koharuwest:20210117110657p:plain


それではよきプログラミングライフを!
またね。

Unityで学ぶプログラミング  テトリス的を作る(9)ブロックの積み重ね

こんにちは!

テトリス的なものを作っていきます。長い連載になります
で、気長にお付き合いください。

なお、プログラムの内容は難しいので、初心者には向きませ
ん。いきなり作るのは厳しいのでよろしくお願いします。
また、説明も大幅に省いていきます。

最後に注意事項
ご紹介するのはあくまで「テトリス的」です。そのものでは
ありませんし、非常にシンプルに遊べるだけのものです。

連載終了後に、より詳しい技術的な解説&追加機能を加えた
電子書籍を発行する予定ですので、よろしくお願いします。


今回はブロックを次々と降らせてみましょう
動けなくなったブロックは一旦、ステージに保存しておきます。
そして、再度ブロックを作成しますが。

ブロック作成部分に、初期位置を追加します。

{0,1,0,0}};
break;
default:
break;
}

//ブロックを初期位置にする
x=5;
y=0;

//フィールドにブロックを加える
for(i=0;i<4;i++){

該当の場所、わかるでしょうか?

新しく、ロックさせるプログラムを書いておきます。

void LockBlk(){
int i,j;
//フィールドの状態を記録
for(i=0;i<12;i++){
for(j=0;j<21;j++){
stage[i,j]=field[i,j];
}
}
}


Updateの部分を変更します。
もし、下に移動できなければ・・・を追加です。

//時間経過後
if(delta>=span){

//自然移動下に行けるかチェックして
if(ChkBlk(x,y+1)==0){
//重なってないなら移動
MoveBlk(x,y+1);
delta=0;
//時間をリセット
}else{
//そうじゃなければ
//ブロックを固定して
LockBlk();
//次のブロックを作成し
makeBlk();
//描画し直す
Render();
//時間をリセット
delta=0;
}
}


これで、次々ブロックが積み重なっていきます。

f:id:koharuwest:20210131223845p:plain



次回は、ブロックを回転させてみたいと思います。

 

f:id:koharuwest:20210117110657p:plain


それではよきプログラミングライフを!
またね。

Unityで学ぶプログラミング  テトリス的を作る(8)左右の移動

こんにちは!

今回からテトリス的なものを作っていきます。長い連載にな
りますので、気長にお付き合いください。

なお、プログラムの内容は難しいので、初心者には向きませ
ん。いきなり作るのは厳しいのでよろしくお願いします。
また、説明も大幅に省いていきます。

最後に注意事項
ご紹介するのはあくまで「テトリス的」です。そのものでは
ありませんし、非常にシンプルに遊べるだけのものです。

連載終了後に、より詳しい技術的な解説&追加機能を加えた
電子書籍を発行する予定ですので、よろしくお願いします。


今回は左右の移動をします

今回はちょっとだけです(笑

//時間の加算
delta += Time.deltaTime;
 
//時間経過後
if(delta>=span){
//自然移動下に行けるかチェックして
if(ChkBlk(x,y+1)==0){
//重なってないなら移動
MoveBlk(x,y+1);
delta=0;
}
//右を押した場合
if(Input.GetKey(KeyCode.RightArrow)&&ChkBlk(x-1,y)!=1){
//重なってないなら移動
MoveBlk(x-1,y);
}
//左を押した場合
if(Input.GetKey(KeyCode.LeftArrow)&&ChkBlk(x+1,y)!=1){
//重なってないなら移動
MoveBlk(x+1,y);
}
}

前回のIF分の後ろに追加していきます。
ボタンを押したのと、チェックをクリアしていれば
移動できるようになります。

壁にめり込むこともないはずです。

しかし、着地したらもう何も起こらない感じになります!

f:id:koharuwest:20210123113451p:plain


次回は、ブロックを次々と降らせる!

 

f:id:koharuwest:20210117110657p:plain


それではよきプログラミングライフを!
またね。