C#实现简单的飞行棋小游戏
本文介绍如何使用C#语言在控制台环境中开发一款基础的飞行棋小游戏。核心逻辑包含地图数据的数组化管理、控制台的动态绘制、基于随机数的掷骰子交互,以及针对踩到不同格子(如地雷、时空隧道)的事件处理机制。
项目核心设计与目标
飞行棋是一款典型的回合制策略游戏。在本实现的简化版本中,游戏目标是将任意一方的棋子从起点移动到终点(索引99)。游戏主要依赖以下数据结构来维持状态:
Maps:一个长度为100的整型数组,用于存储每个格子的类型。0代表普通方块,1代表幸运轮盘,2代表地雷,3代表暂停,4代表时空隧道。PlayerPos:整型数组,记录两名玩家当前的坐标位置。PlayerNames:字符串数组,保存玩家昵称。Flags:布尔数组,标记玩家当前是否处于“暂停”状态,若为true则跳过该回合。
准备条件与输入验证
第1步:获取并校验玩家姓名
为保证对局体验,程序需确保两名玩家姓名非空且互不相同。
- 入口:
Main方法开始处。 - 动作:提示用户依次输入玩家A和玩家B的名字。
- 参数校验:
- 若输入为空字符串,重新提示输入。
- 若玩家B的输入与玩家A相同,或玩家A输入为空导致循环重置时直接接收无效值,系统需拦截并报错重试。
- 完成状态:
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#控制台游戏开发的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









