回答編集履歴

4

コメントのあるところが変更点

2022/06/16 16:04

投稿

TN8001
TN8001

スコア9363

test CHANGED
@@ -54,7 +54,7 @@
54
54
  initBall();
55
55
  initBlocks();
56
56
  showEnemy();
57
-
57
+ // 初期化
58
58
  r_y = height - 50;
59
59
  }
60
60
 

3

コード追記

2022/06/16 15:52

投稿

TN8001
TN8001

スコア9363

test CHANGED
@@ -28,3 +28,246 @@
28
28
  [ブロック崩しゲームにおいて自分の考えた内容をどうゆう風にプログラムで書き換えばいいのか教えてください。](https://teratail.com/questions/272261)
29
29
 
30
30
  別にそれがどうということはないのですが、(予想される元々の)コードがちょっと癖があるのが気になったもので^^;
31
+
32
+ ---
33
+
34
+ ```Processing
35
+ int block[][] = new int[10][10];
36
+ float x, y = 60;
37
+ float b_w = 10, b_h = 10, dx, dy;
38
+ float r_w = 50.0, r_h = 3.0;
39
+ int hp = 3;
40
+ int enemy_x[] = new int[10];
41
+ int enemy_y[] = new int[10];
42
+ int enemy_speed[] = new int[10];
43
+ //int r_x = mouseX;
44
+ //int r_y = height - 50;
45
+ float r_x;
46
+ float r_y;
47
+ int gseq;
48
+ int mcnt;
49
+ float bw, bh = 40.0;
50
+
51
+
52
+ void setup() {
53
+ size(600, 700);
54
+ initBall();
55
+ initBlocks();
56
+ showEnemy();
57
+
58
+ r_y = height - 50;
59
+ }
60
+
61
+ void draw() {
62
+ background(192, 192, 255);
63
+
64
+ rect(x, y, b_w, b_h);
65
+ if (gseq == 0) {
66
+ gameTitle();
67
+ } else if (gseq == 1) {
68
+ x += dx;
69
+ y += dy;
70
+ gameplay();
71
+ } else {
72
+ gameover();
73
+ }
74
+
75
+ checkBlocks();
76
+ showBlocks();
77
+
78
+ checkAndShowRacket(height - 50);
79
+
80
+ if (y + b_h >= height) {
81
+ initBlocks();
82
+ gseq = 2;
83
+ }
84
+ if (x < 0 || x + b_w >= width) {
85
+ dx = -dx;
86
+ }
87
+ if (y < 0) {
88
+ dy = -dy;
89
+ }
90
+ }
91
+
92
+ void initBall() {
93
+ x = 40;
94
+ y = 400;
95
+ dx = 1;
96
+ dy = 2;
97
+ }
98
+
99
+ void initBlocks() {
100
+ for (int j = 0; j < 3; j++) {
101
+ for (int i = 0; i < block.length; i++) {
102
+ block[i][j] = 1;
103
+ }
104
+ bw = width / block.length;
105
+ }
106
+ }
107
+
108
+ void checkBlocks() {
109
+ for (int j = 0; j < 3; j++) {
110
+ for (int i = 0; i < block.length; i++) {
111
+ if (block[i][j] > 0) {
112
+ int ret = blockHitCheck(i * bw, j * bh + 200, bw, bh, x, y, b_w, b_h, dx, dy);
113
+ if (ret > 0) {
114
+ if (ret == 1) {
115
+ dx = -dx;
116
+ block[i][j]--;
117
+ } else if (ret == 2) {
118
+ dy = -dy;
119
+ block[i][j]--;
120
+ } else if (ret == 3) {
121
+ dx = -dx;
122
+ dy = -dy;
123
+ block[i][j]--;
124
+ }
125
+ return;
126
+ }
127
+ }
128
+ }
129
+ }
130
+ }
131
+
132
+ void showBlocks() {
133
+ for (int j = 0; j < 3; j++) {
134
+ for (int i = 0; i < block.length; i++) {
135
+ if (block[i][j] > 0) {
136
+ fill(255);
137
+ rect(i * bw, j * bh + 200, bw, bh);
138
+ }
139
+ }
140
+ }
141
+ }
142
+
143
+ void enemymove() {
144
+ for (int i = 0; i < 10; i++) {
145
+ fill(255, 0, 0);
146
+ rect(enemy_x[i], enemy_y[i], 10, 10);
147
+ enemy_y[i] += enemy_speed[i];
148
+ if (enemy_y[i] > height) {
149
+ enemy_x[i] =int(random(width));
150
+ enemy_y[i] = -50;
151
+ enemy_speed[i] =int(random(2, 6));
152
+ }
153
+ }
154
+ }
155
+
156
+ void hitEnemy() {
157
+ for (int i = 0; i < 10; i++) {
158
+ //if ((enemy_x[i] < r_x + 50 && r_x < enemy_x[i]) && enemy_y[i] == r_y) {
159
+ // hp = hp - 1;
160
+ //}
161
+ if (isOverlap(r_x, r_y, r_w, r_h, enemy_x[i], enemy_y[i], 10, 10)) {
162
+ hp = hp - 1;
163
+ enemy_x[i] = int(random(width));
164
+ enemy_y[i] = -50;
165
+ enemy_speed[i] = int(random(2, 6));
166
+ }
167
+ }
168
+ }
169
+
170
+ void showMyhp() {
171
+ fill(255);
172
+ text("hp:" + hp, 10, 30);
173
+ }
174
+
175
+
176
+ void showEnemy() {
177
+ for (int i = 0; i < 10; i++) {
178
+ enemy_x[i] = int(random(width));
179
+ enemy_y[i] = -50;
180
+ enemy_speed[i] = int(random(2, 6));
181
+ }
182
+ }
183
+
184
+ boolean isOverlap(float x1, float y1, float w1, float h1,
185
+ float x2, float y2, float w2, float h2) {
186
+ return x1 < x2 + w2 && x2 < x1 + w1 && y1 < y2 + h2 && y2 < y1 + h1;
187
+ }
188
+
189
+ int blockHitCheck(float x, float y, float w, float h,
190
+ float bx, float by, float bw, float bh, float dx, float dy) {
191
+ int xflag = 0, yflag = 0;
192
+
193
+ if (!isOverlap(x, y, w, h, bx + dx, by + dy, bw, bh)) {
194
+ return 0;
195
+ }
196
+
197
+ if (isOverlap(x, y, w, h, bx + dx, by, bw, bh)) xflag = 1;
198
+ if (isOverlap(x, y, w, h, bx, by + dy, bw, bh)) yflag = 2;
199
+ if (xflag + yflag > 0) {
200
+ return xflag + yflag;
201
+ }
202
+ return 3;
203
+ }
204
+
205
+ void checkAndShowRacket(float r_y) {
206
+ //float r_x = mouseX;
207
+ r_x = mouseX;
208
+
209
+ if (r_x + r_w > width) {
210
+ r_x = width - r_w;
211
+ }
212
+
213
+ if (blockHitCheck(r_x, r_y, r_w, r_h, x, y, b_w, b_h, dx, dy) > 0) {
214
+ dy = -2;
215
+ }
216
+
217
+ rect(r_x, r_y, r_w, r_h);
218
+ }
219
+
220
+ void gameTitle() {
221
+ checkAndShowRacket(height - 50);
222
+ showBlocks();
223
+ mcnt++;
224
+ if ((mcnt % 60) < 40) {
225
+ textSize(20);
226
+ fill(255, 0, 0);
227
+ text("Click to start!!", 220, 400);
228
+ }
229
+ }
230
+
231
+ void gameInit() {
232
+ x += dx;
233
+ y += dy;
234
+ gseq = 0;
235
+ initBall();
236
+ showBlocks();
237
+ mcnt = 0;
238
+ }
239
+
240
+ void gameplay() {
241
+ x += dx;
242
+ y += dy;
243
+ checkAndShowRacket(height - 50);
244
+ showBlocks();
245
+ enemymove();
246
+ hitEnemy();
247
+ showMyhp();
248
+ }
249
+
250
+ void gameover() {
251
+ checkAndShowRacket(height - 50);
252
+ showBlocks();
253
+ textSize(50);
254
+ fill(0);
255
+ text("GAME OVER", 200, 500);
256
+ mcnt++;
257
+ if ((mcnt % 60) < 40) {
258
+ textSize(20);
259
+ fill(0);
260
+ text("Click to retry!!", 170, 400);
261
+ }
262
+ }
263
+
264
+ void mousePressed() {
265
+ if (gseq == 2) {
266
+ gameInit();
267
+ return;
268
+ }
269
+ if (gseq == 0) {
270
+ gseq = 1;
271
+ }
272
+ }
273
+ ```

2

2022/06/16 12:07

投稿

TN8001
TN8001

スコア9363

test CHANGED
@@ -8,7 +8,7 @@
8
8
  かなりの複合原因のため、うまく言葉で伝わるか心配です^^;
9
9
 
10
10
  まず`(enemy_x[i]<r_x+50 || r_x<enemy_x[i])`はおかしいです。
11
- 「自機の左右範囲内に玉があったら」のはずですから、`&&`でしょう。
11
+ 「自機の左右範囲内に降ってくる玉があったら」のはずですから、`&&`でしょう。
12
12
 
13
13
  次にグローバルに定義した`r_x`・`r_y`です。
14
14
  ```
@@ -18,8 +18,8 @@
18
18
  `r_x`は0のまま一切変わりません。なぜかというと`checkAndShowRacket`で変更している`r_x`は、**ローカル変数**だからです。
19
19
  `r_y`はこの時点では50になります。`size`の**後**に初期化しないと正しい値になりません。
20
20
 
21
- さらに`&& enemy_y[i]==r_y`の部分ですがのスピードはランダムなため、必ずしも自機のy(`r_y`)と一致するとは限りません。
21
+ さらに`&& enemy_y[i]==r_y`の部分ですが降ってくる玉のスピードはランダムなため、必ずしも自機のy(`r_y`)と一致するとは限りません。
22
- 結局ブロックと同じように`isOverlap`を使って、自機に当たったらを消して(リセットして)しまうほうが楽そうな気がします。
22
+ 結局ブロックと同じように`isOverlap`を使って、自機に当たったら降ってくる玉を消して(リセットして)しまうほうが楽そうな気がします。
23
23
 
24
24
  ---
25
25
 

1

してして

2022/06/16 12:05

投稿

TN8001
TN8001

スコア9363

test CHANGED
@@ -19,7 +19,7 @@
19
19
  `r_y`はこの時点では50になります。`size`の**後**に初期化しないと正しい値になりません。
20
20
 
21
21
  さらに`&& enemy_y[i]==r_y`の部分ですが球のスピードはランダムなため、必ずしも自機のy(`r_y`)と一致するとは限りません。
22
- 結局ブロックと同じように`isOverlap`を使って、自機に当たったら球を消して(リセットしてしまうほうが楽そうな気がします。
22
+ 結局ブロックと同じように`isOverlap`を使って、自機に当たったら球を消して(リセットしてしまうほうが楽そうな気がします。
23
23
 
24
24
  ---
25
25