ぷよぷよのベースを動画を参考にしながら作ったのですがここにゲームオーバーの処理と得点加算の処理を入れたいのですがどこにどのような処理をいれればいいのかわかりません。主にゲームオーバーの処理は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(); } } } }コード
このプログラムに於いて、「ゲームオーバー」とはどういうときに、どうなることですか。「フィールドの上から溢れたら」とかではなく、変数の値や動作などの観点から説明してみてください。
「得点の追加」についても同様。
自分が何をしたいのかを(プログラムの次元で)明確にしなければプログラムは書けません。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13236933818
https://teratail.com/help#posted-otherservice を参照して
「やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。」の処置をしてください。
う~ん...さらに重複質問をするとは一体...
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13236947093
で、ここのルールは無視する、ということですか?
質問に回答がつかないためマルチポストしているのかと思いますが、回答がつかないのは質問が回答しにくいためと考えられます。回答しにくい理由は次の通りです。
1.質問が「ゲームオーバー」と「連鎖の得点の加算方法」の2種類が混在している。
→質問は一つのことについて行いましょう。
2.質問者さんがどこまでのことができて何ができないのかが分からない。
→「ゲームオーバーの処理がしたい」という明確な目標があるのでまずは自分でやってみてください。その結果、どういうことが実現できていないのか具体的に書きましょう。「ゲームオーバーの処理をするコード」は作る人によってそれぞれ違うので答えだけもらっても、質問者さんのものにはできませんし、コピペで使えるコード書いてくれる暇な人もそうそういません。
以上を踏まえて質問を考え直してみてもらえませんか?
あなたの回答
tips
プレビュー