【C++】宝さがしゲーム【C++11】


#include <iostream>
#include <random>
#include <algorithm>
#include <vector>
#include <numeric>
#include <iterator>
#include <chrono>
#include <string>
enum digstate{
    stilldig,       // 0
    stilltreasure,  // 1
    dig,            // 2
    digtreasure     // 3
};
void dispgrid(std::vector<int>&grid, const std::vector<std::string>&rows){
    for(int i=0;i<100;i++){
        if(i%10==0){
            std::cout<<std::endl;
            if(i==0) std::cout<<" 0123456789"<<std::endl;
            std::cout<<rows[i/10];
        }
        switch(grid[i]){
            case digstate::stilldig:
                std::cout<<"-";break;
            case digstate::stilltreasure:
                std::cout<<"-";break;
            case digstate::dig:
                std::cout<<"〇";break;
            case digstate::digtreasure:
                std::cout<<"宝";break;
        }
    }
    std::cout<<std::endl;
}
int main(){
    std::vector<int> grid(100);     //表示グリッド
    std::vector<int> digtable(100); //掘る順番
    auto seed=std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
    std::mt19937 mt(seed);
    int treasureNumber; //宝の数
    int playstyle;      //手動か自動か
    std::fill(grid.begin(),grid.end(),0);           //gridは全てゼロ埋め
    std::iota(digtable.begin(),digtable.end(),0);   //digtableは0から99まで連番
    //宝の数を入力
    std::cout<<"宝箱の数[1-100]"<<std::endl;
    std::cin>>treasureNumber;
    if(treasureNumber<1||100<treasureNumber){
        std::cout<<"異常値が入力されました"<<std::endl;
        return EXIT_FAILURE;
    }
    // 宝の位置設定(シャッフル)
    std::shuffle(std::begin(digtable),std::end(digtable),mt);
    for(int i=0;i<treasureNumber;i++){
        grid[digtable[i]]=digstate::stilltreasure;
    }
    std::vector<int>::iterator it=digtable.begin();   //iterator
    int treasureCont=0;
    const std::vector<std::string> rows={"0","1","2","3","4","5","6","7","8","9"};
    //プレイスタイル入力
    std::cout<<"1:Auto 2:Play"<<std::endl;
    std::cin>>playstyle;
    if(playstyle==1){
        // 自動回答なので再抽選(宝箱抽選を使いまわしているので注意)
        std::shuffle(std::begin(digtable),std::end(digtable),mt);
    }else if(playstyle==2){
    }else{
        std::cout<<"異常値が入力されました"<<std::endl;
        return EXIT_FAILURE;
    }
    //グリッド表示
    dispgrid(grid,rows);
    for(;;){
        std::cout<<std::endl;
        int col,row;
        if(playstyle==1){
            //playstayle==auto
            col=*it%10;
            row=*it/10;
            ++it;
        }else{
            //playstayle==play
            std::cout<<"Input:RowNumber ColNumber"<<std::endl;
            std::cin>>row>>col;
        }
        //当たり外れ判定
        if(grid[row*10+col]==digstate::dig || grid[row*10+col]==digstate::digtreasure){
            std::cout<<"already open\n";
        }else if(grid[row*10+col]==digstate::stilldig){
            grid[row*10+col]=digstate::dig;
        }else if(grid[row*10+col]==digstate::stilltreasure){
            grid[row*10+col]=digstate::digtreasure;
            treasureCont++;
            std::cout<<"found a treasure!\n";
        }
        //グリッド表示
        dispgrid(grid,rows);
        //結果表示
        if(treasureCont==treasureNumber){
            std::cout<<std::endl<<"all treasure discovery.congratulations!";
            return EXIT_SUCCESS;  //ゲームオーバー(終了)
        }
    }
}