質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • C

    3687questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ぷよぷよを作っています

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 238

ringo08

score 2

 前提・実現したいこと

C言語でぷよぷよを作っているのですが、
ぷよが綺麗に落ちてくれません。

 発生している問題・エラーメッセージ

ぷよが落ちると何マスか上に配置されます

 該当のソースコード

ソースコード

#include <stdio.h>
#include <handy.h>
#include <stdlib.h>
#include <time.h>

#define WINDOW_X 600
#define WINDOW_Y 700
#define FIELD_H 14
#define FIELD_W 8
#define PLAYMAT_H 13
#define PLAYMAT_W 6
#define PEACE_H 3
#define PEACE_W 3
#define SIZE 50
#define SPEED 50

int main(){
  int puyofield[FIELD_W][FIELD_H] = {0};  // 画面のピクセル
  int puyopeace[PEACE_W][PEACE_H] = {0};  // 予備ぷよのフィールド
  int puyomath[FIELD_W][FIELD_H] = {0};  // プレイ画面のフィールド
  int radius = SIZE/2;  // ぷよの半径
  int random_wide, random_color1, random_color2, pre_random_color3, pre_random_color4;  // ランダム系変数
  int main_x, main_y, sub_x, sub_y, move_wide;  // 移動系変数
  int i, j, p, q, s, t, a, b;  // カウント変数
  int speed, accel, sx, sy, pre_main, pre_sub, color, window, score;  // その他変数

  score = 0;
  window = HgOpen(WINDOW_X, WINDOW_Y);


  int layer1 = HgWAddLayer(0);
  int layer2 = HgWAddLayer(0);
  int field_layer[PLAYMAT_W+1][PLAYMAT_H+1];  // ぷよ用レイヤ

  for(i=1; i<PLAYMAT_W+1; i++){
    for(j=1; j<PLAYMAT_H+1; j++){
      field_layer[i][j] = HgWAddLayer(0);  // ぷよ用レイヤの作成
    }
  }

  //  field start


  HgWSetFillColor(0, HG_BLACK);
  HgWBoxFill(0, 0, 0, WINDOW_X, WINDOW_Y, 1);

  for(i=1; i<FIELD_W; i++){
    for(j=0; j<FIELD_H; j++){
      puyofield[i][j] = j*SIZE;
    }
  }

  HgWSetFillColor(0, HG_WHITE);
  HgWSetWidth(0, 0.3);
  for(i=1; i<=PLAYMAT_W; i++){
    for(j=1; j<PLAYMAT_H; j++){
      HgWBoxFill(0, i*SIZE, puyofield[i][j], SIZE, SIZE, 1);
    }
  }

  for(i=0; i<PEACE_W; i++){
    for(j=0; j<PEACE_H; j++){
      puyopeace[i][j] = (j+10)*SIZE;
      HgWBoxFill(0, (i+8)*SIZE, puyopeace[i][j], SIZE, SIZE, 1);
    }
  }

  // field end

  // contents start

  HgWSetEventMask(layer1, HG_KEY_DOWN);

  for(i=0; i<FIELD_W; i++){
    puyomath[i][0] = 1;
  }

  for(j=0; j<FIELD_H; j++){
    puyomath[0][j] = 1;
    puyomath[7][j] = 1;
  }

  srand(time(NULL));

  random_color1 = rand()%4+1;  // 最初の mainぷよ の色
  random_color2 = rand()%4+1;  // 最初の subぷよ の色

  pre_main = (random_wide*SIZE+move_wide)/SIZE;  // 初期のmainぷよの横軸
  pre_sub = (random_wide*SIZE+move_wide)/SIZE;  // 初期のsubぷよの横軸

  for(;;){
    pre_random_color3 = rand()%4+1;  // 次の mainぷよ の色
    pre_random_color4 = rand()%4+1;  // 次の subぷよ の色

    random_wide = rand()%6+1;  // ぷよの最初の横座標

    move_wide = 0;
    sx = 0;
    sy = -1;
    main_x = random_wide*SIZE + radius;  // mainぷよのx座標
    sub_x = random_wide*SIZE + radius;  // subぷよのx座標


// 次のぷよ表示
    if(pre_random_color3==1) {
      HgWSetFillColor(layer2, HG_RED);
    }s
    else if(pre_random_color3==2) {
      HgWSetFillColor(layer2, HG_BLUE);
    }
    else if(pre_random_color3==3) {
      HgWSetFillColor(layer2, HG_YELLOW);
    }
    else if(pre_random_color3==4) {
      HgWSetFillColor(layer2, HG_GREEN);
    }
    HgWCircleFill(layer2, 9*SIZE+radius, 10*SIZE+radius, radius, 0);


// 次のぷよ表示
    if(pre_random_color4==1) {
      HgWSetFillColor(layer2, HG_RED);
    }
    else if(pre_random_color4==2) {
      HgWSetFillColor(layer2, HG_BLUE);
    }
    else if(pre_random_color4==3) {
      HgWSetFillColor(layer2, HG_YELLOW);
    }
    else if(pre_random_color4==4) {
      HgWSetFillColor(layer2, HG_GREEN);
    }
    HgWCircleFill(layer2, 9*SIZE+radius, 11*SIZE+radius, radius, 0);


    pre_main = (random_wide*SIZE+move_wide)/SIZE;  // mainぷよの横軸
    pre_sub = (random_wide*SIZE+move_wide)/SIZE;  // subぷよの横軸

    p = 13;
    q = 13;
    t = 0;

    for(;((puyomath[pre_main][p] == 0)||(puyomath[pre_sub+sx][q+sy] == 0));){

      hgevent *event = HgEventNonBlocking();
      if(event != NULL){
        if(event->type == HG_KEY_DOWN){
          switch(event->ch){
            case HG_D_ARROW :
              if(puyomath[pre_main][p-2] == 0 && puyomath[pre_sub+sx][q+sy-2] == 0){
                p--;
                q--;
              }
              break;

            case HG_L_ARROW :
              if((puyomath[pre_main-1][p-1]==0) || (puyomath[pre_sub-1][q-1]==0)) {
                move_wide += -SIZE;
              }
              break;

            case HG_R_ARROW :
              if((puyomath[pre_main+1][p-1]==0) || (puyomath[pre_sub+1][q-1]==0)) {
                move_wide += SIZE;
              }
              break;

            case HG_U_ARROW :
              t += 1;
              if(t >= 4) t = 0;
              break;
          }
        }
      }





      if(t==0) {
        sx = 0;
        sy = -1;
      }
      else if(t==1) {
        sx = -1;
        sy = 0;
      }
      else if(t==2) {
        sx = 0;
        sy = 1;
      }
      else if(t==3) {
        sx = 1;
        sy = 0;
      }

      sub_x = random_wide*SIZE + radius + SIZE*sx;

      main_y = puyofield[pre_main][p] + radius;
      sub_y = puyofield[pre_sub+sx][q+sy] + radius;


      if(puyomath[pre_main][p-1] == 0) {
        p--;
      }

      if(puyomath[pre_sub+sx][q+sy-1] == 0) {
        q--;
      }


      if(random_color1==1) {
        HgWSetFillColor(layer1, HG_RED);
      }
      else if(random_color1==2) {
        HgWSetFillColor(layer1, HG_BLUE);
      }
      else if(random_color1==3) {
        HgWSetFillColor(layer1, HG_YELLOW);
      }
      else if(random_color1==4) {
        HgWSetFillColor(layer1, HG_GREEN);
      }
      HgWCircleFill(layer1, main_x+move_wide, main_y, radius, 0);


      if(random_color2==1) {
        HgWSetFillColor(layer1, HG_RED);
      }
      else if(random_color2==2) {
        HgWSetFillColor(layer1, HG_BLUE);
      }
      else if(random_color2==3) {
        HgWSetFillColor(layer1, HG_YELLOW);
      }
      else if(random_color2==4) {
        HgWSetFillColor(layer1, HG_GREEN);
      }
      HgWCircleFill(layer1, sub_x+move_wide, sub_y, radius, 0);

      HgSleep(0.50);


      if(sub_y >= main_y){
        if(puyomath[pre_main][p-1] != 0) {
          puyomath[pre_main][p] = 2;
        }
        if(puyomath[pre_sub+sx][q+sy-1] != 0) {
          puyomath[pre_sub+sx][q+sy] = 2;
        }
      }
      else if(main_y > sub_y){
        if(puyomath[pre_sub+sx][q+sy-1] != 0) {
          puyomath[pre_sub+sx][q+sy] = 2;
        }
        if(puyomath[pre_main][p-1] != 0) {
          puyomath[pre_main][p] = 2;
        }
      }

      HgLClear(layer1);

      a = p;
      b = q;
    }

    main_y = puyofield[pre_main][a] + radius;
    sub_y = puyofield[pre_sub+sx][b+sy] + radius;

    if(random_color1==1) {
      HgWSetFillColor(field_layer[pre_main][a], HG_RED);
      color = 1;
    }
    else if(random_color1==2) {
      HgWSetFillColor(field_layer[pre_main][a], HG_BLUE);
      color = 2;
    }
    else if(random_color1==3) {
      HgWSetFillColor(field_layer[pre_main][a], HG_YELLOW);
      color = 3;
    }
    else if(random_color1==4) {
      HgWSetFillColor(field_layer[pre_main][a], HG_GREEN);
      color = 4;
    }
    HgWCircleFill(field_layer[pre_main][a], main_x+move_wide, main_x, radius, 0);



    if(random_color2==1) {
      HgWSetFillColor(field_layer[pre_sub+sx][b+sy], HG_RED);
      color = 1;
    }
    else if(random_color2==2) {
      HgWSetFillColor(field_layer[pre_sub+sx][b+sy], HG_BLUE);
      color = 2;
    }
    else if(random_color2==3) {
      HgWSetFillColor(field_layer[pre_sub+sx][b+sy], HG_YELLOW);
      color = 3;
    }
    else if(random_color2==4) {
      HgWSetFillColor(field_layer[pre_sub+sx][b+sy], HG_GREEN);
      color = 4;
    }
    HgWCircleFill(field_layer[pre_sub+sx][b+sy], sub_x+move_wide, sub_y, radius, 0);


    score += 0;
    HgLClear(layer2);

    HgWSetFont(0, HG_M, 35);
    HgWSetColor(0, HG_WHITE);
    HgWText(0, 415, 320, "SCORE\n \t\t%d", score);


    random_color1 = pre_random_color3;
    random_color2 = pre_random_color4;

  }



  HgClose();

  return 0;
}

![イメージ説明](1b7bf0c37a57916dec922377fce1a424.png)

 補足情報(FW/ツールのバージョンなど)

Xcode、handy graphicを使用しています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

私ならですが、ぷよ1個置くたびに
フィールドが(見た目ではなく、内部的に)どうなっているか、
確認してバグを追っていきます。

置き場所が確定した後に、おかしくなれば設置の処理が、
置く前におかしければ、落下の処理に問題がありそうです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/10 10:49

    具体的には、ソースコードを部分的に抜粋し、他のファイルに貼り付けて、実行してみたらいいでしょうか?

    キャンセル

  • 2018/07/10 13:39

    質問者様のコメントの意図はよくわかりませんが、私は、
    ぷよ設置毎にフィールドの内容を保存している変数の内容を確認すると、
    何か分る可能性が高いのではないか、と言う意味で書きました。

    キャンセル

  • 2018/07/10 14:15

    ぷよを1つずつにしてみると間違っているところがわかりました!
    ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    import staticについて

    package othello; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphi

  • 解決済

    星を動かしたいです!

    書いた星を動かしたいです この中に組み込みたいと思っています( ;  ; ) 全然わからなくて困っているので助けてください! void setup(){ size(80

  • 受付中

    エラーの意味が分かりません

    import java.util.*; import java.awt.*; import java.awt.event.*; @SuppressWarnings("uncheck

  • 解決済

    無限ループしてしまうようになった

    解決したいこと 一度はうまくいったのですが、作り直したらなぜか無限ループしてしまうようになってしまいましたのですが、わかる方いますか。コンパイルも通っているのですが。 追記 #

  • 受付中

    プログラムを見やすく改良したい

    正常に動くプルグラムを見やすく改良したい。 具体的に教えていただければありがたいです。セグメンテーションフォルトでベスト7まで表示して停止します。173行あたりだと思うのですが、よ

  • 解決済

    【vector】vector.erase()を高速化したい

     解決済みですが、まだまだこんなのあるよ!という方のコメントを随時募集してます! 前提・実現したいこと タイトルの通り、C++のSTLコンテナの一つvectorクラスの"vecto

  • 解決済

    Java クラスの追加方法について(テトリス)

    Javaでテトリスの実装をさせているのですが機能として次にくるブロックを表示させる機能追加をしようとしていて別途でnextblockpaenlを作成したのですが(コード2)、コード

  • 解決済

    C言語 アドレスを構造体に格納する問題について

    「kを除く0からn-1までの整数を要素とする集合をアドレスpの指す構造体に格納する関数」の作成をしたいのですがやり方が思い浮かびません。参考例などありましたらよろしくお願いします。

同じタグがついた質問を見る

  • C

    3687questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。