テトリス 回転の実装ができません

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

テトリス 回転の実装ができません

#1

投稿記事 by 海老天 » 15年前

windows vista
vusual C++
DXライブラリを使用しています

現在自力でテトリスを組もうとしているのですが回転で躓いてしまいました
Zを押すと回転するようにしているのですがエラーは出ず処理そのものが行われません
Zを押したことは認識されているようなのですが……
ごちゃごちゃしたプログラムですがミスを指摘してくださる方お願いします

バグ

Re:テトリス 回転の実装ができません

#2

投稿記事 by バグ » 15年前

コメント文が少ないのと、ファイルを細かく分けすぎていて、全部読む気になれなかったのですが…
Zが押されたのを認識するところまでは確認できているようですので、それ以降の処理をざっと読んでみました。

turn_calc関数内でなんらかの処理を行って、turn_move関数で完結させてるって感じでしょうか?
で、turn_switchとturn_stateという変数が共に1である場合にturn_move関数の中身が実際に実行される…
turn_switchはturn_calc関数内でZが押された場合に問答無用で1になっているので、これは大丈夫かな?
となると、turn_stateが怪しいぞと。

turn_stateが変更される条件は、bblock[/url][/url]のメンバであるstateが1の場合に、同メンバのkind_stateの数値で上書きされると…

多分、ここが問題かな?前後の流れから察するにturn_state変数はkind_stateが1箇所でも1であったら0に戻ってはいけないっぽいけど0で上書きされている可能性が大きいですね…


下記のような感じでいかがでしょうか?
今、動作できる環境がないので未確認ですが…
void turn_calc()
{
    if (CheckStateKey(KEY_INPUT_Z) == 1)
    {
        turn_state = 0;        // ※ここでturn_stateを0クリアしておく
        turn_switch = 1;

        for (int i = 0; i < 10; i++)
        {
            for (int n = 0; n < 22; n++)
            {
                if (bblock[n].state == 1)
                {
                    turn_number = bblock[n].kind;
                    turn_state |= bblock[n].kind_state;        // ※1度でも1になったturn_stateが0にならないようにkind_stateとの論理和を求めるように変更

                    if ((ablock[i + 2][n].state == 1) || (ablock[i + 1][n + 2].state == 1))
                    {
                        turn_switch = 0;
                    }
                }
            }
        }
    }
}

海老天

Re:テトリス 回転の実装ができません

#3

投稿記事 by 海老天 » 15年前

すみません
根本的にプログラムがまずかったようです
一から組み直したいと思います

バグ

Re:テトリス 回転の実装ができません

#4

投稿記事 by バグ » 15年前

以前作ったテトリスをアップしてますんで、よかったらダウンロードしてみてください。
開発言語がC#なので全てが参考になるか分かりませんが、大まかな流れとかは使える箇所があるかもしれませんので(^_^;)

http://park.geocities.jp/bugbugbugbug2001/

閉鎖

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