今回は受講生が作った問題の中から良問をピックアップします。
*******借金返済ゲーム(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}万円"); } } }
コメント