Number Bomb Game V2.7.4

发布时间:2026/9/30 15:02:57

Number Bomb Game V2.7.4 自从我踏入 CSDN 论坛并开始写博文已经过去一年多了。我的第一篇博文就是关于《数字炸弹》这款名副其实的“小游戏”的。事实上我一直在持续迭代这个小代码它已从最初的仅有 28 行发展到现在功能较为齐全的游戏版本。这是最新的 V2.7.4 版本写在下面。/** * Number Bomb Game V2.7.4 * This is a digital bomb code written by a single person for playing. * Therere some comments inside that may help you understand the code. * Enjoy the game! * Author: WP18Noru **/ #includecstdlib #includeiostream #ifdef _WIN32 #includewindows.h #else #includetime.h #endif #ifdef _WIN32 #includeconio.h #else #includetermios.h #includeunistd.h #includecstdio #endif #if __cplusplus201103L #includerandom #endif #includelimits #includecctype #if __cplusplus201103L #includectime #endif enum Language{ // enum for languages CHINESE,ENGLISH,JAPANESE }; Language languageCHINESE; inline void clear_screen(){ #ifdef _WIN32 std::system(CLS); #else std::system(clear); #endif } void input_error_prompt(){ switch(language){ case CHINESE: std::cout输入错误请重新输入std::endl; break; case ENGLISH: std::coutInput error, please re-enter! std::endl; break; case JAPANESE: std::cout入力エラーです。再入力してください。std::endl; break; } } int get_char(){ // a compatible function that mimics _getch() from conio.h #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); if(received_characterEOF){ std::clearerr(stdin); } return received_character; #endif } void unified_sleep(long long time_millisecond){ #ifdef _WIN32 Sleep(static_castDWORD(time_millisecond)); #else struct timespec request; request.tv_sectime_millisecond/1000; request.tv_nsec(time_millisecond%1000)*1000000L; nanosleep(request,NULL); #endif } class number_bomb_game{ // main class of the program private: enum Difficulty{ // enum for difficulty EASY1,NORMAL,HARD,CUSTOM }; short game_mode,player_count; Difficulty difficulty; long long seed; short bomb,lower_limit,upper_limit,player_input,guess_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(); std::cout输入错误请重新输入Input error, please re-enter! 入力エラーです。再入力してください。std::endl; input-1; }else if(input0||input2){ std::cout输入错误请重新输入Input error, please re-enter! 入力エラーです。再入力してください。std::endl; } std::cin.ignore(std::numeric_limitsstd::streamsize::max(),\n); }while(input0||input2); languagestatic_castLanguage(input); clear_screen(); } void output_game_rules()const{ switch(language){ case CHINESE: std::cout是否查看游戏规则Y/其他任意键std::endl; break; case ENGLISH: std::coutDo you want to check the game rules?(Y/Any other key) std::endl; break; case JAPANESE: std::coutゲームのルールを表示しますかY/他の任意のキーstd::endl; break; } { int received_character0; 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::coutNumber 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(); // press any key to continue } } clear_screen(); } 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(); input_error_prompt(); game_mode-1; }else if(game_mode0||game_mode1){ input_error_prompt(); } std::cin.ignore(std::numeric_limitsstd::streamsize::max(),\n); }while(game_mode0||game_mode1); clear_screen(); } 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(); input_error_prompt(); player_count1; }else if(player_count2||player_count20){ input_error_prompt(); } std::cin.ignore(std::numeric_limitsstd::streamsize::max(),\n); }while(player_count2||player_count20); } clear_screen(); } 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(); input_error_prompt(); input0; }else if(input1||input4){ input_error_prompt(); } std::cin.ignore(std::numeric_limitsstd::streamsize::max(),\n); }while(input1||input4); difficultystatic_castDifficulty(input); clear_screen(); } 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(); input_error_prompt(); seed-2; }else if(seed-1||seed4294967295LL){ input_error_prompt(); } std::cin.ignore(std::numeric_limitsstd::streamsize::max(),\n); }while(seed-1||seed4294967295LL); // 4294967295LL is 2^32 - 1. Its also the upper limit of unsigned int, the upper limit of the argument to the srand() function, and the upper limit of the seed() method } void custom_upper_and_lower_limits(){ if(difficultyCUSTOM){ // yes, we need to determine while(true){ // -32768 ~ 32767 is the range of short. here we dont need to validate, input error handling will take care of everything. 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(); input_error_prompt(); 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(); input_error_prompt(); 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){ // it should be noted here that the bombs generation range is [lower_limit, upper_limit). #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); bombdistribution(random_engine); break; case NORMAL: bombdistribution(random_engine); break; case HARD: distributionstd::uniform_int_distribution(1,49); bombdistribution(random_engine); break; case CUSTOM: if(upper_limit-lower_limit0){ bomblower_limit; }else{ distributionstd::uniform_int_distribution(lower_limit,upper_limit-1); bombdistribution(random_engine); } break; } #else if(random_seed!-1){ std::srand(random_seed); }else{ std::srand(static_castunsigned int(std::time(0))); } switch(difficulty){ case EASY: bombstd::rand()%1991; break; case NORMAL: bombstd::rand()%991; break; case HARD: bombstd::rand()%491; break; case CUSTOM: if(upper_limit-lower_limit0){ bomblower_limit; }else{ 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; } } bool player_turn(short current_player0){ do{ switch(language){ case CHINESE: if(current_player0){ std::cout玩家lower_limit~upper_limitstd::flush; }else{ std::cout玩家current_playerlower_limit~upper_limitstd::flush; } break; case ENGLISH: if(current_player0){ std::coutPlayer(lower_limit~upper_limit):std::flush; }else{ std::coutPlayer current_player(lower_limit~upper_limit):std::flush; } break; case JAPANESE: if(current_player0){ std::coutプレイヤーlower_limit~upper_limitstd::flush; }else{ std::coutプレイヤーcurrent_playerlower_limit~upper_limitstd::flush; } break; } if(!(std::cinplayer_input)){ std::cin.clear(); input_error_prompt(); player_input-1; }else if(player_inputlower_limit||player_inputupper_limit){ input_error_prompt(); } std::cin.ignore(std::numeric_limitsstd::streamsize::max(),\n); }while(player_inputlower_limit||player_inputupper_limit); guess_count; 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; } return true; }else if(player_inputbomb){ lower_limitplayer_input1; }else{ upper_limitplayer_input; } return false; } bool computer_turn(){ short deviation_range4,deviation0,computer_guess0; switch(difficulty){ case EASY: deviation_range7; break; case NORMAL: break; case HARD: deviation_range2; break; case CUSTOM: break; } short current_deviationdeviation_range,range_sizeupper_limit-lower_limit; if(range_size50){ current_deviationdeviation_range2; }else if(range_size20){ current_deviationdeviation_range/2; if(current_deviation1){ current_deviation1; } } #if __cplusplus201103L std::uniform_int_distribution distribution(-current_deviation,current_deviation); deviationdistribution(random_engine); #else deviationstd::rand()%(current_deviation*21)-current_deviation; #endif computer_guessstatic_castshort((lower_limit(upper_limit-1))/2)1deviation; if(computer_guesslower_limit){ computer_guesslower_limit; } if(computer_guessupper_limit){ computer_guessupper_limit-1; } 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; } unified_sleep(1000); std::coutcomputer_guessstd::endl; guess_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; } return true; }else if(computer_guessbomb){ lower_limitcomputer_guess1; }else{ upper_limitcomputer_guess; } return false; } void reset_game(){ #ifdef _WIN32 std::system(COLOR 07); #else std::cout\033[0mstd::flush; #endif lower_limit1; upper_limit100; guess_count0; } public: number_bomb_game():game_mode(1),player_count(2),difficulty(NORMAL),seed(-1),bomb(50),lower_limit(1),upper_limit(100),player_input(0),guess_count(0){ #if __cplusplus201103L std::random_device game_random_device; random_engine.seed(game_random_device()); #endif } void player_versus_computer(){ while(true){ if(player_turn()||computer_turn()){ break; } } } void player_versus_player(){ short current_player1; while(true){ if(player_turn(current_player)){ break; } current_player(current_player!player_count)?current_player1:1; } } void play(){ 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); unified_sleep(1000); clear_screen(); if(game_mode0){ player_versus_computer(); }else{ player_versus_player(); } unified_sleep(3000); switch(language){ case CHINESE: std::cout猜测次数guess_count\n再玩一局请按 c 键否则请按任意键以继续std::endl; break; case ENGLISH: std::coutGuess counts: guess_count\nPlease press the c key to play another round, otherwise please press any key to continue! std::endl; break; case JAPANESE: std::cout試行回数guess_count\nもう一度プレイするには c キーを押してください。そうでない場合は任意のキーを押して続行しますstd::endl; break; } { int received_character0; received_characterget_char(); if(received_characterEOF||std::tolower(static_castunsigned char(received_character))!c){ break; } } reset_game(); clear_screen(); } } }; void start(){ std::cout正在启动游戏中std::flush; for(short i1;i6;i){ unified_sleep(667); std::cout.; } std::cout\n启动完成std::flush; unified_sleep(500); clear_screen(); } int main(){ #ifdef _WIN32 SetConsoleTitleA(Number Bomb Game V2.7.4); #else std::cout\033]0;Number Bomb Game V2.7.4\007std::flush; #endif start(); number_bomb_game game; 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; } /** * Here are some thoughts on the future of the project: * Maybe: a major refactoring of the code structure; * Maybe: minor changes to the code logic; * Maybe (in the more distant future): update to a graphical interface; * Maybe (in the even more distant future): add online multiplayer! **/ // The code is provided for learning, but that does not mean you can infringe. // Thanks.这就是《数字炸弹》 V2.7.4 的完整实现。代码已在 Windows 和 Linux 下测试通过支持中英日三语言。如果你有改进建议欢迎在评论区指出。感谢大家的阅读
延伸阅读

更多相关文章

2026/9/26 13:55:36

Python数据分析与爬虫自学教程:548集零基础到实战全解析

如果你正在寻找一套从零开始、系统学习 Python 的完整教程,并且希望它能覆盖数据分析与网络爬虫这两个最热门的实战方向,那么这篇文章正是为你准备的。我们这次要看的不是某个单一的工具或模型,而是一套号称“548集”的、面向2026年的Python自…

2026/9/30 14:58:42

商标侵权的四个要素

具备下述四个构成要件的,构成销售假冒注册商标的商品的侵权行为: 1)必须有违法行为存在 即指行为人实施了销售假冒注册商标商品的行为。 2)必须有损害事实发生 即指行为人实施的销售假冒商标商品的行为造成了商标权人的损害后果。销售假冒他人注册商标的商品会给权利…

2026/9/30 14:58:42

少林功夫传承学校办学实力怎么样

嵩山南麓,少林文化传承千年,从禅武并修的古老传统,到融入当代教育体系的特色办学,这片文化沃土之上,无数教育者以传承为使命,探索着少林功夫在当代青少年成长中的全新价值。三十余年来少林功夫文化传播从民…

2026/9/30 14:58:42

网络物理层从原理到排障:编码、介质与常见问题全解析

简介:本资源为网络基础物理层知识讲解文档,面向嵌入式开发、网络运维及通信技术入门人群,帮助理解数据从应用层到物理层的封装与解封装全流程,以及电路交换、报文交换、分组交换三种数据交换形式的差异。内容涵盖同轴电缆、双绞线…

2026/9/30 14:58:42

用了一周 Meta 的 Muse,聊聊这个「个人 AI Agent」到底怎么样

用了一周 Meta 的 Muse,聊聊这个「个人 AI Agent」到底怎么样 前阵子 Meta 上线了一个叫 Muse 的产品,号称是「个人 AI Agent」。市面上的 AI Agent 概念满天飞,但真正做成开箱即用产品的没几个,我抱着试试看的心态用了一周&#…

2026/9/30 14:53:41

EF Core并发冲突实战:乐观锁、RowVersion与异常处理深度解析

先问一个问题:你们在生产环境里有没有遇到过两个人同时改同一条订单记录,后提交的人把先提交的人的数据整个覆盖掉的场景?我见过不止一次,而且每一次都是线上事故级别的。订单状态从“已支付”被改回“待支付”,用户收…

2026/9/29 11:07:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/29 21:48:03

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 0:01:22

MATLAB+Yalmip+CPLEX实战:综合能源系统优化调度全流程解析

做综合能源系统优化调度这活儿,最痛苦的不是建模本身,而是模型写完之后不知道该怎么求解。看论文里轻飘飘一句“采用Yalmip调用CPLEX求解”,自己上手时却往往卡在环境配置、变量声明、约束写法和求解状态判读上,一耗就是两三天。这…

2026/9/30 0:01:22

I3C比I2C快10倍?RK3576实战:速率、DTS配置与混合总线避坑指南

I3C 比 I2C 快 10 倍?这句话在嵌入式群里传了很久,每次都能吵出一堆截图。前段时间我正好在 RK3576 上调板级 I3C 接口,从控制器寄存器一路摸到 Linux DTS 配置,踩了不少坑,也把这笔速度账彻底算明白了。本文就用 RK35…

2026/9/30 0:01:22

字符串转对象:JSON.parse、new Function与URLSearchParams

“字符串转对象”这几个字,我在技术群里见过的问法至少有十几种:有人拿着一串{a:1,b:2}说 JSON.parse 直接报错,有人要从 URL 里抠出参数,还有人只是想把abc变成能挂属性的东西。js 这门语言里,字符串和对象之间的转换…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/29 9:46:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/30 10:28:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑