ケイバハック

競馬ソフトは自分で作ろう!

レース結果を適当に予想するアプリ

頭立て数が正しく入力されるまで繰り返しチェックするようにしたコンソールアプリ

頭立て数が正しく入力されるまで繰り返しチェックするようにしたコンソールアプリ

今回は、競馬ソフトを開発してみたいプログラミング未経験者のうち、.NET Core環境での開発手順の基本が分かっている人に向けての情報です。

「.NET Core環境での開発手順って何?」という方は、まずは、次の記事から読み進め、.NET Core環境での開発手順の基本を学んでください。

.NET Core環境でのコンソールアプリを作るときの基本手順

さて、前回の入力された頭立て数をチェックするようにしたコンソールアプリでは、コンソールから入力された文字が整数かをチェックし、整数以外が入力された場合は、エラーメッセージを表示するように改良しました。

今回は、この「適当にレース結果を予想するアプリシリーズ」の最終回として、このアプリに最後の仕上げを行います。具体的には、頭立て数が正しく入力されるまで繰り返しチェックするようにアプリを改良します。

エラーのたびにアプリを起動をするのが面倒

では、そのようにアプリを改良する理由から説明します。その理由ですが、コンソールに入力された文字が不正だった場合に、そのアプリがいちいち終了してしまうと、その度にアプリを起動することになり面倒だからです。

今作っているのが、コンソールアプリのため、その面倒さがわかりにくいはずです。ですが、作るアプリがデスクトップアプリやスマホアプリの場合を考えてみてください。

競馬のレース結果の予想アプリを立ち上げて、そのアプリの画面には、「次のレースは、何頭立てですか?」と入力欄があるイメージです。

その入力欄に、意地悪く「キングカメハメハ」と入力して、確定すると、「入力された値が不正です」とエラーメッセージが表示された後、何とアプリ自体が終了してしまうわけですね。

そして、もう一度そのアプリを使いたければ、そのアプリを起動する操作が必要になる状況です。どう考えても使いにくいアプリですよね。

前回作ったコンソールアプリは、まさにそのように動作するアプリとなっています。そして、普通のアプリだったら、エラーメッセージの表示後に、アプリを終了したりしませんよね。

なので、コンソールアプリをそのように改良します。具体的には、不正な値が入力されたら、エラーメッセージを表示し、再度、頭立て数の入力を繰り返して受け付けるようにします。

修正するソースコード

では、頭立て数に整数が正しく入力されるまで繰り返しチェックするように改良するために、どうしたら良いかをご紹介します。

まず、改修後のアプリが動作する様子を次の動画で確認してください。

では、この動画について解説します。まず、「dotnet run」で、このアプリを実行すると、コンソールに「次のレースは、何頭立てですか?:」と表示されます。ここまでは、これまで作ってきたアプリと何も変わりませんね。

で、この動画では、そこで、コンソールに「キングカメハメハ」と入力しています。

すると、コンソールに、「入力された文字が不正です。半角の数字で整数を入力してください。」とエラーメッセージが表示された後、再度、「次のレースは何頭立てですか?: 」と表示されています。

この動きが、今回の改修のポイントです。前回のアプリでは、エラーメッセージの表示後、アプリが終了していました。そのため、再度「dotnet run」コマンドを使って、アプリを再起動する必要がありました。

一方、今回の改修後のアプリは、そのようにアプリを再起動するまでもなく、再度、頭立て数を入力できるようになっています。

このようにプログラムを改良するためには、Program.csのソースコードを次のように修正します。

Program.csのソースコード

using System;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //変数の初期化
            int toudate = 0;    //頭立て数
            bool seisuuka = false; //整数に変換できるか

            do
            {
                //コンソールから何頭立てかを入力させる
                Console.Write("次のレースは何頭立てですか?: ");
                string line = Console.ReadLine();

                //入力された文字が整数かをチェックして設定する
                seisuuka = int.TryParse(line, out toudate);

                //整数に変換できない場合、エラーメッセージを表示
                if(!seisuuka)
                {
                    Console.WriteLine("入力された文字が不正です。半角の数字で整数を入力してください。");
                }
            }while(!seisuuka); //整数に変換できない限り繰り返す

            //1〜入力頭立て数の範囲でランダムな数字をkekkaに設定する
            var random = new Random();
            int kekka = random.Next(1, toudate+1);

            //kekkaをコンソールに出力する   
            Console.WriteLine($"次のレースは、{kekka}番の馬が来るよ");  
        }
    }
}

「繰り返し処理」という概念を理解する

今回のソースコードのポイントは、「do」から「}while(!seisuuka);」に挟まれた行のエリアにあります。そのエリアの中でも特に重要なのが、「do-while文」を利用して、繰り返し処理を定義していることです。

ここでは、do-while文を利用して「頭立て数に整数が入力されるまで」という繰り返し処理を実現しているわけですね。

do-while文は、次のような書式で繰り返し実行したい処理を記述できます。

do
{
    //繰り返し実行したい処理
}while(条件);

で、whileのカッコの中の条件がポイントで、do-while文では、その条件を満たす限り、繰り返して処理が行われます。今回の例では、「入力された頭立て数が、整数に変換できない限り」が、その条件となるわけですね。

また、今回のソースコードでは、「seisuuka = int.TryParse(line, out toudate);」の行で、整数への変換結果を「seisuuka」という変数に設定しています。

つまり、「!seisuuka」とすると、「整数に変換できない」という意味になります。それを前回学んだif文の条件に利用し、「エラーメッセージを表示すべきか」を判断しています。

同じく、whileの条件にも「!seisuuka」を利用し、処理を繰り返し続けるかどうかを判断しています。

前回学んだif文と今回学んだ繰り返し処理は、今後プログラミングのロジックを作る上での基礎となります。なので、その使い方をしっかりと抑えてください。

次に読むべき記事:有馬記念の単勝オッズを計算するコンソールアプリ

Return Top