今回は受講生が作った問題の中から良問をピックアップします。

*******借金返済ゲーム(S氏作)*******
多重債務を抱えた夫婦が返済をして行くゲーム。
設定がとてもシュールだがオブジェクト指向の基礎力が試される良問。

問題: ATMゲーム
トメは闇金に手を出してしまい、借金返済の為に夫婦の共有財産に手を付けてしまいました。
口座の残高は3000万円。1回の出金額はランダムで100~1000万円(100万円区切り)です。
(ただし、ランダムに生成される値は残高を超えることはない)
ただし、トメは計算が苦手なので、1回で出金した預金を全額返済してしまいます。(余剰金は返ってきません)
口座残高が0円以下になる前に借金返済が完了すればクリア。
口座残高が0円以下になると家族会議が開かれてゲームオーバーです。

[***実行例1***]
[借入額]
鳥肌銀行:500万円
ときめき銀行:1500万円
さわやか銀行:300万円
*預金残高は3000万円です。

引き出しますか(はい:y いいえ:n)>y
トメは600万円の引き出しに成功した!!
何処に返済しますか?(鳥肌銀行:0 ときめき銀行:1 さわやか銀行:2 )>1
ときめき銀行へ600万円返済しました。

[借入額]
鳥肌銀行:500万円
ときめき銀行:900万円
さわやか銀行:300万円
*預金残高は2400万円です。

引き出しますか(はい:y いいえ:n)>y
トメは100万円の引き出しに成功した!!
何処に返済しますか?(鳥肌銀行:0 ときめき銀行:1 さわやか銀行:2 )>2
さわやか銀行へ100万円返済しました。

[借入額]
鳥肌銀行:500万円
ときめき銀行:900万円
さわやか銀行:200万円
*預金残高は2300万円です。

引き出しますか(はい:y いいえ:n)>y
トメは300万円の引き出しに成功した!!
何処に返済しますか?(鳥肌銀行:0 ときめき銀行:1 さわやか銀行:2 )>2
さわやか銀行へ300万円返済しました。
さわやか銀行への借金返済が完了した!!

[借入額]
鳥肌銀行:500万円
ときめき銀行:900万円
*預金残高は2000万円です。

引き出しますか(はい:y いいえ:n)>y
トメは1000万円の引き出しに成功した!!
何処に返済しますか?(鳥肌銀行:0 ときめき銀行:1 )>1
ときめき銀行へ1000万円返済しました。
ときめき銀行への借金返済が完了した!!

[借入額]
鳥肌銀行:500万円
*預金残高は1000万円です。

引き出しますか(はい:y いいえ:n)>y
トメは500万円の引き出しに成功した!!
何処に返済しますか?(鳥肌銀行:0 )>0

鳥肌銀行へ500万円返済しました。
鳥肌銀行への借金返済が完了した!!

全ての借金返済が完了した!!

[***実行例2***]
[借入額]
鳥肌銀行:500万円
ときめき銀行:1500万円
さわやか銀行:300万円
*預金残高は3000万円です。

引き出しますか(はい:y いいえ:n)>y
トメは100万円の引き出しに成功した!!
何処に返済しますか?(鳥肌銀行:0 ときめき銀行:1 さわやか銀行:2 )>2
さわやか銀行へ100万円返済しました。

[借入額]
鳥肌銀行:500万円
ときめき銀行:1500万円
さわやか銀行:200万円
*預金残高は2900万円です。

引き出しますか(はい:y いいえ:n)>y

トメは200万円の引き出しに成功した!!
何処に返済しますか?(鳥肌銀行:0 ときめき銀行:1 さわやか銀行:2 )>2
さわやか銀行へ200万円返済しました。
さわやか銀行への借金返済が完了した!!

[借入額]
鳥肌銀行:500万円
ときめき銀行:1500万円
*預金残高は2700万円です。

引き出しますか(はい:y いいえ:n)>y
トメは1000万円の引き出しに成功した!!
何処に返済しますか?(鳥肌銀行:0 ときめき銀行:1 )>1
ときめき銀行へ1000万円返済しました。

[借入額]
鳥肌銀行:500万円
ときめき銀行:500万円
*預金残高は1700万円です。

引き出しますか(はい:y いいえ:n)>y

トメは300万円の引き出しに成功した!!
何処に返済しますか?(鳥肌銀行:0 ときめき銀行:1 )>1
ときめき銀行へ300万円返済しました。

[借入額]
鳥肌銀行:500万円
ときめき銀行:200万円
*預金残高は1400万円です。

引き出しますか(はい:y いいえ:n)>y
トメは400万円の引き出しに成功した!!
何処に返済しますか?(鳥肌銀行:0 ときめき銀行:1 )>0
鳥肌銀行へ400万円返済しました。

[借入額]
鳥肌銀行:100万円
ときめき銀行:200万円
*預金残高は1000万円です。

引き出しますか(はい:y いいえ:n)>y
トメは1000万円の引き出しに成功した!!
何処に返済しますか?(鳥肌銀行:0 ときめき銀行:1 )>0
鳥肌銀行へ1000万円返済しました。
鳥肌銀行への借金返済が完了した!!

預金がなくなった!!
ヒロシ「トメ、なんてことをしてくれたんだ!!」
ゲームオーバー

[***実行例3***]
[借入額]
鳥肌銀行:500万円
ときめき銀行:1500万円
さわやか銀行:300万円
*預金残高は3000万円です。

引き出しますか(はい:y いいえ:n)>y
トメは100万円の引き出しに成功した!!
何処に返済しますか?(鳥肌銀行:0 ときめき銀行:1 さわやか銀行:2 )>2
さわやか銀行へ100万円返済しました。

[借入額]
鳥肌銀行:500万円
ときめき銀行:1500万円
さわやか銀行:200万円
*預金残高は2900万円です。

引き出しますか(はい:y いいえ:n)>n
…夢だった。最初からやり直し!!

[借入額]
鳥肌銀行:500万円
ときめき銀行:1500万円
さわやか銀行:300万円
*預金残高は3000万円です。

引き出しますか(はい:y いいえ:n)>

[解答例]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sgames {
    class Program {
        //ランダムに生成される引き出し金額の最小値
        const int RANDOM_DRAW_MIN = 100;
        //ランダムに生成される引き出し金額の最大値
        const int RANDOM_DRAW_MAX = 1000;
        static List<Bank> bankList;
        static Tome tome=new Tome();
       //値を初期化するメソッド
        static void Init() {
            bankList = new List<Bank> {
                new Bank("鳥肌銀行",500),
                new Bank("ときめき銀行",1500),
                new Bank("さわやか銀行",300),
            };
            tome.Amount = 3000;//トメの預金額の初期値は3000
        }
        static void Main(string[] args) {
            Random rand = new Random();
            Init();
            while (true) {
                ShowInfo();
                Console.Write("引き出しますか(はい:y いいえ:n)>");
                string input = Console.ReadLine();
                if (input == "y") {
                    int money = rand.Next(RANDOM_DRAW_MIN/100
                        , Math.Min(RANDOM_DRAW_MAX/100, tome.Amount/100) + 1)*100;
                    tome.Draw(money);
                    Console.Write($"何処に返済しますか?({ShowBankName()})>");
                    int bankIndex = int.Parse(Console.ReadLine());
                   if(bankList[bankIndex].Recive(money)) {
                        bankList.RemoveAt(bankIndex);
                    }
                    if (bankList.Count == 0) {
                        Console.WriteLine("全ての借金返済が完了した!!");
                        return;
                    }
                } else {
                    Console.WriteLine("…夢だった。最初からやり直し!!");
                    Init();
                    continue;
                }
                if (tome.Amount <= 0) {
                    Console.WriteLine("預金がなくなった!!");
                    Console.WriteLine("ヒロシ「トメ、なんてことをしてくれたんだ!!」");
                    Console.WriteLine("ゲームオーバー");
                    return;
                }
            }
        }
        //繰り返し表示されている残高リスト表示
        static void ShowInfo() {
            Console.WriteLine("[借入額]");
            bankList.ForEach(b => b.ShowInfo());
            Console.WriteLine($"*預金残高は{tome.Amount}万円です。\n");
        }
        //銀行選択の際に銀行名を並べて表示する
        static string ShowBankName() { 
            string str = "";
            for(int i = 0; i < bankList.Count; i++) {
                str += $"{bankList[i].Name}:{i} ";
            }
            return str;
        }
    }
    class Tome {
        public string Name { get; set; } = "トメ";
        public int Amount { get; set; }
        public int Draw(int money) {
            Console.WriteLine($"{Name}は{money}万円の引き出しに成功した!!");
            Amount -= money;
            return money;
        }
    }
    class Bank {
        public string Name { get; set; }
        public int Rest { get; set; }
        public Bank(string name,int rest) {
            Name = name;
            Rest = rest;
        }
        //戻り値:完済したか?
        public bool Recive(int money) {
            bool isComplete = false;
            Console.WriteLine($"{Name}へ{money}万円返済しました。\n");
            Rest -= money;
            if (Rest <= 0) {
                Console.WriteLine($"{Name}への借金返済が完了した!!");
                isComplete = true;
            }
            return isComplete;
        }
        public void ShowInfo() {
            Console.WriteLine($"{Name}:{Rest}万円");
        }
    }
}