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

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

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

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

Q&A

0回答

1849閲覧

ぷよぷよのゲームオーバーの処理と得点の追加の処理をどこにどのように入れればいいのかを教えてほしいです

退会済みユーザー

退会済みユーザー

総合スコア0

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

0グッド

0クリップ

投稿2021/01/07 20:08

編集2021/01/08 04:42

ぷよぷよのベースを動画を参考にしながら作ったのですがここにゲームオーバーの処理と得点加算の処理を入れたいのですがどこにどのような処理をいれればいいのかわかりません。主にゲームオーバーの処理はFILED_HEIGHT(フィールドの場外)0の位置にいずれかのぷよ(puyo_color)が来た際に操作をロックしてゲームオーバーという文字を出してプログラムを終わらせたいです。得点の処理は4つ以上ぷよが繋がっていればそこをCELL_NONE(ぷよが何も無い状態)に変えているのですがそこを1連鎖なら1ポイント2連鎖なら2ポイントのように加算されていく処理にしたいです。
とても説明が下手ですみません。。

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #include<conio.h> //フィールドの広さ #define FIELD_WIDTH 8 #define FILED_HEIGHT 14 //組ぷよ初期位置 #define PUYO_START_X 3 #define PUYO_START_Y 1 //ぷよの種類 #define PUYO_COLOR_MAX 4 //フィールドの状態 enum { CELL_NONE, CELL_WALL, CELL_PUYO_0, CELL_PUYO_1, CELL_PUYO_2, CELL_PUYO_3, CELL_MAX }; enum { PUYO_ANGLE_0, PUYO_ANGLE_90, PUYO_ANGLE_180, PUYO_ANGLE_270, PUYO_ANGLE_MAX }; //サブぷよ回転位置 int puyoSubPotions[][2] = { {0,-1},//PUYO_ANGLE_0 {-1,0},//PUYO_ANGLE_90 {0,1},//PUYO_ANGLE_180 {1,0}//PUYO_ANGLE_270 }; int cells[FILED_HEIGHT][FIELD_WIDTH]; //描画用バッファ int displayBuffe[FILED_HEIGHT][FIELD_WIDTH]; //チェック済みフラグ int checked[FILED_HEIGHT][FIELD_WIDTH]; //各セルに該当する記号 char cellNames[][2 + 1] = { "・",//CELL_NONE, "■",//CELL_WALL, "〇",//CELL_PUYO_0, "△",//CELL_PUYO_1, "□",//CELL_PUYO_2, "☆"//CELL_PUYO_3, }; //ぷよの位置種類定義 int puyoX = PUYO_START_X, puyoY = PUYO_START_Y; int puyoColor; int puyoAngle; bool lock = false; void display() { system("cls"); //displayBuffeにcellの内容を書き込む memcpy(displayBuffe, cells, sizeof cells); //もしもロックが掛かって無ければ組ぷよを描画 if (!lock) { int subX = puyoX + puyoSubPotions[puyoAngle][0]; //サブのX軸 int subY = puyoY + puyoSubPotions[puyoAngle][1]; //サブのY軸 displayBuffe[puyoY][puyoX] = //メインぷよ displayBuffe[subY][subX] = CELL_PUYO_0 + puyoColor; } //フィールド描画 for (int y = 1; y < FILED_HEIGHT; y++) { for (int x = 0; x < FIELD_WIDTH; x++) printf("%s", cellNames[displayBuffe[y][x]]);//cellsからFILED上のcellのタイプを取得 printf("\n"); } } bool intersectPuyoToField(int _puyoX,int _puyoY,int _puyoAngle) { //影武者 if (cells[_puyoY][_puyoX] != CELL_NONE) return true; //sub当たり判定 int subX = _puyoX + puyoSubPotions[_puyoAngle][0]; int subY = _puyoY + puyoSubPotions[_puyoAngle][1]; if (cells[subY][subX] != CELL_NONE) return true; return false; } //連結してるか int getPuyoConnectedCount(int _x, int _y, int _cell, int _count) { if ( checked[_y][_x] ||(cells[_y][_x]!=_cell) ) return _count; _count++; checked[_y][_x] = true; for (int i = 0; i < PUYO_ANGLE_MAX; i++) {//ぷよの全方向をチェック int x = _x + puyoSubPotions[i][0]; int y = _y + puyoSubPotions[i][1]; _count=getPuyoConnectedCount(x, y, _cell, _count);//再起処理 } return _count; } //ぷよを消す処理 void erasePuyo(int _x, int _y, int _cell) { if (cells[_y][_x] != _cell) return; cells[_y][_x] = CELL_NONE; for (int i = 0; i < PUYO_ANGLE_MAX; i++) {//ぷよの全方向をチェック int x = _x + puyoSubPotions[i][0]; int y = _y + puyoSubPotions[i][1]; erasePuyo(x, y, _cell);//再起処理 } } int main() { srand((unsigned int)time(NULL)); //乱数の初期化 //左右の壁を配置 for (int y = 0; y < FILED_HEIGHT; y++) cells[y][0] = cells[y][FIELD_WIDTH-1]=CELL_WALL; //上下の壁を配置 for (int x = 0; x < FIELD_WIDTH; x++) cells[FILED_HEIGHT - 1][x] = CELL_WALL; puyoColor = rand()%PUYO_COLOR_MAX; //0123からランダム time_t t = 0; while (1) { if (t < time(NULL)) { t = time(NULL);//1秒経つと再描画 if (!lock) { //lockが掛かってなければ落下の処理 if (!intersectPuyoToField(puyoX, puyoY + 1, puyoAngle)) { puyoY++; //ぷよ落下 } else { int subX = puyoX + puyoSubPotions[puyoAngle][0]; //sab座標定義 int subY = puyoY + puyoSubPotions[puyoAngle][1]; cells[puyoY][puyoX] = cells[subY][subX] = CELL_PUYO_0 + puyoColor; //4種のぷよのいずれかが落下 puyoX = PUYO_START_X; puyoY = PUYO_START_Y; puyoAngle = PUYO_ANGLE_0; puyoColor = rand() % PUYO_COLOR_MAX; lock = true; } //4個以上でぷよが消える処理 if (!lock) { for(int y=0;y<FILED_HEIGHT-1;y++) for (int x = 1; x < FIELD_WIDTH - 1; x++) { if (getPuyoConnectedCount(x, y, cells[y][x],0) >= 4) cells[y][x] = CELL_NONE; } } } if (lock) { lock = false; for(int y=FILED_HEIGHT - 3;y >=0;y--) //ブロックの上にくるまで落下 for(int x=1; x<FIELD_WIDTH-1;x++) if ( (cells[y][x] != CELL_NONE) && (cells[y + 1][x] == CELL_NONE) ) { cells[y + 1][x] = cells[y][x]; cells[y][x] = CELL_NONE; lock = true; } //チェックフラグクリア if (!lock) { memset(checked, 0, sizeof checked); for(int y=0;y< FILED_HEIGHT -1;y++) for (int x = 1; x < FIELD_WIDTH - 1; x++) { if(cells[y][x]!=CELL_NONE) if (getPuyoConnectedCount(x, y, cells[y][x], 0) >= 4) erasePuyo(x, y, cells[y][x]); } } } display(); } //ぷよ操作 if (_kbhit()) { //もしキーの入力があった時に受け付ける if (lock) _getch(); //入力をロック else { int x = puyoX; int y = puyoY; int angle = puyoAngle; switch (_getch()) { case 'w':y--; break; case 's':y++; break; case 'a':x--; break; case 'd':x++; break; case ' ':angle = (++angle) % PUYO_ANGLE_MAX; break; //溢れず0,90,180,270をループ } if (!intersectPuyoToField(x, y, angle)) { //影武者の通りに移動 puyoX = x; puyoY = y; puyoAngle = angle; } display(); } } } }コード

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

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

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

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

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

thkana

2021/01/07 22:24 編集

このプログラムに於いて、「ゲームオーバー」とはどういうときに、どうなることですか。「フィールドの上から溢れたら」とかではなく、変数の値や動作などの観点から説明してみてください。 「得点の追加」についても同様。 自分が何をしたいのかを(プログラムの次元で)明確にしなければプログラムは書けません。
thkana

2021/01/07 22:25

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13236933818 https://teratail.com/help#posted-otherservice を参照して 「やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。」の処置をしてください。
vann_2921

2021/01/08 12:04

質問に回答がつかないためマルチポストしているのかと思いますが、回答がつかないのは質問が回答しにくいためと考えられます。回答しにくい理由は次の通りです。 1.質問が「ゲームオーバー」と「連鎖の得点の加算方法」の2種類が混在している。 →質問は一つのことについて行いましょう。 2.質問者さんがどこまでのことができて何ができないのかが分からない。 →「ゲームオーバーの処理がしたい」という明確な目標があるのでまずは自分でやってみてください。その結果、どういうことが実現できていないのか具体的に書きましょう。「ゲームオーバーの処理をするコード」は作る人によってそれぞれ違うので答えだけもらっても、質問者さんのものにはできませんし、コピペで使えるコード書いてくれる暇な人もそうそういません。 以上を踏まえて質問を考え直してみてもらえませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問