12.C#基础实践项目总结

12.总结


12.1 知识点

学习的主要内容

总结目的-养成良好的学习习惯

流程图

断点学习法

练习

程序员的最终目标


12.2 核心要点速览

项目概述

飞行棋控制台游戏,玩家与电脑轮流扔骰子前进,途中踩到道具格子触发效果,先到终点者胜。

三大场景:开始场景 → 游戏场景 → 结束场景(循环切换)

控制台基础设置

功能 API 说明
隐藏光标 Console.CursorVisible = false 提升用户体验
设置窗口大小 Console.SetWindowSize(w, h) 固定窗口尺寸
设置缓冲区大小 Console.SetBufferSize(w, h) 与窗口一致,禁用滚动条
设置光标位置 Console.SetCursorPosition(x, y) 控制输出位置
设置前景色 Console.ForegroundColor = ConsoleColor.Red 彩色输出
清屏 Console.Clear() 切换场景时调用

场景管理

要点 实现
场景枚举 enum E_SceneType { Begin, Game, End }
场景切换 while(true) + switch(nowSceneType)
开始/结束场景复用 同一函数,通过参数区分标题和选项
退出游戏 Environment.Exit(0)

场景切换核心结构

E_SceneType nowSceneType = E_SceneType.Begin;
while (true)
{
    switch (nowSceneType)
    {
        case E_SceneType.Begin: /* 调用开始场景函数 */ break;
        case E_SceneType.Game:  /* 调用游戏场景函数 */ break;
        case E_SceneType.End:   /* 调用结束场景函数 */ break;
    }
}

数据结构设计

格子类型枚举

类型 效果
Normal 普通格子,无效果
Boom 炸弹,倒退 5 格
Pause 暂停,下回合不能行动
Tunnel 时空隧道,随机效果(倒退/暂停/换位置)

核心结构体

结构体 字段 用途
Vector2 x, y 位置坐标
Grid type, pos 格子类型 + 位置
Map Grid[] grids 格子数组,蛇形布局
Player type, nowIndex, isPause 玩家类型、位置、暂停状态

地图生成

蛇形布局规则

  • 每行 10 格,横向排列
  • 行尾转向,步长取反(stepNum = -stepNum
  • 首尾格子必为普通格子,中间随机生成道具

格子概率:普通 85%、炸弹 5%、暂停 5%、时空隧道 5%

玩家系统

功能 实现要点
绘制玩家 根据类型设置颜色和图标(★玩家 / ▲电脑)
重合处理 判断 nowIndex 相等时显示特殊图标(◎)
暂停机制 isPause 标识,回合开始时检测并重置

游戏逻辑

扔骰子流程

  1. 检测暂停状态 → 若暂停则跳过本回合
  2. 随机 1-6 点数,更新位置
  3. 判断是否到达终点 → 游戏结束
  4. 判断格子类型 → 触发对应效果
  5. 重绘地图和玩家

时空隧道效果

  • 30% 倒退 5 格
  • 30% 暂停一回合
  • 40% 双方交换位置

制作流程建议

  1. 控制台初始化 → 隐藏光标、固定窗口
  2. 场景框架 → 枚举 + switch 切换
  3. 开始/结束场景 → 菜单选择
  4. 游戏场景 - 静态元素 → 红墙、提示文字
  5. 数据结构 → 枚举、结构体
  6. 地图生成 → 蛇形布局、随机道具
  7. 玩家系统 → 绘制、重合处理
  8. 游戏逻辑 → 扔骰子、格子效果、胜负判断

12.3 面试题精选

进阶题

1. 数据结构设计思路

题目

这个飞行棋项目用了哪些数据结构?为什么要这样设计?

深入解析

项目用了枚举 + 结构体组合,符合面向对象思想。

枚举设计

// 格子类型
enum E_Grid_Type { Normal, Boom, Pause, Tunnel }

// 玩家类型
enum E_PlayerType { Player, Computer }

// 场景类型
enum E_SceneType { Begin, Game, End }

结构体设计

// 位置
struct Vector2 { public int x, y; }

// 格子
struct Grid
{
    public E_Grid_Type type;
    public Vector2 pos;
    public void Draw() { /* 根据类型画不同图标 */ }
}

// 地图
struct Map
{
    public Grid[] grids;
    public Map(int x, int y, int num) { /* 蛇形布局初始化 */ }
    public void Draw() { /* 遍历画所有格子 */ }
}

// 玩家
struct Player
{
    public E_PlayerType type;
    public int nowIndex;      // 当前格子索引
    public bool isPause;      // 暂停标识
    public void Draw(Map map) { /* 画玩家图标 */ }
}

设计思路

  • 枚举替代魔法数,代码可读性强
  • 结构体封装数据和行为,职责清晰
  • Map 持有 Grid 数组,Player 持有位置索引,便于重合判断
答题示例

用了三个枚举和四个结构体。

枚举用来定义格子类型、玩家类型、场景类型,避免魔法数。

结构体封装数据和画的方法:Vector2 存坐标,Grid 存格子类型和位置,Map 管格子数组,Player 存玩家状态。

这样设计职责清晰,Map 负责画地图,Player 负责画自己,重合判断也方便。

参考文章
  • 6.游戏场景-格子类型枚举和格子结构体
  • 7.游戏场景-地图结构体
  • 8.游戏场景-玩家和电脑结构体

2. 蛇形地图生成算法

题目

如何生成蛇形布局的地图?每行 10 格,行尾转向。

深入解析

核心思路:步长控制方向,计数控制转向

int indexX = 0;      // X 方向计数
int indexY = 0;      // Y 方向计数
int stepNum = 2;     // X 步长,负数表示反向

for (int i = 0; i < num; i++)
{
    // 设置格子位置
    grids[i].pos = new Vector2(x, y);

    if (indexX == 10)  // 横向走满 10 格
    {
        y += 1;        // 换行
        ++indexY;      // 竖向计数

        if (indexY == 2)  // 竖向走满 2 行
        {
            indexX = 0;
            indexY = 0;
            stepNum = -stepNum;  // 步长取反,实现蛇形
        }
    }
    else
    {
        x += stepNum;  // 横向移动
        ++indexX;
    }
}

算法要点

  • 每行 10 格后换行
  • 每 2 行转向一次
  • 步长取反实现左右交替
答题示例

用步长控制方向,计数控制转向。

横向走 10 格就换行,竖向走 2 行就把步长取反。

比如第一行向右步长是 2,走完两行后变成 -2,就向左走了。这样就能画出蛇形的地图。

参考文章
  • 7.游戏场景-地图结构体

深度题

1. 项目制作思路

题目

如果让你从零开始制作这个飞行棋控制台游戏,你会怎么规划?

深入解析

项目概述:飞行棋控制台游戏,玩家与电脑轮流扔骰子前进,踩道具格子触发效果,先到终点者胜。

模块划分

  1. 控制台基础设置
  2. 场景管理(开始/游戏/结束)
  3. 数据结构(枚举、结构体)
  4. 地图系统(蛇形布局、随机道具)
  5. 玩家系统(绘制、重合、暂停)
  6. 游戏逻辑(扔骰子、格子效果、胜负判断)

开发顺序

  1. 控制台初始化 → 隐藏光标、固定窗口大小
  2. 场景框架 → 枚举 + switch + 主循环
  3. 开始/结束场景 → 菜单选择、场景切换
  4. 游戏场景 - 静态元素 → 画红墙、提示文字
  5. 数据结构 → 定义枚举和结构体
  6. 地图生成 → 蛇形布局、随机道具格子
  7. 玩家系统 → 绘制玩家和电脑、重合处理
  8. 游戏逻辑 → 扔骰子、格子效果、胜负判断

关键技术点

  • 场景切换:枚举 + switch + ref 参数
  • 蛇形地图:步长控制方向,计数控制转向
  • 重合判断:比较 nowIndex,相等时画特殊图标
  • 暂停机制:isPause 标识,回合开始检测并重置

难点与解决

  • 玩家电脑重合:判断索引相等,画特殊图标
  • 场景切换传参:用 ref 让函数内修改生效
  • 随机道具:首尾必为普通格子,中间按概率生成
答题示例

先做控制台基础设置,隐藏光标固定窗口。

然后搭场景框架,用枚举加 switch 管理三个场景。

游戏场景是核心,先画红墙这些静态元素,再定义数据结构:格子枚举、位置结构体、地图结构体、玩家结构体。

然后生成蛇形地图,用步长控制方向。玩家系统要处理绘制和重合判断。

最后是游戏逻辑,扔骰子、判断格子类型、触发效果。

难点主要是场景切换要用 ref,重合要判断索引相等。

参考文章
  • 1.需求分析
  • 2.控制台基础设置
  • 3.多个场景
  • 4.开始场景
  • 5.游戏场景-不变的红墙
  • 6.游戏场景-格子类型枚举和格子结构体
  • 7.游戏场景-地图结构体
  • 8.游戏场景-玩家和电脑结构体
  • 9.游戏场景-扔骰子
  • 10.结束场景
  • 11.代码汇总


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏