return 1  について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たか

return 1  について

#1

投稿記事 by たか » 14年前

現在C言語の勉強をしており知識は参考書(入門レベル)で構造体の所までは理解しているはずです。

◆質問内容
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;
}

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: return 1  について

#2

投稿記事 by beatle » 14年前

returnは関数の戻り値を指定する命令です。

コード:

int foo()
{
    int bar;
    /* barに何か計算結果を代入 */
    return bar;
}

void hoge()
{
    int x;
    x = foo();
}
というようなコードが有ったとして、hoge()を実行すると、変数xには関数fooの戻り値が代入されます。
つまり変数xには変数barの内容が代入されます。

non
記事: 1097
登録日時: 15年前

Re: return 1  について

#3

投稿記事 by non » 14年前

208行目のTurnBlock();で関数を呼び出したところに返すのですが、
ここで、
ret=TurnBlock();
のように、値を受けるように呼び出せば、返値を参照することができます。
この作者は、この返値を利用しようとはしていないので、値を受けるようには、していないのでしょう。
non

たか

Re: return 1  について

#4

投稿記事 by たか » 14年前

返信遅れました。
回答ありがとうございます。

作者はこの「返値」を利用しようとはしていないので、値を受けるようにはしていないのでしょう。bynon 様

そういうことでしたか、まだ途中なので後々使用するものだと思います、すっきりしましたありがとうございます。

beatle 様 コードまで書いて頂き、大変参考になりました、ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る