public List <MoveCommand> CreateAvailableMoveCommand(Koma koma) { lock (thisLock) { var moveCommandList = new List <MoveCommand>(); var positions = MovablePosition(koma); foreach (var toPos in positions.Positions) { if (koma.IsOnBoard) { moveCommandList.Add(new BoardKomaMoveCommand(koma.Player, toPos, koma.BoardPosition, false)); if (!koma.IsTransformed && koma.KomaType.CanBeTransformed && (Rule.IsPlayerTerritory(koma.Player.Opponent, toPos, Board) || Rule.IsPlayerTerritory(koma.Player.Opponent, koma.BoardPosition, Board))) { moveCommandList.Add(new BoardKomaMoveCommand(koma.Player, toPos, koma.BoardPosition, true)); } } else if (koma.IsInHand) { moveCommandList.Add(new HandKomaMoveCommand(koma.Player, toPos, koma.KomaType)); } } return(RemoveProhibitedMove(moveCommandList)); } }
public static bool IsLegalMove(Koma km, Masu dstMs, Masu attackerMs, Shogiban shogiban) { // KomanoUgokikata komanoUgokikata return(shogiban.GetKomanoUgokikata(km, attackerMs).IsIntersect( // 相手の利き dstMs // 調べる升 )); }
/// <summary> /// クリック /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void CheckBox_Click(object sender, RoutedEventArgs e) { // コマ追加 var cilcked = sender as CheckBox; cilcked.IsEnabled = false; cilcked.IsChecked = _Now == Koma.Black; // 画面から盤面配列を取得 var map = _KomaMap; // 全て反転の場所を算出 var reverseList = _Algorithm.ReverseList(_KomaMap, (Location)cilcked.Tag); // 反転処理 foreach (var reverse in reverseList) { map[reverse.X, reverse.Y] = _Now; } // 画面更新 _KomaMap = map; // 手番交換 _Now = (Koma)(Koma.None - _Now); // 次の設置可能な場所を算出 _CanSets = _Algorithm.CanSets(map, _Now); // 情報設定 _UpdateInfo(); }
/// <summary> /// 項目番号 K を返すぜ☆(^~^) /// </summary> /// <returns>該当なければ -1</returns> public static int GetKoumokuBango_Banjo(Kyokumen ky, Koma km_jissai, Masu ms_jissai) { return(-1); //// 盤上の駒1 //int iMs_jissai = (int)ms_jissai; //if (Conv_Koma.IsOk(km_jissai)) //{ // // 盤上のパラメーター // // まず、大きく10区画「RZKHNrzkhn」に分かれているので、 // // komaArea = ( 0 ~ 10 ) に分けるぜ☆ // int komaArea; // switch (km_jissai) // { // case Koma.King1: komaArea = 0; break; // area = 0 の場合、 0 以上 1 未満だぜ☆(^~^) // case Koma.Bishop1: komaArea = 1; break; // case Koma.Rook1: komaArea = 2; break; // case Koma.Pawn1: komaArea = 3; break; // case Koma.ProPawn1: komaArea = 4; break; // case Koma.King2: komaArea = 5; break; // case Koma.Bishop2: komaArea = 6; break; // case Koma.Rook2: komaArea = 7; break; // case Koma.Pawn2: komaArea = 8; break; // case Koma.ProPawn2: komaArea = 9; break; // default: throw new Exception("未定義の駒"); // } // // K2 の方も、 K1 と同じように分かれているぜ☆(^▽^) // return komaArea * KyokumenImpl.MASUS + iMs_jissai; //} //return -1; }
/// <summary> /// 設置可能な場所を返す /// </summary> /// <param name="map">盤面状況</param> /// <param name="nowKoma">手番のコマ</param> /// <returns></returns> public HashSet <Location> CanSets(Koma[,] map, Koma nowKoma) { // 戻り用の集合 var canSets = new HashSet <Location>(); // 全箇所チェック for (int y = 0; y < map.GetLength(1); y++) { for (int x = 0; x < map.GetLength(0); x++) { // コマあり if (map[x, y] != Koma.None) { continue; } // コピー作成 var copy = (Koma[, ])map.Clone(); // 1箇所チェック var p = new Location { X = x, Y = y }; copy[p.X, p.Y] = nowKoma; if (_CanSetPoint(copy, p)) { canSets.Add(p); } } } return(canSets); }
/// <summary> /// 初期化処理 /// </summary> private void _Init() { // 盤面初期化 MainMap.Children.Clear(); for (int y = 0; y < MainMap.Columns; y++) { for (int x = 0; x < MainMap.Rows; x++) { MainMap.Children.Add(new CheckBox { Tag = new Location { X = x, Y = y } }); } } // 初期コマ (MainMap.Children[28] as CheckBox).IsEnabled = false; (MainMap.Children[28] as CheckBox).IsChecked = true; (MainMap.Children[27] as CheckBox).IsEnabled = false; (MainMap.Children[27] as CheckBox).IsChecked = false; (MainMap.Children[35] as CheckBox).IsEnabled = false; (MainMap.Children[35] as CheckBox).IsChecked = true; (MainMap.Children[36] as CheckBox).IsEnabled = false; (MainMap.Children[36] as CheckBox).IsChecked = false; // 先手設定 _Now = Koma.Black; // 次の設置可能な場所を算出 _CanSets = _Algorithm.CanSets(_KomaMap, _Now); // 情報設定 _UpdateInfo(); }
void Start() { deck = new List <Koma>(); makeKoma(kinNum, KinInstance, "kin"); makeKoma(keimaNum, keimaObject, "keima"); makeKoma(huNum, HuObject, "hu"); makeKoma(ginNum, ginObjecet, "gin"); makeKoma(kyousyaNum, kyousyaObject, "kyousya"); makeKoma(hisyaNum, hisyaObject, "hisya"); makeKoma(kakuNum, kakuObject, "kaku"); deck = deck.OrderBy(a => Guid.NewGuid()).ToList(); Koma ou = Instantiate(OuObject); ou.name = "Ou"; ou.masterUser = this; ou.settingturn = Board.turn; ou.makeMV(); hand.Add(ou); for (int i = 0; i < handNum; i++) { draw(); } setCardPos(); }
public void OnUserAction(Koma koma) { koma.OnUserAction(); // Vector2 pos = GetComponent<RectTransform> ().anchoredPosition; // pos.y += -220; // GetComponent<RectTransform> ().anchoredPosition = pos; }
/// <summary> /// 局面ハッシュを再計算するぜ☆(^▽^) /// </summary> /// <returns></returns> public void Tukurinaosi(Kyokumen ky) { ulong hash = 0; // 盤上 Bitboard komaBB = new Bitboard(); for (int iTai = 0; iTai < Conv_Taikyokusya.AllOptionalPhaseList.Length; iTai++) { var optionalPhase = Conv_Taikyokusya.AllOptionalPhaseList[iTai]; for (int iKs = 0; iKs < Conv_Komasyurui.Itiran.Length; iKs++) { Komasyurui ks = Conv_Komasyurui.Itiran[iKs]; Koma km = Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, optionalPhase); ky.Shogiban.ToSet_BBKoma(km, komaBB); while (komaBB.Ref_PopNTZ(out Masu ms)) { hash ^= Util_ZobristHashing.GetBanjoKey(ms, km, ky.Sindan); } } } // 持ち駒 foreach (MotiKoma mk in Conv_MotiKoma.Itiran) { hash ^= Util_ZobristHashing.GetMotiKey(ky.Sindan, mk); } // 手番 hash ^= Util_ZobristHashing.GetTaikyokusyaKey(ky.CurrentOptionalPhase, ky.Sindan); Value = hash; }
/// <summary> /// 差分更新で使う☆(^▽^)駒取り☆ /// </summary> public void Herasu(Option <Phase> optionalPhase, Koma km) { Hyokati henkaRyo = Conv_Hyokati.KomaHyokati[(int)km]; this.Increase(optionalPhase, (Hyokati)(-(int)henkaRyo)); this.Increase(Conv_Taikyokusya.Reverse(optionalPhase), henkaRyo); }
public void UpdateCanMove(ISelectable selectedMoveSource) { // [MEMO:ここでUpdate()(つまり、Board.Clear())してしまうと、持ち駒で同じ種類がある場合にどれをハイライトすべきか判別できなくなる] if (OperationMode != OperationMode.SelectMoveDestination) { return; } Koma koma = selectedMoveSource.GetKoma(this.gameService.GetGame()); var moves = this.gameService.GetGame().CreateAvailableMoveCommand(koma); foreach (var row in Board) { foreach (var cell in row) { var cellMoves = moves.Where(x => x.ToPosition == cell.Position).ToList(); if (cellMoves.Count() > 0) { cell.MoveCommands = cellMoves; } } } MoveCommand.RaiseCanExecuteChanged(); }
void OnSelectEvent(Koma koma) { OnSelect.Call(koma); foreach (var slot in _slotList) { slot.SetSelect(koma); } }
public bool promote; // 成るか成らないか public void setTe(int _fromDan, int _fromSuji, int _toDan, int _toSuji, Koma _koma, bool _promote) { from.dan = _fromDan; from.suji = _fromSuji; to.dan = _toDan; to.suji = _toSuji; koma = _koma; promote = _promote; }
public BoardPositions MovablePosition(Koma koma) { lock (thisLock) { return(koma.GetMovableBoardPositions( Board, State.BoardPositions(koma.Player), State.BoardPositions(koma.Player.Opponent))); } }
public Kyokumen(Kyokumen kyokumen, string usimove) { bammen = new Koma[9, 9]; s_mochi = new int[7]; g_mochi = new int[7]; teban = kyokumen.teban; Array.Copy(kyokumen.bammen, bammen, kyokumen.bammen.Length); Array.Copy(kyokumen.s_mochi, s_mochi, kyokumen.s_mochi.Length); Array.Copy(kyokumen.g_mochi, g_mochi, kyokumen.g_mochi.Length); proceed(usimove); }
// Update is called once per frame void makeKoma(int komaNum, Koma komaObj, string name) { for (int i = 0; i < komaNum; i++) { Koma madeHu = Instantiate(komaObj); deck.Add(madeHu); madeHu.name = name + i; madeHu.settingturn = Board.turn; madeHu.makeMV(); } }
public void Add(Koma koma) { var obj = new GameObject(); obj.transform.SetParent(transform, false); var slot = obj.AddComponent <Slot>(); slot.OnSelect = OnSelectEvent; slot.Add(koma); _slotList.Add(slot); }
public static Option <Phase> PhaseOfPiece(Koma km) { // FIXME: 範囲外の引数を指定できるのがそもそもダメ☆(^~^) if (-1 < (int)km && (int)km < m_OptionalPhaseOfPiece_.Length) { return(m_OptionalPhaseOfPiece_[(int)km]); } else { throw new Exception($"km={(int)km} < m_KomaToTaikyokusya_.Length={m_OptionalPhaseOfPiece_.Length}"); } }
public static void AppendLine_Data_Kyokumen(Kyokumen ky, int dan, StringBuilder syuturyoku) { syuturyoku.Append("│"); for (int iMs_offset = 0; iMs_offset < Option_Application.Optionlist.BanYokoHaba; iMs_offset++) { Masu ms = (Masu)(dan * Option_Application.Optionlist.BanYokoHaba + iMs_offset); Koma km = ky.GetBanjoKoma(ms); Conv_Koma.Setumei(km, syuturyoku); syuturyoku.Append("│"); } syuturyoku.AppendLine(); }
/// <summary> /// 一手詰めの局面かどうか調べるぜ☆(^▽^) /// /// 自分が一手詰めを掛けられるから、この指し手は作らないでおこう、といった使い方がされるぜ☆(^▽^) /// /// FIXME: 持ち駒の打ちにも使えないか☆(^~^)? /// </summary> /// <param name="fukasa"></param> /// <param name="ky"></param> /// <param name="jibun"></param> /// <param name="ms_src">持ち駒の場合、エラー値</param> /// <param name="mks">持ち駒の場合、持駒の種類</param> /// <param name="ms_t1"></param> /// <param name="jibunHioute"></param> /// <returns></returns> public static bool Ittedume_MotiKoma(int fukasa, Kyokumen ky, MotiKoma mk, Masu ms_t1, HiouteJoho jibunHioute, HiouteJoho aiteHioute) { if (!Conv_MotiKoma.IsOk(mk)) { throw new Exception("持ち駒じゃないじゃないか☆(^▽^)www"); } // A B C // ┌──┬──┬──┐ //1│ │▽ら│ │ // ├──┼──┼──┤ //2│▲き│ │▲き│ // ├──┼──┼──┤ //3│ │▲に│▲ら│ // ├──┼──┼──┤ //4│▲ぞ│▲ひ│▲ぞ│ // └──┴──┴──┘ // 盤上の駒を動かすのか、駒台の駒を打つのかによって、利き の形が異なるぜ☆(^~^) Bitboard bb_kiki_t1 = ky.Shogiban.GetKomanoUgokikata(Med_Koma.MotiKomaToKoma(mk), ms_t1); if (!ky.Shogiban.GetBBKoma(aiteHioute.KmRaion).IsIntersect( // 相手らいおんの場所☆ bb_kiki_t1)) // 相手らいおん が、動かした駒の、利きの中に居ないんだったら、一手詰め にはならないぜ☆(^~^) { // FIXME: ステイルメイトは考えてないぜ☆(>_<) return(false); } Koma km_t1 = Med_Koma.MotiKomaToKoma(mk);//t0も同じ // FIXME: ↓駒移動後の、利きを取る必要がある Bitboard bb_jibunKikiNew = new Bitboard(); { // 打による、重ね利きの数を差分更新するぜ☆(^▽^) //, ky.BB_KikiZenbu ky.Shogiban.N100_FuyasuKiki(km_t1, ky.Sindan.CloneKomanoUgoki(km_t1, ms_t1), ky.Sindan);// 移動先の駒の利きを増やすぜ☆(^▽^) // こっちの利きを作り直し bb_jibunKikiNew = ky.Shogiban.ToBitboard_KikisuZenbuPositiveNumber(Med_Koma.MotiKomaToPhase(mk), ky.Sindan); // 打による、重ね利きの数の差分更新を元に戻すぜ☆(^▽^) // , ky.BB_KikiZenbu ky.Shogiban.N100_HerasuKiki(km_t1, ky.Sindan.CloneKomanoUgoki(km_t1, ms_t1), ky.Sindan);// 移動先の駒の利きを減らすぜ☆(^▽^) } // 相手らいおんが逃げようとしていて。 return(aiteHioute.FriendRaion8KinboBB.Clone() // 相手らいおんの8近傍 .Sitdown(ky.Shogiban.GetBBKomaZenbu(aiteHioute.CurrentOptionalPhase)) // 相手の駒がない升 .Sitdown(bb_jibunKikiNew) // こっちの利きがない升 .IsEmpty()); // 相手らいおん が逃げれる升がない場合、詰み☆ }
public void Remove(Koma koma) { var slot = _slotList.FirstOrDefault(data => data.Koma == koma); if (slot == null) { return; } slot.OnSelect = null; _slotList.Remove(slot); GameObject.Destroy(slot); }
public Form1() { InitializeComponent(); chick_1 = new Koma(pictureBox8, 0, 1, 2, chick_move); chick_2 = new Koma(pictureBox4, 1, 1, 1, chick_move); giraffe_1 = new Koma(pictureBox5, 0, 2, 3, giraffe_move); giraffe_2 = new Koma(pictureBox1, 1, 0, 0, giraffe_move); elephant_1 = new Koma(pictureBox7, 0, 0, 3, elephant_move); elephant_2 = new Koma(pictureBox3, 1, 2, 0, elephant_move); lion_1 = new Koma(pictureBox6, 0, 1, 3, lion_move); lion_2 = new Koma(pictureBox2, 1, 1, 0, lion_move); animal_Initialize(); }
/// <summary> /// 手番と、 /// 駒の種類と、その升、 /// この3つを指定すると、利きを表にして返すぜ☆(^▽^) /// </summary> /// <param name="tai"></param> /// <param name="targetMs"></param> /// <param name="ks"></param> /// <param name="attackerMs"></param> /// <returns></returns> public static bool[] Kiki(Koma km, Masu attackerMs, Kyokumen.Sindanyo kys, Shogiban shogiban)//KomanoUgokikata komanoUgokikata { bool[] kiki = new bool[kys.MASU_YOSOSU]; // 盤上 for (int iDan = 0; iDan < Option_Application.Optionlist.BanTateHaba; iDan++) { for (int iSuji = 0; iSuji < Option_Application.Optionlist.BanYokoHaba; iSuji++) { kiki[iDan * Option_Application.Optionlist.BanYokoHaba + iSuji] = Util_HiouteCase.IsLegalMove(km, (Masu)(iDan * Option_Application.Optionlist.BanYokoHaba + iSuji), attackerMs, shogiban); } } return(kiki); }
/// <summary> /// 差分更新は、対局者1 の視点の盤で行えなんだぜ☆(^▽^) /// </summary> /// <param name="ky"></param> /// <param name="km"></param> /// <param name="ms"></param> /// <param name="fueta"></param> public void FuyasuBanjoKoma(Kyokumen ky, Koma km, Masu ms) { if (DebugOptions.AddPiecesOnBoard) { var optionalPiece = OptionalPiece.From(km); Debug.Assert(Conv_Koma.IsOk(optionalPiece), "");//空白とか禁止☆(^~^)! Util_NikomaKankei.MakeKoumokuBangoHairetu_Subete(ky, Util_NikomaKankei.KoumokuBangoHairetu1); Increase( Util_NikomaKankei.Kazoeru_NikomaKankeiHyokati_ItiTaiTa_SabunKosinYou(ky, Util_NikomaKankei.GetKoumokuBango_Banjo(ky, km, ms),// 駒の位置(評価関数の項目番号)をリストに入れておくぜ☆ Util_NikomaKankei.KoumokuBangoHairetu1 )); } }
public void proceed(string usimove) { var to = usitovec(usimove[2], usimove[3]); if (usimove[1] != '*') { //移動 var from = usitovec(usimove[0], usimove[1]); if (bammen[to.x, to.y] != Koma.None) { Koma m = bammen[to.x, to.y]; if (teban) { s_mochi[komatomochi(m)]++; } else { g_mochi[komatomochi(m)]++; } } if (usimove.Length > 4 && usimove[4] == '+') { bammen[to.x, to.y] = prom(bammen[from.x, from.y]); } else { bammen[to.x, to.y] = bammen[from.x, from.y]; } bammen[from.x, from.y] = Koma.None; } else { //駒打ち Koma koma = uchiusitokoma(usimove[0], teban); bammen[to.x, to.y] = koma; if (teban) { s_mochi[komatomochi(koma)]--; } else { g_mochi[komatomochi(koma)]--; } } teban = !teban; }
public Kyokumen() { teban = true; s_mochi = new int[5] { 0, 0, 0, 0, 0 }; g_mochi = new int[5] { 0, 0, 0, 0, 0 }; bammen = new Koma[5, 5] { { Koma.g_Ou, Koma.g_Fu, Koma.None, Koma.None, Koma.s_Hi }, { Koma.g_Kin, Koma.None, Koma.None, Koma.None, Koma.s_Kaku }, { Koma.g_Gin, Koma.None, Koma.None, Koma.None, Koma.s_Gin }, { Koma.g_Kaku, Koma.None, Koma.None, Koma.None, Koma.s_Kin }, { Koma.g_Hi, Koma.None, Koma.None, Koma.s_Fu, Koma.s_Ou } }; }
public static Bitboard Kiki_BB(Koma km, Masu attackerMs, Shogiban shogiban) { Bitboard kiki = new Bitboard(); // 盤上 for (int iDan = 0; iDan < Option_Application.Optionlist.BanTateHaba; iDan++) { for (int iSuji = 0; iSuji < Option_Application.Optionlist.BanYokoHaba; iSuji++) { if (Util_HiouteCase.IsLegalMove(km, (Masu)(iDan * Option_Application.Optionlist.BanYokoHaba + iSuji), attackerMs, shogiban)) { kiki.Standup((Masu)(iDan * Option_Application.Optionlist.BanYokoHaba + iSuji)); } } } return(kiki); }
// Use this for initialization void Start() { KomaLists[0] = new Dictionary <string, GameObject>(); KomaLists[0].Add("とり01", Koma.Generate(Koma.Kind.Chick, new Vector2Int(1, 1), Koma.Direction.Up, Field)); KomaLists[0].Add("ぞう01", Koma.Generate(Koma.Kind.Elephant, new Vector2Int(0, 0), Koma.Direction.Up, Field)); KomaLists[0].Add("らいおん01", Koma.Generate(Koma.Kind.Lion, new Vector2Int(1, 0), Koma.Direction.Up, Field)); KomaLists[0].Add("きりん01", Koma.Generate(Koma.Kind.Kirin, new Vector2Int(2, 0), Koma.Direction.Up, Field)); KomaLists[1] = new Dictionary <string, GameObject>(); KomaLists[1].Add("とり02", Koma.Generate(Koma.Kind.Chick, new Vector2Int(1, 2), Koma.Direction.Down, Field)); KomaLists[1].Add("ぞう02", Koma.Generate(Koma.Kind.Elephant, new Vector2Int(2, 3), Koma.Direction.Down, Field)); KomaLists[1].Add("らいおん02", Koma.Generate(Koma.Kind.Lion, new Vector2Int(1, 3), Koma.Direction.Down, Field)); KomaLists[1].Add("きりん02", Koma.Generate(Koma.Kind.Kirin, new Vector2Int(0, 3), Koma.Direction.Down, Field)); MochigomaLists[0] = new Dictionary <string, GameObject>(); MochigomaLists[1] = new Dictionary <string, GameObject>(); WinnerText = Canvas.transform.Find("WinnerText").gameObject; WinnerText.active = false; }
/// <summary> /// 指定の升にいる駒を除く、味方全部の利き☆ /// /// 盤上の駒を指す場合、自分自身が動いてしまうので利きが変わってしまうので、 /// 全部の利きを合成したBBが使えないので、代わりにこの関数を使うんだぜ☆(^~^) /// </summary> /// <param name="ky"></param> /// <param name="ms_nozoku">除きたい駒がいる升</param> /// <returns></returns> public static Bitboard CreateKikiZenbuBB_1KomaNozoku(Kyokumen ky, Option <Phase> phase, Masu ms_nozoku) { Bitboard kikiZenbuBB = new Bitboard(); // 味方の駒(変数使いまわし) Bitboard mikataBB = new Bitboard(); foreach (Komasyurui ks in Conv_Komasyurui.Itiran) { Koma km = Med_Koma.KomasyuruiAndTaikyokusyaToKoma(ks, phase); ky.Shogiban.ToSet_BBKoma(km, mikataBB); while (mikataBB.Ref_PopNTZ(out Masu ms)) { if (ms_nozoku != ms)//この駒を除く { ky.Shogiban.ToStandup_KomanoUgokikata(km, ms, kikiZenbuBB); } } } return(kikiZenbuBB); }
static int komatomochi(Koma k) { int komanum = (int)k; if (komanum >= (int)Koma.g_Nari) { return(komanum - (int)Koma.g_Nari); } else if (komanum >= (int)Koma.g_Min) { return(komanum - (int)Koma.g_Min); } else if (komanum >= (int)Koma.s_Nari) { return(komanum - (int)Koma.s_Nari); } else { return(komanum); } }