C#实现简单的飞行棋小游戏

阿麦
阿麦
发布时间:2026-10-13 | 3人浏览过
原创

本文介绍如何使用C#语言在控制台环境中开发一款基础的飞行棋小游戏。核心逻辑包含地图数据的数组化管理、控制台的动态绘制、基于随机数的掷骰子交互,以及针对踩到不同格子(如地雷、时空隧道)的事件处理机制。

项目核心设计与目标

飞行棋是一款典型的回合制策略游戏。在本实现的简化版本中,游戏目标是将任意一方的棋子从起点移动到终点(索引99)。游戏主要依赖以下数据结构来维持状态:

  • Maps:一个长度为100的整型数组,用于存储每个格子的类型。0代表普通方块,1代表幸运轮盘,2代表地雷,3代表暂停,4代表时空隧道。
  • PlayerPos:整型数组,记录两名玩家当前的坐标位置。
  • PlayerNames:字符串数组,保存玩家昵称。
  • Flags:布尔数组,标记玩家当前是否处于“暂停”状态,若为true则跳过该回合。

准备条件与输入验证

第1步:获取并校验玩家姓名

为保证对局体验,程序需确保两名玩家姓名非空且互不相同。

  1. 入口:Main方法开始处。
  2. 动作:提示用户依次输入玩家A和玩家B的名字。
  3. 参数校验:
    • 若输入为空字符串,重新提示输入。
    • 若玩家B的输入与玩家A相同,或玩家A输入为空导致循环重置时直接接收无效值,系统需拦截并报错重试。
  4. 完成状态:PlayerNames数组填入两个合法的唯一字符串。
Console.WriteLine("请输入玩家A的姓名:");
PlayerNames[0] = Console.ReadLine();
while (PlayerNames[0] == "")
{
    Console.WriteLine("玩家A的姓名不能为空,请重新输入");
    PlayerNames[0] = Console.ReadLine();
}
Console.WriteLine("请输入玩家B的姓名:");
PlayerNames[1] = Console.ReadLine();
while (PlayerNames[1] == "" || PlayerNames[1] == PlayerNames[0])
{
    if (PlayerNames[0] == "")
    {
        Console.WriteLine("玩家A的姓名不能为空,请重新输入");
        PlayerNames[1] = Console.ReadLine();
    }
    else
    {
        Console.WriteLine("玩家B的姓名不能与玩家A相同");
        PlayerNames[1] = Console.ReadLine();
    }
}

初始化与地图构建

第2步:配置格子事件

在游戏开始前,需根据预设规则将特定索引的格子赋予对应的功能代码。这通常在InitailMap方法中执行:

  • 幸运轮盘 (Code 1):索引 {6, 23, 40, 55, 69, 83}。
  • 地雷 (Code 2):索引 {5, 13, 17, 33, 38, 50, 64, 80, 94}。
  • 暂停 (Code 3):索引 {2, 3, 4, 9, 27, 60, 93}。
  • 时空隧道 (Code 4):索引 {20, 25, 45, 63, 72, 88, 90}。

第3步:渲染控制台地图

由于是单线程控制台应用,无法像GUI那样实时刷新画面,通常采用清屏后重绘的方式。DrawMap方法按照预定义的几何路径(第一横行→第一竖行→第二横行→第二竖行→第三横行)依次输出字符:

  • 普通格子显示 □。
  • 玩家A所在位置显示 A(全角字符)。
  • 玩家B所在位置显示 B(全角字符)。
  • 若两人重合,显示 <>。
  • 特殊格子分别用 ○、☆、▽、◎ 表示。
public static void InitailMap()
{
    int[] luckyturn = { 6, 23, 40, 55, 69, 83 };
    for (int i = 0; i < luckyturn.Length; i++) Maps[luckyturn[i]] = 1;
    
    int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };
    for (int i = 0; i < landMine.Length; i++) Maps[landMine[i]] = 2;
    
    int[] pause = { 2, 3, 4, 9, 27, 60, 93 };
    for (int i = 0; i < pause.Length; i++) Maps[pause[i]] = 3;
    
    int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };
    for (int i = 0; i < timeTunnel.Length; i++) Maps[timeTunnel[i]] = 4;
}

游戏核心循环与交互

第4步:轮流进行回合操作

游戏主循环使用 while 结构,只要两名玩家的坐标均未达到或超过99,游戏继续。每轮包含以下步骤:

1. 掷骰子阶段:

调用 PlayGame 方法传入当前玩家索引。使用 Random.Next(1, 7) 生成1-6之间的整数。期间多次使用 Console.ReadKey(true) 制造停顿,增强仪式感。

2. 碰撞与事件判定:

移动后首先检查是否与对方重叠。若重叠,对方后退6步。若未重叠,则根据当前位置的 Maps 值触发相应逻辑:

  • 幸运轮盘 (1):弹出选项,玩家可选择与对手交换位置(输入1)或轰炸对手使其后退6步(输入2)。
  • 地雷 (2):自身退6步(注:原代码在此处逻辑指向了对手后退,实际应为自身后退,代码中为 PlayerPos[1 - playerNumber] -= 6,这里需注意原文逻辑可能是想表达踩雷后果,但通常地雷是自己受罚,此处保留原代码行为的描述,即原代码实际上让对手退6步或自己退6步取决于具体赋值,原代码片段在case 2中写的是 PlayerPos[1 - playerNumber] -= 6 且打印“玩家...退了6格”,存在逻辑歧义,建议按常规修正或注明原代码行为)。
  • 暂停 (3):将对应玩家的 Flags 设为 true,下一轮直接跳过。
  • 时空隧道 (4):坐标直接加10。

第5步:边界检查与状态更新

每次移动完毕后,必须调用 ChangePos 方法确保坐标不越界:

  • 若坐标 < 0,强制设为 0。
  • 若坐标 >= 99,强制设为 99(视为到达终点)。
public static void ChangePos()
{
    // 防止小于0
    if (PlayerPos[0] < 0) PlayerPos[0] = 0;
    if (PlayerPos[1] < 0) PlayerPos[1] = 0;
    
    // 防止超过终点
    if (PlayerPos[0] >= 99) PlayerPos[0] = 99;
    if (PlayerPos[1] > 99) PlayerPos[1] = 99;
}

胜负判定

在主循环内部,每当一名玩家行动结束后,立即检查其坐标。若满足条件(代码中判断 PlayerPos[0] > 99 或等于99视为胜利),输出获胜信息并使用 break 跳出循环,结束游戏进程。

以上就是C#实现简单飞行棋小游戏的详细内容,更多关于C#控制台游戏开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表