Rangeオーバーの原因がわからない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
JJJuto
記事: 29
登録日時: 3年前

Rangeオーバーの原因がわからない

#1

投稿記事 by JJJuto » 2年前

以前に質問した五目並べのプログラムを書いているものです。

以下のコードの☆の部分がRangeオーバーになってしまい、処理落ちしてしまいます。
色々調べて直したりしたのですが、直らず、原因がわからず困っています。
使用言語はC#です。

コード:

class Program
    {
        static void Main(string[] args)
        {
            Gomoku gomoku = new Gomoku();

            gomoku.Start();
        }
    }

    class Gomoku
    {
        const int rowMax = 8, colMax = 8;//縦、横
        Stone[,] board = new Stone[rowMax, colMax];

        enum Stone
        {
            None,
            White,
            Black
        }

        public void Start()
        {
            const string endKeyword = "end";
            string str;
            int row, col;
            

            Gomoku mc = new Gomoku();


            Console.WriteLine("-------------------------");

            for (int i = 0; i < board.GetLength(0); i++)
            {
                Console.Write("|");
                for (int m = 0; m < board.GetLength(1); m++)
                {

                    Console.Write(" |");
                }
                Console.WriteLine("");
                Console.WriteLine("-------------------------");
            }
            
            ArrayList al = new ArrayList();

            int array=8;

            for (array = 0; array < 8; array++)
            {
                al.Add(array);
            }

            while (true)
            {
                //プレイヤーのターン
                Console.WriteLine("\nboard[縦][横]のどこに石を置きますか。(endを入力すると終了します)");
                Console.Write("縦[1-8]=");

                str = Console.ReadLine();

                if (str == endKeyword)
                {
                    break;
                }
                if (!int.TryParse(str, out row))
                {
                    continue;
                }

                row--;

                if (!(0 <= row && row < board.GetLength(0)))
                {
                    continue;
                }

                Console.Write("横[1-8]=");
                str = Console.ReadLine();

                if (!int.TryParse(str, out col))
                {
                    continue;
                }

                col--;

                if (!(0 <= col && col < board.GetLength(1)))
                {
                    continue;
                }
               
                Console.WriteLine("-------------------------");

                board[row, col] = Stone.White;

                for (int i = 0; i < board.GetLength(0); i++)
                {
                    Console.Write("|");
                    for (int m = 0; m < board.GetLength(1); m++)
                    {
                        if (board[i, m] == Stone.White)
                        {
                            Console.Write("〇|");
                        }
                        else
                        {
                            Console.Write(" |");
                        }

                        if (board[i, m] == Stone.White && board[i + 1, m] == Stone.White && board[i + 2, m] == Stone.White && board[i + 3, m] == Stone.White && board[i + 4, m] == Stone.White)
                        {

                            Console.WriteLine("あなたの勝利です!");
                            break;
                        }
                        else if (board[i, m] == Stone.White && board[i, m + 1] == Stone.White && board[i, m + 2] == Stone.White && board[i, m + 3] == Stone.White && board[i, m + 4] == Stone.White)
                        {
                            Console.WriteLine("あなたの勝利です!");
                            break;
                        }
                        else if (board[i, m] == Stone.White && board[i + 1, m + 1] == Stone.White && board[i + 2, m + 2] == Stone.White && board[i + 3, m + 3] == Stone.White && board[i + 4, m + 4] == Stone.White)
                        {
                            Console.WriteLine("あなたの勝利です!");
                            break;
                        }
                    }
                    Console.WriteLine("");
                    Console.WriteLine("-------------------------");
                    
                }

                //COMのターン

                Random r1 = new Random();
                board[array,array] = Stone.Black;

                for (int i = 0; i < al.Count; i++)//☆ここがエラーになってます
                {
                    Console.WriteLine("-------------------------");
                    for (int m = 0; m < al.Count; m++)
                    {
                        if (board[i, m] == Stone.Black)
                        {
                            Console.Write("●|");
                        }
                        else
                        {
                            Console.Write("|");
                        }
                        if (board[i, m] == Stone.Black && board[i + 1, m] == Stone.Black && board[i + 2, m] == Stone.Black && board[i + 3, m] == Stone.Black && board[i + 4, m] == Stone.Black)
                        {
                            Console.WriteLine("敵の勝利です!");
                        }
                        else if (board[i, m] == Stone.Black && board[i, m + 1] == Stone.Black && board[i, m + 2] == Stone.Black && board[i, m + 3] == Stone.Black && board[i, m + 4] == Stone.Black)
                        {
                            Console.WriteLine("敵の勝利です!");
                        }
                        else if (board[i, m] == Stone.Black && board[i + 1, m + 1] == Stone.Black && board[i + 2, m + 2] == Stone.Black && board[i + 3, m + 3] == Stone.Black && board[i + 4, m + 4] == Stone.Black)
                        {
                            Console.WriteLine("敵の勝利です!");
                        }
                    }
                }
                Console.WriteLine("");
                Console.WriteLine("-------------------------");
            }
            
            Console.WriteLine("push any key");
            Console.ReadLine();//入力待ち
        }  
    }
助けてください、よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: Rangeオーバーの原因がわからない

#2

投稿記事 by みけCAT » 2年前

al.Count は rowMax や colMax と同じ8になるはずですが、
例えば i = 7 の時に board[i + 1, m] にアクセスしたり、
m = 7 の時に board[i, m + 1] などにアクセスしてしまうと、範囲外になります。
アクセスする場所に合わせた変数の範囲チェックを追加するべきです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

JJJuto
記事: 29
登録日時: 3年前

Re: Rangeオーバーの原因がわからない

#3

投稿記事 by JJJuto » 2年前

なるほど、範囲外になっている理由がわかりました。

範囲チェックに関してですが、
if(i<=0&&i<=board.GetLength(0))を判定前に加えたりとかですかね?

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: Rangeオーバーの原因がわからない

#4

投稿記事 by みけCAT » 2年前

いいえ。
i<=0 を加えてしまうと、i = 0 の時しか判定しなくなってしまいます。 (iは0からカウントアップするので)
また、既に i < al.Count という条件があるので、 i<=board.GetLength(0) を加えても意味がないでしょう。

アクセスする場所が範囲外でないという条件にしたいので、
i + 4 < al.Count や m + 4 < al.Count が使えそうと思われます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

“C言語何でも質問掲示板” へ戻る