public void back() { if (kk.turn - 2 >= 0) { Te teLast = kihu [kk.turn - 2]; kihu.RemoveAt(kk.turn - 2); kk.Back(teLast); kk.turn -= 1; //ボタンを有効にし、駒を正しく for (int i = 1; i <= 81; i++) { Masu [i - 1].GetComponent <Button> ().interactable = true; Masu [i - 1].GetComponent <Image>().sprite = komaPicture[kk.banKoma[i]]; } for (int koma = 1; koma < 8; koma++) { hand[koma].GetComponent <Text>().text = kk.hand [1] [koma].ToString(); hand[koma + 8].GetComponent <Text>().text = kk.hand [0] [koma + 16].ToString(); } } }
static void Main(string[] args) { var str = nameof(Te.None); Te obj = (Te)Enum.Parse(typeof(Te), str); Console.WriteLine(obj); }
//合法手を返す関数 public bool LegalMove(Te te) { //合法手を持ってくる関数を作成し、その中にteがあればtrueを返す var teList = new List <Te>(); teList = kk.GenerateLegalMoves(); //打ち歩詰めならfalseを返す if (kk.IsUtifuDume(te)) { return(false); } for (int i = 0; i < teList.Count; i++) { //合法手と一致すればtrue if (te.koma == teList [i].koma && te.from == teList [i].from && te.to == teList [i].to && ((te.promote && teList [i].promote) || (!te.promote && !teList [i].promote))) { return(true); } } return(false); }
private void FinishFeature() { DateTime start = DateTime.Now; var properties = new Dictionary <string, string> { { "RebaseOnDevelopmentBranch", FeatureRebaseOnDevelopmentBranch.ToString() }, { "DeleteBranch", FeatureDeleteBranch.ToString() } }; Logger.Event("FinishFeature", properties); if (GitFlowPage.ActiveRepo != null) { GitFlowPage.ActiveOutputWindow(); ShowProgressBar(); var gf = new VsGitFlowWrapper(GitFlowPage.ActiveRepoPath, GitFlowPage.OutputWindow); var result = gf.FinishFeature(SelectedFeature.Name, FeatureRebaseOnDevelopmentBranch, FeatureDeleteBranch); if (!result.Success) { ShowErrorMessage(result); } HideProgressBar(); ShowFinishFeature = Visibility.Collapsed; UpdateMenus(); HideAll(); OnPropertyChanged("AllFeatures"); Te.Refresh(); } Logger.Metric("Duration-FinishFeature", (DateTime.Now - start).Milliseconds); }
public static string ShowTimeBySQL() { DateTime Dt = DateTime.Now; string dt = Dt.ToString("yyyyMMdd"); //最新开奖时间 string a; DataSet ds = BLL.UserMessage.SelectNewLotterys(); DataTable datat = ds.Tables[0]; if (datat.Rows.Count == 0) { a = DateTime.Now.ToString(); } else { //开奖时间 a = datat.Rows[1]["Timer"].ToString(); } string NetTime = GetNetDateTime(); DateTime Te; if (DateTime.TryParse(NetTime, out Te)) { intertime = Te.ToString("yyyy-MM-dd HH:mm:ss") + "/" + a; //网络时间 } else { intertime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "/" + a; //系统时间 } return(intertime); }
public Te fromjoseki(Kyokumenn k, int tesu) { //tesuには実際の手数が渡されるが、定跡データは0手目から始まるので1ずらしておく tesu = tesu - 1; //定跡にあった候補手を入れる List <Te> teList = new List <Te>(); //定跡で進めた局面を作り、渡された局面と比較する Kyokumenn josekiKyokumenn = new Kyokumenn(); for (int i = 0; i < numJoseki; i++) { //平手で初期化 josekiKyokumenn.BanShokika(); for (int j = 0; j < tesu; j++) { if (josekiData [i][j * 2] == (byte)0 || josekiData [i][j * 2] == (byte)0xff) { break; } Te te = josekiByteToTe(josekiData [i][j * 2], josekiData [i][j * 2 + 1], josekiKyokumenn); josekiKyokumenn.Move(te); josekiKyokumenn.turn += 1; } //局面が一致するか if (josekiKyokumenn.equals(k)) { if (josekiData [i][tesu * 2] == (byte)0 || josekiData [i][tesu * 2] == (byte)0xff) { continue; } //候補手を生成 Te te = josekiByteToTe(josekiData[i][tesu * 2], josekiData[i][tesu * 2 + 1], k); teList.Add(te); } } if (teList.Count == 0) { //候補手がない場合 /* * if(child != null){ * //子定跡がある時は、その結果を返す * return child.fromjoseki(k,tesu); * } */ //候補手がなかったのでnullを返す return(null); } else { //候補手の中からランダム //候補手がない場合 return(teList[UnityEngine.Random.Range(0, teList.Count)]); } }
public void cargarTe() { Te t1 = new Te("Variados Tea", "Especial", 50, 07); ListadeTe.Add(t1); Te t2 = new Te("Chai Latte", "Especial", 60, 08); ListadeTe.Add(t2); }
public void Back(Te te) { //取った駒を盤に戻す Put(te.to, te.capture); //取った駒がある時 if (te.capture != 0) { //持ち駒を減らす if (8 < te.capture && te.capture <= 16 || 24 < te.capture && te.capture <= 32) { //先手の駒か後手の駒か if (0 != te.capture && te.capture <= 16) { this.hand [0] [te.capture + 8] -= 1; } else if (te.capture != 0 && 17 <= te.capture) { this.hand [1] [te.capture - 24] -= 1; } } else { if (0 != te.capture && te.capture <= 16) { this.hand [0] [te.capture + 16] -= 1; } else if (te.capture != 0 && 17 <= te.capture) { this.hand [1] [te.capture - 16] -= 1; } } } if (te.from == 0) { //駒打ちなので元の位置に戻す //先手の駒か後手の駒か if (0 != te.koma && te.koma <= 16) { this.hand [1] [te.koma] += 1; } else if (te.koma != 0 && 17 <= te.koma) { this.hand [0] [te.koma] += 1; } } else { //盤上の駒を動かしたので、その駒を元に戻す Put(te.from, te.koma); } }
private void FinishFeature() { try { DateTime start = DateTime.Now; var properties = new Dictionary <string, string> { { "RebaseOnDevelopmentBranch", FeatureRebaseOnDevelopmentBranch.ToString() }, { "DeleteLocalBranch", FeatureDeleteLocalBranch.ToString() }, { "DeleteRemoteBranch", FeatureDeleteRemoteBranch.ToString() }, { "Squash", FeatureSquash.ToString() }, { "NoFastForward", FeatureNoFastForward.ToString() } }; Logger.Event("FinishFeature", properties); if (GitFlowPage.ActiveRepo != null) { GitFlowPage.ActiveOutputWindow(); ShowProgressBar(); var gf = new VsGitFlowWrapper(GitFlowPage.ActiveRepoPath, GitFlowPage.OutputWindow); if (FeatureSquash) { ShowInfoMessage("Waiting for your editor to close the file..."); } var result = gf.FinishFeature(SelectedFeature.Name, FeatureRebaseOnDevelopmentBranch, FeatureDeleteLocalBranch, FeatureDeleteRemoteBranch, FeatureSquash, FeatureNoFastForward); if (!result.Success) { ShowErrorMessage(result); } HideProgressBar(); ShowFinishFeature = Visibility.Collapsed; UpdateMenus(); HideAll(); OnPropertyChanged("AllFeatures"); if (result.Success) { Te.Refresh(); } } Logger.Metric("Duration-FinishFeature", (DateTime.Now - start).Milliseconds); } catch (Exception ex) { ShowErrorMessage(ex.ToString()); Logger.Exception(ex); } }
public Te DeepCopy() //ディープコピー { Te obj = (Te)this.Clone(); obj.koma = (int)this.koma; //参照型は全てインスタンスをコピーする obj.from_dan = (int)this.from_dan; obj.from_suji = (int)this.from_suji; obj.to_dan = (int)this.to_dan; obj.to_suji = (int)this.to_suji; obj.promote = (bool)this.promote; return((Te)Clone()); }
public Te josekiByteToTe(byte toByte, byte fromByte, Kyokumenn k) { int f = ((int)fromByte) & 0xff; int t = ((int)toByte) & 0xff; int koma = 0; int fs, fd, ts, td; bool promote = false; if (f > 100) { //fが100以上なら、持ち駒を打つ手 if (k.turn % 2 == 1) { koma = (f - 100); } else { koma = (f - 100) + 16; } fs = 0; fd = 1; } else { //fをこのプログラムの中で使う座標の方式へ変換 fs = 10 - ((f - 1) % 9 + 1); //筋 fd = (f + 8) / 9; //段 koma = k.banKoma [(fd - 1) * 9 + fs]; } //tが100以上なら成り手 if (t > 100) { promote = true; t -= 100; } ts = 10 - ((t - 1) % 9 + 1); //筋 td = (t + 8) / 9; //段 Te te = new Te(); te.koma = koma; te.from = (fd - 1) * 9 + fs; te.to = (td - 1) * 9 + ts; te.promote = promote; te.capture = k.banKoma [te.to]; return(te); }
public void CheckoutFeatureBranch() { Logger.Event("CheckoutFeatureBranch"); GitFlowPage.ActiveOutputWindow(); ShowProgressBar(); var gf = new VsGitFlowWrapper(GitFlowPage.ActiveRepoPath, GitFlowPage.OutputWindow); var result = gf.CheckoutFeature(SelectedFeature.Name); if (!result.Success) { Te.ShowErrorNotification(result.CommandOutput); } HideProgressBar(); Update(); }
private void StartHotfix() { try { if (String.IsNullOrEmpty(HotfixName)) { return; } Logger.Event("StartHotfix"); DateTime start = DateTime.Now; if (GitFlowPage.ActiveRepo != null) { GitFlowPage.ActiveOutputWindow(); ShowProgressBar(); var gf = new VsGitFlowWrapper(GitFlowPage.ActiveRepoPath, GitFlowPage.OutputWindow); var result = gf.StartHotfix(HotfixName); if (!result.Success) { ShowErrorMessage(result); } HideProgressBar(); ShowStartHotfix = Visibility.Collapsed; HotfixName = String.Empty; UpdateMenus(); HideAll(); OnPropertyChanged("AllHotfixes"); if (result.Success) { Te.Refresh(); } } Logger.Metric("Duration-StartHotfix", (DateTime.Now - start).Milliseconds); } catch (ArgumentException ex) { ShowErrorMessage(ex.Message); } catch (Exception ex) { ShowErrorMessage(ex.ToString()); Logger.Exception(ex); } }
public void Move(Te te) { //駒の行き先に駒があったなら持ち駒にする int toKoma = this.banKoma[te.to]; if (8 < toKoma && toKoma <= 16 || 24 < toKoma && toKoma <= 32) { toKoma -= 8; } if (toKoma != 0) { //先手の駒なら後手の持ち駒 if (1 <= toKoma && toKoma < 16) { this.hand [0] [toKoma + 16] += 1; } else { this.hand [1] [toKoma - 16] += 1; } } //持ち駒を打った if (te.from == 0) { //使った持ち駒を減らす this.hand [this.turn % 2] [te.koma] -= 1; this.Put(te.to, te.koma); } else { //盤上の駒を進めた //移動前は空白に this.Put(te.from, 0); //移動後は成る場合は成った駒をならない場合はそのままの駒をおく if (te.promote) { this.Put(te.to, te.koma + 8); } else { this.Put(te.to, te.koma); } } }
private void FinishRelease() { try { DateTime start = DateTime.Now; var properties = new Dictionary <string, string> { { "TaggedRelease", (!String.IsNullOrEmpty(ReleaseTagMessage)).ToString() }, { "DeleteBranch", ReleaseDeleteBranch.ToString() }, { "ForceDeletion", ReleaseForceDeletion.ToString() }, { "PushChanges", ReleasePushChanges.ToString() }, { "NoBackMerge", ReleaseNoBackMerge.ToString() } }; Logger.Event("FinishRelease", properties); if (GitFlowPage.ActiveRepo != null) { GitFlowPage.ActiveOutputWindow(); ShowProgressBar(); var gf = new VsGitFlowWrapper(GitFlowPage.ActiveRepoPath, GitFlowPage.OutputWindow); var result = gf.FinishRelease(SelectedRelease.Name, ReleaseTagMessage, ReleaseDeleteBranch, ReleaseForceDeletion, ReleasePushChanges, ReleaseNoBackMerge); if (!result.Success) { ShowErrorMessage(result); } HideAll(); HideProgressBar(); ShowFinishRelease = Visibility.Collapsed; OnPropertyChanged("AllReleases"); UpdateMenus(); if (result.Success) { Te.Refresh(); } } Logger.Metric("Duration-FinishRelease", (DateTime.Now - start).Milliseconds); } catch (Exception ex) { ShowErrorMessage(ex.ToString()); Logger.Exception(ex); } }
//打ち歩詰めの判定関数 public bool IsUtifuDume(Te te) { //歩(1,17)で打たれた時(段が0)に相手に合法手がなければ打ち歩詰め if (te.koma == 1 || te.koma == 17) { if (te.from == 0) { this.Move(te.DeepCopy()); this.turn += 1; if (this.GenerateLegalMoves().Count == 0) { return(true); } this.Back(te.DeepCopy()); this.turn -= 1; } } return(false); }
private void OnInitialize() { try { DateTime start = DateTime.Now; Logger.Event("Init"); if (GitFlowPage.ActiveRepo != null) { GitFlowPage.OutputWindow.Activate(); ProgressVisibility = Visibility.Visible; var gf = new VsGitFlowWrapper(GitFlowPage.ActiveRepo.RepositoryPath, GitFlowPage.OutputWindow); var result = gf.Init(new GitFlowRepoSettings { DevelopBranch = Develop, MasterBranch = Master, FeatureBranch = FeaturePrefix, BugfixBranch = BugfixPrefix, ReleaseBranch = ReleasePrefix, SupportBranch = SupportPrefix, HotfixBranch = HotfixPrefix, VersionTag = VersionTagPrefix }); if (!result.Success) { Te.ShowErrorNotification(result.CommandOutput); } ProgressVisibility = Visibility.Hidden; InitGridVisibility = Visibility.Hidden; Te.Refresh(); } Logger.Metric("Duration-Init", (DateTime.Now - start).Milliseconds); } catch (Exception e) { Te.ShowErrorNotification(e.ToString()); Logger.Exception(e); } }
public void PublishReleaseBranch() { try { Logger.Event("PublishReleaseBranch"); GitFlowPage.ActiveOutputWindow(); ShowProgressBar(); var gf = new VsGitFlowWrapper(GitFlowPage.ActiveRepoPath, GitFlowPage.OutputWindow); var result = gf.PublishRelease(SelectedRelease.Name); if (!result.Success) { Te.ShowErrorNotification(result.CommandOutput); } HideProgressBar(); Update(); } catch (Exception ex) { ShowErrorMessage(ex.ToString()); Logger.Exception(ex); } }
public void SortTe(ref List <Te> teList) { for (int i = 0; i < teList.Count - 1; i++) { for (int j = 0; j < teList.Count - 1; j++) { this.Move(teList[i]); int evalS = this.evaluate(); this.Back(teList [i]); this.Move(teList[i + 1]); int evalL = this.evaluate(); this.Back(teList [i + 1]); if (this.turn % 2 == 1) { if (evalS < evalL) { Te tmp = teList [i].DeepCopy(); teList [i] = teList [i + 1].DeepCopy(); teList [i + 1] = tmp; } } else { if (evalS > evalL) { Te tmp = teList [i].DeepCopy(); teList [i] = teList [i + 1].DeepCopy(); teList [i + 1] = tmp; } } } } return; }
/* * //手番を進める関数 * void ChangeTurn(Te te){ * * if (kk.turn % 2 == 1) { * turn.GetComponent<Text> ().text = "後手"; * } else { * turn.GetComponent<Text> ().text = "先手"; * } * * * kk.turn = kk.turn + 1; * kihu.Add (te.DeepCopy()); * * if (te.capture != 0 && te.capture != 1 && te.capture != 17) { * phase = true; * } * * if (kk.turn > 10 && phase) { * sikou.DEPTH_MAX = 3; * } * * * * for (int j = 0; j < historykyokumenn.Count; j++) { * if (kk.equals (historykyokumenn [j])) { * kk.sameKyokumenn += 1; * } * * } * * if (kk.sameKyokumenn > 3) { * vsCom = false; * vsComGote = false; * winner.GetComponent<Text>().text = "千日手により引き分けです"; * resultCanvas.GetComponent<Canvas>().enabled = true; * * for (int i = 1;i <= 81 ; i++){ * * Masu [i - 1].GetComponent<Button> ().interactable = false; * Masu [i - 1].GetComponent<Image> ().color = new Color (255f / 255f, 255f / 255f, 255f / 255f, 255f / 255f); * * } * } * kk.sameKyokumenn = 0; * * * historykyokumenn.Add (kk.DeepCopyKyokumenn()); * * * if (kihu.Count > 1) { * Masu [kihu [kk.turn - 3].to - 1].GetComponent<Image> ().color = new Color (255f / 255f, 255f / 255f, 255f / 255f, 255f / 255f); * } * Masu [te.to - 1].GetComponent<Image> ().color = new Color (255f / 255f, 180f / 255f, 0f / 255f, 255f / 255f); * * * //合法手が無くなったら * if (kk.GenerateLegalMoves ().Count == 0) { * * vsCom = false; * vsComGote = false; * print (kk.turn); * * if (kk.turn % 2 == 1) { * winner.GetComponent<Text>().text = "後手の勝利です"; * } else { * winner.GetComponent<Text>().text = "先手の勝利です"; * } * //勝敗がついたらボタンをオフに * for (int i = 1;i <= 81 ; i++){ * * Masu [i - 1].GetComponent<Button> ().interactable = false; * Masu [i - 1].GetComponent<Image> ().color = new Color (255f / 255f, 255f / 255f, 255f / 255f, 255f / 255f); * * } * * resultCanvas.GetComponent<Canvas>().enabled = true; * * } * } * * * */ //手番を進める関数 IEnumerator Changeturn(Te te) { if (kk.turn % 2 == 1) { turn.GetComponent <Text> ().text = "後手"; } else { turn.GetComponent <Text> ().text = "先手"; } yield return(new WaitForEndOfFrame()); kk.turn = kk.turn + 1; kihu.Add(te.DeepCopy()); for (int j = 0; j < historykyokumenn.Count; j++) { if (kk.equals(historykyokumenn [j])) { kk.sameKyokumenn += 1; } } if (kk.sameKyokumenn > 3) { vsCom = false; vsComGote = false; winner.GetComponent <Text>().text = "千日手により引き分けです"; resultCanvas.GetComponent <Canvas>().enabled = true; for (int i = 1; i <= 81; i++) { Masu [i - 1].GetComponent <Button> ().interactable = false; Masu [i - 1].GetComponent <Image> ().color = new Color(255f / 255f, 255f / 255f, 255f / 255f, 255f / 255f); } } kk.sameKyokumenn = 0; historykyokumenn.Add(kk.DeepCopyKyokumenn()); if (kihu.Count > 1) { Masu [kihu [kk.turn - 3].to - 1].GetComponent <Image> ().color = new Color(255f / 255f, 255f / 255f, 255f / 255f, 255f / 255f); } Masu [te.to - 1].GetComponent <Image> ().color = new Color(255f / 255f, 180f / 255f, 0f / 255f, 255f / 255f); //合法手が無くなったら if (kk.GenerateLegalMoves().Count == 0) { vsCom = false; vsComGote = false; print(kk.turn); if (kk.turn % 2 == 1) { winner.GetComponent <Text>().text = "後手の勝利です"; } else { winner.GetComponent <Text>().text = "先手の勝利です"; } //勝敗がついたらボタンをオフに for (int i = 1; i <= 81; i++) { Masu [i - 1].GetComponent <Button> ().interactable = false; Masu [i - 1].GetComponent <Image> ().color = new Color(255f / 255f, 255f / 255f, 255f / 255f, 255f / 255f); } resultCanvas.GetComponent <Canvas>().enabled = true; } }
private void ShowErrorMessage(string message) { Te.ShowErrorNotification(message); }
private void ShowErrorMessage(GitFlowCommandResult result) { Te.ShowErrorNotification(result.CommandOutput); }
void Update() { //CURRENT STATE: WAIT FOR THE USER TO ENTER SETUP INFORMATION if (clientAuto.CurrState == PongClientAutomaton.WAIT_USER_SETUP_INFO) { //if the Role has been assigned if (GeneralUtils.RoleChosen()) { //enact transition to the next state clientAuto.Transition(PongClientAutomaton.TRY_CONNECT_SERVER); } } //CURRENT STATE: TRY TO CONNECT TO THE SERVER else if (clientAuto.CurrState == PongClientAutomaton.TRY_CONNECT_SERVER) { //initiate connection clientSocket = new ClientSocket(NetUtils.GetMyClientPort(), 1, serverIP); //if connected successfully if (clientSocket.Connected) { //enact transition to the next state clientAuto.Transition(PongClientAutomaton.WAIT_RECV_ENV_SETTINGS); } } //CURRENT STATE: WAIT TO RECV ENVIRONMENT SETTINGS FROM SERVER else if (clientAuto.CurrState == PongClientAutomaton.WAIT_RECV_ENV_SETTINGS) { //if received something from server if (clientSocket.pollAndReceiveData(clientSocket.Client, recvdData, 10) >= 1) { //extract the json part of the message string jsonString = recvdData.timeStamp.Substring(recvdData.timeStamp.IndexOf(",") + 1); envState = JsonConvert.DeserializeObject <EnvState>(jsonString); //respond with acknowledgement clientSocket.sendData(new StreamData("00:00:00")); //store communication time begin for Throughput analysis if (doAnalysis) { Tb = DateTime.Now; } //enact transition to the next state clientAuto.Transition(PongClientAutomaton.NORMAL_COMMUNICATION); } } //CURRENT STATE: NORMAL COMMUNICATION WITH THE SERVER else if (clientAuto.CurrState == PongClientAutomaton.NORMAL_COMMUNICATION) { //if received something from server if (clientSocket.pollAndReceiveData(clientSocket.Client, recvdData, 10) >= 1) { //extract the json part of the message //Debug.Log ( "recvd = " + recvdData.timeStamp ); string jsonString = recvdData.timeStamp.Substring(recvdData.timeStamp.IndexOf(",") + 1); envState = JsonConvert.DeserializeObject <EnvState>(jsonString); //update the environment to reflect the contents of the EnvState object GeneralUtils.SetEnvState(envState); //get human input InputData inputData = GeneralUtils.PackageInputData(); if (inputData == null) { inputData = new InputData(); } //send InputData to the server string message = "InputData," + inputData.ToJsonString(); StreamData dataToSend = new StreamData(message); clientSocket.sendData(dataToSend); //increment Throughpput counter N if (doAnalysis) { N += 1; } } //if user stops, stop Throughput analysis if (doAnalysis && Input.GetKeyDown(KeyCode.C)) { Te = DateTime.Now; T = ((float)N / (float)(Te - Tb).TotalSeconds); string outputFileName = GeneralUtils.GetTAFileName(); StreamWriter sw = new StreamWriter(outputFileName, true); sw.Write(T.ToString() + "," + N.ToString() + "," + Tb.ToString().Replace(",", "_") + "," + Te.ToString().Replace(",", "_")); sw.Close(); } //if the connection is lost if (!clientSocket.Connected) { //enact transition to the next state clientAuto.Transition(PongClientAutomaton.ERROR_STATE); } } //CURRENT STATE: ERROR OCCURRED else if (clientAuto.CurrState == PongClientAutomaton.ERROR_STATE) { } }
private void ShowInfoMessage(string message) { Te.ShowInfoNotification(message); }
public void Move(int teban, ref Te te) // C#での参照渡しはref tebanは先手が0、後手が1 { Debug.Log("Move te.from.dan : " + te.from.dan); Debug.Log("Move te.from.suji : " + te.from.suji); Debug.Log("Move te.to.dan : " + te.to.dan); Debug.Log("Move te.to.suji : " + te.to.suji); Koma capture = board[te.to.dan, te.to.suji]; // 移動先にある駒は取られる if (te.from.suji != 0) // 盤上の駒を動かした場合 { board [te.from.dan, te.from.suji] = Koma.Empty; // 元いた場所は空きに } else // 手駒を出した場合 { hand [teban, (byte)te.koma & ~(byte)Koma.Enemy]--; // 手駒が減る } if (te.promote) // 成った場合 { board [te.to.dan, te.to.suji] = te.koma | Koma.Promoted; // ビットシフト(+8)して移動先に置かれる } else // 成らない場合 { if (teban == 0) // 先手の場合 // board [te.to.dan, te.to.suji] = te.koma; // そのまま移動先に置かれる { board [te.to.dan, te.to.suji] = te.koma & ~Koma.Enemy; // そのまま移動先に置かれる } else // 後手の場合 { board [te.to.dan, te.to.suji] = te.koma | Koma.Enemy; // ビットシフト(+16)して移動先に置かれる } } if (capture != Koma.Empty) // 相手の駒を取った場合 // if (teban == 0) { { hand [teban, (byte)capture & ~(byte)Koma.Enemy & ~(byte)Koma.Promoted]++; //自分の手駒に加えられる(味方の駒になって成っている場合は戻る) ~->NOT // Hiyoko = 0000 0001 -> 0000 0001 & 1110 1111 = 0000 0001 = Hiyoko // eHiyoko = 0001 0001 -> 0001 0001 & 1110 1111 = 0000 0001 = Hiyoko // Debug.Log ("hand" + ((byte)capture & ~(byte)Koma.Enemy & ~(byte)Koma.Promoted).ToString()); Debug.Log("hand[]" + (hand [teban, (byte)capture & ~(byte)Koma.Enemy & ~(byte)Koma.Promoted]).ToString()); // } else { // hand [teban, (byte)capture | (byte)Koma.Enemy & ~(byte)Koma.Promoted]++; //自分の手駒に加えられる(味方の駒になって成っている場合は戻る) ~->NOT // Hiyoko = 0000 0001 -> 0000 0001 | 0001 0000 = 0001 0001 = eHiyoko // eHiyoko = 0001 0001 -> 0001 0001 | 0001 0000 = 0001 0001 = eHiyoko // Debug.Log ("hand" + ((byte)capture | (byte)Koma.Enemy & ~(byte)Koma.Promoted).ToString()); // } Debug.Log("取った!" + ((byte)capture & ~(byte)Koma.Enemy & ~(byte)Koma.Promoted).ToString()); } if (hand [0, 4] == 1) { gameStatusManager.ChangePlayer1Won(); } else if (hand [1, 4] == 1) { gameStatusManager.ChangePlayer2Won(); } }
//コンピューターに打たせるAlphaBeta public void AlphaBeta() { //Sikouクラスから次の手をもらう Te te = sikou.getNextTeKai(kk, kk.turn); //合法手出ない場合は合法手の中からランダムに手を作る if (!LegalMove(te)) { var teList = new List <Te>(); teList = kk.GenerateLegalMoves(); te = teList [Random.Range(0, teList.Count)]; } if (te.from == 0) { //使った持ち駒を減らす kk.hand [kk.turn % 2] [te.koma] -= 1; //持ち駒数の表示を正しくし、タップマーカーを消す if (kk.turn % 2 == 1) { hand [te.koma].GetComponent <Text> ().text = kk.hand [1] [te.koma].ToString(); motiGoma [te.koma].GetComponent <Image> ().color = new Color(255f / 255f, 255f / 255f, 255f / 255f, 255f / 255f); } else { hand [te.koma - 8].GetComponent <Text> ().text = kk.hand [0] [te.koma].ToString(); motiGoma [te.koma - 8].GetComponent <Image> ().color = new Color(255f / 255f, 255f / 255f, 255f / 255f, 255f / 255f); } //行き先に駒をおく Put(te.to, te.koma); //駒、持ち駒の選択フラグを消す isSelectKoma = 0; isSelectMotigoma = 0; } else { //移動先に相手の駒があったらとる int toKoma = kk.banKoma [te.to]; if (8 < toKoma && toKoma <= 16 || 24 < toKoma && toKoma <= 32) { toKoma -= 8; } //先手の駒なら後手に追加,後手の駒なら先手に追加 if (0 != toKoma && toKoma <= 16) { kk.hand [0] [toKoma + 16] += 1; hand [toKoma + 8].GetComponent <Text> ().text = kk.hand [0] [toKoma + 16].ToString(); } else if (toKoma != 0 && 17 <= toKoma) { kk.hand [1] [toKoma - 16] += 1; hand [toKoma - 16].GetComponent <Text> ().text = kk.hand [1] [toKoma - 16].ToString(); } //駒があった場所を空にする Put(te.from, 0); //成る場合は成った駒を、ならない場合はそのままの駒を移動先におく if (te.promote) { Put(te.to, te.koma + 8); } else { Put(te.to, te.koma); } } //手番を変える //this.ChangeTurn (te); StartCoroutine(Changeturn(te)); }
public List <Te> GenerateLegalMoves() { //合法手を格納する変数 List <Te> teList = new List <Te>(); List <Te> removed = new List <Te>(); Te te = new Te(); for (int masu = 1; masu <= 81; masu++) { int koma = this.banKoma [masu]; //探索する駒が手番の駒かどうか if ((this.turn % 2 == 1 && koma >= 1 && koma <= 16) || (this.turn % 2 == 0 && koma >= 17)) { //各方向に移動する手を生成 for (int direct = 0; direct < 12; direct++) { if (KomaMoves.canMove [direct, koma]) { te.koma = koma; te.to = masu + KomaMoves.diff [direct]; te.from = masu; if ((masu % 9 == 0 && te.to % 9 == 1) || (masu % 9 == 1 && te.to % 9 == 0)) { continue; } //移動先は盤内か if (1 <= te.to && te.to <= 81) { //移動先に自分の駒はないか int toKoma = this.banKoma[te.to]; te.capture = this.banKoma [te.to]; if ((this.turn % 2 == 1 && (toKoma == 0 || toKoma >= 17)) || (this.turn % 2 == 0 && toKoma <= 16)) { //桂馬は敵二段目まで、歩は一段目までで成らずはできない if ((te.koma != 3 || te.to > 18) && (te.koma != 19 || te.to < 64) && (te.koma != 1 || te.to >= 10) && (te.koma != 17 || te.to <= 72)) { te.promote = false; teList.Add(te.DeepCopy()); } //移動先が敵陣 if ((te.to <= 27 && this.turn % 2 == 1) || (te.to >= 55 && this.turn % 2 == 0)) { //成れる駒 if (KomaMoves.canPromote[koma]) { te.promote = true; teList.Add(te.DeepCopy()); } } //移動元が敵陣 if ((te.from <= 27 && this.turn % 2 == 1) || (te.from >= 55 && this.turn % 2 == 0)) { //成れる駒 if (KomaMoves.canPromote[koma]) { te.promote = true; teList.Add(te.DeepCopy()); } } } } } } //各方向に「飛ぶ」手を生成 for (int direct = 0; direct < 8; direct++) { if (KomaMoves.canJump [direct, koma]) { te.from = masu; te.koma = koma; for (int i = 1; i < 9; i++) { //移動先を生成 te.to = masu + KomaMoves.diff[direct] * i; if (((te.to % 9 == 0) && (((te.to - KomaMoves.diff[direct]) % 9) == 1)) || ((te.to % 9 == 1) && ((te.to - KomaMoves.diff[direct]) % 9 == 0))) { break; } //移動先は盤内か if (1 <= te.to && te.to <= 81) { //移動先に自分の駒はないか int toKoma = this.banKoma[te.to]; te.capture = this.banKoma [te.to]; if ((this.turn % 2 == 1 && (toKoma == 0 || toKoma >= 17)) || (this.turn % 2 == 0 && toKoma <= 16)) { //香車は敵の一段目まで行って成らずは不可 if ((te.koma != 2 || te.to > 9) && (te.koma != 18 || te.to < 73)) { te.promote = false; teList.Add(te.DeepCopy()); } //移動先が敵陣 if ((te.to <= 27 && this.turn % 2 == 1) || (te.to >= 55 && this.turn % 2 == 0)) { //成れる駒 if (KomaMoves.canPromote[koma]) { te.promote = true; teList.Add(te.DeepCopy()); } } //移動元が敵陣 if ((te.from <= 27 && this.turn % 2 == 1) || (te.from >= 55 && this.turn % 2 == 0)) { //成れる駒 if (KomaMoves.canPromote[koma]) { te.promote = true; teList.Add(te.DeepCopy()); } } } //空きマスでなければここでループ終わり if (toKoma != 0) { break; } } } } } } } //持ち駒からだす手を追加(銀、金、角、飛車) if (this.turn % 2 == 1) //先手の場合 //銀~飛車までループ { for (int i = 4; i <= 7; i++) { //探索中の駒を持っているか if (this.hand [1] [i] >= 1) { te.koma = i; for (int masu = 1; masu <= 81; masu++) { //駒は(0,0)点からとおく te.to = masu; te.from = 0; te.promote = false; te.capture = this.banKoma [te.to]; if (this.banKoma [masu] == 0) { teList.Add(te.DeepCopy()); } } } } } else //後手の場合 //銀~飛車までループ { for (int i = 20; i <= 23; i++) { //探索中の駒を持っているか if (this.hand [0] [i] >= 1) { te.koma = i; for (int masu = 1; masu <= 81; masu++) { //駒は(0,0)点からとおく te.to = masu; te.from = 0; te.promote = false; te.capture = this.banKoma [te.to]; if (this.banKoma [masu] == 0) { teList.Add(te.DeepCopy()); } } } } } if (this.turn % 2 == 1) //先手の場合 //先手の持ち駒に歩がある { if (this.hand [1] [1] >= 1) { te.koma = 1; //二歩チェック for (int suji = 1; suji <= 9; suji++) { bool isNifu = false; //二歩チェック用変数 for (int dan = 1; dan <= 9; dan++) { if (this.banKoma [(dan - 1) * 9 + suji] == 1) { isNifu = true; } } if (isNifu) { continue; } //これ以上進めない1段目を除き、駒がなければ歩を出す手を追加する for (int dan = 2; dan <= 9; dan++) { //駒は(0,0)点からとおく te.to = (dan - 1) * 9 + suji; te.from = 0; te.promote = false; te.capture = this.banKoma [te.to]; if (this.banKoma [(dan - 1) * 9 + suji] == 0) { teList.Add(te.DeepCopy()); } } } } //先手の持ち駒に香車がある if (this.hand [1] [2] >= 1) { te.koma = 2; for (int masu = 10; masu <= 81; masu++) { //これ以上進めない1段目を除き、駒がなければ香車を出す手を追加する //駒は(0,0)点からとおく te.to = masu; te.from = 0; te.promote = false; te.capture = this.banKoma [te.to]; if (this.banKoma [masu] == 0) { teList.Add(te.DeepCopy()); } } } //先手の持ち駒に桂馬がある if (this.hand [1] [3] >= 1) { te.koma = 3; for (int masu = 19; masu <= 81; masu++) { //これ以上進めない1,2段目を除き、駒がなければ桂馬を出す手を追加する //駒は(0,0)点からとおく te.to = masu; te.from = 0; te.promote = false; te.capture = this.banKoma [te.to]; if (this.banKoma [masu] == 0) { teList.Add(te.DeepCopy()); } } } } else //後手の場合 //持ち駒に歩がある { if (this.hand [0] [17] >= 1) { te.koma = 17; //二歩チェック for (int suji = 1; suji <= 9; suji++) { bool isNifu = false; //二歩チェック用変数 for (int dan = 1; dan <= 9; dan++) { if (this.banKoma [(dan - 1) * 9 + suji] == 17) { isNifu = true; } } if (isNifu) { continue; } //これ以上進めない1段目を除き、駒がなければ歩を出す手を追加する for (int dan = 1; dan <= 8; dan++) { //駒は(0,0)点からとおく te.to = (dan - 1) * 9 + suji; te.from = 0; te.promote = false; te.capture = this.banKoma [te.to]; if (this.banKoma [(dan - 1) * 9 + suji] == 0) { teList.Add(te.DeepCopy()); } } } } //持ち駒に香車がある if (this.hand [0] [18] >= 1) { te.koma = 18; for (int masu = 1; masu <= 72; masu++) { //これ以上進めない1段目を除き、駒がなければ香車を出す手を追加する //駒は(0,0)点からとおく te.to = masu; te.from = 0; te.promote = false; te.capture = this.banKoma [te.to]; if (this.banKoma [masu] == 0) { teList.Add(te.DeepCopy()); } } } //持ち駒に桂馬がある if (this.hand [0] [19] >= 1) { te.koma = 19; for (int masu = 1; masu <= 63; masu++) { //これ以上進めない1段目を除き、駒がなければ桂馬を出す手を追加する //駒は(0,0)点からとおく te.to = masu; te.from = 0; te.promote = false; te.capture = this.banKoma [te.to]; if (this.banKoma [masu] == 0) { teList.Add(te.DeepCopy()); } } } } //王手を放置している手を抜く int gyoku = 0; for (int i = 0; i < teList.Count; i++) { bool isOuteHouchi = false; Te teTest = teList [i]; this.Move(teTest); if (this.turn % 2 == 1) { gyoku = gyokuSente; } else { gyoku = gyokuGote; } // 玉の周辺(12方向)から相手の駒が利いていたら、その手は取り除く for (int direct = 0; direct < 12 && !isOuteHouchi; direct++) { //方向の反対側にある駒の取得 int masuSerch = gyoku - KomaMoves.diff[direct]; if (((masuSerch % 9 == 0) && (((masuSerch + KomaMoves.diff[direct]) % 9) == 1)) || ((masuSerch % 9 == 1) && ((masuSerch + KomaMoves.diff[direct]) % 9 == 0))) { continue; } if (1 <= masuSerch && masuSerch <= 81) { int koma = this.banKoma [masuSerch]; //その駒が敵の駒で手番の玉を取れるか if (this.turn % 2 == 1 && 17 <= koma || this.turn % 2 == 0 && koma <= 16 && 1 <= koma) { //動けるなら、この手は王手を放置しているので追加しない if (KomaMoves.canMove [direct, koma]) { isOuteHouchi = true; break; } } } } // 玉の周り(8方向)から相手の駒の飛び利きがあるなら、その手は取り除く for (int direct = 0; direct < 8 && !isOuteHouchi; direct++) { // 方向の反対方向にある駒を取得 int masuSerch = gyoku - KomaMoves.diff[direct]; // その方向にマスがある限り、駒を探す while (1 <= masuSerch && masuSerch <= 81) { if (((masuSerch % 9 == 0) && (((masuSerch + KomaMoves.diff[direct]) % 9) == 1)) || (((masuSerch % 9 == 1) && ((masuSerch + KomaMoves.diff[direct]) % 9) == 0))) { break; } int koma = this.banKoma [masuSerch]; // 味方駒で利きが遮られているなら、チェック終わり if (this.turn % 2 == 1 && koma <= 16 && 1 <= koma || this.turn % 2 == 0 && 17 <= koma) { break; } // 遮られていない相手の駒の利きがあるなら、王手がかかっている。 if (this.turn % 2 == 1 && 17 <= koma || this.turn % 2 == 0 && koma <= 16 && 1 <= koma) { //動けるなら、この手は王手を放置しているので追加しない if (KomaMoves.canJump [direct, koma]) { isOuteHouchi = true; break; } else { // 敵駒で利きが遮られているから、チェック終わり break; } } //玉から一つ離してループ masuSerch -= KomaMoves.diff[direct]; } } this.Back(teTest); if (!isOuteHouchi) { removed.Add(teList [i]); } } return(removed); }
IEnumerator MessageWait(int masu, Te te) { te.to = masu; // masu [num2].GetComponent<Image>().color = Color.red; //選択中の駒をタップで選択を外す if (te.from == te.to) { Masu [masu - 1].GetComponent <Image> ().color = new Color(255f / 255f, 255f / 255f, 255f / 255f, 255f / 255f); isSelectKoma = 0; } //手が生成されていれば駒を動かす if (isSelectKoma == 1) { te.promote = false; //移動先か移動元が敵陣 if ((te.to <= 27 && kk.turn % 2 == 1) || (te.to >= 55 && kk.turn % 2 == 0) || (te.from <= 27 && kk.turn % 2 == 1) || (te.from >= 55 && kk.turn % 2 == 0)) { //成れる駒 if (KomaMoves.canPromote[te.koma]) { //メッセージボックス表示 popupCanvas.GetComponent <Canvas>().enabled = true; while (!pushButtonBool) { yield return(new WaitForEndOfFrame()); } pushButtonBool = false; popupCanvas.GetComponent <Canvas>().enabled = false; te.promote = promote; } } //合法手ならば移動 if (LegalMove(te)) { //移動先に相手の駒があったらとる int toKoma = kk.banKoma [te.to]; te.capture = toKoma; if (8 < toKoma && toKoma <= 16 || 24 < toKoma && toKoma <= 32) { toKoma -= 8; } if (0 != toKoma && toKoma <= 16) { kk.hand [0] [toKoma + 16] += 1; //先手の駒なら後手に追加 hand[toKoma + 8].GetComponent <Text>().text = kk.hand [0] [toKoma + 16].ToString(); } else if (toKoma != 0 && 17 <= toKoma) { kk.hand [1] [toKoma - 16] += 1; //後手の駒なら先手に追加 hand[toKoma - 16].GetComponent <Text>().text = kk.hand [1] [toKoma - 16].ToString(); } //駒があった場所を空にする Put(te.from, 0); //成る場合は成った駒を、ならない場合はそのままの駒を移動先におく if (te.promote) { Put(te.to, te.koma + 8); } else { Put(te.to, te.koma); } isSelectKoma = 0; //手番を変える //this.ChangeTurn(te); StartCoroutine(Changeturn(te)); } } }
// float countTime; /* * public void Update () { * countTime += Time.deltaTime; * Debug.Log ("(●・▽・●)"); * } */ private int NegaMax(ref Te t, Kyokumenn k, int alpha, int beta, int depth, int depthMax) { int value = new int(); //深さが最大に達していたら評価値を返して終了 if (depth >= depthMax) { leaf++; value = k.evaluate(); //先手ならプラス、後手でマイナスの値を返す if (k.turn % 2 == 1) { return(value); } else { return(-value); } } node++; //現在の局面での合法手を生成 var teList = new List <Te>(); teList = k.GenerateLegalMoves(); value = -100000000; for (int i = 0; i < teList.Count; i++) { Te te = teList [i]; //その手で一手進めた局面を作る // KyokumennArray nextKyokumenn = k.DeepCopyKyokumenn (); k.Move(te.DeepCopy()); k.turn += 1; Te tempTe = new Te(); int eval = -NegaMax(ref tempTe, k, -beta, -alpha, depth + 1, depthMax); k.Back(te.DeepCopy()); k.turn -= 1; //大きかったら if (eval > value) { value = eval; //αの値も更新 if (eval > alpha) { alpha = eval; } //最善手を更新 best [depth, depth] = te; t.koma = te.koma; t.from = te.from; t.to = te.to; t.promote = te.promote; t.capture = k.banKoma [te.to]; for (int j = depth + 1; j < depthMax; j++) { best [depth, j] = best [depth + 1, j]; } //βカットの条件を満たしていたらループ終了 if (eval >= beta) { break; } } } return(value); }