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

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

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

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

Q&A

1回答

581閲覧

ぷよぷよ的な物をめちゃめちゃ作りたい

KenDom

総合スコア21

C++

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

0グッド

1クリップ

投稿2019/07/28 13:24

編集2019/07/28 13:37

今、ぷよぷよ的なものを作ろうとしています。ですがミスを自分で直せずこまってます。ミス・Putin::checkAround’:値を返さなければいけません。とエラーがでています。99行目です。```c++
// 3.5h
#include <iostream>
#include <memory.h>

namespace Puyo
{
struct Check2D
{
int x;
int y;
};
const int SY = 13;
const int SX = 6;
// 右, 下, 左の順に定義
const Check2D Ofs[] = { {1, 0}, {0, 1}, {-1, 0} };

enum Dir
{
Right = 0,
Down = 1,
Left = 2,
None = 3
};
// グローバル
char gStage[SY][SX] =
{
' ',' ','G','Y','R','R',
'R','Y','Y','G','Y','G',
'G','Y','G','Y','R','R',
'R','Y','G','Y','R','G',
'Y','G','Y','R','Y','G',
'G','Y','R','Y','R','G',
'Y','G','Y','R','Y','R',
'Y','G','Y','R','Y','R',
'Y','R','R','G','R','G',
'R','Y','G','Y','G','G',
'G','R','Y','G','Y','R',
'G','R','Y','G','Y','R',
'G','R','Y','G','Y','R',
};
int gCombCnt = 0; // グローバル
int gCheckN = 0; // グローバル
Check2D gC2D[SY * SX] = { 0 }; // グローバル
// ↑こんなに要素いらないだろうけど念のため

void printAll();
bool checkAround(char target, int y, int x, Dir dir);
void del();
void fall();
void puyo();
bool isEnd();

/*

  • 現状を出力

*/
void printAll()
{
std::cout << "+------+\n";
for (int y = 0; y < SY; y++)
{
std::cout << "|";
for (int x = 0; x < SX; x++)
{
std::cout << gStage[y][x];
}
std::cout << "|\n";
}
std::cout << "+------+\n";
}

/*

  • 右, 下, 左 (この順がいいかはどうかは微妙)
  • の順につながっている個数を数え、
  • 結果をグローバルに保存する。

*/
bool checkAround(char target, int y, int x, Dir dir)
{
// 周りを調査
for (int i = 0; i < 3; i++)
{
int cx = x + Ofs[i].x;
int cy = y + Ofs[i].y;
// 境界チェック
if (cx < 0 || SX -1 < cx) { continue; }
if (cy < 0 || SY -1 < cy) { continue; }
// きた方向にもどるのはダメ Downは特別扱い
// 現在地点を基準にすると逆方向になるため2 - i
if (dir != Down && dir == 2 - i ) { continue; }
//
if (target == gStage[cy][cx])
{
gC2D[gCheckN].y = cy;
gC2D[gCheckN].x = cx;
gCheckN++;
// 再帰
checkAround(target, cy, cx, static_cast<Dir>(i));
}
}
}

/*

  • checkした部分を消しに行く

*/
void del()
{
for (int i = 0; i < gCheckN; i++)
{
gStage[gC2D[i].y][gC2D[i].x] = ' ';
}
}

// この関数でハマった
/*

  • 消去済み列を調べて下から上に順に落としていく

*/
void fall()
{
for (int i = gCheckN - 1; i >= 0; i--)
{
int ty = gC2D[i].y;
int tx = gC2D[i].x;
// 消えた列に既に何か移動済みであれば次へ
if (gStage[ty][tx] != ' ') { continue; }
int cnt = 0; // 上にずらした分のカウント
// 下から上へ
for (int y = ty; y >= 0; y--)
{
// 現在調べているところに何かあったら
if (gStage[y][tx] != ' ')
{
// 落とす
char swap = gStage[y][tx];
gStage[ty - cnt][tx] = swap;
gStage[y][tx] = ' ';
cnt++;
}
}
}
}

/*

  • 1回のぷよぷよ処理

*/
void puyo()
{
// 左上→右下
//for (int y = 0; y < SY - 1; y++) // 一個手前まで
for (int y = 0; y < SY; y++) // 上は間違ってたので修正
{
for (int x = 0; x < SX; x++)
{
if (gStage[y][x] == ' ') { continue; }
// 現在位置をチェックに入れる!!
gC2D[gCheckN].y = y;
gC2D[gCheckN].x = x;
gCheckN++;

checkAround(gStage[y][x], y, x, None); if (gCheckN >= 4) { del(); fall(); // DEBUG用 実際にはコンボかどうかチェックしていない std::cout << ++gCombCnt << "コンボ!" << std::endl; printAll(); } // 元に戻す memset(gC2D, 0, sizeof(gC2D)); gCheckN = 0; } }

}

/*

  • 終了判定

*/
bool isEnd()
{
// 下から見てく
for (int y = SY - 1; y >= 0; y--)
{
for (int x = SX - 1; x >= 0; x--)
{
if (gStage[y][x] != ' ') { return false; }
}
}
return true;
}

} // end of namespace

int main()
{
std::cout << "--初期状態\n";
Puyo::printAll();
for (int i = 0;;i++)
{
std::cout << "--ループ" << i + 1 << "回目\n";
Puyo::puyo();
if (Puyo::isEnd()) { break; }
}

return 0;

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

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

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

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

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

asm

2019/07/28 14:14

```は行頭にし、開始は```c++のみ終了は```のみにしてください
guest

回答1

0

bool checkAround(char target, int y, int x, Dir dir);
bool checkAround(char target, int y, int x, Dir dir) {

なぜboolを返す型の関数にしているのでしょうか?
void checkAround(char target, int y, int x, Dir dir);でダメな理由はありますか?

投稿2019/07/28 14:19

asm

総合スコア15147

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問