C# 五目並べが上手くいかない

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

C# 五目並べが上手くいかない

#1

投稿記事 by JJJuto » 2年前

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("-------------------------");
            }

            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("-------------------------");
                }
            }

    //敵のターン
            {

                ArrayList al = new ArrayList();
                Random r1 = new Random();

                int array;

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

                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();//入力待ち
        }
 
    }
    
    
今の状態では、プレイヤーの入力のみになっていて、敵側が石を置くことができません。
個人的にはdo~whileを使うのかな?とも思っていますが、いまいちピンときておらず、どうすればいいかわかりません。
アドバイス宜しくお願いします。

box
記事: 2002
登録日時: 13年前

Re: C# 五目並べが上手くいかない

#2

投稿記事 by box » 2年前

プレイヤーの入力のみになっていて、敵側が石を置くことができません。
敵側というのはコンピューターのことですか?だとすると、プレイヤーの打った手や
盤面の状況などによって最善手あるいはそれに近い手を選ぶためのアルゴリズムは
メチャクチャむずかしいと思います。少なくとも当方にはできません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: C# 五目並べが上手くいかない

#3

投稿記事 by JJJuto » 2年前

そうですね、コンピューターです。
今回のは、空いているマスにランダムに置く形で作ってみたいので、最善手等は考えていないです。
プレイヤー入力→その位置に置く→コンピュータが空いているマスにランダムに置く→プレイヤーの入力…という感じです。

box
記事: 2002
登録日時: 13年前

Re: C# 五目並べが上手くいかない

#4

投稿記事 by box » 2年前

2次元の盤面の一つ一つの場所に数値を当てはめて(例えば10*10の盤面だったら0~99とか)、
そこに石が置いてあるかどうかをon/offで管理します。
コンピューターの手番になったとき、乱数によって
盤面のうち一つの場所を決め、そこがあいていれば
石を置き、あいてなければ別の乱数を発生させて場所を決めて石を置く
(石を置けるまでくり返す)ようにしてみてはどうでしょう。

p.s.
ただ、これだと、コンピューターには何の戦略もありませんので、
プレイヤーが連戦連勝になる気がします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: C# 五目並べが上手くいかない

#5

投稿記事 by JJJuto » 2年前

すみません、質問の仕方が少し下手くそでした。
コード内にある 『//敵のターン』の部分を『//プレイヤーのターン』の次に実行するにはどうしたら良いかがわかりません。//プレイヤーのターン→//敵のターン→//プレイヤーのターン…と繰り返されるようにしたいです。
while(true)の中に入れると、プレイヤーの処理が一度だけ行われて終了してしまう状態で、どうすれば良いかわからず困っています。

コンピューターの戦略はなくて大丈夫です

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

Re: C# 五目並べが上手くいかない

#6

投稿記事 by JJJuto » 2年前

JJJuto さんが書きました:
2年前
すみません、質問の仕方が少し下手くそでした。
コード内にある 『//敵のターン』の部分を『//プレイヤーのターン』の次に実行するにはどうしたら良いかがわかりません。//プレイヤーのターン→//敵のターン→//プレイヤーのターン…と繰り返されるようにしたいです。
while(true)の中に入れると、プレイヤーの処理が一度だけ行われて終了してしまう状態で、どうすれば良いかわからず困っています。

コンピューターの戦略はなくて大丈夫です
今色々試したところ、別途エラーは出てしまいましたが、こちらの問題は解決しました。
ありがとうございました。

返信

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