KLB686
@KLB686

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【将棋】5*5将棋の挙動を再現したい【javascript】

解決したいこと

添付のcodepenにおける5*5将棋の挙動、
【修正点】①を解決したい

【codepen】

See the Pen Untitled by kmb686 (@kmb686) on CodePen.

【修正点】

[①持ち駒を盤上に置くことができない((後手番のみ))]
・持ち駒を選択することはできるが盤上に置くことができない。
※盤上の駒は動かすことができる

背景

・html/jsにて5*5将棋を作成している
・「駒を動かす」まで実装できた
・「持ち駒」「成り駒」の処理は他サイトを参考にしている
・知識不足もあり、全てのコードを一から説明できるほどの能力値に至っておらず、修正点について自力での解決に至らなかった

自分で試したこと

①について > 158-170L(持ち駒の使用)周辺の設定確認

まとめ

調べる力、知識不足からの質問となり申し訳ございません。
ヒントや方針のみのアドバイスでもいただければ大変助かります。

当方、6か月程度の初学者です。
質問内容、分かりづらい箇所あれば厳しくご指摘いただければ幸いです。

何卒よろしくお願い申し上げます。

追記

当初、下記3点を合わせた計4点が修正できない という質問内容でした。

ー----------------
[①成ることができない駒がある]
・銀→成銀 
・角→馬
⇒正しく成ることができるようにしたい

[②正しく成ることができない]
・「歩→と金」にならず「歩→龍」になってしまう

[③龍を持ち駒にした時の挙動]
・相手の駒の龍を取った時、
 龍→飛車にならず、持ち駒に龍が追加されてしまう。
ー----------------

WGG_SH 様よりご回答をいただき、上記3点は解決することができました。
WGG_SH 様、誠にありがとうございます。

残った「持ち駒を盤上に置くことができない(後手番のみの症状)」が現時点で解決できていないという状況です。

ヒントや気づきのきっかけだけでもご指摘いただければ、大変助かります。
何卒よろしくお願い申し上げます。

0

2Answer

①〜③については全て同じ問題が原因のように見えますね
ビット演算についての理解が間違っているように思います

.js
// L7~

//駒の名前
var nametbl = [
  "", "", "", "", "", "",
  "", "", "", "", "", "",
];

と駒の情報を定義していますがこの配列だと,
[0]〜[5]: 成る前
[6]〜[11]: 成ったあと
の駒を表現しています

.js
// L202~

//駒が「成る」「成らない」の処理
if (isinside(startx, starty, ofsx, ofsy, 5, 5) == true) {
  exist1 = isinside(startx, starty, ofsx, ofsy + 4 * player, 5, 1);
  exist2 = isinside(endx, endy, ofsx, ofsy + 4 * player, 5, 1);
  if (exist1 == true || exist2 == true) {
    //敵陣に入るor出る
    if ((id < 6) && (nametbl[id | 6] != "")) {
      if (confirm("成りますか?")) {
        board[starty][startx].id |= 6; //成る
      }
    }
  }
}

この部分で nametbl[id | 6] != "" は, 成ったあとの駒の情報を取得して裏面が存在しない駒 (王と金) を除外しようとしたように思えますが

.js
for(i=0;i<6;i++) console.log(i|6)

------
6
7
6
7
6
7

となるので裏面の情報を正しく取得できていないようです

この場合だと,単純に6を足してあげるだけで良さそうです

.js
if ((id < 6) && (nametbl[id + 6] != "")) {
  if (confirm("成りますか?")) {
    board[starty][startx].id += 6; //成る
  }
}

↑のような変更で①②は解決できると思います

同様に③も,

.js
// L227
board[y][x].id = (board[endy][endx].id >=6 ? board[endy][endx].id - 6 : board[endy][endx].id); //持ち駒の追加

このようにidが6以上なら6減らして持ち駒に追加,みたいな形にすることで解消できると思います

0Like

Comments

  1. @KLB686

    Questioner

    WGG_SH 様

    ご回答ありがとうございます。

    まず、大変丁寧な解説、感謝申し上げます。
    ビット演算についての理解が乏しく、お恥ずかしい限りです。

    「成る前に6を足して成った後の駒になればいい」をしっかり理解できていなかったようです。ご指摘、本当にありがとうございます。

    追記いただいたコードを元に再度修正を進めようと思います。
    ④について、引き続きどこに問題があるか考えてみようと思います。

    改めまして、回答、ありがとうございました。

閲覧、回答をいただきましたWGG_SH様、ありがとうございました。

追記箇所等が概要等について多めの修正が必要と判断致しました。
その為、当質問については一旦クローズとさせていただきます。

改めまして、ご協力いただきました方に感謝を申し上げます。

0Like

Your answer might help someone💌