飞行棋业务:
我们要能够让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. (转)MVC语法-基础

    好久没有关注微软的开发了,今天看到了MVC3,顺便学习学习,我觉得Razor是个不错的做法,比使用<%%>简单多了,而且好看.首先“_”开头的cshtml文档将不能在服务器上访问,和asp ...

  2. 21069207《Linux内核原理与分析》第四周作业

    本周首先我结合mooc网的视频资料,了解了计算机的三大法宝,分别是存储程序计算机,函数调用堆栈和中断机制. 在计算机的三大法宝中,存储程序计算机是根本,函数调用堆栈是高级语言运行的基础,而中断机制成就 ...

  3. Lombok自定义annotation扩展含Intellij插件

    Lombok简介 Lombok(https://projectlombok.org/)  提供了以注解的形式为java对象增加属性和方法,这使得原来冗长的java源文件变的简洁(不需要再使用ide去生 ...

  4. javascript 减少全部变量

    方法1 自创建一个唯一的全局变量a,把自己用到的变量都加在a上 方法2:模块 String.method('test1', function(){ var a = '12'; return funct ...

  5. Maven的依赖管理

    我们知道dependencies是可以被继承的,这个时候我们就想到让我们的发生了共用的依赖元素转移到parent中,这样我们又进一步的优化了配置.可是问题也随之而来,如果有一天我创建了一个新的模块,但 ...

  6. gcc 6.0编译opencv出错

    在编译opencv3.2时候,出现下面错误: cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_NE ...

  7. .NET MVC 学习笔记(五)— Data Validation

    .NET MVC 学习笔记(五)—— Data Validation 在实际应用中,我们需要对数据进行增查改删业务,在添加和修改过程中,无论你编写什么样的网页程序,都需要对用户的数据进行验证,以确数据 ...

  8. MVC 5 Strongly Typed Views(强类型视图)

    学习MVC这样久以来,发觉网站上很多MVC的视频或是文章,均是使用Strongly Type views来实现控制器与视图的交互.Insus.NET以前发布的博文中,也大量使用这种方式: <Da ...

  9. javascript实现OOP编程

    1.首先通过一个函数来实现JS的单继承.使用原型方式来实现继承 (function () { $.extend({ oop: { extend: function (child, father) { ...

  10. 常用下载方式的区别-BT下载、磁力链接、电驴

    出处:https://www.jianshu.com/p/72b7a64e5be1 打开 115 离线下载的窗口,看到支持这么多种链接,你都清楚他们是什么原理嘛?接下来我们一个一个说. 一.HTTP( ...