public void AnswerBoxCheck(ref Numpre[,] numpre, ref int checknum, ref int timeover) { int countblank, i_out, j_out; bool IsSameNum = false; countblank = 0; i_out = 0; j_out = 0; execbutton[0].PerformClick(); // それぞれのグループの左上だけを指定する for (int i = 0; i <= 6; i += 3) { for (int j = 0; j <= 6; j += 3) { // 指定した位置から順に1行目、2行目、3行目と数値判定を行う for (int k = i; k <= i + 2; k++) { for (int l = j; l <= j + 2; l++) { // checknumの効いていない空白があったら if (numpre[k, l].IsError == true && numpre[k, l].IsValid == false) { // とりあえず覚えておく countblank += 1; i_out = k; j_out = l; } // そのグループに既にchecknumがあったら if (numpre[k, l].Number == checknum) { // そのグループはもう終了 IsSameNum = true; continue; } } } // そのグループにchecknumがまだなく // 空白が一つ、かつその空白のIsValidがfalseであった場合 if (countblank == 1 && IsSameNum == false) { // そのマスにchecknumを入れる numpre[i_out, j_out].Number = checknum; int txtbxi = FindTextBoxIndexFromNumpreIndex(i_out, j_out); if (txtbxi == -1) { ConsoleList.Items.Add("エラー: Numpre[,]配列のインデックスが不正です"); ConsoleList.Update(); return; } else { txtbox[txtbxi].Text = checknum.ToString(); txtbox[txtbxi].Update(); ConsoleList.Items.Add("自動解答: ボックスの消去法により (" + (i_out + 1) + ", " + (j_out + 1) + ") は " + checknum); ConsoleList.Update(); timeover = 0; // で、もう一度最初から試行する AnswerHrizonCheck(ref numpre, ref checknum, ref timeover); } } IsSameNum = false; countblank = 0; } } // 何もせずにループを抜けたら // タイムアウトカウンタを増やす timeover += 1; }
public void AnswerVerticalCheck(ref Numpre[,] numpre, ref int checknum, ref int timeover) { int countblank, i_out, j_out; bool IsSameNum = false; countblank = 0; i_out = 0; j_out = 0; execbutton[0].PerformClick(); for (int i = 0; i <= 8; i++) { for (int j = 0; j <= 8; j++) { // checknumの効いていない空白があったら if (numpre[j, i].IsError == true && numpre[j, i].IsValid == false) { // とりあえず覚えておく countblank += 1; i_out = i; j_out = j; } // その列に既にchecknumがあったら if (numpre[j, i].Number == checknum) { // その列はもう終了 IsSameNum = true; continue; } } // その行で該当する空白がぴったり1個だった場合のみ if (countblank == 1 && IsSameNum == false) { // そのマスにchecknumを入れる numpre[j_out, i_out].Number = checknum; int txtbxi = FindTextBoxIndexFromNumpreIndex(j_out, i_out); if (txtbxi == -1) { ConsoleList.Items.Add("エラー: Numpre[,]配列のインデックスが不正です"); ConsoleList.Update(); return; } else { txtbox[txtbxi].Text = checknum.ToString(); txtbox[txtbxi].Update(); ConsoleList.Items.Add("自動解答: タテの消去法により (" + (j_out + 1) + ", " + (i_out + 1) + ") は " + checknum); ConsoleList.Update(); timeover = 0; // で、もう一度最初から試行する AnswerHrizonCheck(ref numpre, ref checknum, ref timeover); } } IsSameNum = false; countblank = 0; } // 何もせずにループを抜けたら // タイムアウトカウンタを増やす timeover += 1; }