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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

340閲覧

コンソールテトリス 回転後の挙動

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

2クリップ

投稿2018/05/08 14:41

編集2018/05/14 09:00

コマンドプロンプト表示でコンソールテトリス作ってます
あと一歩というところで積んでしまいました
ヒントをください

まずsquare[22][12];という配列を作り
この配列の要素の数字が1もしくは2だったら表示
0だったら非表示にするという関数があります
要素が2の場合動いているブロックのことで
ブロックが止まったら1になるという仕様です
2を作った理由は当たり判定を作るのに
2の下や右が1だったら動かせないという感じにしたかったからです
それで当たり判定まではうまくいったのですが
スピン後にブロックが重なったら弾いて何段か戻す
例えば下にブロックがありそこにIテトリミノを回転させたら
Iテトリミノは上にブロックが当たらない位置まで戻されるという
仕様にしたいのですがうまくいきません
何かいい手はありますか?
お知恵をお貸しください
よろしくお願いします

追記

まずブロックの出現の方法ですが
こんな風に書いています

int Tetrimino::ZTetrimino(int ypos, int xpos, int transform) { if (transform % 2 == 0) { for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) { a = ypos + i + move; b = xpos + j; if (a >= 0) { if(!((i==0 && j == 2) || (i == 1 && j == 0))) square[a][b] = 2; } } } } else { for (i = 0; i < 3; i++) { for (j = 0; j < 2; j++) { a = ypos + i + move; b = xpos + j; if (a >= 0) { if (!((i == 0 && j == 0) || (i == 2 && j == 1))) square[a][b] = 2; } } } } return 4; // Zの戻り値は4、Iは1のように順番に振り分けてる //なので個の戻り値を拾って今なんのテトリミノか判断している }

全部こんな感じです
左上から順に2にしていくイメージです

ちなみにですがsquare[][]などの変数は継承元のクラスで静的に宣言しています

あとはfor文でsquare[i][j] == 0以上だったら"■"を0だったら" "を表示するでjのループが終わったら
改行を挟むという感じです

main関数のメインループでmoveを増やしてそのあとtetriminoの戻り値でなんのブロックか判断して
その関数を呼び出す
moveでy軸が増えるのでy軸が一個増えた値でtetrimino関数スタート
で当たり判定関数があります
当たり判定はsquare[][]の値が2の周りに1があれば0~7までの戻り値を返す
// return 0 = 判定なし
// return 1 = 下
// return 2 = 右
// return 3 = 左
// return 4 = 下と右
// return 5 = 下と左
// return 6 = 左と右
// return 7 = 下と左と右

で個の戻り値で判断して1か4か5か7だったら
moveを増やさないという感じで判定しています

ざっとこんな感じです

さらに追記

ブロックが重なってたらsquare[][]が3になります。
ですがここからブロックが重なってたらどうするかがわかりません。
弾くにしても何マス弾けばいいかがわからないです。
ブロックごとに、このブロックがこうめり込んでたらブロックが全部表示できる位置まで
戻すということも考えましたがブロックが7x回転後の形があるのでソースが長くなると思いやめました。
何かいい判定方法はないでしょうか?

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2018/05/08 15:00

どんなイメージになるのでしょうか? 文字だけでは分かりにくいです。また、どんなコードになっていますか?
ardin

2018/05/09 07:57 編集

何がどううまくいかないのかも書いてください。書いてある情報だけで行けば、回転後、ブロックと重なるならばない段まで戻せばよいかと。 現ブロックの受付時間の判定が必要になるとは思いますが。(次に出るはずのブロック出現までとか)
退会済みユーザー

退会済みユーザー

2018/05/12 20:50

ブロックが重なってればsquareが3になります。で回転後for文で調べて3があれば一段戻る、これを3がなくなるまで繰り返しているのですがやはり回転後ブロックが重なってそのまま下に落ちていきます
guest

回答2

0

今回のケースとは違う場合には、積み重なることがうまくいっているのであれば、
今回のケースで回転後の全マス(と言っていいのかな?)状態はどうなっているかを調べてみてください。
それが想定通りならば、落ちてきているテトリミノ(?)に対しての判定タイミングがずれているのではないでしょうか。
デバッグ文を置くなりして確認してみてください。

投稿2018/05/13 23:52

ardin

総合スコア544

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/14 08:55

回転後重なってる部分はsquareが3になっています。 重なってるということはわかるのですがここからどう弾く処理を書いたらいいかわかりません。
退会済みユーザー

退会済みユーザー

2018/05/14 09:02

回転さえしなければもしくはめり込まないようにプレイヤーが気を付ければ一応テトリスはできてます。 ですがこれだとプレイやー次第になってしまうのでどうしたらいいかわかりません。
ardin

2018/05/14 09:04

その下の部分はどうなっていますか? 通常であれば1だと思いますが。 重なっていて3になっている場合、通常であれば記載の通り1段上に戻して判定をして 0になるところに置く。 但し注意するのは、その際に操作しているミノのsquare状態は2にする必要があります。 (2の状態とするのは、操作受付時間を考慮しています。 もう動かす必要ない(または動かせない)ならば1になるでしょう。たぶん) 3のままだったりしませんか?
退会済みユーザー

退会済みユーザー

2018/05/14 11:10

for文で調べてsquare[][] == 3だったら 動かす変数をマイナス(一段マイナス)にしてそのあとsquare[][]を1にしています。
guest

0

まだ、回答を求めているとありましたので、、、、
回答になってはいませんが、、。

提示の関数で、ブロックの設定を行っているようですが、移動前のブロックの消去などもどこかで行っている事と思います。また、ブロックの設定場所が空白である事の確認も行っていると思います。 それらを全て勘案しないと回答するのは難しいです。
質問の範囲では、Iブロックの移動先に移動できるかとの判定が正しく行われているかの判定が正しく行われていないのでは無いかと推測する事くらいしかできません。

多分、この質問だけでは、正確に答えられる人はいないのではないかと思います。コードの質問ならば、問題点を絞って、アルゴリズムの質問ならば、どういうアルゴリズムか分かり易く説明頂かないと難しいと思います。 (もっとも、整理していると自己解決したりするのですが)

投稿2018/05/13 12:56

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/14 08:53

移動前のブロックの消去、ブロックの設定箇所が空白である確認等確かに行っております。ブロックの移動先に移動できるかどうかの判定を作っているところで積んでしまいました。どう判定してよいのやらわかりません。ブロックが重なっている場所はsquareが3になっていますが3になってたらどうするかがよくわかりません。if(square[][] == 3){どうするか、何マス戻るのか?} ここがわかりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問