質問編集履歴

2

追記

2018/05/14 09:00

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -185,3 +185,21 @@
185
185
 
186
186
 
187
187
  ざっとこんな感じです
188
+
189
+
190
+
191
+ さらに追記
192
+
193
+
194
+
195
+ ブロックが重なってたらsquare[][]が3になります。
196
+
197
+ ですがここからブロックが重なってたらどうするかがわかりません。
198
+
199
+ 弾くにしても何マス弾けばいいかがわからないです。
200
+
201
+ ブロックごとに、このブロックがこうめり込んでたらブロックが全部表示できる位置まで
202
+
203
+ 戻すということも考えましたがブロックが7x回転後の形があるのでソースが長くなると思いやめました。
204
+
205
+ 何かいい判定方法はないでしょうか?

1

説明の追記

2018/05/14 09:00

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -35,3 +35,153 @@
35
35
  お知恵をお貸しください
36
36
 
37
37
  よろしくお願いします
38
+
39
+
40
+
41
+ 追記
42
+
43
+
44
+
45
+ まずブロックの出現の方法ですが
46
+
47
+ こんな風に書いています
48
+
49
+
50
+
51
+ ```ここに言語を入力
52
+
53
+ int Tetrimino::ZTetrimino(int ypos, int xpos, int transform)
54
+
55
+ {
56
+
57
+
58
+
59
+ if (transform % 2 == 0)
60
+
61
+ {
62
+
63
+ for (i = 0; i < 2; i++)
64
+
65
+ {
66
+
67
+ for (j = 0; j < 3; j++)
68
+
69
+ {
70
+
71
+ a = ypos + i + move;
72
+
73
+ b = xpos + j;
74
+
75
+ if (a >= 0)
76
+
77
+ {
78
+
79
+ if(!((i==0 && j == 2) || (i == 1 && j == 0)))
80
+
81
+ square[a][b] = 2;
82
+
83
+ }
84
+
85
+ }
86
+
87
+ }
88
+
89
+
90
+
91
+ }
92
+
93
+ else
94
+
95
+ {
96
+
97
+ for (i = 0; i < 3; i++)
98
+
99
+ {
100
+
101
+ for (j = 0; j < 2; j++)
102
+
103
+ {
104
+
105
+ a = ypos + i + move;
106
+
107
+ b = xpos + j;
108
+
109
+ if (a >= 0)
110
+
111
+ {
112
+
113
+ if (!((i == 0 && j == 0) || (i == 2 && j == 1)))
114
+
115
+ square[a][b] = 2;
116
+
117
+ }
118
+
119
+ }
120
+
121
+ }
122
+
123
+ }
124
+
125
+ return 4; // Zの戻り値は4、Iは1のように順番に振り分けてる
126
+
127
+ //なので個の戻り値を拾って今なんのテトリミノか判断している
128
+
129
+
130
+
131
+ }
132
+
133
+ ```
134
+
135
+
136
+
137
+ 全部こんな感じです
138
+
139
+ 左上から順に2にしていくイメージです
140
+
141
+
142
+
143
+ ちなみにですがsquare[][]などの変数は継承元のクラスで静的に宣言しています
144
+
145
+
146
+
147
+ あとはfor文でsquare[i][j] == 0以上だったら"■"を0だったら" "を表示するでjのループが終わったら
148
+
149
+ 改行を挟むという感じです
150
+
151
+
152
+
153
+ main関数のメインループでmoveを増やしてそのあとtetriminoの戻り値でなんのブロックか判断して
154
+
155
+ その関数を呼び出す
156
+
157
+ moveでy軸が増えるのでy軸が一個増えた値でtetrimino関数スタート
158
+
159
+ で当たり判定関数があります
160
+
161
+ 当たり判定はsquare[][]の値が2の周りに1があれば0~7までの戻り値を返す
162
+
163
+ // return 0 = 判定なし
164
+
165
+ // return 1 = 下
166
+
167
+ // return 2 = 右
168
+
169
+ // return 3 = 左
170
+
171
+ // return 4 = 下と右
172
+
173
+ // return 5 = 下と左
174
+
175
+ // return 6 = 左と右
176
+
177
+ // return 7 = 下と左と右
178
+
179
+
180
+
181
+ で個の戻り値で判断して1か4か5か7だったら
182
+
183
+ moveを増やさないという感じで判定しています
184
+
185
+
186
+
187
+ ざっとこんな感じです