C#控制台飞行棋:界面分区与核心逻辑实现解析

小鹿同学
小鹿同学
发布时间:2026-10-13| 5人浏览过
原创

本文深入分析C#控制台飞行棋小程序的开发过程,从界面分区设计到核心代码实现,详细讲解如何利用Console类进行地图绘制、状态管理及游戏规则逻辑控制。

界面分区与设计分析

C#飞行棋小程序的控制台界面主要划分为四个核心区域,整体效果如下:

具体分区结构如下:

  1. 顶部标题区:显示游戏名称及图例说明,用于区分不同格子的含义。
  2. 信息提示区:展示对战双方的姓名录入情况,并在每一步操作后显示当前行动状态或结果提示。
  3. 游戏主界面区:核心绘图区域,通过字符和颜色变化实时渲染棋盘布局,包括普通格、特殊关卡格及玩家当前位置。
  4. 操作提示区:引导用户输入指令,如按下回车键掷骰子、选择转盘策略或确认下一步行动。

各区域对应的视觉呈现:

① 游戏名字界面示意:

② 信息提示区示意:

③ 游戏界面区示意:

④ 操作提示区示意:

地图绘制与数据存储实现

游戏地图是程序的核心难点,需支持多次重绘并反映最新的棋子位置。由于只需在控制台输出图形,可采用数组存储坐标属性,并通过 Console.WriteLine() 和 Console.Write() 进行分块绘制。

第1步:初始化地图数据

使用一个整型数组 Map 存储棋盘上每个位置的类型,初始化为0(普通方块)。根据游戏规则,将特定索引位置标记为特殊关卡:

  • 幸运转盘 (1)
  • 地雷 (2)
  • 暂停 (3)
  • 时空隧道 (4)
/// <summary>
/// 初始化游戏地图
/// </summary>
static void InitialMap()
{
   for (int i=0;i<Map.Length;i++)
   {
    Map[i] =0;
   }
   //用于存储关卡位置
   int[] luckyTurn = { 6, 23, 40, 55, 69, 83,98 };//幸运转盘 1
   int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//地雷 2
   int[] pause = { 9, 27, 60, 93 };//暂停 3
   int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90};//时空隧道 4
   
   //赋值特殊关卡
   foreach(int pos in luckyTurn) Map[pos] = 1;
   foreach(int pos in landMine) Map[pos] = 2;
   foreach(int pos in pause) Map[pos] = 3;
   foreach(int pos in timeTunnel) Map[pos] = 4;
}

第2步:构建坐标映射函数

为了根据坐标返回正确的字符和颜色,封装 GetMapString 方法。该方法优先判断玩家位置,若该坐标有玩家,则显示特定符号;否则根据 Map 数组的值返回对应图案。

/// <summary>
/// 获得要绘制的坐标对应的字符串和颜色设置
/// </summary>
static string GetMapString(int i)
{
   string Result="";
   
   // 优先级最高:判断是否有玩家在此坐标
   if (playerPos[0] == i && playerPos[1] == i)
   {
    Console.ForegroundColor = ConsoleColor.Yellow;
    Result = "<>"; // 两人同在
   }
   else if (playerPos[0] == i)
   {
    Console.ForegroundColor = ConsoleColor.Yellow;
    Result = "A";
   }
   else if (playerPos[1] == i)
   {
    Console.ForegroundColor = ConsoleColor.Yellow;
    Result = "B";
   }
   else
   {
    switch (Map[i])
    {
     case 0: // 普通
      Console.ForegroundColor = ConsoleColor.White;
       Result = "□";
       break;
     case 1: // 幸运转盘
       Console.ForegroundColor = ConsoleColor.Red;
       Result = "○";
       break;
     case 2: // 地雷
       Console.ForegroundColor = ConsoleColor.Blue;
       Result = "☆";
       break;
     case 3: // 暂停
      Console.ForegroundColor = ConsoleColor.Green;
      Result = "▲";
       break;
     case 4: // 时空隧道
      Console.ForegroundColor = ConsoleColor.DarkBlue;
      Result = "卍";
       break;
    }
   }
   return Result;
}

第3步:执行地图绘制

绘制地图时分多行进行,以第一行(下标0-29)为例,利用循环调用 GetMapString 获取每个点的字符并输出。注意处理换行符和前景色重置。

/// <summary>
/// 绘制游戏地图
/// </summary>
static void DrownMap()
{
   Console.WriteLine("图例:幸运转盘 ○ 地雷 ☆ 暂停 ▲ 时空隧道 卍");
   
   // 绘制第一行
   for(int i=0;i<30;i++)
   {
    Console.Write(GetMapString(i)); 
   }
   Console.Write("\n");
   // 后续行类似处理...
   Console.ResetColor(); 
}

核心游戏逻辑与回合控制

游戏逻辑围绕“掷骰子 → 移动 → 检查事件 → 切换玩家”循环展开。需处理边界检查、玩家碰撞、特殊格子效应及暂停机制。

第1步:安全的位置校验

玩家移动后必须确保坐标在有效范围内(0-99),防止越界。

static void CheckPos()
{
   for (int i = 0; i <= 1; i++)
   {
    if (playerPos[i] > 99) playerPos[i] = 99;
    if (playerPos[i] < 0) playerPos[i] = 0;
   }
}

第2步:稳健的用户输入处理

在幸运转盘交互等环节,需限制用户输入范围。封装 ReadInt 方法捕获异常并重复提示,直到输入合法整数。

static int ReadInt(int min,int max)
{
   while (true)
   {
    try
    {
     int number = Convert.ToInt32(Console.ReadLine());
     if(number<min||number>max)
     {
      Console.WriteLine("只能输入{0}-{1}之间的数字,请重新输入!", min, max);
      continue;
     }
     return number;
    }
    catch
    {
     Console.WriteLine("只能输入数字,请重新输入!");
    }
   }
}

第3步:回合主循环与事件处理

主循环检测双方是否均未到达终点。内部包含玩家A的判断逻辑(玩家B逻辑对称),重点展示事件处理分支:

  1. 掷骰子:默认随机生成1-6,此处预留了按Tab键固定步数的调试接口。
  2. 移动与碰撞:更新坐标后,若踩到对手位置,对手退回原点(0)。
  3. 特殊格子判定:
    • 幸运转盘 (1):弹出选择菜单,交换位置或轰炸对方(后退6步)。
    • 地雷 (2):自动后退6步。
    • 暂停 (3):设置布尔标志位,跳过下一次回合。
    • 时空隧道 (4):自动前进6步。
// 简化的主循环逻辑片段
while(playerPos[0]<99 && playerPos[1]<99)
{
   // ... 玩家A操作 ...
   if (isStop[0] == false)
   {
     // 掷骰子
     int Step = r.Next(1, 7);
     playerPos[0] += Step;
     CheckPos();

     // 碰撞检测
     if (playerPos[0] == playerPos[1])
     {
      playerPos[1] = 0;
      msg = string.Format("{0}踩到了{1},退回原点", names[0], names[1]);
     }
     else
     {
      // 特殊格子处理
      switch (Map[playerPos[0]])
      {
       case 1: // 幸运转盘
        // ... 读取用户选择并执行相应逻辑 ...
        break;
       case 2: // 地雷
        playerPos[0] -= 6;
        CheckPos();
        msg = string.Format("{0}踩到了地雷,后退6步", names[0]);
        break;
       case 3: // 暂停
        isStop[0] = true;
        msg = string.Format("{0}暂停一次!", names[0]);
        break;
       case 4: // 时空隧道
        playerPos[0] += 6;
        CheckPos();
        msg = string.Format("{0}进入时空隧道", names[0]);
        break;
      }
     }
     
     // 刷新屏幕
     Console.Clear();
     DrownMap();
   }
   // ... 切换至玩家B ... 
}

简要总结

本程序通过一维数组管理棋盘状态,结合控制台颜色与字符输出实现可视化界面。核心在于位置更新后的边界与安全校验,以及基于Switch的结构化事件分发。掌握此案例有助于理解基础游戏状态机与控制流设计。

以上就是C#飞行棋小程序设计与实现的详细内容,更多关于C#小游戏开发的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。