#include <iostream>
#include <string>
#include <random>
#include <windows.h>
using namespace std;

// コメントありのプログラムと行数を合わせるためのコメント
const int PUR_PRICE = 100;
const int SEL_PRICE = 300;
const string DAY_OF_WEEK[] = { "月", "火", "水", "木", "金", "土", "日" };
const int BASE_NUMBER[] = { 300, 300, 300, 300, 400, 500, 600 };
const string WEATHER[] = { "快晴", "晴れ", "曇り", "小雨", "雨" };
const float EFFECTS[] = { 1.5, 1.0, 0.8, 0.6, 0.4 };
const int BUY_PER[] = { 8, 10, 12, 20, 30 };
const string DIV_LINE = "-------------------------------------------------";
const int CASH_ON_HAND = 10000;
int money = CASH_ON_HAND;

random_device rd;
unsigned int seed = rd();
mt19937 rand_mt(seed);

int main() {
    // 行数を合わせるためのコメント
    cout << "アイスクリーム１個の仕入れ値は" << PUR_PRICE << "円" << endl;
    cout << "アイスクリーム１個の売値は" << SEL_PRICE << "円" << endl;
    cout << "ゲーム開始！" << endl;
    cout << DIV_LINE << endl;

    for (int day = 0; day < 7; day++) {
        int forecast = rand_mt() % size(WEATHER);
        int icecream = 0;

        // 行数を合わせるためのコメント
        cout << "明日は" << DAY_OF_WEEK[day] << "曜日です。" << endl;
        cout << DAY_OF_WEEK[day] << "曜の平均的な来場者数は" << BASE_NUMBER[day] << "人です。" << endl;
        cout << "天気予報は「" << WEATHER[forecast] << "」" << endl;
        cout << "手持ち資金は" << money << "円。";
        cout << (money / PUR_PRICE) << "個まで仕入れられます。" << endl;

        while (true) {
            cout << "何個、仕入れますか？（1個" << PUR_PRICE << "円）";
            cin >> icecream;
            if (icecream <= 0) {
                cout << "最低１個は仕入れましょう。" << endl;
            }
            else if (money < PUR_PRICE * icecream) {
                cout << "手持ち資金が足りません。" << endl;
            }
            else {
                money = money - PUR_PRICE * icecream;
                break;
            }
        }
        cout << "仕入れ" << icecream << "個／支出" << PUR_PRICE * icecream << "円／手持ち資金" << money << "円" << endl;
        Sleep(3000);

        int weather = forecast;
        if (rand_mt() % 3 == 0) weather = rand_mt() % size(WEATHER);
        int beachgoers = BASE_NUMBER[day] * EFFECTS[weather] * (80 + rand_mt() % 41) / 100;
        int buy_per = BUY_PER[weather] * (80 + rand_mt() % 41) / 100;
        int sel_num = beachgoers / buy_per;
        if (sel_num > icecream) sel_num = icecream;

        // 行数を合わせるためのコメント
        cout << DIV_LINE << endl;
        cout << day + 1 << "日目 " << DAY_OF_WEEK[day] << "曜日" << endl;
        cout << "天気は" << WEATHER[weather] << "です。" << endl;
        if (weather != forecast) cout << "天気予報は外れました。" << endl;
        cout << "この日は海水浴客が" << beachgoers << "人、訪れました。" << endl;
        cout << buy_per << "人に1人がアイスクリームを買いました。" << endl;
        cout << sel_num << "個、売れ、" << SEL_PRICE * sel_num << "円、売り上げました。" << endl;
        cout << DIV_LINE << endl;
        money = money + SEL_PRICE * sel_num;
        Sleep(3000);
    }
    // 行数を合わせるためのコメント
    cout << "ゲーム終了です。" << endl;
    cout << "所持金は " << money << "円" << endl;
    if (money >= CASH_ON_HAND)
        cout << (money - CASH_ON_HAND) << "円の利益が出ました。" << endl;
    else
        cout << (CASH_ON_HAND - money) << "円の赤字になりました、、、" << endl;
}
