C++第二十三课:猜数字游戏等练习
好的!这里为每道题目都生成了完整的练习题目,包含题目要求、输入输出示例和提示。
题目
📝 题目1:猜字母游戏
题目要求
编写一个猜字母游戏程序,要求:
- 电脑随机生成一个A-Z的大写字母
- 玩家有5次猜测机会
- 每次猜测后,提示字母在字母表中的相对位置(之前/之后)
- 猜对或机会用完时显示结果
输入输出示例
猜一个A-Z的字母(5次机会):M
字母在 M 之后,重新猜:S
字母在 S 之前,重新猜:P
字母在 P 之前,重新猜:N
正确!字母是 N
提示
- 使用
char target = 'A' + rand() % 26
生成随机字母 - 用
toupper()
函数将输入转为大写 - 通过比较ASCII码值判断位置关系
📝 题目2:猜颜色游戏
题目要求
编写一个猜颜色游戏程序,要求:
- 从预定义颜色列表【红色, 蓝色, 绿色, 黄色, 紫色】中随机选择
- 玩家有4次猜测机会
- 每次猜测后,提示颜色在列表中的相对位置(较前/较后)或是否在列表中
- 显示可选颜色列表
输入输出示例
可选颜色:红色 蓝色 绿色 黄色 紫色
猜一个颜色(4次机会):蓝色
颜色在列表中较前位置,重新猜:绿色
颜色在列表中较后位置,重新猜:黄色
🎉 正确!颜色是 黄色
提示
- 使用
vector<string>
存储颜色列表 - 遍历vector查找颜色位置
- 比较目标索引和猜测索引
📝 题目3:猜单词游戏(两阶段)
题目要求
编写一个两阶段猜单词游戏:
第一阶段:猜单词长度(3次机会)
- 提示"单词更长"或"单词更短"
第二阶段:猜单词本身
- 只有长度猜对才能进入此阶段
单词库:[“苹果”, “香蕉”, “计算机”, “编程”, “学习”]
输入输出示例
第一关:猜单词的长度:3
单词更长,重新猜长度:5
单词更短,重新猜长度:4
长度正确!现在猜单词是什么:学习
🎉 完全正确!单词是 学习
提示
- 使用
string.length()
获取单词长度 - 分两个阶段处理输入
- 注意长度猜测的机会限制
📝 题目4:网格位置猜谜
题目要求
编写一个网格位置猜谜游戏:
- 在3×3网格中随机生成目标位置(1-9)
- 玩家有3次猜测机会
- 每次猜测后,提示目标相对于猜测位置的方向(上方/下方/左侧/右侧)
- 显示网格位置图
输入输出示例
网格位置图:
1 2 3
4 5 6
7 8 9
猜目标在哪个位置(1-9,3次机会):5
提示:下方且右侧,重新猜:8
提示:上方,重新猜:7
🎯 命中目标!位置 7
提示
- 使用
(位置-1)/3
计算行号,(位置-1)%3
计算列号 - 通过行列差值判断方向
- 注意组合方向的提示(如"下方且右侧")
📝 题目5:数字属性猜谜
题目要求
编写一个通过属性提示猜数字的游戏:
- 生成1-100的随机数
- 玩家有6次猜测机会
- 每次猜测后,提供三个属性提示:
- 奇偶性(奇数/偶数)
- 数字位数(一位数/两位数/三位数)
- 十位数比较(更大/更小/相同)
- 根据属性提示逐步缩小范围
输入输出示例
猜一个1-100的数字(通过属性提示):50
属性提示:偶数,两位数,十位数相同,继续猜:55
属性提示:奇数,两位数,十位数相同,继续猜:52
🎉 完美猜中!数字是 52
提示
- 使用
% 2
判断奇偶性 - 通过数值范围判断位数
- 使用
/ 10
获取十位数进行比较
🎓 知识点考察
题目 | 考察知识点 |
---|---|
猜字母 | 字符处理、ASCII码、循环控制 |
猜颜色 | 数组/vector、字符串比较、遍历查找 |
猜单词 | 字符串操作、多阶段逻辑、条件判断 |
网格位置 | 数学计算、二维坐标、方向判断 |
数字属性 | 数值运算、属性判断、多重条件 |
答案
🟢 简单题
题目1:猜字母游戏
#include <iostream> // 用于输入输出
#include <cstdlib> // 用于随机数函数
#include <ctime> // 用于时间函数
using namespace std; // 使用标准命名空间int main() {// 设置随机数种子,确保每次运行结果不同srand(time(0));// 生成A-Z的随机字母// 'A'的ASCII码是65,26个字母,所以rand() % 26得到0-25,加上'A'就是A-Zchar target = 'A' + rand() % 26;char guess; // 存储玩家的猜测int count = 0; // 记录猜测次数cout << "猜一个A-Z的字母(5次机会):";// 主游戏循环,最多5次机会while (count < 5) {cin >> guess; // 获取玩家输入guess = toupper(guess); // 将输入转为大写,方便比较count++; // 猜测次数加1// 判断是否猜对if (guess == target) {cout << "正确!字母是 " << target << endl;break; // 猜对了就退出循环} // 如果猜错了,给出提示else if (guess < target) {cout << "字母在 " << guess << " 之后"; // 按字母表顺序提示} else {cout << "字母在 " << guess << " 之前";}// 判断是否还有机会if (count < 5) {cout << ",重新猜:";} else {cout << endl << "游戏结束!字母是 " << target << endl;}}return 0; // 程序正常结束
}
代码执行流程:
- 生成随机字母A-Z
- 循环接受玩家输入
- 比较输入与目标字母
- 给出"之前/之后"的提示
- 5次机会用完或猜对时结束
题目2:猜颜色游戏
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector> // 用于动态数组
#include <string> // 用于字符串处理
using namespace std;int main() {srand(time(0));// 定义颜色列表vector<string> colors = {"红色", "蓝色", "绿色", "黄色", "紫色"};int targetIndex = rand() % colors.size(); // 随机选择颜色索引string target = colors[targetIndex]; // 目标颜色string guess; // 玩家猜测int count = 0; // 猜测次数// 显示可选颜色cout << "可选颜色:";for (const auto& color : colors) {cout << color << " ";}cout << endl << "猜一个颜色(4次机会):";while (count < 4) {cin >> guess;count++;// 检查是否猜对if (guess == target) {cout << "🎉 正确!颜色是 " << target << endl;break;} else {// 查找猜测颜色在列表中的位置int guessIndex = -1; // -1表示未找到for (int i = 0; i < colors.size(); i++) {if (colors[i] == guess) {guessIndex = i; // 记录找到的位置break;}}// 根据位置给出提示if (guessIndex == -1) {cout << "颜色不在列表中"; // 输入无效} else if (guessIndex < targetIndex) {cout << "颜色在列表中较前位置"; // 目标在猜测之后} else {cout << "颜色在列表中较后位置"; // 目标在猜测之前}}// 判断是否继续if (count < 4) {cout << ",重新猜:";} else {cout << endl << "游戏结束!颜色是 " << target << endl;}}return 0;
}
核心机制:
- 使用vector存储颜色列表
- 通过索引比较给出位置提示
- 处理无效输入情况
🟡 中等题
题目3:猜单词长度+单词
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <string>
using namespace std;int main() {srand(time(0));// 单词库vector<string> words = {"苹果", "香蕉", "计算机", "编程", "学习"};int targetIndex = rand() % words.size(); // 随机选择单词string target = words[targetIndex]; // 目标单词int targetLength = target.length(); // 目标单词长度int guessLength, guessCount = 0; // 长度猜测和计数string guessWord; // 单词猜测cout << "第一关:猜单词的长度:";cin >> guessLength;// 长度猜测阶段(3次机会)while (guessLength != targetLength && guessCount < 3) {if (guessLength < targetLength) {cout << "单词更长"; // 提示单词更长} else {cout << "单词更短"; // 提示单词更短}cout << ",重新猜长度:";cin >> guessLength;guessCount++;}// 根据长度猜测结果进入不同分支if (guessLength == targetLength) {cout << "长度正确!现在猜单词是什么:";cin >> guessWord;if (guessWord == target) {cout << "🎉 完全正确!单词是 " << target << endl;} else {cout << "单词猜错了,正确答案是 " << target << endl;}} else {cout << "长度猜测失败,单词是 " << target << endl;}return 0;
}
游戏特点:
- 两阶段游戏:先猜长度,再猜单词
- 长度猜测有独立的机会限制
- 使用字符串的length()方法获取长度
题目4:位置猜谜游戏
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;int main() {srand(time(0));int targetPos = rand() % 9 + 1; // 生成1-9的随机位置// 显示网格cout << "网格位置图:" << endl;cout << "1 2 3" << endl;cout << "4 5 6" << endl;cout << "7 8 9" << endl;cout << "猜目标在哪个位置(1-9,3次机会):";int guess, count = 0;while (count < 3) {cin >> guess;count++;if (guess == targetPos) {cout << "🎯 命中目标!位置 " << targetPos << endl;break;} else {// 计算目标位置的行列坐标// 行号:(位置-1)/3,列号:(位置-1)%3int targetRow = (targetPos - 1) / 3; // 0-2行int targetCol = (targetPos - 1) % 3; // 0-2列int guessRow = (guess - 1) / 3;int guessCol = (guess - 1) % 3;// 计算行列差异int rowDiff = targetRow - guessRow; // 正数表示目标在下方的行int colDiff = targetCol - guessCol; // 正数表示目标在右侧的列cout << "提示:";// 行方向提示if (rowDiff > 0) {cout << "下方"; // 目标在猜测的下方} else if (rowDiff < 0) {cout << "上方"; // 目标在猜测的上方}// 列方向提示if (colDiff != 0) {if (rowDiff != 0) cout << "且"; // 如果行方向也有差异if (colDiff > 0) {cout << "右侧"; // 目标在猜测的右侧} else {cout << "左侧"; // 目标在猜测的左侧}}// 判断游戏是否继续if (count < 3) {cout << ",重新猜:";} else {cout << endl << "目标位置是 " << targetPos << endl;}}}return 0;
}
核心算法:
- 将1-9的位置映射到3×3网格坐标
- 通过行列差值计算方向提示
- 使用整数除法和取模计算网格位置
题目5:猜数字属性
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;int main() {srand(time(0));int target = rand() % 100 + 1; // 1-100的随机数int guess, count = 0;cout << "猜一个1-100的数字(通过属性提示):" << endl;while (count < 6) { // 6次机会cin >> guess;count++;if (guess == target) {cout << "🎉 完美猜中!数字是 " << target << endl;break;}cout << "属性提示:";// 提示1:奇偶性if (target % 2 == 0) {cout << "偶数"; // 能被2整除} else {cout << "奇数"; // 不能被2整除}// 提示2:数字位数if (target < 10) {cout << ",一位数"; // 1-9} else if (target < 100) {cout << ",两位数"; // 10-99} else {cout << ",三位数"; // 100}// 提示3:十位数比较int targetTen = target / 10; // 十位数(整除10)int guessTen = guess / 10;if (targetTen > guessTen) {cout << ",十位数更大"; // 目标的十位数更大} else if (targetTen < guessTen) {cout << ",十位数更小"; // 目标的十位数更小} else {cout << ",十位数相同"; // 十位数一样}// 游戏状态判断if (count < 6) {cout << endl << "继续猜:";} else {cout << endl << "游戏结束!数字是 " << target << endl;}}return 0;
}
属性提示解析:
- 奇偶性:使用取模运算
% 2
- 位数判断:通过数值范围判断
- 十位数比较:使用整数除法
/ 10
综合题
//猜数字游戏
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;int main()
{int input_num, rand_num, count = 0, min_ = 0, max_ = 100;cout << "---猜数字小游戏---" << endl;srand(time(0));rand_num = rand() % 101; // 生成0-100的随机数cout << "电脑随机生成了一个数,请猜一猜这个数(0-100):" << endl;min_ = 0;max_ = 100;while(count < 5){cin >> input_num;count++;// 检查输入是否在有效范围内if(input_num < min_ || input_num > max_) {cout << "请输入在" << min_ << "-" << max_ << "之间的数字:" << endl;count--; // 不计入有效尝试次数continue;}if(input_num == rand_num) {cout << "恭喜你,猜对了,电脑随机产生的数为:" << rand_num << endl;cout << "你总共猜了" << count << "次" << endl;break;}if(input_num > rand_num){max_ = input_num;cout << "你猜的数大了,范围在" << min_ << "-" << max_ << "之间";}else {min_ = input_num;cout << "你猜的数小了,范围在" << min_ << "-" << max_ << "之间";}if(count < 5){cout << ",请重新输入:";}else {cout << endl << "很遗憾,游戏失败,你的猜数字次数已经用完!" << endl;cout << "你总共猜了" << count << "次" << endl;cout << "电脑随机产生的数为:" << rand_num << endl;}}return 0;
}