Skip to main content

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 分支、变量更新。

  • 题目要求: 编写一个控制台程序,模拟喂养一只电子宠物。
  1. 定义一个初始饥饿值 int hunger = 50;
  2. 程序进入循环,每次循环显示当前的饥饿值。
  3. 用户输入数字 1 表示喂食(饥饿值减 10),输入数字 2 表示让宠物运动(饥饿值加 15)。
  4. 如果饥饿值超过 100,提示“宠物饿晕了,游戏结束”并退出循环。
  5. 如果饥饿值低于 0,提示“宠物撑坏了,游戏结束”并退出循环。

2. 幸运抽奖“开盲盒”

考察知识点: Random 随机数、switch 语句。

  • 题目要求: 设计一个模拟商场开盲盒的程序。
  1. 提示用户输入“开”来启动盲盒。
  2. 使用 Random 类生成一个 1 到 5 之间的随机整数。
  3. 根据随机数的结果输出不同的奖品:
  • 1: 获得“特等奖:雷神笔记本”
  • 2: 获得“一等奖:机械键盘”
  • 3: 获得“二等奖:无线鼠标”
  • 45: 获得“参与奖:谢谢惠顾”
  1. 输出结果后,询问用户是否继续。

3. “真心话大冒险”生成器

考察知识点: 字符串数组 string[]、随机索引。

  • 题目要求: 创建一个简单的惩罚指令随机抽取器,用于班级活动。
  1. 提前在程序中定义一个字符串数组,存入至少 5 个惩罚动作(例如:“学猫叫”、“原地转 5 圈”、“表演一个冷笑话”等)。
  2. 当用户按下回车键时,程序随机挑选数组中的一个元素并打印出来。
  3. 加分项: 打印前先显示“正在抽取中...”并配合 System.Threading.Thread.Sleep(1000); 制造停顿感。

4. 简易版“谁是卧底”发号器

考察知识点: 输入输出、清空控制台 Console.Clear()

  • 题目要求: 模拟聚会时分发词语的过程。
  1. 程序开始时,提示“玩家 A 请就位,点击回车查看词语”。
  2. 玩家 A 按下回车后,显示词语“状元”(平民词)。
  3. 提示“请按下回车清空屏幕,交给下一位玩家”。
  4. 屏幕清空后,提示“玩家 B 请就位...”,按下回车显示词语“榜眼”(卧底词)。
  5. 以此类推,通过 Console.Clear() 确保玩家之间看不到对方的词语。

5. 自动“弹幕”刷屏器

考察知识点: for 循环、字符串拼接。

  • 题目要求: 模拟直播间的弹幕刷屏效果。
  1. 要求用户输入想要发送的弹幕内容(例如:“老师 666”)。
  2. 要求用户输入想要刷屏的次数。
  3. 使用 for 循环按照次数打印弹幕,并在每一条弹幕前加上当前的序号,格式如:第 1 条:老师 666
  4. 进阶要求: 如果刷屏次数超过 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. 循环不知道要执行多少次
  2. 有一个**特殊值(哨兵)**用来结束循环
  3. 哨兵值不参与数据处理,只负责“关门”

经典哨兵循环例子(最容易理解)

# 累加输入的数字,输入 -1 停止
total = 0
while True:
num = int(input("输入数字(-1 停止):"))

if num == -1: # -1 就是哨兵
break

total += num # 只有非哨兵值才参与计算

print("总和:", total)

这里:

  • -1哨兵值
  • 程序不知道用户会输几个数字
  • 只有用户输入 -1,循环才结束

一句话总结区别

类型特点典型场景
条件循环用任意条件控制循环固定次数、范围判断
哨兵循环用一个特定值控制结束未知次数、用户主动停止

👉 哨兵循环 = 条件循环的一种特殊用法 不是新语法,只是设计思路不同


总结

  1. 哨兵循环不是新东西,就是 while 循环
  2. 它的特点:用一个特殊值(哨兵)来终止循环
  3. 适用场景:不知道循环多少次,让用户/数据决定何时停止
  4. 和普通条件循环的关系:哨兵循环 ⊂ 条件循环

案例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退出程序。 菜单:

  1. 开始
  2. 帮助
  3. 退出

答案

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 所有考试用法

  1. 条件满足 break
  2. while(true) + break(最常用)
  3. 游戏/猜谜 猜对 break
  4. 数值达到目标 break
  5. 菜单退出 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);
}
}
}