3日目の開発
この1編は整理編になります.開発プロセスは、左、右の移動と回転時に壁を重ならない部分でブロックされます.コード自体は機能しますが、問題を完璧に解決したいので、1週間のコードを見て、見て、見て、チェックして、最後に間違った結論を出しました.まず見つけた問題を見てみましょう.
1.ゲーム画面座標のぼやけ
2.ブロックの回転パターンダンス
3.ブロックの回転軸座標の問題
4.ブロック回転時の境界線との干渉問題
5.問題の最適化
これらの問題は,壁との干渉時にこれ以上行えない部分を開発する際に発見された問題である.
まず,1番題,ブロックが移動可能な空間起点を(10,10)とし,生成ゲーム壁を(8,9)から開始するという開発は,8から直感的ではなく,符号化過程でずっとエラーが発生する.だからゲームの壁は(10,10)、ゲームが形成する空間は(12,11)、開始座標を修正しました.従って、ブロックが初めて現れる座標図xは2増加し、yは1増加する.ブロックは最初から全部露出していないので、後で修正します.
2つ目の問題は、ブロックを回転させるときにfor文を使用して座標全体を移動するコードが使用されるため、最初にブロック形状を指定するときに、すべての形状が2次元配列で格納されることです.ただし回転を計算するコードが記述されているため、基本形状以外の形状は不要である.したがって、メモリブロックの4次元配列は、すべての回転形状を削除し、3次元配列に変換し、任意のブロックをアクティブブロックのコードにインポートします.
3番目の問題は回転の中心点の問題です.
私は4*4サイズのブロックなので、ブロックの真ん中の仮想点を回転軸に置いてコードを書き、ブヨブヨトリスは(1,2)の周りを回転します.しかし、ここには例外があり、正方形のブロックは回転しません.そして、1文字のブロックが回転するのではなく、レバーを上下に動かすように、2つの形が繰り返されます.
これに鑑みて,コードを書き直した.
4つ目の問題は,既存の回転時のコードで操作すると壁と干渉することである.これはもともと開発ログの3編目に入る予定でしたが、この作業にかかる時間が一番長いので、このように書きました.全ての実施ミスをここに書きたいのですが、細かい修正が多いので、最終目標を達成するための考え方を書きたいだけです.
最初は左右移動や回転時の干渉は一度に処理したい.しかし、2つのプロセスのアルゴリズムは違います.
左右に移動する.
入力->残留除去->干渉->非干渉時移動->出力.
回転します.
入力->残像の除去->回転->座標を移動して干渉を回避->出力
はい.
似ているように見えますが、順序の違いで別途作成する必要があります.
左右移動の干渉処理.
回転時の干渉
これにより,左側と右側壁との干渉が完璧に現れた.
コードをきれいにしたいので、わざと時間をかけました.しかし、まだ足りないと思います.注釈をつけるときは一緒に整理してください.次に、積み木の部分を実現するつもりです.
1.ゲーム画面座標のぼやけ
2.ブロックの回転パターンダンス
3.ブロックの回転軸座標の問題
4.ブロック回転時の境界線との干渉問題
5.問題の最適化
これらの問題は,壁との干渉時にこれ以上行えない部分を開発する際に発見された問題である.
まず,1番題,ブロックが移動可能な空間起点を(10,10)とし,生成ゲーム壁を(8,9)から開始するという開発は,8から直感的ではなく,符号化過程でずっとエラーが発生する.だからゲームの壁は(10,10)、ゲームが形成する空間は(12,11)、開始座標を修正しました.従って、ブロックが初めて現れる座標図xは2増加し、yは1増加する.ブロックは最初から全部露出していないので、後で修正します.
2つ目の問題は、ブロックを回転させるときにfor文を使用して座標全体を移動するコードが使用されるため、最初にブロック形状を指定するときに、すべての形状が2次元配列で格納されることです.ただし回転を計算するコードが記述されているため、基本形状以外の形状は不要である.したがって、メモリブロックの4次元配列は、すべての回転形状を削除し、3次元配列に変換し、任意のブロックをアクティブブロックのコードにインポートします.
void acran(void)
{
int i, j;
int num;
num=rand()%7; //블록 종류가 7개이기 때문에
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
{
acblock[i][j]=block[num][0][i][j];
}
}
}
活動場所を表すvoid acran(void)
{
int i, j;
int num;
num=rand()%7; //블록 종류가 7개이기 때문에
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
{
acblock[i][j]=block[num][i][j];
}
}
}
に変更します.しかし、イドブヨブヨトリスは事前に5つの積み木を展示しており、後でゲーム開発の際に修正されます.3番目の問題は回転の中心点の問題です.
私は4*4サイズのブロックなので、ブロックの真ん中の仮想点を回転軸に置いてコードを書き、ブヨブヨトリスは(1,2)の周りを回転します.しかし、ここには例外があり、正方形のブロックは回転しません.そして、1文字のブロックが回転するのではなく、レバーを上下に動かすように、2つの形が繰り返されます.
これに鑑みて,コードを書き直した.
void turnL(void) //좌로 회전
{
if(acblock[1][2]==1&&acblock[2][1]==1&&acblock[2][2]==1&&acblock[1][1]==1) //정사각형일 시 스킵
return;
int n=0;
rvprintsq(acblock);
n=acblock[2][3];
acblock[2][3]=acblock[2][1];
acblock[2][1]=acblock[0][1];
acblock[0][1]=acblock[0][3];
acblock[0][3]=n;
n=acblock[1][3];
acblock[1][3]=acblock[2][2];
acblock[2][2]=acblock[1][1];
acblock[1][1]=acblock[0][2];
acblock[0][2]=n;
n=acblock[1][0]; //일자모양을 위해
acblock[1][0]=acblock[3][2];
acblock[3][2]=n;
printsq(acblock);
}
これでコードを作りました.なぜなら、一字型のコードブロックは、(0,1)および(2,3)のみを使用する一字型垂直0号線および水平3号線を使用する唯一のブロックであるからである.4つ目の問題は,既存の回転時のコードで操作すると壁と干渉することである.これはもともと開発ログの3編目に入る予定でしたが、この作業にかかる時間が一番長いので、このように書きました.全ての実施ミスをここに書きたいのですが、細かい修正が多いので、最終目標を達成するための考え方を書きたいだけです.
最初は左右移動や回転時の干渉は一度に処理したい.しかし、2つのプロセスのアルゴリズムは違います.
左右に移動する.
入力->残留除去->干渉->非干渉時移動->出力.
回転します.
入力->残像の除去->回転->座標を移動して干渉を回避->出力
はい.
似ているように見えますが、順序の違いで別途作成する必要があります.
左右移動の干渉処理.
int blockcheckmove(void)
{
int i;
if(acblock[1][0]==1) //일자모양일 때
{
if(x==12)
return 1;
}
if(x==10)
{
for(i=0; i<4; i++)
{
if(acblock[i][1]==1)
return 1;
}
}
else if(x<10)
{
for(i=0; i<4; i++)
{
if(acblock[i][2]==1)
return 1;
}
}
else if(x==24)
{
for(i=0; i<4; i++)
{
if(acblock[i][3]==1)
return 2;
}
}
else if(x>24)
{
for(i=0; i<4; i++)
{
if(acblock[i][2]==1)
return 2;
}
}
else
return 0;
}
作成void moveL(void) //좌로 이동
{
if(blockcheckmove()!=1)
{
rvprintsq(acblock);
x-=2;
printsq(acblock);
}
}
このように使います.最適化問題を同時に処理するために,以下の2つのコードを比較した.void moveR(void)
{
rvprintsq(acblock); //잔상제거
if(blockcheckmove()!=2) //간섭x
x+=2;
printsq(acblock); //출력
}
void moveR(void)
{
if(blockcheckmove()!=2)
{
rvprintsq(acblock);
x+=2;
printsq(acblock);
}
}
コード1とコード2は同じ役割を果たしている.コード1が干渉されないと仮定すると、コード1は残像の除去->if->演算->出力、コード2はif->残像の除去->演算->出力によって異なる点がないように見えます.ただし、この場合、干渉があると仮定すると、コード1は残りの除去->if->出力の3つのステップを経験し、コード2はifとenderを実行し、最初のステップのみを実行する.これは,コード2がより効率的なコードであるといえる.回転時の干渉
int blockcheckturn(void) //회전시 간섭체크
{
int i;
if(x==10)
{
for(i=0; i<4; i++)
{
if(acblock[i][0]==1)
return 1;
}
}
else if(x==8)
{
if(acblock[1][0]==1)
return 3;
for(i=0; i<4; i++)
{
if(acblock[i][1]==1)
return 1;
}
}
else if(x>24)
{
for(i=0; i<4; i++)
{
if(acblock[i][2]==1)
return 2;
}
}
else
return 0;
}
作成void turnL(void) //좌로 회전
{
if(acblock[1][2]==1&&acblock[2][1]==1&&acblock[2][2]==1&&acblock[1][1]==1)
return;
int n=0;
rvprintsq(acblock);
n=acblock[2][3];
acblock[2][3]=acblock[2][1];
acblock[2][1]=acblock[0][1];
acblock[0][1]=acblock[0][3];
acblock[0][3]=n;
n=acblock[1][3];
acblock[1][3]=acblock[2][2];
acblock[2][2]=acblock[1][1];
acblock[1][1]=acblock[0][2];
acblock[0][2]=n;
n=acblock[1][0];
acblock[1][0]=acblock[3][2];
acblock[3][2]=n;
if(blockcheckturn()==1)
x+=2;
else if(blockcheckturn()==2)
x-=2;
else if(blockcheckturn()==3)
x+=4;
printsq(acblock);
}
使用これにより,左側と右側壁との干渉が完璧に現れた.
コードをきれいにしたいので、わざと時間をかけました.しかし、まだ足りないと思います.注釈をつけるときは一緒に整理してください.次に、積み木の部分を実現するつもりです.
Reference
この問題について(3日目の開発), 我々は、より多くの情報をここで見つけました https://velog.io/@science4588/테트리스-개발-3일차テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol