fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5. // your code goes here
  6. return 0;
  7. }
Success #stdin #stdout 0.01s 5288KB
stdin
#include <iostream>
#include <cstdlib> // rand(), srand() のため
#include <ctime>   // time() のため
#include <string>
#include <vector>  // ★これが必要になります!
#include <limits>  // std::numeric_limits のため (getlineの前処理)
#include <algorithm> // std::max, std::min のため

#ifdef _WIN32
#include <windows.h>
#define sleep_ms(ms) Sleep(ms)
#else
#include <unistd.h>
#define sleep_ms(ms) usleep(ms * 1000)
#endif

using namespace std;

class Omikuji
{
private:
    int kinun = 0;
    int goukei = 0;
    string player_name;

    void drawOmikujiResult(int& score_target);

public:
    Omikuji();
    void hiku();
    void unnsei();
    void kanakana();
    void set_player_name(const string& name);

    // ゲッター関数
    int get_goukei() const {
        return goukei;
    }
    int get_kinun() const {
        return kinun;
    }
    string get_player_name() const {
        return player_name;
    }
    int get_total_score() const { // 新しく総合点を返すゲッターも追加
        return goukei + kinun;
    }
};

Omikuji::Omikuji()
{
}

void Omikuji::set_player_name(const string& name) {
    player_name = name;
}

void Omikuji::drawOmikujiResult(int& score_target){
    int x = rand() % 43 + 1;

    switch (x) {
        case 1: cout << "小凶" << endl; score_target += 3; break;
        case 2: cout << "末小吉" << endl; score_target += 6; break;
        case 3: cout << "末凶" << endl; score_target += 5; break;
        case 4: cout << "末吉" << endl; score_target += 7; break;
        case 5: cout << "半凶" << endl; score_target += 4; break;
        case 6: cout << "末小吉" << endl; score_target += 6; break;
        case 7: cout << "半吉" << endl; score_target += 8; break;
        case 8: cout << "中吉" << endl; score_target += 11; break;
        case 9: cout << "小吉" << endl; score_target += 9; break;
        case 10: cout << "小凶" << endl; score_target += 3; break;
        case 11: cout << "末吉" << endl; score_target += 7; break;
        case 12: cout << "凶" << endl; score_target += 2; break;
        case 13: cout << "末小吉" << endl; score_target += 6; break;
        case 14:
            cout << "大吉🎉" << endl;
            cout << "あなた大吉を引くなんて、すごく運がいいですね!" << endl;
            cout << "だけど、この日は少し気をつけてください。" << endl;
            cout << "なぜなら、おみくじは逆の運勢はなりやすいと言われているからです。" << endl;
            cout << "しかし、大吉を引いたのは事実なので、自信持ってくださいね!" << endl;
            score_target += 12;
            break;
        case 15: cout << "末凶" << endl; score_target += 5; break;
        case 16: cout << "吉" << endl; score_target += 10; break;
        case 17: cout << "半吉" << endl; score_target += 8; break;
        case 18: cout << "半凶" << endl; score_target += 4; break;
        case 19: cout << "末吉" << endl; score_target += 7; break;
        case 20: cout << "吉" << endl; score_target += 10; break;
        case 21: cout << "末小吉" <<endl; score_target += 6; break;
        case 22: cout << "末凶" << endl; score_target += 5; break;
        case 23: cout << "小吉" << endl; score_target += 9; break;
        case 24: cout << "半吉" << endl; score_target += 8; break;
        case 25: cout << "半凶" << endl; score_target += 4; break;
        case 26: cout << "末吉" << endl; score_target += 7; break;
        case 27: cout << "小凶" << endl; score_target += 3; break;
        case 28: cout << "末小吉" << endl; score_target += 6; break;
        case 29: cout << "末凶" << endl; score_target += 5; break;
        case 30: cout << "小吉" << endl; score_target += 9; break;
        case 31: cout << "半吉" << endl; score_target += 8; break;
        case 32: cout << "吉" << endl; score_target += 10; break;
        case 33: cout << "末吉" << endl; score_target += 7; break;
        case 34: cout << "凶" << endl; score_target += 2; break;
        case 35: cout << "末小吉" << endl; score_target += 6; break;
        case 36: cout << "中吉" << endl; score_target += 11; break;
        case 37: cout << "半凶" << endl; score_target += 4; break;
        case 38: cout << "末凶" << endl; score_target += 5; break;
        case 39:
            cout << "大凶😱" << endl;
            cout << "あなた大凶を引くなんて、かなり運が悪いですね。" << endl;
            cout << "でも大丈夫。なぜなら、おみくじは逆の運勢になりやすいと言われているからです。" << endl;
            cout << "なのですごく心配する必要はありません!!" << endl;
            cout << "しかし、大凶を引いたのは事実なので、警戒を怠らないでください。" << endl;
            score_target += 1;
            break;
        case 40: cout << "半吉" << endl; score_target += 8; break;
        case 41: cout << "末吉" << endl; score_target += 7; break;
        case 42: cout << "小吉" << endl; score_target += 9; break;
        case 43: cout << "末小吉" << endl; score_target += 6; break;
        default: cout << "エラー:不明な運勢番号です。" << endl; break;
    }
}

void Omikuji::hiku(){
    drawOmikujiResult(goukei);
}

void Omikuji::kanakana(){
    drawOmikujiResult(kinun);
}

void Omikuji::unnsei(){
    cout << player_name << "さんの一週間の運勢は、";
    bool is_error_goukei = false;
    bool is_error_kinun = false;

    if(goukei == 84){
        cout << "超超特大吉です。  は?" << endl;
        cout << "絶対にあり得ません!!" << endl;
        cout << "7つとも大吉が出るなんて!これはバグです。" << endl;
        cout << "すぐおみくじ会社に連絡してください!!" << endl;
        is_error_goukei = true;
    }
    else if(goukei >= 85){
        cout << "すみません。測定不能です。" << endl;
        cout << "おみくじ会社に報告してもらえると助かります。" << endl;
        cout << "まぁ1つ言えることとしては、" << endl;
        cout << "コード。書き換えただろ💢" << endl;
        cout << "お前は人の作品を壊して、何がしたいんだよ" << endl;
        cout << "呪ってやる・・・・・・・・・・";
        for(int o=0; o < 50; o++){
            cout << "呪ってやる";
        }
        cout << endl;
        is_error_goukei = true;
    }
    else if(goukei >= 83){
        cout << "特大吉です!!  ん?" << endl;
        cout << "そして運勢を表す数字は、" << goukei << "です・・   は?" << endl;
        cout << "数字が高すぎます! これはバグです。" << endl;
        cout << "今すぐおみくじ会社に連絡して下さい!" << endl;
        is_error_goukei = true;
    }
    if (!is_error_goukei) {
        if(goukei >= 59){ cout << "おめでとう!!大吉です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "この一週間は自信持って、行動してみましょう!" << endl; cout << "まあ。おみくじは逆の運勢になりやすいと言われているのですが・・" << endl; }
        else if(goukei >= 55){ cout << "中吉です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "大吉は情緒不安定なことが多いので、実質一番いい運勢かもしれません!!" << endl; cout << "しかし、大吉より運勢が悪いのは事実なので、大吉目指して、頑張って下さい!" << endl; }
        else if(goukei >= 52){ cout << "吉です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "以外と結構いいんですね!" << endl; }
        else if(goukei >= 48){ cout << "小吉です" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "いつもより少し小さく行動することをお勧めします。  小吉だけに" << endl; }
        else if(goukei >= 43){ cout << "半吉です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "この辺りから、少しずつ運が下がっていきますね‥" << endl; }
        else if(goukei >= 37){ cout << "末吉です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "小さな幸運しかないかも?" << endl; }
        else if(goukei >= 31){ cout << "末小吉です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "凶ギリギリ!" << endl; }
        else if(goukei >= 27){ cout << "末凶です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "とうとう凶の領域ですよ‥" << endl; }
        else if(goukei >= 24){ cout << "半凶です" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "本格的に凶の領域にいますよ・・" << endl; }
        else if(goukei >= 22){ cout << "小凶です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "ちょっと・中途半端?" << endl; }
        else if(goukei >= 21){ cout << "凶です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です。" << endl; cout << "凶出るなら大凶が良かった・・なんていうSの方はいますか?" << endl; }
        else if(goukei >= 18){ cout << "残念。大凶です。" << endl; cout << "そして運勢を表す数字は、" << goukei << "です・・" << endl; cout << "この一週間は、かなり慎重に行動して下さい" << endl; cout << "今すぐおみくじ会社に連絡して下さい!" << endl; }
        else if(goukei > 8){ cout << "大大凶です!!  ん?" << endl; cout << "そして運勢を表す数字は、" << goukei << "です・・   は?" << endl; cout << "数字が低すぎます! これはバグです。" << endl; cout << "今すぐおみくじ会社に連絡して下さい!" << endl; }
        else if(goukei == 7){ cout << "どん底の大凶です。  は?" << endl; cout << "絶対にあり得ません!!" << endl; cout << "7つとも大凶が出るなんて!これはバグです。" << endl; cout << "すぐおみくじ会社に連絡してください!!" << endl; }
        else{ cout << "すみません。測定不能です。" << endl; cout << "おみくじ会社に報告してもらえると助かります。" << endl; cout << "まぁ1つ言えることとしては、" << endl; cout << "コード。書き換えただろ💢" << endl; cout << "お前は人の作品を壊して、何がしたいんだよ" << endl; cout << "呪ってやる・・・・・・・・・・"; for(int o=0; o < 50; o++){ cout << "呪ってやる"; } cout << endl; }
    }
    cout << endl;

    cout << "そして一週間の金運は、";
    if(kinun == 84){
        cout << "超超特大吉です。  は?" << endl;
        cout << "絶対にあり得ません!!" << endl;
        cout << "7つとも大吉が出るなんて!これはバグです。" << endl;
        cout << "すぐおみくじ会社に連絡してください!!" << endl;
        is_error_kinun = true;
    }
    else if(kinun >= 85){
        cout << "すみません。測定不能です。" << endl;
        cout << "おみくじ会社に報告してもらえると助かります。" << endl;
        cout << "まぁ1つ言えることとしては、" << endl;
        cout << "コード。書き換えただろ💢" << endl;
        cout << "お前は人の作品を壊して、何がしたいんだよ" << endl;
        cout << "呪ってやる・・・・・・・・・・";
        for(int o=0; o < 50; o++){
            cout << "呪ってやる";
        }
        cout << endl;
        is_error_kinun = true;
    }
    else if(kinun >= 83){
        cout << "特大吉です!!  ん?" << endl;
        cout << "そして運勢を表す数字は、" << kinun << "です・・   は?" << endl;
        cout << "数字が高すぎます! これはバグです。" << endl;
        cout << "今すぐおみくじ会社に連絡して下さい!" << endl;
        is_error_kinun = true;
    }
    if (!is_error_kinun) {
        if(kinun >= 57){ cout << "おめでとう!!大吉です。" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "この一週間は、臨時収入が期待できます!!" << endl; cout << "まあ。おみくじは逆の運勢になりやすいと言われているのですが・・" << endl; }
        else if(kinun >= 55){ cout << "中吉です。" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "大吉は情緒不安定なことが多いので、実質一番いい運勢かもしれません!!" << endl; cout << "大きな出費が、安くなるかも?" << endl; }
        else if(kinun >= 52){ cout << "吉です。" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "ちょっとしたボーナスがあるかも?" << endl; }
        else if(kinun >= 48){ cout << "小吉です" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "大きな出費の契約が、少しだけうまくいくかも?" << endl; }
        else if(kinun >= 43){ cout << "半吉です。" << endl; cout << "運勢を表す数字は、" << kinun << "です。" << endl; cout << "自分が気になっていたお菓子が、おみやげとして届くかも?" << endl; }
        else if(kinun >= 37){ cout << "末吉です。" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "お小遣いが少し上がるかも?" << endl; }
        else if(kinun >= 31){ cout << "末小吉です。" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "少しだけサービスしてくれるかも?" << endl; }
        else if(kinun >= 27){ cout << "末凶です。" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "契約が少し不利になるかも?" << endl; }
        else if(kinun >= 24){ cout << "半凶です" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "契約が難しくなるかも?" << endl; }
        else if(kinun >= 22){ cout << "小凶です。" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "思った以上に値がはるかも?" << endl; }
        else if(kinun >= 21){ cout << "凶です。" << endl; cout << "そして運勢を表す数字は、" << kinun << "です。" << endl; cout << "契約が取れなくなるかも?" << endl; }
        else if(kinun >= 18){ cout << "残念。大凶です。" << endl; cout << "そして運勢を表す数字は、" << kinun << "です・・" << endl; cout << "この一週間は、かなり慎重に行動して下さい" << endl; cout << "また、かなりの出費がでる予感がします・・" << endl; }
        else if(kinun > 8){ cout << "大大凶です!!  ん?" << endl; cout << "そして運勢を表す数字は、" << kinun << "です・・   は?" << endl; cout << "数字が低すぎます! これはバグです。" << endl; cout << "今すぐおみくじ会社に連絡して下さい!" << endl; }
        else if(kinun == 7){ cout << "どん底の大凶です。  は?" << endl; cout << "絶対にあり得ません!!" << endl; cout << "7つとも大凶が出るなんて!これはバグです。" << endl; cout << "すぐおみくじ会社に連絡してください!!" << endl; }
        else{ cout << "すみません。測定不能です。" << endl; cout << "おみくじ会社に報告してもらえると助かります。" << endl; cout << "まぁ1つ言えることとしては、" << endl; cout << "コード。書き換えただろ💢" << endl; cout << "お前は人の作品を壊して、何がしたいんだよ" << endl; cout << "呪ってやる・・・・・・・・・・"; for(int o=0; o < 50; o++){ cout << "呪ってやる"; } cout << endl; }
    }

    cout << endl;

    if(!is_error_goukei && !is_error_kinun) {
        if(goukei < 18 || goukei > 61 || kinun < 18 || kinun > 59){
            cout << "ここまで見に来たんですね・・・・" << endl;
            cout << "あなたは出禁です! と言いたいところですが、" << endl;
            cout << "1回だけ許してあげましょう。" << endl;
            cout << "だけど、次はありません!" << endl;
            cout << "反省できたなら、コードを直して、実行ボタンを押して下さい。" << endl;
            cout << "今週の運勢が出ます。" << endl;
            cout << "別に怖がらなくていいんですよ!" << endl;
            cout << "自分が知っている範囲でも、C++教えましょうか?" << endl;
            cout << "嫌なら早く押して下さい!" << endl;
            cout << "早く!!!!!!!" << endl;
        }
    }
    int souunnsei = goukei + kinun;
    cout << "総合的な運勢の合計は、" << souunnsei << "です。" << endl;
}

int main(){
    srand( (unsigned)time( NULL ) );

    cout << "今からおみくじをします。" << endl;
    cout << "運勢は、" << endl;
    cout << "大吉<中吉<吉<小吉<半吉<末吉<末小吉<末凶<半凶<小凶<凶<大凶で、" << endl;
    cout << "左の方が運勢がよく、右の方が悪いです。" << endl;
    cout << "運勢が1番良い大吉は43分の1の確率で出ます。" << endl;
    cout << "最後に、あなたの一週間まとめての運勢が出ます。" << endl;
    cout << "まとめての運勢は、数字と文字で出ます。" << endl;
    cout << "数字は高いほど運勢がよく、低いほど運勢が悪いです。" << endl;
    cout << "ないと思いますが、全て大吉だったら、84点になります(www😆)" << endl;
    cout << "こちらももいと思いますが、全て大凶だったら、7点になります。(www🤣)" << endl;
    cout << "悪い運勢が出ても、責任は取れませんので、自己責任でお願いします。🙇" << endl;
    cout << "それでは早速。おみくじを引いてみてください!" << endl;
    cout << endl;

    int num_players;
    while (true) {
        cout << "何人でおみくじを引きますか? (2人以上、5人まで推奨): ";
        cin >> num_players;

        // 数値以外の入力がされた場合の処理
        if (cin.fail()) {
            cout << "無効な入力です。数字を入力してください。" << endl;
            cin.clear(); // エラーフラグをクリア
            // 入力バッファに残っている不要な文字をすべて読み飛ばす
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            continue; // ループの最初に戻る
        }

        // 範囲外の入力チェック
        if (num_players >= 2 && num_players <= 5) { // 2人から5人まで推奨
            break; // 正しい入力なのでループを抜ける
        } else {
            cout << "申し訳ありませんが、2人以上5人まででお願いします。" << endl;
        }
    }
    // cinで数値を読んだ後にgetlineを使うためのバッファクリア
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    vector<Omikuji> players; // Omikujiオブジェクトを複数しまっておく箱 (vector)
    players.reserve(num_players); // 最初に必要な分のメモリを確保しておくと少し効率的

    // 各プレイヤーのおみくじを引く
    for (int p_idx = 0; p_idx < num_players; ++p_idx) {
        Omikuji current_player_omikuji; // 新しいOmikujiオブジェクトを作成

        string player_name_input;
        cout << endl << "---------------------------------------" << endl;
        cout << (p_idx + 1) << "人目の名前を入力して下さい: ";
        getline(cin, player_name_input);
        current_player_omikuji.set_player_name(player_name_input);

        cout << current_player_omikuji.get_player_name() << "さんの1週間分の占いです。" << endl;
        cout << "まずは総合運を占います。" << endl;
        for(int i = 0; i < 7; ++i){
            if (i == 0) {
                cout << "今日:";
            } else {
                cout << "今日から" << i << "日後:" ;
            }
            current_player_omikuji.hiku();
        }
        cout << endl;
        cout << "次に金運です。" << endl;
        for(int w = 0; w < 7; ++w){
            if (w == 0) {
                cout << "今日:";
            } else {
                cout << "今日から" << w << "日後:";
            }
            current_player_omikuji.kanakana();
        }
        cout << endl;
        current_player_omikuji.unnsei(); // 運勢の最終表示とsouunnsei計算

        players.push_back(current_player_omikuji); // 完成したオブジェクトをvectorに追加
    }

    // 全員の総合運を比較する
    cout << endl << "---------- 全員のおみくじ結果比較 ----------" << endl;

    if (num_players > 1) { // 複数人いる場合のみ比較
        int max_score = -1; // 最も高い点数を見つけるための変数
        int min_score = 999; // 最も低い点数を見つけるための変数 (ありえない高い値で初期化)
        string best_player_name = "";
        string worst_player_name = "";

        for (const auto& p : players) { // players の中身を一つずつ取り出して p と名付ける (const auto& は「変更しない」という意味)
            cout << p.get_player_name() << "さんの合計点: " << p.get_total_score() << endl;

            // 最も高い点数を更新
            if (p.get_total_score() > max_score) {
                max_score = p.get_total_score();
                best_player_name = p.get_player_name();
            }
            // 最も低い点数を更新
            if (p.get_total_score() < min_score) {
                min_score = p.get_total_score();
                worst_player_name = p.get_player_name();
            }
        }

        cout << endl;
        if (best_player_name == worst_player_name) {
             cout << "全員の運勢の合計点は同じでした! (" << best_player_name << "さん: " << max_score << "点)" << endl;
        } else {
            cout << "最も運勢が良かったのは、" << best_player_name << "さんで、" << max_score << "点でした!おめでとう!" << endl;
            cout << "最も運勢が低かったのは、" << worst_player_name << "さんで、" << min_score << "点でした!ドンマイ!" << endl;
        }
    } else {
        cout << "一人だけなので比較はありません。" << endl;
    }

    cout << endl;
    cout << "これでおみくじは終わりです。お疲れ様でした!" << endl;

    return 0;
}
stdout
Standard output is empty