3月31日 控制台
// 1. 初始化
Random rd = new Random();
int bombPassword = rd.Next(1, 101);
int chances = 5;
bool isDefused = false;
// 初始界面:白底黑字,显得专业且正式
Console.BackgroundColor = ConsoleColor.White;
Console.ForegroundColor = ConsoleColor.Black;
Console.Clear(); // 必须调用 Clear,背景色才会铺满全屏
Console.WriteLine("========= 紧急任务:炸弹拆解 =========");
Console.WriteLine($"警告:密码范围 1-100,剩余机会:{chances} 次");
Console.WriteLine("======================================");
// 2. 游戏主循环
for (int i = 1; i <= chances; i++)
{
// 恢复为默认的黑底白字进行输入,方便阅读
Console.BackgroundColor = ConsoleColor.Black;
Console.ForegroundColor = ConsoleColor.White;
Console.Write($"\n第 {i} 次尝试,输入密码:");
if (int.TryParse(Console.ReadLine(), out int guess))
{
if (guess == bombPassword)
{
// 成功:绿底白字
Console.BackgroundColor = ConsoleColor.Green;
Console.ForegroundColor = ConsoleColor.White;
Console.Clear(); // 全屏变绿
Console.WriteLine("\n\n\n 【 恭喜 】密码正确!炸弹已拆除,你是英雄!");
isDefused = true;
break;
}
else
{
// 猜错提示:蓝底白字
Console.BackgroundColor = ConsoleColor.Blue;
Console.ForegroundColor = ConsoleColor.White;
string hint = guess > bombPassword ? " 提示:偏高了 ↑ " : " 提示:偏低了 ↓ ";
Console.WriteLine(hint);
}
}
}
// 3. 结局处理
if (!isDefused)
{
// 失败:红黑交替闪烁 3 次
for (int j = 0; j < 3; j++)
{
Console.BackgroundColor = ConsoleColor.Red; // 红底
Console.Clear();
System.Threading.Thread.Sleep(200); // 暂停 0.2 秒
Console.BackgroundColor = ConsoleColor.Black; // 黑底
Console.Clear();
System.Threading.Thread.Sleep(200);
}
Console.BackgroundColor = ConsoleColor.Red;
Console.ForegroundColor = ConsoleColor.White;
Console.Clear();
Console.WriteLine("\n\n\n 【 轰!!! 】炸弹爆炸,任务失败!");
Console.WriteLine($" 正确密码是:{bombPassword}");
}
// 无论胜负,最后重置颜色
Console.ResetColor();
Console.WriteLine("\n\n按任意键退出程序...");
Console.ReadKey();
声音实验
Console.WriteLine("准备感受频率的力量!声音会越来越尖锐...");
for (int freq = 200; freq <= 2000; freq += 100)
{
Console.WriteLine($"当前频率:{freq} Hz");
Console.Beep(freq, 200); // 频率逐渐升高
}
制作闪烁的“进度条”
Console.Write("正在解压资源:");
for (int i = 0; i <= 100; i++)
{
Console.Write($"\r当前进度:{i}%"); // \r 是回车符,会让光标回到行首重新覆盖
Thread.Sleep(50);
}
控制台版:自动演奏《小星星》
在这段代码中,我们会定义不同音阶的频率(Hz),然后通过一个数组来存储简谱,最后用循环来播放它。
using System;
using System.Threading;
class Program
{
static void Main()
{
Console.Title = "C# 自动音乐盒 - 《小星星》";
Console.BackgroundColor = ConsoleColor.DarkBlue;
Console.Clear();
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("***********************************");
Console.WriteLine(" 正在播放:一闪一闪亮晶晶 (Twinkle Star)");
Console.WriteLine("***********************************");
// 1. 定义音阶频率 (单位: Hz)
int C = 523; // Do
int D = 587; // Re
int E = 659; // Mi
int F = 698; // Fa
int G = 784; // Sol
int A = 880; // La
int B = 988; // Si
// 2. 编写简谱 (1 1 5 5 6 6 5 -)
int[] melody = {
C, C, G, G, A, A, G, // 一闪一闪亮晶晶
F, F, E, E, D, D, C, // 满天都是小星星
G, G, F, F, E, E, D, // 挂在天空放光明
G, G, F, F, E, E, D, // 好像许多小眼睛
C, C, G, G, A, A, G, // 一闪一闪亮晶晶
F, F, E, E, D, D, C // 满天都是小星星
};
// 3. 循环播放
for (int i = 0; i < melody.Length; i++)
{
// 改变颜色增加视觉效果
Console.ForegroundColor = (ConsoleColor)new Random().Next(1, 16);
Console.Write("★ ");
// 播放声音 (频率, 持续时间500毫秒)
Console.Beep(melody[i], 500);
// 每句结尾稍微停顿一下 (每 7 个音符)
if ((i + 1) % 7 == 0)
{
Console.WriteLine();
Thread.Sleep(300);
}
}
Console.ResetColor();
Console.WriteLine("\n播放完毕!按任意键退出...");
Console.ReadKey();
}
}
针对中职学生的学习特点,设计练习题时应尽量脱离枯燥的数学计算,转向具象化的生活场景。
以下为您设计了 5 个趣味性的基础代码练习题,涵盖了 C# 的基础语法(输入输出、条件判断、循环、随机数及数组):
1. 虚拟宠物“饿了么”
考察知识点: while 循环、if...else 分支、变量更新。
- 题目要求: 编写一个控制台程序,模拟喂养一只电子宠物。
- 定义一个初始饥饿值
int hunger = 50;。 - 程序进入循环,每次循环显示当前的饥饿值。
- 用户输入数字
1表示喂食(饥饿值减 10),输入数字2表示让宠物运动(饥饿值加 15)。 - 如果饥饿值超过 100,提示“宠物饿晕了,游戏结束”并退出循环。
- 如果饥饿值低于 0,提示“宠物撑坏了,游戏结束”并退出循环。
2. 幸运抽奖“开盲盒”
考察知识点: Random 随机数、switch 语句。
- 题目要求: 设计一个模拟商场开盲盒的程序。
- 提示用户输入“开”来启动盲盒。
- 使用
Random类生成一个 1 到 5 之间的随机整数。 - 根据随机数的结果输出不同的奖品:
1: 获得“特等奖:雷神笔记本”2: 获得“一等奖:机械键盘”3: 获得“二等奖:无线鼠标”4或5: 获得“参与奖:谢谢惠顾”
- 输出结果后,询问用户是否继续。
3. “真心话大冒险”生成器
考察知识点: 字符串数组 string[]、随机索引。
- 题目要求: 创建一个简单的惩罚指令随机抽取器,用于班级活动。
- 提前在程序中定义一个字符串数组,存入至少 5 个惩罚动作(例如:“学猫叫”、“原地转 5 圈”、“表演一个冷笑话”等)。
- 当用户按下回车键时,程序随机挑选数组中的一个元素并打印出来。
- 加分项: 打印前先显示“正在抽取中...”并配合
System.Threading.Thread.Sleep(1000);制造停顿感。
4. 简易版“谁是卧底”发号器
考察知识点: 输入输出、清空控制台 Console.Clear()。
- 题目要求: 模拟聚会时分发词语的过程。
- 程序开始时,提示“玩家 A 请就位,点击回车查看词语”。
- 玩家 A 按下回车后,显示词语“状元”(平民词)。
- 提示“请按下回车清空屏幕,交给下一位玩家”。
- 屏幕清空后,提示“玩家 B 请就位...”,按下回车显示词语“榜眼”(卧底词)。
- 以此类推,通过
Console.Clear()确保玩家之间看不到对方的词语。
5. 自动“弹幕”刷屏器
考察知识点: for 循环、字符串拼接。
- 题目要求: 模拟直播间的弹幕刷屏效果。
- 要求用户输入想要发送的弹幕内容(例如:“老师 666”)。
- 要求用户输入想要刷屏的次数。
- 使用
for循环按照次数打印弹幕,并在每一条弹幕前加上当前的序号,格式如:第 1 条:老师 666。 - 进阶要求: 如果刷屏次数超过 99 次,提示“由于发言过快,您已被禁言”。
给老师的建议技巧:
- 增加代入感: 可以把题目中的角色换成学生们熟悉的英雄联盟英雄、网络红人或校园生活场景。
- 代码互助: 完成后,可以让学生交换程序,尝试输入一些“非法数据”(比如在要求输入数字的地方输入字母),看看谁的程序先“崩溃”,从而引入异常处理或逻辑严密性的概念。
您需要我针对其中某个题目提供标准的参考示例代码吗?
没问题!这 5 套代码示例专门为初学者编写,结构清晰,并附带了关键逻辑的注释。您可以直接演示给学生看,或者作为评分的标准参考。
1. 虚拟宠物“饿了么”
核心逻辑: 使用 while(true) 保持游戏运行,通过 if 检查死亡条件。
int hunger = 50;
Console.WriteLine("--- 欢迎来到电子宠物领养中心 ---");
while (true)
{
Console.WriteLine($"\n当前饥饿值:{hunger}");
Console.WriteLine("指令:1.喂食(-10) 2.运动(+15)");
string input = Console.ReadLine();
if (input == "1") hunger -= 10;
else if (input == "2") hunger += 15;
else Console.WriteLine("无效指令!");
if (hunger > 100)
{
Console.WriteLine("哎呀!宠物饿晕了,游戏结束。");
break;
}
else if (hunger < 0)
{
Console.WriteLine("太撑了!宠物撑坏了,游戏结束。");
break;
}
}
2. 幸运抽奖“开盲盒”
核心逻辑: 实例化 Random 对象,使用 switch 处理多种中奖结果。
Random rd = new Random();
Console.WriteLine("输入 '开' 启动你的幸运盲盒:");
string action = Console.ReadLine();
if (action == "开")
{
int num = rd.Next(1, 6); // 生成 1, 2, 3, 4, 5
switch (num)
{
case 1:
Console.WriteLine("恭喜!获得【特等奖:雷神笔记本】");
break;
case 2:
Console.WriteLine("恭喜!获得【一等奖:机械键盘】");
break;
case 3:
Console.WriteLine("恭喜!获得【二等奖:无线鼠标】");
break;
default:
Console.WriteLine("遗憾!获得【参与奖:谢谢惠顾】");
break;
}
}
3. “真心话大冒险”生成器
核心逻辑: 数组索引与随机数的结合。
string[] actions = { "学猫叫", "原地转5 圈", "表演一个冷笑话", "深情对视黑板30秒", "模仿一位老师" };
Random rd = new Random();
Console.WriteLine("--- 真心话大冒险 惩罚抽取 ---");
Console.WriteLine("请按下回车键,抽取你的命运...");
Console.ReadLine();
Console.Write("正在抽取中...");
System.Threading.Thread.Sleep(1000); // 制造 1 秒停顿感
int index = rd.Next(actions.Length); // 随机获取合法索引
Console.WriteLine($"\n抽取结果:{actions[index]}!请立刻执行!");
4. 简易版“谁是卧底”发号器
核心逻辑: 利用 Console.Clear() 实现信息的物理遮蔽。
Console.WriteLine("=== 谁是卧底发号器 ===");
// 玩家 A 环节
Console.WriteLine("玩家 A 请就位,点击回车查看词语...");
Console.ReadLine();
Console.WriteLine("你的词语是:【状元】");
Console.WriteLine("查看后请按回车清屏!");
Console.ReadLine();
Console.Clear();
// 玩家 B 环节
Console.WriteLine("玩家 B 请就位,点击回车查看词语...");
Console.ReadLine();
Console.WriteLine("你的词语是:【榜眼】");
Console.WriteLine("查看后请按回车清屏!");
Console.ReadLine();
Console.Clear();
Console.WriteLine("发号完毕,请开始讨论!");
5. 自动“弹幕”刷屏器
核心逻辑: for 循环的计数应用,以及简单的防作弊判断。
Console.WriteLine("请输入你想发送的弹幕:");
string msg = Console.ReadLine();
Console.WriteLine("请输入刷屏次数:");
int count = int.Parse(Console.ReadLine());
if (count > 99)
{
Console.WriteLine("警告:检测到恶意刷屏,您已被禁言!");
}
else
{
for (int i = 1; i <= count; i++)
{
Console.WriteLine($"第 {i} 条:{msg}");
}
Console.WriteLine("刷屏完成!");
}
教学小贴士:
这些代码逻辑非常适合在课堂上进行“活代码”演示。例如在练习 5 中,可以故意不写 int.Parse,让学生观察程序报错,从而引出 类型转换 的必要性。
您需要我把这些代码整理成适合分发给学生的 Word 文档格式 吗?
案例4:统计输入数字的和(输入0结束)
int sum = 0;
while (true)
{
Console.Write("输入数字:");
int num = int.Parse(Console.ReadLine());
if (num == 0)
break;
sum += num;
}
Console.WriteLine("总和:" + sum);
哨兵值
定义:只把「用来终止未知次数循环」的那个值叫哨兵。
哨兵循环:带“终止标记”的特殊条件循环
哨兵循环本质上就是一种条件循环。
哨兵循环(Sentinel Loop)
专门用一个特定的值(哨兵值)来控制循环结束的 while 循环。
- 哨兵值 = 循环的终止信号
- 哨兵值不是有效数据,只是用来告诉程序:“可以停了”
最直观的区别:用途不同
普通条件循环
多用于知道循环范围/次数的场景
# 普通条件循环:循环 5 次
i = 0
while i < 5:
print(i)
i += 1
哨兵循环
多用于不知道要循环多少次,让用户决定什么时候停
# 哨兵循环:输入 'q' 就停止
while True:
user = input("输入内容(输入 q 退出):")
if user == 'q': # q 就是哨兵值
break
print("你输入了:", user)
哨兵循环的核心特征
只要满足下面 3 点,就是哨兵循环:
- 循环不知道要执行多少次
- 有一个**特殊值(哨兵)**用来结束循环
- 哨兵值不参与数据处理,只负责“关门”
经典哨兵循环例子(最容易理解)
# 累加输入的数字,输入 -1 停止
total = 0
while True:
num = int(input("输入数字(-1 停止):"))
if num == -1: # -1 就是哨兵
break
total += num # 只有非哨兵值才参与计算
print("总和:", total)
这里:
-1是哨兵值- 程序不知道用户会输几个数字
- 只有用户输入
-1,循环才结束
一句话总结区别
| 类型 | 特点 | 典型场景 |
|---|---|---|
| 条件循环 | 用任意条件控制循环 | 固定次数、范围判断 |
| 哨兵循环 | 用一个特定值控制结束 | 未知次数、用户主动停止 |
👉 哨兵循环 = 条件循环的一种特殊用法 不是新语法,只是设计思路不同。
总结
- 哨兵循环不是新东西,就是 while 循环
- 它的特点:用一个特殊值(哨兵)来终止循环
- 适用场景:不知道循环多少次,让用户/数据决定何时停止
- 和普通条件循环的关系:哨兵循环 ⊂ 条件循环
案例1:数字反转器
说明:用户在控制台输入:123 ,程序要输出:321
方法:辗转相除法
// 0.定义两个变量
int n,m;
// 1.输出程序名称
Console.WriteLine("整数反转器");
// 2.输出提示语
Console.Write("请输入一个整数:");
// 3.存储用户输入(int.Parse()把字符串数字转整数)
n = int.Parse(Console.ReadLine());
// 4.辗转相除: 除到 n == 0
Console.Write($"{n}反转后是:");
while(n != 0)
{
// n = 120 % 10 + 3 => 3
m = n % 10; // 提取个位 3
// 123 => 12
n = n / 10;
Console.Write(m);
}
第 1 题:找到数字 5 就立刻停止(基础 break)
题目:循环输出 1~10 的数字,当输出到 5 时,立刻停止循环。
要求:必须使用 break 实现。
答案
using System;
class Program
{
static void Main()
{
int i = 1;
while (i <= 10)
{
Console.WriteLine(i);
if (i == 5)
{
break; // 找到5,立刻退出循环
}
i++;
}
Console.WriteLine("循环已停止");
}
}
第 2 题:输入“退出”就结束程序(break + 输入)
题目:让用户不断输入文字,输入“退出”时用 break 结束循环。
要求:必须用 while(true) + break。
答案
using System;
class Program
{
static void Main()
{
while (true)
{
Console.Write("请输入内容(输入退出结束):");
string txt = Console.ReadLine();
if (txt == "退出")
{
break; // 退出循环
}
Console.WriteLine("你输入了:" + txt);
}
Console.WriteLine("程序已退出");
}
}
第 3 题:猜数字,猜对就 break(最经典)
题目:随机生成 1~5 数字,用户猜,猜对立即 break 退出。
要求:必须用 break 结束循环。
答案
using System;
class Program
{
static void Main()
{
Random r = new Random();
int ans = r.Next(1, 6);
while (true)
{
Console.Write("猜数字(1-5):");
int g = int.Parse(Console.ReadLine());
if (g == ans)
{
Console.WriteLine("猜对了!");
break; // 必须用break
}
Console.WriteLine("不对,再试一次");
}
}
}
第 4 题:循环累加,和超过 20 就 break(计算+break)
题目:从 1 开始累加,当总和超过 20 时,立刻 break 停止,并输出最终和。
要求:必须用 break。
答案
using System;
class Program
{
static void Main()
{
int sum = 0;
int i = 1;
while (true)
{
sum += i;
Console.WriteLine("当前总和:" + sum);
if (sum > 20)
{
break; // 超过20退出
}
i++;
}
Console.WriteLine("最终总和:" + sum);
}
}
第 5 题:菜单程序,选3就break退出(综合必考题)
题目:循环显示菜单,选择3时用break退出程序。 菜单:
- 开始
- 帮助
- 退出
答案
using System;
class Program
{
static void Main()
{
while (true)
{
Console.WriteLine("\n===菜单===");
Console.WriteLine("1.开始");
Console.WriteLine("2.帮助");
Console.WriteLine("3.退出");
Console.Write("请选择:");
int c = int.Parse(Console.ReadLine());
if (c == 3)
{
Console.WriteLine("再见!");
break; // 退出菜单
}
else
{
Console.WriteLine("你选择了:" + c);
}
}
}
}
这 5 道题完美覆盖 break 所有考试用法
- 条件满足 break
- while(true) + break(最常用)
- 游戏/猜谜 猜对 break
- 数值达到目标 break
- 菜单退出 break
需要我把这 5 道 break 题目整理成【课堂练习题单(可打印)】 吗? 带:班级、姓名、得分、题目要求、评分标准。
老虎机
using System;
using System.Threading;
class Program
{
static void Main()
{
Random rand = new Random();
int money = 100;
Console.WriteLine("====== 老虎机小游戏 ======");
while (money >= 10)
{
Console.WriteLine();
Console.WriteLine("当前金币:" + money);
Console.WriteLine("按 Enter 拉动老虎机 (10金币)");
Console.WriteLine("输入 0 退出");
string input = Console.ReadLine();
if (input == "0")
break;
money -= 10;
Console.WriteLine("🎰 老虎机转动中...");
int a = 0, b = 0, c = 0;
// 滚动动画
for (int i = 0; i < 10; i++)
{
a = rand.Next(1, 5);
b = rand.Next(1, 5);
c = rand.Next(1, 5);
Console.Write("\r");
Console.Write(GetIcon(a) + " | " + GetIcon(b) + " | " + GetIcon(c));
Thread.Sleep(150);
}
Console.WriteLine();
Console.WriteLine();
// 判断中奖
if (a == b && b == c)
{
Console.WriteLine("🎉 三个相同!大奖 +50");
money += 50;
}
else if (a == b || a == c || b == c)
{
Console.WriteLine("✨ 两个相同!+20");
money += 20;
}
else
{
Console.WriteLine("很遗憾,没有中奖");
}
}
Console.WriteLine();
Console.WriteLine("游戏结束,剩余金币:" + money);
}
static string GetIcon(int n)
{
switch (n)
{
case 1: return "🍒";
case 2: return "🍋";
case 3: return "🔔";
case 4: return "⭐";
default: return "😭";
}
}
}
贪吃蛇
using System;
using System.Collections.Generic;
using System.Threading;
class Program
{
static void Main()
{
Console.CursorVisible = false;
int width = 40;
int height = 20;
Random rand = new Random();
List<(int x, int y)> snake = new List<(int, int)>();
snake.Add((10, 10));
int foodX = rand.Next(1, width - 1);
int foodY = rand.Next(1, height - 1);
int dx = 1;
int dy = 0;
while (true)
{
// 键盘控制
if (Console.KeyAvailable)
{
ConsoleKey key = Console.ReadKey(true).Key;
if (key == ConsoleKey.UpArrow)
{
dx = 0; dy = -1;
}
else if (key == ConsoleKey.DownArrow)
{
dx = 0; dy = 1;
}
else if (key == ConsoleKey.LeftArrow)
{
dx = -1; dy = 0;
}
else if (key == ConsoleKey.RightArrow)
{
dx = 1; dy = 0;
}
}
// 新头位置
var head = snake[0];
int newX = head.x + dx;
int newY = head.y + dy;
// 撞墙结束
if (newX <= 0 || newX >= width || newY <= 0 || newY >= height)
{
Console.Clear();
Console.WriteLine("游戏结束!");
break;
}
snake.Insert(0, (newX, newY));
// 吃食物
if (newX == foodX && newY == foodY)
{
foodX = rand.Next(1, width - 1);
foodY = rand.Next(1, height - 1);
}
else
{
snake.RemoveAt(snake.Count - 1);
}
Console.Clear();
// 画边框
for (int i = 0; i < width; i++)
{
Console.SetCursorPosition(i, 0);
Console.Write("#");
Console.SetCursorPosition(i, height);
Console.Write("#");
}
for (int i = 0; i < height; i++)
{
Console.SetCursorPosition(0, i);
Console.Write("#");
Console.SetCursorPosition(width, i);
Console.Write("#");
}
// 画蛇
foreach (var s in snake)
{
Console.SetCursorPosition(s.x, s.y);
Console.Write("O");
}
// 画食物
Console.SetCursorPosition(foodX, foodY);
Console.Write("*");
Thread.Sleep(120);
}
}
}