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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

3657閲覧

android テトリス ゲームオーバー処理

cray

総合スコア29

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/06/07 05:19

編集2016/06/08 00:24

androidアプリでテトリスを作成しています。
ゲームオーバー処理を書きたいのですがどのように実装したらいいかがわかりません。

関連する部分のソースコードを載せます。

//ブロックが存在してもいい位置か判定 boolean check(int[][] block, int offsetx, int offsety) { if (offsetx < 0 || offsety < 0 || mapHeight < offsety + block.length || mapWidth < offsetx + block[0].length) { return false; } for (int y = 0; y < block.length; y++) { for (int x = 0; x < block[y].length; x++) { if (block[y][x] != 0 && map[y + offsety][x + offsetx] != 0) { return false; } } } return true; } //ブロックを落とす処理 private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { if (count == 0) { switch (msg.what) { case INVALIDATE: invalidate(); break; case DROPBLOCK: if (check(block, posx, posy + 1)) { posy++; } else { //新しいブロックを画面の一番上に設置する処理 mergeMatrix(block, posx, posy); //そろった列を消す処理 clearRows(); posx = 4; posy = 0; block = block1; block1 = blocks[mRand.nextInt(blocks.length)]; //次落ちてくるブロックを表示させる処理 mergeMatrix1(block1, 0, 0); } invalidate(); Message massage = new Message(); massage.what = DROPBLOCK; sendMessageDelayed(massage, 500); break; } } } };

checkメソッドの中にゲームオーバーになったかどうかを判断できるif文を追加して、count=1処理をしたいのですが、ゲームオーバーになったかどうかを判断する方法がわかりません。
今のままですと画面がブロックでいっぱいになっても降り続けます。

ブロックは下に行くほどposyの値が大きくなります。
ブロックが下に積み重なっているブロックに重なったときのposyがわかればできると思うのですがどうすればいいでしょうか。

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

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

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

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

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

yona

2016/06/07 06:32

質問をする時に自作のメソッドが含まれる場合は、せめて処理の概要を書きましょう。 今回で言えば、checkメソッドははん用的な名前過ぎて、何をチェックしているのかがわかりません。また、返却値のtrue/falseが何を表しているかもわかりません。
guest

回答1

0

ベストアンサー

横チェックと縦の下方チェック、縦の上方チェックに判定を分割し、縦の上方チェックでfalseになった時にcountを1にすると良いと思います。

また、変数名やメソッド名の意味が広すぎるものがあるので、それらをリファクタリングすることで読みやすいコードになると思います。

投稿2016/06/08 00:38

yona

総合スコア18155

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

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

cray

2016/06/08 06:42

boolean check(int[][] block, int offsetx, int offsety) { if (offsetx < 0 || offsety < 0 || mapWidth < offsetx + block[0].length) { return false; } if (mapHeight < offsety + block.length) { count = 1; return false; } for (int y = 0; y < block.length; y++) { for (int x = 0; x < block[y].length; x++) { if (block[y][x] != 0 && map[y + offsety][x + offsetx] !=0){ return false; } } } return true; } でためしましたができませんでした。 boolean check(int[][] block, int offsetx, int offsety) { if (offsetx < 0 || mapHeight < offsety + block.length || mapWidth < offsetx + block[0].length) { return false; } if (offsety < 0) { count = 1; return false; } for (int y = 0; y < block.length; y++) { for (int x = 0; x < block[y].length; x++) { if (block[y][x] != 0 && map[y + offsety][x + offsetx] !=0){ return false; } } } return true; } というコードも試してみましたが、countの値は1になりませんでした。どこがいけないのでしょうか?
yona

2016/06/08 07:15

デバッグの仕方を学んだ方が良さそうですね。 まず、引数をすべてログ出力します。 次にif文で分岐する箇所にログ出力をします。 すると、与えた引数と分岐がログ出力されるので、あなたの想定した処理順と実際の処理順の差異がわかります。 この差異がなぜ起こるのかを考えることでバグの原因を知ることができます。 今回で言えば、配列の長さを判定に利用していますが、本来ならここにブロックのサイズを掛けないといけないのではないでしょうか?
cray

2016/06/09 05:11

丁寧な解説ありがとうございました!デバッグをすることで無事解決できました!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問