質問するログイン新規登録

質問編集履歴

1

書式の改善

2017/11/04 03:01

投稿

ganariya
ganariya

スコア50

title CHANGED
File without changes
body CHANGED
@@ -1,22 +1,248 @@
1
+ ###前提・実現したいこと
1
- 現在Siv3Dでゲーム制作しています。
2
+ 現在C++とSiv3Dで落ち物パズルゲーム制作しています。
2
3
 
3
- 独自のクラス[Block]を作り、それを vectorとして
4
- std::vector<Block> blocksと[Board]というクラス内で宣言して
5
- emplace_backで要素を追加し、
6
- [Board]というクラス内で使用しています。
7
4
 
5
+ ###発生している問題・エラーメッセージ
6
+ std::vectorを使用して'Block'クラスを格納しようとしていたのですが
7
+ (std::vector<Block> bronzeと宣言)
8
- ブロッを真下に落とす関数を作っていたのですが、
8
+ bronze[0]などとアセスしようとするとエラーが起きしままし
9
- blocks[0]
10
- て使おうとると
9
+ **発生た箇所はboard.cpp内のdropBronze関数で。**
10
+ ```
11
- Expression: vector subscript out of range 
11
+ Expression: vector subscript out of range
12
- Line:1234
12
+ ```
13
- と表示され、アサーションが吐かれてしまいました。
14
13
 
14
+ ###該当のソースコード
15
+ ```C+++
16
+ #pragma once
15
- for(auto& x: blocks)は使用でき、
17
+ #include "Block.hpp"
16
- for(size_t i=0;i<blocks.size();i++)もエラーはありませんでした。
17
18
 
19
+ ///<summary>
20
+ ///<para>Boardクラス</para>
21
+ ///<para>・Boardのサイズは大きい方</para>
22
+ ///<para>・位置=画面上のもの</para>
23
+ ///<para>・座標=二次元配列のこと</para>
18
- blocks[0]やblocks.front()などだけエラーとなってしまいます。
24
+ ///</summary>
25
+ class Board {
19
26
 
27
+ public:
28
+ Board() = default;
29
+ Board(WhichPlayer _whichPlayer);
30
+ ~Board();
20
31
 
32
+ public:
33
+ const Point BOARD_VISUAL_SIZE; //見た目上の二次元配列
34
+ const Point BOARD_ACTUAL_SIZE; //実際の二次元配列
35
+ const Point BOARD_POINT_1P; //1Pの画面上の位置
36
+ const Point BOARD_POINT_2P; //2Pの画面上の位置
37
+ const Point INIT_BRONZE_COORDINATE; //ブロンズの基準の初期座標
38
+ const Point BOARD_RECTANGLE_SIZE; //ボードのサイズ
39
+ const int BLOCK_SIZE;
40
+ const unsigned int BRONZE_MAX_SIZE;
41
+ const int RED_NUM;
42
+ const int BLUE_NUM;
43
+ const int GREEN_NUM;
44
+ const int YELLOW_NUM;
45
+ const int PURPLE_NUM;
46
+ const int SELULIAN_NUM;
47
+ const int WALL_NUM;
48
+ const int NONE_NUM;
49
+
50
+ public:
51
+ void init();
52
+ void update();
53
+ void draw() const;
54
+
55
+ void boardInit();
56
+ void bronzeInit();
57
+ void boardDraw() const;
58
+ void bronzeDraw() const;
59
+
60
+ void addBlockToBronze(Point coordinate,BlockColor blockColor);
61
+ void moveBronzeIndicator(int direction);
62
+ void dropBronze();
63
+ void checkBoardConnection();
64
+
65
+ bool isCanMoveBronze(int direction);
66
+ bool isCanAddBlockToBronze();
67
+ bool isBronzeDontCollideWithBoard(Point _coordinate);
68
+ bool isReachFallingDefaultCount();
69
+
70
+ private:
71
+ std::vector<std::vector<BlockColor>> board;
72
+ std::vector<Block> bronze;
73
+ std::vector<Point> candidates;
74
+ Point bronzeIndicator;
75
+ WhichPlayer whichPlayer;
76
+ Point boardVisualPoint;
77
+ Rect rectangle;
78
+ int fallingCount;
79
+ int fallingDefaultCount;
80
+ };
81
+
82
+
83
+ #include "Board.hpp"
84
+
85
+
86
+
87
+ Board::Board(WhichPlayer _whichPlayer) :
88
+ whichPlayer(_whichPlayer),
89
+ BOARD_VISUAL_SIZE(Point(7, 13)),
90
+ BOARD_ACTUAL_SIZE(Point(9, 15)),
91
+ BOARD_POINT_1P(150, 100),
92
+ BOARD_POINT_2P(850, 100),
93
+ INIT_BRONZE_COORDINATE(3,0),
94
+ BOARD_RECTANGLE_SIZE(280,520),
95
+ BLOCK_SIZE(40),
96
+ BRONZE_MAX_SIZE(5),
97
+ RED_NUM(0),
98
+ BLUE_NUM(1),
99
+ GREEN_NUM(2),
100
+ YELLOW_NUM(3),
101
+ PURPLE_NUM(4),
102
+ SELULIAN_NUM(5),
103
+ WALL_NUM(6),
104
+ NONE_NUM(7)
105
+ {
106
+ init();
107
+ }
108
+
109
+
110
+ Board::~Board() {
111
+
112
+ }
113
+
114
+ void Board::init() {
115
+ boardInit();
116
+ bronzeInit();
117
+ }
118
+
119
+
120
+ void Board::update() {
121
+ if (Input::Key1.clicked) {
122
+ dropBronze();
123
+ }
124
+ }
125
+
126
+ void Board::draw() const {
127
+ rectangle.draw();
128
+ boardDraw();
129
+ bronzeDraw();
130
+ }
131
+
132
+ void Board::boardInit() {
133
+ board.resize(BOARD_ACTUAL_SIZE.x);
134
+ for (int i = 0; i < BOARD_ACTUAL_SIZE.x; i++) {
135
+ board[i].resize(BOARD_ACTUAL_SIZE.y);
136
+ }
137
+
138
+ for (int i = 0; i < BOARD_ACTUAL_SIZE.x; i++) {
139
+ for (int j = 0; j < BOARD_ACTUAL_SIZE.y; j++) {
140
+ board[i][j] = static_cast<BlockColor>(NONE_NUM);
141
+ }
142
+ }
143
+ for (int i = 0; i < BOARD_ACTUAL_SIZE.x; i++) {
144
+ board[i][0] = static_cast<BlockColor>(WALL_NUM);
145
+ board[i][BOARD_ACTUAL_SIZE.y - 1] = static_cast<BlockColor>(WALL_NUM);
146
+ }
147
+ for (int i = 0; i < BOARD_ACTUAL_SIZE.y; i++) {
148
+ board[0][i] = static_cast<BlockColor>(WALL_NUM);
149
+ board[BOARD_ACTUAL_SIZE.x - 1][i] = static_cast<BlockColor>(WALL_NUM);
150
+ }
151
+
152
+ if (whichPlayer == WhichPlayer::PLAYER1) {
153
+ boardVisualPoint = BOARD_POINT_1P;
154
+ }
155
+ else {
156
+ boardVisualPoint = BOARD_POINT_2P;
157
+ }
158
+ rectangle = Rect(boardVisualPoint, BOARD_RECTANGLE_SIZE);
159
+ }
160
+ void Board::bronzeInit() {
161
+ bronzeIndicator = INIT_BRONZE_COORDINATE;
162
+ std::vector<Block>().swap(bronze);
163
+ }
164
+ void Board::bronzeDraw() const {
165
+ for (unsigned int i = 0; i<bronze.size(); i++) {
166
+ TextureAsset(L"Block")(BLOCK_SIZE*static_cast<int>(bronze[i].getBlockColor()), 0, BLOCK_SIZE, BLOCK_SIZE).draw(boardVisualPoint +BLOCK_SIZE*(bronzeIndicator+bronze[i].getPoint()));
167
+ }
168
+ }
169
+ void Board::boardDraw() const {
170
+ for (int i = 0; i < BOARD_VISUAL_SIZE.x; i++) {
171
+ for (int j = 0; j < BOARD_VISUAL_SIZE.y; j++) {
172
+ if (static_cast<int>(board[i + 1][j + 1]) < 5) {
173
+ TextureAsset(L"Block")(BLOCK_SIZE*static_cast<int>(board[i + 1][j + 1]), 0, BLOCK_SIZE, BLOCK_SIZE).draw(boardVisualPoint + Point(i*BLOCK_SIZE, j*BLOCK_SIZE));
174
+ }
175
+ }
176
+ }
177
+ }
178
+
179
+ void Board::addBlockToBronze(Point coordinate,BlockColor blockColor) {
180
+ for (auto& x : bronze) {
181
+ x.setPoint(x.getPoint() + Point(0, 1));
182
+ }
21
- これは、vectorが、emplace_backとして追加したせいで、配列として機能せず、添字などの順番が決まっていないからでしょうか。
183
+ bronze.emplace_back(Block(blockColor,coordinate));
184
+ }
185
+
186
+ void Board::moveBronzeIndicator(int direction) {
187
+ bronzeIndicator += Point(direction, 0);
188
+ }
189
+
190
+ void Board::dropBronze() {
191
+ Point dropBaseCoordinate = Point(0,0);
192
+ for (auto& x : bronze) {
193
+
194
+ }
195
+ // while (board[bronzeIndicator.x+1][(dropBaseCoordinate + bronze.front().getPoint()).y + 1] == BlockColor::NONE) {
196
+ //dropBaseCoordinate += Point(0, 1);
197
+ // }
198
+ for (auto& x : bronze) {
199
+ board[bronzeIndicator.x + 1][x.getPoint().y + dropBaseCoordinate.y + 1] = x.getBlockColor();
200
+ }
201
+
202
+ bronze[0];
203
+ bronzeInit();
204
+ }
205
+
206
+ bool Board::isCanAddBlockToBronze() {
207
+ if (bronze.size() < BRONZE_MAX_SIZE) {
208
+ bool isCanBronzeAdd = true;
209
+ for (auto& x : bronze) {
210
+ if (!isBronzeDontCollideWithBoard(x.getPoint() + bronzeIndicator + Point(0, 1))) {
211
+ isCanBronzeAdd = false;
212
+ }
213
+ }
214
+ return isCanBronzeAdd;
215
+ }
216
+ return false;
217
+ }
218
+
219
+ bool Board::isCanMoveBronze(int direction) {
220
+ int valid = bronzeIndicator.x + direction;
221
+ if (valid >= 0 && valid < BOARD_VISUAL_SIZE.x) {
222
+ bool isCanBronzeMove = true;
223
+ for (auto& x : bronze) {
224
+ if (!isBronzeDontCollideWithBoard(x.getPoint()+bronzeIndicator+Point(direction,0))) {
225
+ isCanBronzeMove = false;
226
+ }
227
+ }
228
+ return isCanBronzeMove;
229
+ }
230
+ return false;
231
+ }
232
+
233
+ bool Board::isBronzeDontCollideWithBoard(Point _coordinate) {
234
+ if (board[_coordinate.x + 1][_coordinate.y + 1] == BlockColor::NONE) {
235
+ return true;
236
+ }
237
+ else {
238
+ return false;
239
+ }
240
+ }
241
+ ```
242
+
243
+ ###試したこと
244
+ brozneをfor文やfor auto文で回した場合エラーはありませんでした。
245
+ 添字アクセスまたは、front()などでアクセスしてしまうとエラーが発生しました。
246
+
247
+
22
248
  よろしくお願いいたします。