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

質問編集履歴

1

コードの追加

2019/04/05 01:06

投稿

dounatsu
dounatsu

スコア78

title CHANGED
File without changes
body CHANGED
@@ -23,4 +23,243 @@
23
23
  a = b + c;
24
24
  }
25
25
 
26
+ ```
27
+
28
+ ---
29
+ 追記
30
+
31
+ 単純化させたコードを載せて逆に混乱させてしまった様なので、少々長いですが、コード全文載せます。
32
+ onイベントの中のplacePieceというメソッドはboardという変数に新たな値を代入するメソッドなので、`console.log(board)`(*1)では変更前のboardを表示して、`console.log(board)`(*2)では変更後の値が表示されることを期待していたのですが、どちらも変更後(つまりplacePieceメソッドが動作した後)の値を表示しています。
33
+
34
+ placePiece自体が期待した動作をしていないので、読み込みの順番がおかしいのは何となく分かっているのですが、どこが間違っているのか分からないので質問させていただきました。
35
+
36
+ `board`という変数に新たな値を代入する直前で`console.log`しても新しい値の代入後の`board`が表示されるので、混乱しています。
37
+
38
+ ```javascript
39
+
40
+ <!DOCTYPE html>
41
+ <html lang="en" dir="ltr">
42
+ <head>
43
+ <meta charset="utf-8">
44
+ <title></title>
45
+ <style>
46
+ #reversiTable {
47
+ border: 2px solid black;
48
+ background: #2A2;
49
+ }
50
+ #reversiTable td {
51
+ border: 2px solid black;
52
+ width: 100px;
53
+ height: 100px;
54
+ }
55
+ .blackPiece{
56
+ width: 70px;
57
+ height: 70px;
58
+ background: black;
59
+ border-radius: 50%;
60
+ margin: auto;
61
+ }
62
+ .whitePiece{
63
+ width: 70px;
64
+ height: 70px;
65
+ background: white;
66
+ border-radius: 50%;
67
+ margin: auto;
68
+
69
+ }
70
+ </style>
71
+ </head>
72
+ <body>
73
+ <div>
74
+ <table id="reversiTable">
75
+
76
+ </table>
77
+ </div>
78
+
79
+ <div id="id">
80
+ </div>
81
+
82
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
83
+ <script type="text/javascript">
84
+ (function(){
85
+ // set borad
86
+ let table = document.getElementById("reversiTable");
87
+ for (let i = 0; i < 8; i++) {
88
+ let tr = document.createElement('tr');
89
+ table.appendChild(tr);
90
+ }
91
+
92
+ let trElem = table.children;
93
+ for (let i = 0; i < 8; i++) {
94
+ for (var j = 0; j < 8; j++) {
95
+ let td = document.createElement('td');
96
+ trElem[i].appendChild(td)
97
+ }
98
+ }
99
+
100
+ tds = $('td');
101
+ for (var i = 0; i < tds.length; i++) {
102
+ tds.eq(i).attr('value', i);
103
+ tds.eq(i).attr('class', 'tdElements');
104
+ tds.eq(i).attr('id', 'tdId-' + i);
105
+ tds.eq(i).append("<div></div>")
106
+ }
107
+
108
+
109
+
110
+ // initialize reversi pieces
111
+ let serializedBoard = [];
112
+ let board = [];
113
+ let activePlayer = 1;
114
+
115
+ for (var i = 0; i < 64; i++) {
116
+ serializedBoard.push(0);
117
+ }
118
+
119
+ serializedBoard[27] = 2;
120
+ serializedBoard[28] = 1;
121
+ serializedBoard[35] = 1;
122
+ serializedBoard[36] = 2;
123
+
124
+ for (var i = 0; i < 8; i++) {
125
+ let array = [];
126
+ for (var j = 0; j < 8; j++) {
127
+ array.push(serializedBoard[8*i + j]);
128
+ }
129
+ board.push(array);
130
+ }
131
+
132
+ for (var i = 0; i < serializedBoard.length; i++) {
133
+ if (serializedBoard[i] === 1){
134
+ $("#tdId-"+i+" > div").addClass('whitePiece');
135
+ } else if (serializedBoard[i] === 2){
136
+ $("#tdId-"+i+" > div").addClass('blackPiece');
137
+ }
138
+ }
139
+
140
+ for (var i = 0; i < serializedBoard.length; i++) {
141
+ const x = i % 8;
142
+ const y = Math.floor(i / 8);
143
+ board[y][x] = serializedBoard[i]
144
+ }
145
+
146
+
147
+ //
148
+ // functions of reversi
149
+ //
150
+
151
+ $('td').on('click', function(){
152
+
153
+ console.log(board); // *1
154
+
155
+ // クリック箇所の取得
156
+ const posX = $(this).index();
157
+ const posY = $(this).parent().index();
158
+
159
+ // 石をひっくり返すメソッド
160
+ placePiece(posX, posY, activePlayer);
161
+
162
+ // 盤面の状態を2次元配列から1次元配列にするメソッド
163
+ serializeTheBoard();
164
+
165
+ // 盤面の状態を表す配列から石が置いてある場所にCSSを適用するメソッド
166
+ setColorOfPieces();
167
+
168
+ console.log(board); // *2
169
+
170
+ });
171
+
172
+ function placePiece(_posX, _posY, _activePlayer){
173
+ let opponent = getOpponent(_activePlayer);
174
+ if (board[_posY][_posX] === 0){
175
+ turnOverPiece(_posY, _posX, opponent);
176
+ switchActivePlayer(_posY, _posX, _activePlayer);
177
+
178
+ }else{
179
+ return;
180
+ }
181
+ }
182
+
183
+ function getOpponent(_activePlayer) {
184
+ if (_activePlayer === 1){
185
+ return 2;
186
+ }else{
187
+ return 1;
188
+ }
189
+ }
190
+
191
+ function switchActivePlayer(_posX, _posY, _activePlayer){
192
+ if (board[_posY][_posX] === activePlayer){
193
+ if (activePlayer === 1) {
194
+ activePlayer = 2;
195
+ }else{
196
+ activePlayer = 1;
197
+ }
198
+ }
199
+ }
200
+
201
+ function turnOverPiece(posY, posX, opponent){
202
+ for (var i = -1; i <= 1; i++) {
203
+ for (var j = -1; j <= 1; j++) {
204
+ if (board[posY+j][posX+i] == opponent){
205
+ flipPieces(posY, posX, j, i, opponent);
206
+ }
207
+ }
208
+ }
209
+ }
210
+
211
+
212
+ function flipPieces(posY, posX, j, i, opponent){
213
+ let counter = 1;
214
+ let initDiffX = i;
215
+ let initDiffY = j;
216
+ do {
217
+ counter++;
218
+ diffX = initDiffX * counter;
219
+ diffY = initDiffY * counter;
220
+
221
+ if (board[posY + diffY][posX + diffX] === 0){
222
+ break;
223
+ }else if (board[posY + diffY][posX + diffX] === activePlayer){
224
+ for (var a = 1; a < counter; a++){
225
+ board[posY + (a * j)][posX + (a * i)] = activePlayer;
226
+ }
227
+ board[posY][posX] = activePlayer;
228
+ }
229
+
230
+ } while (board[posY + diffY][posX + diffX] == opponent);
231
+ }
232
+
233
+
234
+ function serializeTheBoard(){
235
+ for (var i = 0; i < serializedBoard.length; i++) {
236
+ const x = i % 8;
237
+ const y = Math.floor(i / 8);
238
+ serializedBoard[i] = board[y][x];
239
+ }
240
+ }
241
+
242
+ function setColorOfPieces(){
243
+ for (var i = 0; i < serializedBoard.length; i++) {
244
+ if (serializedBoard[i] === 1){
245
+ $("#tdId-"+i+" > div").addClass('whitePiece');
246
+ } else if (serializedBoard[i] === 2){
247
+ $("#tdId-"+i+" > div").addClass('blackPiece');
248
+ }
249
+ }
250
+ }
251
+
252
+
253
+
254
+
255
+
256
+ })();
257
+
258
+
259
+ </script>
260
+ </body>
261
+ </html>
262
+
263
+
264
+
26
265
  ```