#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; //ゲームオーバー(終了) } } }