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

コメント