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

質問編集履歴

2

具体的な状況の記載

2019/01/27 03:41

投稿

ijuhs
ijuhs

スコア13

title CHANGED
File without changes
body CHANGED
@@ -4,6 +4,8 @@
4
4
  を見て同じプログラムを書いています。
5
5
  動画の42:00ごろのeraseConnectedBlocks関数を実装したところ、セルを選択しようとしただけでelse内の処理まで実行され、次のwhileループへ移ってしまいます。
6
6
  別の場面でも同じバグが起こりましたが、その時はelseとその後ろの{の間にスペースを入れたら解決しました。今回はそれでは解決せず、困っています。回答よろしくお願いします。
7
+ ##状況
8
+ セルを選択しただけでブロックの消去がされ、矢印は一瞬しか表示されない
7
9
  ##試したこと
8
10
  elseをelse if(selectedX >=0 )にする
9
11
  ##該当部分のコード

1

プログラム全体を記載しました。

2019/01/27 03:41

投稿

ijuhs
ijuhs

スコア13

title CHANGED
File without changes
body CHANGED
@@ -8,7 +8,107 @@
8
8
  elseをelse if(selectedX >=0 )にする
9
9
  ##該当部分のコード
10
10
  ```C++
11
+ #include<stdio.h>
12
+ #include<stdlib.h>
13
+ #include<time.h>
14
+ #include <string.h>
15
+ #include<conio.h>
16
+
17
+ //マップ縦横幅
18
+ #define FIELD_WIDTH 8
19
+ #define FIELD_HEIGHT 8
20
+ //ブロックの種類
21
+ #define BLOCK_TYPE_MAX 7
22
+
23
+ //セルの状態
24
+ enum{
25
+ CELL_TYPE_NONE,//0
26
+ CELL_TYPE_BLOCK_0,//1
27
+ CELL_TYPE_BLOCK_1,//2
28
+ CELL_TYPE_BLOCK_2,//3
29
+ CELL_TYPE_BLOCK_3,//4
30
+ CELL_TYPE_BLOCK_4,//5
31
+ CELL_TYPE_BLOCK_5,//6
32
+ CELL_TYPE_BLOCK_6,//7
33
+ CELL_TYPE_BLOCK_MAX//8
34
+ };
35
+
36
+ //セルAA情報
37
+ char cellAA[][3+1] = {
38
+ "・",//CELL_TYPE_NONE
39
+ "〇",//CELL_TYPE_BLOCK_0
40
+ "△",//CELL_TYPE_BLOCK_1
41
+ "□",//CELL_TYPE_BLOCK_2
42
+ "●",//CELL_TYPE_BLOCK_3
43
+ "▲",//CELL_TYPE_BLOCK_4
44
+ "■",//CELL_TYPE_BLOCK_5
45
+ "☆",//CELL_TYPE_BLOCK_6
46
+ };
47
+
48
+ //セル(0,0)~(7,7)
49
+ int cells[FIELD_HEIGHT][FIELD_WIDTH];
50
+
51
+ //連結チェックされたか
52
+ int ischecked[FIELD_HEIGHT][FIELD_WIDTH];
53
+
54
+ //カーソル位置
55
+ int cursorX, cursorY;
56
+
57
+ //選択されたセル
58
+ int selectedX = -1, selectedY = -1;
59
+
60
+ /*
61
+ 連結判定関数
62
+ x:対象のx座標
63
+ y:対象のy座標
64
+ cellType:ブロックの種類
65
+ count:つながっている数
66
+ */
67
+ int getConnectedBlockCount(int _x, int _y, int _cellType, int _count){
68
+ //判定対象か否か
69
+ if ((_x < 0) || (_x >= FIELD_WIDTH) || (_y < 0 ) || (_y >= FIELD_HEIGHT) || ischecked[_y][_x] || (cells[_y][_x] == CELL_TYPE_NONE) || (cells[_y][_x] != _cellType))
70
+ return _count;
71
+ _count++;
72
+ ischecked[_y][_x] = true;
73
+
74
+ //再帰処理
75
+ //上
76
+ _count = getConnectedBlockCount(_x, _y-1, _cellType, _count);
77
+ //下
78
+ _count = getConnectedBlockCount(_x, _y+1, _cellType, _count);
79
+ //左
80
+ _count = getConnectedBlockCount(_x-1, _y, _cellType, _count);
81
+ //右
82
+ _count = getConnectedBlockCount(_x+1, _y, _cellType, _count);
83
+
84
+ return _count;
85
+ }
86
+
87
+ //連結したブロックを消す関数
88
+ void eraseConnectedBlocks(int _x, int _y, int _cellType){
89
+ //対象か否か
90
+ if ((_x < 0) || (_x >= FIELD_WIDTH) || (_y < 0 ) || (_y >= FIELD_HEIGHT) || (cells[_y][_x] == CELL_TYPE_NONE) || (cells[_y][_x] != _cellType))
91
+ return;
92
+ //自身を消す
93
+ cells[_y][_x] = CELL_TYPE_NONE;
94
+ //上下左右も判定し消す
95
+ eraseConnectedBlocks(_x, _y-1, _cellType);
96
+ eraseConnectedBlocks(_x, _y+1, _cellType);
97
+ eraseConnectedBlocks(_x-1, _y, _cellType);
98
+ eraseConnectedBlocks(_x+1, _y, _cellType);
99
+ }
100
+ //main
101
+ int main() {
102
+ //ブロックのランダム化
103
+ srand((unsigned int)time(NULL));
104
+ for (int y = 0; y < FIELD_HEIGHT; y++){
105
+ for(int x = 0; x < FIELD_WIDTH; x++){
106
+ //1 + 0...6 =1...7
107
+ cells[y][x] = CELL_TYPE_BLOCK_0 + rand() % BLOCK_TYPE_MAX;
108
+ }
109
+ }
110
+ //描画とか
11
- while (1) {
111
+ while (1) {
12
112
  system("cls");
13
113
  for (int y = 0; y < FIELD_HEIGHT; y++) {
14
114
 
@@ -74,4 +174,6 @@
74
174
  break;
75
175
  }
76
176
  }
177
+ }
178
+
77
179
  ```