◆質問内容
visual C++ 2008 でテトリスを作ってみようと思い、ネットの見本を見ながら作成していたのですが、わからない点がありましたので質問させてください。
プログラム下部にありますint TurnBlock()関数内 の return 1 についてなのですが
if(CheckOverlap(x, y)) {
for(i = 0; i<4; i++) {
for(j = 0; j<4; j++) {
block[j] = temp[j];
}
}
return 1; ========== こちら
この「1」はどこに返るのでしょうか、本やネットで調べてみたのですがわかりませんでしたので質問させて頂きました。
※記述しなくても正常に動作しました。
ネット上から引用したものを下記に纏めましたので宜しくお願いします。
stage[21][12] = {0};
block[4][4] = {{0,0,0,0},
{0,1,1,0},
{0,1,1,0},
{0,0,0,0}};
field[21][12] = {0};
int y = 0; //ブロックのステージ上でのy座標
int x = 4; //ブロックのステージ上でのx座標
int gameover = 0; //ゲームオーバー判定。1でゲームオーバー
//関数プロトタイプ宣言
void Initialize();
int CreateBlock();
void ShowGameField();
void MoveBlock(int, int);
int CheckOverlap(int, int);
void LockBlock();
void ControlBlock();
int TurnBlock();int main()
{
int time = 0; //一定時間ごとにブロックを落下させるための時間稼ぎ用
Initialize(); //ステージの初期化
while(!gameover) {
if(kbhit()) {
ControlBlock();
}
if(time < 20000) {
time++;
}
else{
//重なりがなければ移動
if(!CheckOverlap(x, y+1)) {
MoveBlock(x, y+1);
}
//重なりがあれば壁にする
else{
LockBlock();
CreateBlock();
ShowGameField();
}
time = 0;
}
}
return 0;
}
void Initialize()
{
int i, j; //forループ制御用変数
//画面と壁を初期設定
for(i = 0; i <= 20; i++) {
for(j = 0; j <= 11; j++) {
if((j == 0) || (j == 11) || (i == 20)) {
field[i][j] = stage[i][j] = 9;
}
else {
field[i][j] = stage[i][j] = 0;
}
}
}
CreateBlock();
ShowGameField(); //ゲーム直後の画面を描画
}
int CreateBlock()
{
int i, j;
//ブロックの座標を最上段中央にセット
x = 4;
y = 0;
for(i = 0; i<4; i++) {
for(j = 0; j<4; j++) {
field[i][j+4] = stage[i][j+4] + block[i][j];
//初期位置に置いたブロックが既に固定ブロックに重なっていればゲームオーバー
if(field[i][j+4] > 1) {
gameover = 1;
return 1;
}
}
}
return 0;
}
//画面表示
void ShowGameField()
{
int i, j; //forループ制御用変数
//画面を一旦クリア
system("cls");
//データに応じてブロックや空白を画面表示
for(i = 0; i<21; i++) {
for(j = 0; j < 12; j++) {
switch(field[i][j]) {
case 0:
printf(" ");
break;
case 9:
printf("□");
break;
default:
printf("■");
break;
}
}
printf("\n");
}
//ゲームオーバーの場合はGAME OVERを表示
if(gameover){
system("cls");
printf("\n\n\n\n\nGAME OVER\n\n");
}
}
void MoveBlock(int x2, int y2)
{
int i, j; //forループ制御用変数
//今までのブロックを消して
for(i = 0; i<4; i++) {
for(j = 0; j<4; j++) {
field[y+i][x+j] -= block[i][j];
}
}
//ブロックの座標を更新
x = x2;
y = y2;
//新しい座標でブロックを入れなおす
for(i = 0; i<4; i++) {
for(j = 0; j<4; j++) {
field[y+i][x+j] += block[i][j];
}
}
ShowGameField();
}
int CheckOverlap(int x2, int y2)
{
int i, j; //forループ制御用変数
//ブロックが向かう位置に固定ブロックもしくは壁があるかどうかを検査
for(i = 0; i<4; i++) {
for(j = 0; j<4; j++) {
if(block[i][j]) {
if(stage[y2 + i][x2 + j] != 0) {
return 1;
}
}
}
}
return 0;
}
void LockBlock()
{
int i, j; //forループ制御用変数
//ブロックを壁に加える
for(i = 0; i<21; i++) {
for(j = 0; j<12; j++) {
stage[i][j] = field[i][j];
}
}
}
void ControlBlock()
{
char key; //受け付けたキーを保存する変数
key = getch(); //キーから一文字入力
//キーに応じて各方向へブロックを移動したり、回転させたりする
switch(key) {
case 'f':
if(!CheckOverlap(x+1, y)) {
MoveBlock(x+1, y);
}
break;
case 's':
if(!CheckOverlap(x-1, y)) {
MoveBlock(x-1, y);
}
break;
case 'd':
if(!CheckOverlap(x, y+1)) {
MoveBlock(x, y+1);
}
break;
case ' ':
TurnBlock();
}
}
//ブロックを回転する処理
int TurnBlock()
{
int i, j; //forループ制御用
int temp[4][4] = {0}; //ブロックを一時保存するための配列
//ブロックを回転する前にtempにセーブ
for(i = 0; i<4; i++) {
for(j = 0; j<4; j++) {
temp[i][j] = block[i][j];
}
}
//ブロックを回転
for(i = 0; i<4; i++) {
for(j = 0; j<4; j++) {
block[i][j] = temp[3-j][i];
}
}
//重なってるブロックが出てしまったらブロックを回転前に戻して中止
if(CheckOverlap(x, y)) {//検査結果、引数で真(1)なら回転中止
for(i = 0; i<4; i++) {
for(j = 0; j<4; j++) {
block[i][j] = temp[i][j];
}
}
return 1;//--------------------------------------------ここのreturn 1はどこに返るのでしょうか?
}
//一旦フィールドからブロック消して回転後のブロックを再表示
for(i = 0; i<4; i++) {
for(j = 0; j<4; j++) {
field[y+i][x+j] -= temp[i][j];
field[y+i][x+j] += block[i][j];
}
}
ShowGameField();
return 0;
}