C++でテトリスを作ってみるスレ (35レス)
1-

1: 2014/05/06(火)18:23 ID:D02Sx0VTr(1/33) AAS
作ってみるゼ!
よろしくナ!
2: 2014/05/06(火)18:31 ID:D02Sx0VTr(2/33) AAS
誰もいないけど早速行くゼ!
テトリスは座標値がいると思うんダ!
だからPoint2Dっていうクラスを定義するゼ!
3: 2014/05/06(火)18:31 ID:D02Sx0VTr(3/33) AAS
class Point2D {
public:
Point2D()
: x(0), y(0) {}
Point2D(const int getX, const int getY)
: x(getX), y(getY) {}
virtual ~Point2D() {}

Point2D& operator=(const Point2D& p)
{ x = p.x; y = p.y; return *this; }

Point2D& operator+=(const Point2D& p)
省11
4: 2014/05/06(火)18:32 ID:D02Sx0VTr(4/33) AAS
こんな感じだネ!
次に+と-もオーバーロードしておくゼ!
5: 2014/05/06(火)18:33 ID:D02Sx0VTr(5/33) AAS
Point2D operator+(const Point2D& p1, const Point2D& p2)
{ return Point2D(p1.x + p2.x, p1.y + p2.y); }

Point2D operator-(const Point2D& p1, const Point2D& p2)
{ return Point2D(p1.x - p2.x, p1.y - p2.y); }
6: 2014/05/06(火)18:43 ID:D02Sx0VTr(6/33) AAS
テトリスの落下ブロックには型があるラシイ
TetriminoTypeを定義するゼ!
7: 2014/05/06(火)18:44 ID:D02Sx0VTr(7/33) AAS
enum class TetriminoType {
I, O, S, Z, J, L, T
};
8: 2014/05/06(火)18:44 ID:D02Sx0VTr(8/33) AAS
次にブロックの種類についても定義しておくことにするゼ!
BlockTypeを以下の様に定義ダ!
9: 2014/05/06(火)18:45 ID:D02Sx0VTr(9/33) AAS
enum class BlockType {
WALL, NOTHING, RED, AQUA, YELLOW, OLIVE, PURPLE, ORANGE, BLUE
};
10: 2014/05/06(火)18:49 ID:D02Sx0VTr(10/33) AAS
次にいくつかtypedefしておくゼ!
11: 2014/05/06(火)18:49 ID:D02Sx0VTr(11/33) AAS
typedef std::array<Point2D, 4> PointList;
typedef std::array<BlockType, 20> FieldColumn;
typedef std::array<FieldColumn, 10> FieldMatrix;
12: 2014/05/06(火)18:52 ID:D02Sx0VTr(12/33) AAS
次に平行移動の処理を考えてみるゼ!
平行移動できるかどうかを返す関数が必要そうダ
canTranslateという名前にしてみよう。
引数はPointListとFieldMatrixのconst参照でいいかな?
13: 2014/05/06(火)19:01 ID:D02Sx0VTr(13/33) AAS
と思ったけど、それより先にPointListになんらかの処理を施した結果を出力する関数を作ったほうがいいかもしれない。。。
ってわけでmapPointList関数を先に定義します。
14: 2014/05/06(火)19:01 ID:D02Sx0VTr(14/33) AAS
template <typename Function>
PointList mapPointList(const PointList& pl, Function func) {
PointList res;
for (int i = 0; i < res.size(); i++) {
res[i] = func(pl[i]);
}
return res;
}
15: 2014/05/06(火)19:04 ID:StjgCUfip(1) AAS
ふむふむ、参考になります
16: 2014/05/06(火)19:07 ID:D02Sx0VTr(15/33) AAS
あ、人が来てくれた!
やったやった!

で、canTranslateとかいう関数は作らずにcanMoveっていうもっと一般的な関数として定義しておきます。
17: 2014/05/06(火)19:08 ID:D02Sx0VTr(16/33) AAS
bool canMove(const PointList& pl, const FieldMatrix& fm) {
return (std::find_if(pl.begin(), pl.end(),
[&](const Point2D& p) -> bool
{ return fm[p.x][p.y] != BlockType::NOTHING; })
!= pl.end());
}
18: 2014/05/06(火)19:23 ID:D02Sx0VTr(17/33) AAS
やっぱりcanTranslateとかは作っといた方が見やすいかも。。。
19: 2014/05/06(火)19:30 ID:D02Sx0VTr(18/33) AAS
その前に向きを表すDirectionを作っておこう。
20: 2014/05/06(火)19:30 ID:D02Sx0VTr(19/33) AAS
enum class Direction {
RIGHT, LEFT, UP, DOWN
};
1-
あと 15 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.075s*