2025 年 6 月 6 日的时候我发布了第一篇博文《数字炸弹双人版 C程序》里面一个代码 nbg-20241230 代号 nbg-2p 28 行占空间 2.14502143859863 MB 。最近我又双叒叕手搓了一个代码 Number Bomb Game 26.7.9.cpp #ifdef _WIN32 #includeconio.h #else #includetermios.h #includeunistd.h #includecstdio #endif #includecctype #if __cplusplus201103L #includerandom #else #includectime #endif #includeiostream #includelimits #includecstdlib #ifdef _WIN32 #includewindows.h #else #includetime.h #endif enum Language{ CHINESE,ENGLISH,JAPANESE }; int get_char(){ #ifdef _WIN32 return _getch(); #else int received_character; struct termios old_termios,new_termios; tcgetattr(STDIN_FILENO,old_termios); new_termiosold_termios; new_termios.c_lflag~(ICANON|ECHO); tcsetattr(STDIN_FILENO,TCSANOW,new_termios); received_charactergetchar(); tcsetattr(STDIN_FILENO,TCSANOW,old_termios); return received_character; #endif } class number_bomb_game{ private: enum Difficulty{ EASY1,NORMAL,HARD,CUSTOM }; Language language; short game_mode,player_count; Difficulty difficulty; long long seed; short bomb,lower_limit,upper_limit,player_input,round_count; #if __cplusplus201103L std::mt19937 random_engine; #endif protected: void select_language(){ short input; do{ std::cout请选择语言。\tPlease select a language. \t言語を選択してください。 \n0. 简体中文\t1. English\t2. 日本語std::endl; if(!(std::cininput)){ std::cin.clear(); input-1; } std::cin.ignore(std::numeric_limitsstd::streamsize::max(),\n); }while(input0||input2); languagestatic_castLanguage(input); #ifdef _WIN32 std::system(CLS); #else std::system(clear); #endif } void output_game_rules()const{ int received_character0; switch(language){ case CHINESE: std::cout是否查看游戏规则Y/Nstd::endl; break; case ENGLISH: std::coutDo you want to check the game rules?(Y/N) std::endl; break; case JAPANESE: std::coutゲームのルールを表示しますかY/Nstd::endl; break; } received_characterget_char(); if(received_character!EOFstd::tolower(static_castunsigned char(received_character))y){ switch(language){ case CHINESE: std::cout数字炸弹是一款基于逻辑推理的猜数字游戏。游戏开始时系统会在预设范围内生成一个秘密数字称为“炸弹”。玩家根据当前数字范围的提示依次输入一个猜测数字。若玩家猜中炸弹数字则该玩家游戏失败并接受惩罚若未猜中系统将根据猜测值缩小范围若猜测值小于炸弹则下限调整为猜测值1若猜测值大于炸弹则上限调整为猜测值。\n\n游戏可通过种子值控制随机生成结果种子为-1时完全随机。每局结束后可选择继续游戏或退出。\n请按任意键继续......std::endl; break; case ENGLISH: std::coutDigital Bomb is a logic-based number guessing game.\nAt the start of the game, the system generates a secret number (called the \bomb\) within a preset range.\nBased on the current range prompt, players take turns entering a guessed number.\nIf the player guesses the bomb number, they lose the game and must accept a penalty.\nIf the guess is incorrect, the system narrows the range based on the guess:\nif the guess is less than the bomb, the lower bound is adjusted to the guess 1;\nif the guess is greater than the bomb, the upper bound is adjusted to the guess.\n\nThe game can use a seed value to control random outcomes (a seed of -1 means completely random).\nAfter each round, players can choose to continue or quit.\nPress any key to continue...\n; break; case JAPANESE: std::coutデジタルボムは論理的推論に基づく数字当てゲームです。\nゲーム開始時、システムは事前に設定された範囲内で秘密の数字「ボム」と呼びますを生成します。\nプレイヤーは現在の範囲のヒントをもとに、数字を順に予想して入力します。\nもしボムの数字を当ててしまった場合、そのプレイヤーはゲームに敗北し、ペナルティを受けます。\n予想が外れた場合、システムはその予想値に基づいて範囲を狭めます。\n予想値がボムより小さい場合は下限を「予想値1」に調整し、予想値がボムより大きい場合は上限を予想値に調整します。\n\nシード値によってランダムな結果を制御できますシードが-1の場合は完全ランダム。\n各ゲーム終了後、続行するか終了するかを選択できます。\n任意のキーを押して続行してください......\n; break; } get_char(); } #ifdef _WIN32 std::system(CLS); #else std::system(clear); #endif } void choose_game_mode(){ do{ switch(language){ case CHINESE: std::cout请选择游戏模式。0. 人机对战 1. 多人游戏std::flush; break; case ENGLISH: std::coutPlease choose a game mode( 0. Player vs Computer 1. Player vs Player): std::flush; break; case JAPANESE: std::coutゲームモードを選択してください0. プレイヤー対コンピュータ 1. プレイヤー対プレイヤーstd::flush; break; } if(!(std::cingame_mode)){ std::cin.clear(); game_mode-1; } std::cin.ignore(std::numeric_limitsstd::streamsize::max(),\n); }while(game_mode0||game_mode1); #ifdef _WIN32 std::system(CLS); #else std::system(clear); #endif } void input_player_number(){ if(game_mode1){ do{ switch(language){ case CHINESE: std::cout请输入游玩的人数2~20std::flush; break; case ENGLISH: std::coutPlease enter the number of players (2~20): std::flush; break; case JAPANESE: std::coutプレイヤー人数を入力してください2~20std::flush; break; } if(!(std::cinplayer_count)){ std::cin.clear(); player_count1; } std::cin.ignore(std::numeric_limitsstd::streamsize::max(),\n); }while(player_count2||player_count20); } #ifdef _WIN32 std::system(CLS); #else std::system(clear); #endif } void select_difficulty(){ short input; do{ switch(language){ case CHINESE: std::cout请选择难度\n1. 简单\n2. 普通\n3. 困难\n4. 自定义上下限std::endl; break; case ENGLISH: std::coutPlease select the difficulty level: \n1. Easy\n2. Normal\n3. Hard\n4. Custom upper and lower limitsstd::endl; break; case JAPANESE: std::cout難易度を選択してください\n1. 簡単\n2. 普通\n3. 難しい\n4. カスタム上下限std::endl; break; } if(!(std::cininput)){ std::cin.clear(); input0; } std::cin.ignore(std::numeric_limitsstd::streamsize::max(),\n); }while(input1||input4); difficultystatic_castDifficulty(input); #ifdef _WIN32 std::system(CLS); #else std::system(clear); #endif } void input_seed(){ do{ switch(language){ case CHINESE: std::cout请输入种子-1~4294967295-1表示随机std::flush; break; case ENGLISH: std::coutPlease input the seed (-1~4294967295, -1 represents random): std::flush; break; case JAPANESE: std::coutシード値を入力してください-1~4294967295、-1はランダムを表しますstd::flush; break; } if(!(std::cinseed)){ std::cin.clear(); seed-2; } std::cin.ignore(std::numeric_limitsstd::streamsize::max(),\n); }while(seed-1||seed4294967295LL); } void custom_upper_and_lower_limits(){ if(difficultyCUSTOM){ while(true){ switch(language){ case CHINESE: std::cout请输入下限-32768~32767; break; case ENGLISH: std::coutEnter the lower limit (-32768 to 32767): ; break; case JAPANESE: std::cout下限を入力してください-3276832767; break; } if(!(std::cinlower_limit)){ std::cin.clear(); std::cin.ignore(std::numeric_limitsstd::streamsize::max(),\n); }else{ std::cin.ignore(std::numeric_limitsstd::streamsize::max(),\n); break; } } while(true){ switch(language){ case CHINESE: std::cout请输入上限-32768~32767且大于下限; break; case ENGLISH: std::coutEnter the upper limit (-32768 to 32767), and it must be greater than the lower limit: ; break; case JAPANESE: std::cout上限を入力してください-3276832767。下限より大きい値を設定してください; break; } if(!(std::cinupper_limit)||upper_limitlower_limit){ std::cin.clear(); std::cin.ignore(std::numeric_limitsstd::streamsize::max(),\n); }else{ std::cin.ignore(std::numeric_limitsstd::streamsize::max(),\n); break; } } } } void generate_bomb(long long random_seed){ #if __cplusplus201103L if(random_seed!-1){ random_engine.seed(random_seed); }else{ std::random_device random; random_engine.seed(random()); } std::uniform_int_distribution distribution(1,99); switch(difficulty){ case EASY: distributionstd::uniform_int_distribution(1,199); break; case NORMAL: break; case HARD: distributionstd::uniform_int_distribution(1,49); break; case CUSTOM: distributionstd::uniform_int_distribution(lower_limit,upper_limit-1); break; } bombdistribution(random_engine); #else if(random_seed!-1){ std::srand(random_seed); } switch(difficulty){ case EASY: bombstd::rand()%1991; break; case NORMAL: bombstd::rand()%991; break; case HARD: bombstd::rand()%491; break; case CUSTOM: bombstd::rand()%(upper_limit-lower_limit)lower_limit; break; } #endif switch(language){ case CHINESE: std::cout炸弹已就绪std::endl; break; case ENGLISH: std::coutThe bomb is ready! std::endl; break; case JAPANESE: std::cout爆弾の準備ができましたstd::endl; break; } } void reset_game(){ #ifdef _WIN32 std::system(COLOR 07); #else std::cout\033[0mstd::flush; #endif lower_limit1; upper_limit100; round_count0; } public: number_bomb_game(): language(CHINESE),game_mode(1),player_count(2),difficulty(NORMAL),seed(-1),bomb(50),lower_limit(1),upper_limit(100),player_input(0),round_count(0){ #if __cplusplus201103L std::random_device game_random_device; random_engine.seed(game_random_device()); #endif } void player_versus_computer(){ short computer_guess0; while(true){ do{ switch(language){ case CHINESE: std::cout玩家lower_limit~upper_limitstd::flush; break; case ENGLISH: std::coutPlayer(lower_limit~upper_limit):std::flush; break; case JAPANESE: std::coutプレイヤーlower_limit~upper_limitstd::flush; break; } if(!(std::cinplayer_input)){ std::cin.clear(); player_input-1; } std::cin.ignore(std::numeric_limitsstd::streamsize::max(),\n); }while(player_inputlower_limit||player_inputupper_limit); if(player_inputbomb){ #ifdef _WIN32 std::system(COLOR cf); #else std::cout\033[97;101mstd::flush; #endif switch(language){ case CHINESE: std::cout炸弹爆炸你输了接受惩罚吧玩家std::endl; break; case ENGLISH: std::coutThe bomb exploded, you lost! Accept the punishment, Player!!! std::endl; break; case JAPANESE: std::cout爆弾が爆発しました、あなたの負けです罰を受けてください、プレイヤーstd::endl; break; } break; }else if(player_inputbomb){ lower_limitplayer_input1; }else{ upper_limitplayer_input; } #if __cplusplus201103L std::uniform_int_distribution distribution(lower_limit,upper_limit-1); computer_guessdistribution(random_engine); #else computer_guessstd::rand()%(upper_limit-lower_limit)lower_limit; #endif switch(language){ case CHINESE: std::cout计算机lower_limit~upper_limit; break; case ENGLISH: std::coutComputer(lower_limit~upper_limit):; break; case JAPANESE: std::coutコンピュータlower_limit~upper_limit; break; } #ifdef _WIN32 Sleep(1500); #else struct timespec request{1,500000000L}; nanosleep(request,NULL); #endif std::coutcomputer_guessstd::endl; round_count; if(computer_guessbomb){ #ifdef _WIN32 std::system(COLOR 8f); #else std::cout\033[37;100mstd::flush; #endif switch(language){ case CHINESE: std::cout哎呀一不小心触发了炸弹std::endl; break; case ENGLISH: std::coutOops! I accidentally triggered the bomb! std::endl; break; case JAPANESE: std::coutおっとうっかり爆弾を触发してしまいましたstd::endl; break; } break; }else if(computer_guessbomb){ lower_limitcomputer_guess1; }else{ upper_limitcomputer_guess; } } } void player_versus_player(){ short current_player1; while(true){ do{ switch(language){ case CHINESE: std::cout玩家current_playerlower_limit~upper_limitstd::flush; break; case ENGLISH: std::coutPlayer current_player(lower_limit~upper_limit):std::flush; break; case JAPANESE: std::coutプレイヤーcurrent_playerlower_limit~upper_limitstd::flush; break; } if(!(std::cinplayer_input)){ std::cin.clear(); player_input-1; } std::cin.ignore(std::numeric_limitsstd::streamsize::max(),\n); }while(player_inputlower_limit||player_inputupper_limit); if(player_inputbomb){ #ifdef _WIN32 std::system(COLOR cf); #else std::cout\033[97;101mstd::flush; #endif switch(language){ case CHINESE: std::cout炸弹爆炸你输了接受惩罚吧玩家current_playerstd::endl; break; case ENGLISH: std::coutThe bomb exploded, you lost! Accept the punishment, Player current_player!!! std::endl; break; case JAPANESE: std::cout爆弾が爆発しました、あなたの負けです罰を受けてください、プレイヤーcurrent_playerstd::endl; break; } current_player1; break; }else if(player_inputbomb){ lower_limitplayer_input1; }else{ upper_limitplayer_input; } if(current_player!player_count){ current_player; }else{ current_player1; round_count; } } } void play(){ int received_character0; select_language(); output_game_rules(); while(true){ choose_game_mode(); input_player_number(); select_difficulty(); input_seed(); switch(difficulty){ case EASY: lower_limit1; upper_limit200; break; case NORMAL: lower_limit1; upper_limit100; break; case HARD: lower_limit1; upper_limit50; break; case CUSTOM: break; } custom_upper_and_lower_limits(); generate_bomb(seed); #ifdef _WIN32 Sleep(1000); std::system(CLS); #else sleep(1); std::system(clear); #endif if(game_mode0){ player_versus_computer(); }else{ player_versus_player(); } #ifdef _WIN32 Sleep(3000); #else sleep(3); #endif switch(language){ case CHINESE: std::cout回合数round_count\n再玩一局请按 c 键否则请按任意键以继续std::endl; break; case ENGLISH: std::coutRound counts: round_count\nPlease press the c key to play another round, otherwise please press any key to continue! std::endl; break; case JAPANESE: std::coutラウンド数round_count\nもう一度プレイするには c キーを押してください。そうでない場合は任意のキーを押して続行しますstd::endl; break; } received_characterget_char(); if(received_characterEOF||std::tolower(static_castunsigned char(received_character))!c){ break; } reset_game(); #ifdef _WIN32 std::system(CLS); #else std::system(clear); #endif } } }; int main(){ #ifdef _WIN32 SetConsoleTitleA(Number Bomb Game 26.7.9); #else std::cout\033]0;Number Bomb Game 26.7.9\007std::flush; #endif number_bomb_game game; #if __cplusplus201103L std::srand(std::time(0)); #endif game.play(); #ifdef _WIN32 std::system(COLOR 07); #else std::cout\033[0mstd::flush; #endif std::cout\nGame Over! std::endl; get_char(); return 0; }代码共 554 行 17291 个字符。26.7.8 更新内容- 修复了一些已知问题。允许随意编译运行代码转载请私聊