質問編集履歴

2

回答へのお返事

2019/11/25 23:41

投稿

taro_nii_chan
taro_nii_chan

スコア207

test CHANGED
File without changes
test CHANGED
@@ -227,3 +227,177 @@
227
227
 
228
228
 
229
229
  引き続き回答、アドバイス等あればお待ちしています。
230
+
231
+
232
+
233
+ ### 追記(2019.11.26 8:41)
234
+
235
+ MasatoUchidaさんのアドバイスを手がかりにデータの持ち方を変えてみました。
236
+
237
+ 簡単のため石の色や座標は省略し、着手番号(id)と次の着手(idの配列)を持たせることにしました。
238
+
239
+ structだとエラーが出るのでclassにしてみました。
240
+
241
+ それが下のコードです。
242
+
243
+
244
+
245
+ ```swift
246
+
247
+ var 通番: Int = 0
248
+
249
+ class 着手 {
250
+
251
+ var 着手番号: Int
252
+
253
+ var 次の着手: [着手]
254
+
255
+ init() {
256
+
257
+ self.着手番号 = 通番
258
+
259
+ self.次の着手 = []
260
+
261
+ 通番 += 1
262
+
263
+ }
264
+
265
+ func append(次の着手: 着手) {
266
+
267
+ self.次の着手.append(次の着手)
268
+
269
+ }
270
+
271
+ func print() {
272
+
273
+ if 次の着手.count == 0 {
274
+
275
+ Swift.print(self.着手番号)
276
+
277
+ } else {
278
+
279
+ for i in 0 ..< 次の着手.count {
280
+
281
+ if 次の着手[i].着手番号 == 4 {
282
+
283
+ }
284
+
285
+ Swift.print(self.着手番号, " - ", separator: "", terminator: "")
286
+
287
+ 次の着手[i].print()
288
+
289
+ }
290
+
291
+ }
292
+
293
+ }
294
+
295
+ }
296
+
297
+
298
+
299
+ let 棋譜 = 着手()
300
+
301
+ let A = 着手()
302
+
303
+ let B = 着手()
304
+
305
+ let C = 着手()
306
+
307
+ let D = 着手()
308
+
309
+ let E = 着手()
310
+
311
+ let F = 着手()
312
+
313
+ let G = 着手()
314
+
315
+ let H = 着手()
316
+
317
+ let I = 着手()
318
+
319
+ let J = 着手()
320
+
321
+ let K = 着手()
322
+
323
+ 棋譜.append(次の着手: A)
324
+
325
+ A.append(次の着手: B)
326
+
327
+ A.append(次の着手: C)
328
+
329
+ B.append(次の着手: D)
330
+
331
+ D.append(次の着手: G)
332
+
333
+ D.append(次の着手: H)
334
+
335
+ D.append(次の着手: I)
336
+
337
+ C.append(次の着手: E)
338
+
339
+ C.append(次の着手: F)
340
+
341
+ F.append(次の着手: J)
342
+
343
+ F.append(次の着手: K)
344
+
345
+
346
+
347
+ 棋譜.print()
348
+
349
+ ```
350
+
351
+
352
+
353
+ これを実行すると、
354
+
355
+ ```
356
+
357
+ 0 - 1 - 2 - 4 - 7
358
+
359
+ 4 - 8
360
+
361
+ 4 - 9
362
+
363
+ 1 - 3 - 5
364
+
365
+ 3 - 6 - 10
366
+
367
+ 6 - 11
368
+
369
+ ```
370
+
371
+ と表示されます。
372
+
373
+ 本当は
374
+
375
+ ```
376
+
377
+ 0 - 1 - 2 - 4 - 7
378
+
379
+ | L 8
380
+
381
+ | L 9
382
+
383
+ L 3 - 5
384
+
385
+ L 6 - 10
386
+
387
+ L 11
388
+
389
+ ```
390
+
391
+ のように表示させたいのですが、それは本筋とは関係ないので良しとします。
392
+
393
+
394
+
395
+ 上のコードにはundo()は書いてありませんが、一つ戻るだけじゃなく任意の着手にジャンプできるので基本この形でいいのかなと思ってます。
396
+
397
+
398
+
399
+ アドバイス、回答、ありがとうございました。
400
+
401
+
402
+
403
+ ソースが汚い、無駄があるなどありましたら是非お知らせください。

1

回答に対する返事

2019/11/25 23:41

投稿

taro_nii_chan
taro_nii_chan

スコア207

test CHANGED
File without changes
test CHANGED
@@ -171,3 +171,59 @@
171
171
  }
172
172
 
173
173
  ```
174
+
175
+
176
+
177
+ ### 追記、masatoUchidaさんの回答を元に考えてみたこと(2019.11.22 19:47)
178
+
179
+ なるほどと思いました。
180
+
181
+ で、「何手目か」と「分岐番号」を(何手目か, 分岐番号)で簡略的に表しながら考えてみました。
182
+
183
+
184
+
185
+ まずは初期状態から5手まで打ったのが下の0行目です。
186
+
187
+ ここで(2, 0)に戻って3手目で別の手を打ち5手目まで打ったのが1行目。
188
+
189
+ 更に(1, 0)に戻って別の2手目を打って5手目まで打ったのが2行目。
190
+
191
+ で、ここからが本題です。
192
+
193
+
194
+
195
+ (3, 0)に戻って(4, 0)とは別の4手目を打った場合には(4, 3)と表すことになるのかなと思います。一旦そうします。
196
+
197
+ 今度はに(3, 1)に戻って(4, 1)とは別の4手目を打った場合に(4, 4)と表すこととしたとします。
198
+
199
+ すると、一見良さそうに見えますが、この図だけから見ると(4, 4)はどこから派生したのかが分からなくなります。
200
+
201
+ つまり、(4, 4)は(3, 1)の次の手に見えますが、(3, 2)の次の手の可能性もあり得るのではないかという事です。
202
+
203
+ ```
204
+
205
+ (0, 0) -> (1, 0) -> (2, 0) -> (3, 0) -> (4, 0) -> (5, 0) // 0行目
206
+
207
+ L> (3, 1) -> (4, 1) -> (5, 1) // 1行目
208
+
209
+ L> (2, 2) -> (3, 2) -> (4, 2) -> (5, 2) // 2行目
210
+
211
+ L> (4, 3) -> (5, 3) // 3行目
212
+
213
+ L> (4, 4) -> (5, 4) // 4行目
214
+
215
+ ```
216
+
217
+ 僕の理解力不足であればいいのですが。もしそうでしたらご指摘ください。
218
+
219
+
220
+
221
+ で、代案としてstruct着手に自分の通番(id)と前の着手の通番(id)を持っておくといいんじゃないかという気がしています。
222
+
223
+ まだ見えてる訳ではないのですが、その路線で進めてみようと思っています。
224
+
225
+ 進展があったらご報告します。
226
+
227
+
228
+
229
+ 引き続き回答、アドバイス等あればお待ちしています。