예제 #1
0
        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;
        }
예제 #2
0
        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;
        }