飞行棋业务:
我们要能够让2个玩家 在地图上 按照游戏规则 进行游戏

玩家类
变量:玩家位置,玩家名称,玩家标识,玩家是否在陷阱中
方法:投骰子,移动

地图类
变量:地图数据数组
方法:初始化地图数据,绘制地图,显示Logo

游戏规则类
变量:
方法:第一次游戏说明,判断玩家位置是否有障碍物,根据不同障碍物执行不同操作,判断游戏是否结束

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace P03FlyQi
{
class Program
{
#region ----------------1.全局变量 mapData/playerMark/palyerNames/playerPosition/playerIsInTrap-------------------
//1.全局变量-----------------------------
//--------1.1 地图数据-----------------
/// <summary>
/// 地图数据 数组
/// </summary>
static string[] mapData = new string[100]; //--------1.2 玩家数据-----------------
/// <summary>
/// 玩家标识 A / B
/// </summary>
static string[] playerMark = new string[2]; /// <summary>
/// 玩家名字
/// </summary>
static string[] playerNames = new string[2]; /// <summary>
/// 玩家位置
/// </summary>
static int[] playerPosition = new int[2]; /// <summary>
/// 玩家是否在陷阱中
/// </summary>
static bool[] playerIsInTrap = new bool[2];
#endregion static void Main(string[] args)
{
StartGame();
Console.ReadLine();
} #region 0.0 游戏开始 void StartGame()
/// <summary>
/// 0.0 游戏开始
/// </summary>
static void StartGame()
{
//0.1 初始化数据
InitData();
//0.2 显示 Logo
ShowLogo();
//0.3 游戏进行
Playing();
}
#endregion #region 1.0 初始化数据方法 void InitData()
/// <summary>
/// 1.0 初始化数据方法
/// </summary>
static void InitData()
{
//1.初始化 地图数据
InitMapData();
//2.初始化 玩家数据
InitPlayerData();
}
#endregion #region 1.1 初始化 地图数据 void InitMapData()
/// <summary>
/// 1.1 初始化 地图数据
/// </summary>
static void InitMapData()
{
//a.为地图里所有单元 都默认 赋值为 "普通"
for (int i = 0; i < mapData.Length; i++)
{
mapData[i] = "普通";
}
//b.设置 障碍物
mapData[5] = "地雷";
mapData[25] = "地雷";
mapData[45] = "地雷";
mapData[85] = "地雷"; mapData[15] = "陷阱";
mapData[33] = "陷阱";
mapData[65] = "陷阱";
mapData[95] = "陷阱"; mapData[12] = "时空隧道";
mapData[28] = "时空隧道";
mapData[54] = "时空隧道";
mapData[79] = "时空隧道"; mapData[7] = "幸运轮盘";
mapData[37] = "幸运轮盘";
mapData[47] = "幸运轮盘";
mapData[69] = "幸运轮盘";
}
#endregion #region 1.2 初始化 玩家数据 void InitPlayerData()
/// <summary>
/// 1.2 初始化 玩家数据
/// </summary>
static void InitPlayerData()
{
playerMark[0] = "A";
playerMark[1] = "B"; playerNames[0] = ReadString("请输入玩家A的姓名:");
Console.WriteLine("玩家{0}的名字设置成功啦~~~:)\n", playerMark[0]);
do
{
playerNames[1] = ReadString("请输入玩家B的姓名:");
if (playerNames[1] == playerNames[0])
{
Console.WriteLine("两个名字不能一样~~~");
}
else
{
Console.WriteLine("玩家{0}的名字设置成功啦~~~:)\n", playerMark[1]);
break;
}
} while (true);
}
#endregion #region 2.0 显示游戏Logo void ShowLogo()
/// <summary>
/// 2.0 显示游戏Logo
/// </summary>
static void ShowLogo()
{
Console.WriteLine("********************************************");
Console.WriteLine("* *");
Console.WriteLine("* 牛 B 的 骑 士 飞 行 棋 *");
Console.WriteLine("* *");
Console.WriteLine("********************************************");
}
#endregion #region 3.0 游戏进行中 void Playing()
/// <summary>
/// 3.0 游戏进行中
/// </summary>
static void Playing()
{
//3.1清屏
Console.Clear();
//3.2显示Logo
ShowLogo();
//3.3显示第一次运行游戏的 说明消息
ShowFirstRoundMsg();
//3.4游戏轮流进行
PlayRounds();
}
#endregion #region 3.1 显示第一次运行游戏的 说明消息 void ShowFirstRoundMsg()
/// <summary>
/// 3.1 显示第一次运行游戏的 说明消息
/// </summary>
static void ShowFirstRoundMsg()
{
Console.WriteLine("{0} 和 {1} 两个好基友将在此次游戏中一决雌雄~~!", playerNames[0], playerNames[1]);
Console.WriteLine("玩家【{0}】用【A】表示~~", playerNames[0]);
Console.WriteLine("玩家【{0}】用【B】表示~~", playerNames[1]);
Console.WriteLine("如果两个玩家位置相同,则用 <> 表示~!");
Console.WriteLine("游戏开始~~~");
}
#endregion /// <summary>
/// 游戏结束 标识
/// </summary>
static bool isGameOver = false; #region 3.2 游戏轮流进行 void PlayRound()
/// <summary>
/// 3.2 游戏轮流进行
/// </summary>
static void PlayRounds()
{
//3.2.1绘制地图
ShowMap();
while (!isGameOver)
{
//3.2.2玩家开始玩~~
PlayAnRound();
}
}
#endregion #region 3.2.1 绘制地图 void ShowMap()
/// <summary>
/// 3.2.1 绘制地图
/// </summary>
static void ShowMap()
{
//1.绘制 第一部分:第1个横杠(从左到右)
for (int i = 0; i < 30; i++)
{
string unitIcon = GetMapUnitIconByType(i);
Console.Write(unitIcon);
}
Console.WriteLine();
//2.绘制 第二部分:第1个竖线(右竖线)
for (int i = 30; i < 35; i++)
{
string unitIcon = GetMapUnitIconByType(i);
for (int j = 0; j < 29; j++)
{
Console.Write(" ");
}
Console.WriteLine(unitIcon);
} //3.绘制 第三部分:第2个横杠(从右到左)
for (int i = 64; i>=35; i--)
{
string unitIcon = GetMapUnitIconByType(i);
Console.Write(unitIcon);
}
Console.WriteLine(); //4.绘制 第四部分:第2个竖线(左竖线)
for (int i = 65; i < 70; i++)
{
string unitIcon = GetMapUnitIconByType(i);
Console.WriteLine(unitIcon);
}
//5.绘制 第五部分:第3个横杠(从左到右)
for (int i = 70; i < 100; i++)
{
string unitIcon = GetMapUnitIconByType(i);
Console.Write(unitIcon);
}
Console.WriteLine();
//绘制地图后,恢复 原来的 字体颜色
Console.ResetColor();
}
#endregion #region 3.2.1.1 根据 地图下标,返回 地图图标 或者 玩家标识 string GetMapUnitIconByType(int mapIndex)
/// <summary>
/// 3.2.1.1 根据 地图下标,返回 地图图标 或者 玩家标识
/// 获取地图 下标对应的 地图单元类型(普通、地雷、陷阱...),返回对应的符号!
/// </summary>
/// <param name="mapIndex">地图单元下标</param>
static string GetMapUnitIconByType(int mapIndex)
{
string strUnitIcon = ""; //1.判断 地图位置 是否有玩家
if (mapIndex == playerPosition[0])//玩家A的位置
{
//如果两个玩家的位置相同,则需要 返回 <>
if (playerPosition[0] == playerPosition[1])
{
Console.ForegroundColor = ConsoleColor.Gray;
strUnitIcon = "<>";
}
else
{
Console.ForegroundColor = ConsoleColor.White;
strUnitIcon = playerMark[0];
}
}
else if (mapIndex == playerPosition[1])//玩家B的位置
{
Console.ForegroundColor = ConsoleColor.White;
strUnitIcon = playerMark[1];
}
else//地图 符号
{
switch (mapData[mapIndex])
{
case "普通":
Console.ForegroundColor = ConsoleColor.White;
strUnitIcon = "□";
break;
case "地雷":
Console.ForegroundColor = ConsoleColor.Red;
strUnitIcon = "◎";
break;
case "幸运轮盘":
Console.ForegroundColor = ConsoleColor.Yellow;
strUnitIcon = "卐";
break;
case "时空隧道":
Console.ForegroundColor = ConsoleColor.Magenta;
strUnitIcon = "○";
break;
case "陷阱":
Console.ForegroundColor = ConsoleColor.Green;
strUnitIcon = "井";
break;
}
} return strUnitIcon;
}
#endregion #region 3.2.2 两个玩家各投一次骰子 void PlayAnRound()
/// <summary>
/// 3.2.2 两个玩家各投一次骰子
/// </summary>
static void PlayAnRound()
{
int playNum = 0;
//1.玩家A投骰子--------------------------
//0.判断玩家A是否在陷阱中
if (playerIsInTrap[0] == true)//如果在陷阱中,则停止一轮
{
Console.WriteLine("玩家【A】正艰难的向陷阱外攀爬~~~~按回车继续");
playerIsInTrap[0] = false;//将玩家B的陷阱标识 改成 false(已经停了一轮)
Console.ReadLine();
}
else//否则,进行 投骰子
{
playNum = GetAnRandomNum();
//1.1修改玩家A的位置
playerPosition[0] += playNum;
Console.WriteLine("玩家【A】投了一个数字:{0},按回车继续...", playNum);
Console.ReadLine();
//1.2重新绘制地图
Console.Clear();
ShowLogo();
ShowMap();
//1.3判断玩家A新的位置 上 是否 结束 或 有障碍物!,如果有,则进行相应处理
JudgePosition(true);
} //2.玩家B投骰子-----------------------------
//0.判断玩家A是否在陷阱中
if (playerIsInTrap[1] == true)//如果在陷阱中,则停止一轮
{
Console.WriteLine("玩家【B】正艰难的向陷阱外攀爬~~~~按回车继续");
playerIsInTrap[1] = false;//将玩家B的陷阱标识 改成 false(已经停了一轮)
Console.ReadLine();
}
else
{
playNum = GetAnRandomNum();
//2.1修改玩家B的位置
playerPosition[1] += playNum;
Console.WriteLine("玩家【B】投了一个数字:{0},按回车继续...", playNum);
Console.ReadLine();
//2.2重新绘制地图
Console.Clear();
ShowLogo();
ShowMap();
//2.3判断玩家B新的位置 上 是否 结束 或 有障碍物!,如果有,则进行相应处理
JudgePosition(false);
}
}
#endregion #region 3.2.2.1 获取一个 骰子 数(1-6)
/// <summary>
/// 3.2.2.1 获取一个 骰子 数(1-6)
/// </summary>
static int GetAnRandomNum()
{
Random ran = new Random();
return ran.Next(1, 7);
}
#endregion #region 3.2.2.2 判断玩家在地图上是否有障碍物,如果有则执行对应操作 void JudgePosition(bool isPlayerA)
/// <summary>
/// 3.2.2.2 判断玩家在地图上是否有障碍物,如果有则执行对应操作
/// </summary>
/// <param name="index"></param>
static void JudgePosition(bool isPlayerA)
{
//0.判断两个玩家的新位置 是否 已经超过地图,如果超过,则结束游戏
if (playerPosition[0] >= 99)
{
Console.WriteLine("游戏结束~~~玩家{0}赢了~~", playerMark[0]);
isGameOver = true;
}
else if (playerPosition[1] >= 99)
{
Console.WriteLine("游戏结束~~~玩家{0}赢了~~", playerMark[1]);
isGameOver = true;
}
else
{
//1.玩家的位置
int playerIndex = isPlayerA ? playerPosition[0] : playerPosition[1];
//2.根据玩家所在地图 的障碍物 执行不同的操作
switch (mapData[playerIndex])
{
case "地雷":
{
MeetBomb(isPlayerA);
break;
}
case "幸运轮盘":
{
MeetLuckyCircle(isPlayerA);
break;
}
case "时空隧道":
{
MeetTimeTunnuel(isPlayerA);
break;
}
case "陷阱":
{
MeetTrap(isPlayerA);
break;
}
}
}
}
#endregion #region 3.2.2.2.1 遇到地雷 void MeetBomb(bool isPlayerA)
/// <summary>
/// 3.2.2.2.1 遇到地雷
/// </summary>
/// <param name="isPlayerA">是否为玩家A,或者玩家B</param>
static void MeetBomb(bool isPlayerA)
{
//1.如果是地雷,则提示 要后退 6 格
Console.WriteLine("真倒霉~~【{0}】踩到了 地雷了~~!后退6格~~!按回车继续...", (isPlayerA ? playerMark[0] : playerMark[1]));
//2.玩家退后 6 格
if (isPlayerA)
{
playerPosition[0] -= 6;
}
else
{
playerPosition[1] -= 6;
}
CheckPosition();
Console.ReadLine();
Console.Clear();
ShowLogo();
ShowMap();
}
#endregion #region 3.2.2.2.2 遇到时空隧道 void MeetTimeTunnuel(bool isPlayerA)
/// <summary>
/// 3.2.2.2.2 遇到时空隧道
/// </summary>
/// <param name="isPlayerA">是否为玩家A,或者玩家B</param>
static void MeetTimeTunnuel(bool isPlayerA)
{
//1.如果是地雷,则提示 要后退 6 格
Console.WriteLine("真幸运~~【{0}】进入时空隧道了~~ !前进6格子~~!按回车继续...", (isPlayerA ? playerMark[0] : playerMark[1]));
//2.玩家退后 6 格
if (isPlayerA)
{
playerPosition[0] += 6;
}
else
{
playerPosition[1] += 6;
}
CheckPosition();
Console.ReadLine();
Console.Clear();
ShowLogo();
ShowMap();
}
#endregion #region 3.3.2.2.3 遇到陷阱 void MeetTrap(bool isPlayerA)
/// <summary>
/// 3.3.2.2.3 遇到陷阱
/// </summary>
/// <param name="isPlayerA"></param>
static void MeetTrap(bool isPlayerA)
{
//1.如果是地雷,则提示 要后退 6 格
Console.WriteLine("啊~~【{0}】掉进陷阱了~~ !暂停一局!按回车继续...", (isPlayerA ? playerMark[0] : playerMark[1]));
//2.玩家进入陷阱
if (isPlayerA)
{
playerIsInTrap[0] = true;
}
else
{
playerIsInTrap[1] = true;
}
Console.ReadLine();
}
#endregion #region 3.3.2.4 遇到幸运轮盘 void MeetLuckyCircle()
/// <summary>
/// 3.3.2.4 遇到幸运轮盘
/// </summary>
static void MeetLuckyCircle(bool isPlayerA)
{
//1.如果是地雷,则提示 要后退 6 格
string strPalyerMark = isPlayerA ? playerMark[0] : playerMark[1];
int num = ReadANum("啊~~【" + strPalyerMark + "】被幸运之神遭砸了~~,请选择一个愿望:1.轰炸对方,对方后退6格;2.乾坤大挪移,和对方交换位置:");
switch (num)
{
case 1://轰炸对方,对方后退6格
{
//如果是玩家A,那么 玩家B的位置后退6格
if (isPlayerA)
{
playerPosition[1] -= 6;
Console.WriteLine("您选择轰炸对方,玩家【B】将后退6格~!");
}
else//如果是玩家B,那么 玩家A的位置后退6格
{
playerPosition[0] -= 6;
Console.WriteLine("您选择轰炸对方,玩家【A】将后退6格~!");
}
break;
}
case 2://乾坤大挪移,和对方交换位置
{
//playerPosition[0] = playerPosition[0] + playerPosition[1];
//playerPosition[1] = playerPosition[0] - playerPosition[1];
//playerPosition[0] = playerPosition[0] - playerPosition[1]; int temp = playerPosition[0];
playerPosition[0] = playerPosition[1];
playerPosition[1] = temp; Console.WriteLine("您选择了乾坤大挪移,和对方交换位置~!");
break;
}
}
CheckPosition();
Console.ReadLine();
Console.Clear();
ShowLogo();
ShowMap();
}
#endregion #region 4.检查玩家位置,一旦出现越界,则设置临界值 void CheckPosition()
/// <summary>
/// 4.检查玩家位置,一旦出现越界,则设置临界值
/// </summary>
static void CheckPosition()
{
if (playerPosition[0] < 0) playerPosition[0] = 0;
if (playerPosition[1] < 0) playerPosition[1] = 0; if (playerPosition[0] > 99) playerPosition[0] = 99;
if (playerPosition[1] > 99) playerPosition[1] = 99;
}
#endregion //-----------------------工具方法-------------------------------
//------------------------------------------------------------- #region 0.0 读取一个非空字符串 string ReadString(string strMsg)
/// <summary>
/// 0.0 读取一个非空字符串
/// </summary>
/// <returns></returns>
static string ReadString(string strMsg)
{
string strMsgBack=""; while (true)
{
Console.Write(strMsg);
strMsgBack = Console.ReadLine().Trim();
if (string.IsNullOrEmpty(strMsgBack))
{
Console.WriteLine("您输入的字符串不能为空~~");
}
else
{
break;
}
}
return strMsgBack;//返回 接收到的 非空字符串
//Trim方法用来去掉 字符串两边的 空格 ,如:" aaa aaa " => "aaa aaa"
//string.IsNullOrEmpty 判断字符串是否为空,如果为空,则返回 true;否则返回 false
}
#endregion #region 0.0 读取一个数值 int ReadANum(string strMsg)
/// <summary>
/// 0.0 读取一个数值
/// </summary>
/// <returns></returns>
static int ReadANum(string strMsg)
{
int num = -1;
while (true)
{
string strMsgBack = ReadString(strMsg);
if (int.TryParse(strMsgBack, out num) && (num > 0 && num<3))
{
break;
}
else {
Console.WriteLine("请输入 1-2 之间的一个数值!");
}
}
return num;
}
#endregion
}
}

  

C#基础篇六飞行棋的更多相关文章

  1. Python基础篇(六)

    retun空值,后面的语句将不再被执行 >>> def test(): ...    print("just a test!") ...    return .. ...

  2. react基础篇六

    创建 Refs 使用 React.createRef() 创建 refs,通过 ref 属性来获得 React 元素.当构造组件时,refs 通常被赋值给实例的一个属性,这样你可以在组件中任意一处使用 ...

  3. Lua 学习之基础篇六<Lua IO 库>

    引言 I/O 库提供了两套不同风格的文件处理接口. 第一种风格使用隐式的文件句柄: 它提供设置默认输入文件及默认输出文件的操作, 所有的输入输出操作都针对这些默认文件. 第二种风格使用显式的文件句柄. ...

  4. Linux基础篇六:Linux文件属性和类型

    -:代表文件 s: sorket文件 b:block块设备 (磁盘,光驱等) c:字符设备 l:连接文件 p:管道文件 d:代表目录文件 为了更加区分- (文件的具体类型),系统提供了file命令更加 ...

  5. 基础篇六:Nginx编译配置参数

  6. C#基础:飞行棋游戏

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. 【转】WF4.0 (基础篇)

    转自:http://www.cnblogs.com/foundation/category/215023.html 作者:WXWinter  ——  兰竹菊梅★春夏秋冬☆ —— wxwinter@16 ...

  8. Python之路【第十六篇】:Django【基础篇】

    Python之路[第十六篇]:Django[基础篇]   Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...

  9. [C# 基础知识梳理系列]专题六:泛型基础篇——为什么引入泛型

    引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...

随机推荐

  1. C#-VS支持的语言

    其中C语言选C++

  2. ssh+注解开发 pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  3. SSM_CRUD新手练习(1)创建项目

    最近看了SSM框架,网上找了个入门视频的比较简单的小项目熟悉一下框架.现在把整个过程记录下来. 1.创建Maven工程,注意我们选择的是simple project就够了. 这样我们的Maven项目就 ...

  4. vscode 调试node.js

    在开发的过程中,几乎不可能一次性就能写出毫无破绽的程序,断点调试代码是一个普遍的需求. 作为前端开发工程师,以往我们开发的JavaScript程序都运行在浏览器端,利用Chrome提供的开发者工具就可 ...

  5. hdu 1541

    因为y的输入是从小到大,所以不用考虑y坐标的问题 只考虑x坐标就行 还有个小细节就是0<=x,y,<=32000  x和y取0的时候树状数组处理不到 x++就行了 #include < ...

  6. ASP.NET实现头像剪切保存

    利用swfupload上传头像,利用Jcrop来实现头像在线选择,然后提交个ashx对原头像进行剪切.代码如下: default.aspx: <%@ Page Language="C# ...

  7. hive 函数 current_date()

    current_date() 获取当天时间 select current_date() 结果是  实际操作中,这种写法只能获取日期是今天的数据,不适合数据重跑. 更合适的写法是 ,将日期作为外部参数传 ...

  8. Mysql 分区(range,list,hash)转载

    MySQL支持RANGE,LIST,HASH和KEY四种分区.其中,每个分区又都有一种特殊的类型.对于RANGE分区,有RANGE COLUMNS分区.对于LIST分区,有LIST COLUMNS分区 ...

  9. Swift3 页面顶部实现拉伸效果代码

    //懒加载 //顶部需要拉伸自定义视图 lazy var headView:MyHeaderView = { //let hframe = CGRect(x: 0, y: 0, width: swid ...

  10. Android-Kotlin-递归与尾递归

    递归: 阶乘计算: /** * 阶乘: * 1的阶乘是1,因为1往下走一个楼梯 就是0了 * 2的阶乘是 2*1 * 3的继承是 3*2*1 * 4的继承是 4*3*2*1 * 5的阶乘是 5*4*2 ...