using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace ConsoleApplication3
{
class Program
{
/*
* 再输组中用 1:表示幸运轮盘◎
* 2:地雷☆
* 3:暂停▲
* 4:时空隧道卐
* 0:普通
*/
static int[] Map = new int[100];//地图
static int[] playerPos = { 0, 0 };//playerPos[0]存玩家一的位置,playerPos[1]存玩家二的位置
static void Main(string[] args)
{
//r是产生随机数用的
Random r = new Random();
//用于存储产生的临时随机数
int step = 0;
ShowUI();
string[] names = new string[2];
bool []isStop = { false, false };//isStop[0]表示A上一次是否走到了暂停,isStop[1]表示B上一次是否走到了暂停,如果走到暂停则设置其值为True。
string msg = "";//用于存储用户到某关卡输出的话
Console.WriteLine("请输入玩家A的姓名");
names[0] = Console.ReadLine();
while (names[0] == "")
{
Console.WriteLine("输入的字符不能为空,请重新输入!");
names[0] = Console.ReadLine();
}
Console.WriteLine("请输入玩家B的姓名");
names[1] = Console.ReadLine();
while ((names[1] == "") || (names[1] == names[0]))
{
if (names[1] == "")
{
Console.WriteLine("输入的字符不能为空,请重新输入!");
names[1] = Console.ReadLine();
}
if (names[1] == names[0])
{
Console.WriteLine("不能与玩家A的名字相同,请重新输入!");
names[1] = Console.ReadLine();
}
}
Console.Clear();
ShowUI();
Console.WriteLine("战斗开始。。。。。。。。");
Console.WriteLine("{0}用A来表示", names[0]);
Console.WriteLine("{0}用B来表示", names[1]);
Console.WriteLine("如果AB在同一未知那么用<>表示");
InitialMap();//设置关卡
DrawMap();//绘制地图
Console.WriteLine("开始游戏。。。。。。");
//这个循环让玩家A和玩家B轮流掷骰子,当玩家A或者玩家B的坐标>=99时,则循环结束。
//循环条件就是两个玩家坐标都小于99
while((playerPos[0]<99)&&(playerPos[1]<99))
{
if (isStop[0] == false)
{
#region 玩家A掷骰子
Console.WriteLine("{0}按任意键掷骰子。。。。。", names[0]);
ConsoleKeyInfo rec = Console.ReadKey(true);
if (rec.Key == ConsoleKey.Tab)
{
step = 20;
}
else
{
step = r.Next(1, 7);
}
Console.WriteLine("{0}掷出了{1}", names[0], step);
Console.WriteLine("按任意键开始行动........");
Console.ReadKey(true);
playerPos[0] += step;//注意一旦坐标发生改变,就要判断坐标值是否>=99或<0。
CheckPos();//检测坐标是否越界
if (playerPos[0] == playerPos[1]) //玩家A踩到玩家B
{
playerPos[1] = 0; //玩家B退到原点
msg = string.Format("{0}踩到了{1},{1}退回远点", names[0], names[1]);
}
else
{//判断玩家A是否碰到有功能的关卡
switch (Map[playerPos[0]])
{
case 1:
//走到了幸运轮盘关卡
Console.Clear();
DrawMap();
Console.WriteLine("{0}走到了幸运轮盘,请选择运气", names[0]);
Console.WriteLine("1----交换位置 2----轰炸");
int userSelect = ReadInt(1, 2);
if (userSelect == 1)
{//交换AB的位置
int temp = playerPos[1];
playerPos[1] = playerPos[0];
playerPos[0] = temp;
msg = string.Format("{0}选择了和对方交换了位置", names[0]);
}
else
{
playerPos[1] = playerPos[1] - 6;
CheckPos();
msg = string.Format("{0}轰炸了{1},{1}退6步", names[0], names[1]);
}
break;
case 2:
//走到了地雷
playerPos[0] -= 6;
CheckPos();
msg = string.Format("{0}踩到了地雷退6步", names[0]);
break;
case 3:
//暂停一次
isStop[0] = true;
msg = string.Format("{0}走到红灯下次暂停一次", names[0]);
break;
case 4:
//时空隧道
playerPos[0] += 10;
CheckPos();
msg = string.Format("{0}进入了时空隧道前进10步", names[0]);
break;
default:
msg = "";
break;
}
}
Console.Clear();
DrawMap();
if (msg != "")
{
Console.WriteLine(msg);
}
Console.WriteLine("{0}掷骰子掷出了{1},行动完成!", names[0], step);
Console.WriteLine("****************玩家A和玩家B的位置如下****************");
Console.WriteLine("{0}的位置为:{1}", names[0], playerPos[0] + 1);
Console.WriteLine("{1}的位置为:{1}", names[1], playerPos[1] + 1);
Console.ReadKey();
#endregion
}
else
{
isStop[0] = false;
}
if (playerPos[0] >= 99)
{
break;
}
if (isStop[1] == false)
{
#region 玩家B掷骰子
Console.WriteLine("{0}按任意键掷骰子。。。。。", names[1]);
Console.ReadKey(true);
step = r.Next(1, 7);
Console.WriteLine("{0}掷出了{1}", names[1], step);
Console.WriteLine("按任意键开始行动........");
Console.ReadKey(true);
playerPos[1] += step;//注意一旦坐标发生改变,就要判断坐标值是否>=99或<0。
CheckPos();//检测坐标是否越界
if (playerPos[1] == playerPos[0]) //玩家B踩到玩家A
{
playerPos[0] = 0; //玩家A退到原点
msg = string.Format("{0}踩到了{1},{1}退回远点", names[1], names[0]);
}
else
{//判断玩家B是否碰到有功能的关卡
switch (Map[playerPos[1]])
{
case 1:
//走到了幸运轮盘关卡
Console.Clear();
DrawMap();
Console.WriteLine("{0}走到了幸运轮盘,请选择运气", names[1]);
Console.WriteLine("1----交换位置 2----轰炸");
int userSelect = ReadInt(1, 2);
if (userSelect == 1)
{//交换AB的位置
int temp = playerPos[1];
playerPos[1] = playerPos[0];
playerPos[0] = temp;
msg = string.Format("{0}选择了和对方交换了位置", names[1]);
}
else
{
playerPos[0] = playerPos[0] - 6;
CheckPos();
msg = string.Format("{0}轰炸了{1},{1}退6步", names[1], names[0]);
}
break;
case 2:
//走到了地雷
playerPos[1] -= 6;
CheckPos();
msg = string.Format("{0}踩到了地雷退6步", names[1]);
break;
case 3:
//暂停一次
isStop[1] = true;
msg = string.Format("{0}走到红灯下次暂停一次", names[1]);
break;
case 4:
//时空隧道
playerPos[1] += 10;
CheckPos();
msg = string.Format("{0}进入了时空隧道前进10步", names[0]);
break;
default:
msg = "";
break;
}
}
Console.Clear();
DrawMap();
if (msg != "")
{
Console.WriteLine(msg);
}
Console.WriteLine("{0}掷骰子掷出了{1},行动完成!", names[1], step);
Console.WriteLine("****************玩家A和玩家B的位置如下****************");
Console.WriteLine("{0}的位置为:{1}", names[0], playerPos[0] + 1);
Console.WriteLine("{1}的位置为:{1}", names[1], playerPos[1] + 1);
Console.ReadKey();
#endregion
}
else
{
isStop[1] = false;
}
}
//判断谁赢了
Console.Clear();
ShowUI();
if (playerPos[0] >= 99)
{
Console.WriteLine("{0}赢了!!!!!!!", names[0]);
}
else
{
Console.WriteLine("{0}赢了!!!!!!!", names[0]);
}
Console.ReadKey();
}
/// <summary>
/// 进行玩家A和玩家B的坐标越界的判断
/// </summary>
static void CheckPos()
{
for (int i = 0; i <= 1; i++)
{
if (playerPos[i] > 99)
{
playerPos[i] = 99;
}
if (playerPos[i] < 0)
{
playerPos[i] = 0;
}
}
}
/// <summary>
/// 用于显示飞行器名称
/// </summary>
static void ShowUI()
{
Console.WriteLine("**************************************************");
Console.WriteLine("* *");
Console.WriteLine("* 骑 士 飞 行 棋 *");
Console.WriteLine("* *");
Console.WriteLine("**************************************************");
}
/// <summary>
/// 对地图关卡初始化
/// </summary>
static void InitialMap()
{
for (int i = 0; i < Map.Length; i++)
{
Map[i] = 0;
}
int[] luckyTurn = { 6, 23, 40, 55, 69, 93 };//幸运轮盘
int[] lendMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//地雷
int[] pause = { 9, 27, 60, 93 };//暂停的坐标
int[] timeTunnel = { 20, 25, 45, 63, 72, 83, 90 };//时空隧道
for (int i = 0; i < luckyTurn.Length; i++)
{
int pos = luckyTurn[i];
Map[pos] = 1;
}
for (int i = 0; i < lendMine.Length; i++)
{
int pos = lendMine[i];
Map[pos] = 2;
}
for (int i = 0; i < pause.Length; i++)
{
int pos = pause[i];
Map[pos] = 3;
}
for (int i = 0; i < timeTunnel.Length; i++)
{
int pos = timeTunnel[i];
Map[pos] = 4;
}
}
/// <summary>
/// 获取pos坐标该绘制的图案
/// </summary>
/// <param name="pos">要绘制的坐标</param>
/// <returns></returns>
static string GetMapString(int pos)
{
//判断A和B是否在第一个要画的格上
string result = "";
if (playerPos[0] == pos && playerPos[1] == pos)
{
Console.ForegroundColor = ConsoleColor.Magenta;
result = "<>";
}
else if (playerPos[0] == pos) //A在当前格上
{
Console.ForegroundColor = ConsoleColor.Magenta;
result = "A";
}
else if (playerPos[1] == pos) //B在当前格上
{
Console.ForegroundColor = ConsoleColor.Magenta;
result = "B";
}
else
{
switch (Map[pos])
{
case 0:
Console.ForegroundColor = ConsoleColor.Red;
result = "□";
break;
case 1:
Console.ForegroundColor = ConsoleColor.Gray;
result = "◎";
break;
case 2:
Console.ForegroundColor = ConsoleColor.DarkGreen;
result = "☆";
break;
case 3:
Console.ForegroundColor = ConsoleColor.Cyan;
result = "▲";
break;
case 4:
Console.ForegroundColor = ConsoleColor.DarkMagenta;
result = "卐";
break;
}
}
return result;
}
/// <summary>
/// 绘画地图
/// </summary>
static void DrawMap()
{
//输出图例
Console.WriteLine("1:幸运轮盘◎ 2:地雷☆ 3:暂停▲ 4:时空隧道卐 ");
//画第一行
for (int i = 0; i <= 29; i++)
{
Console.Write(GetMapString(i));
}
//第一行绘制完毕
Console.WriteLine();
//绘制第一列
for (int i = 30; i <= 34; i++)
{
for (int j = 0; j < 29; j++)
{
Console.Write(" ");
}
Console.WriteLine(GetMapString(i));
}
//第一列绘制完毕
//画第二行
for (int i = 64; i >= 35; i--)
{
Console.Write(GetMapString(i));
}
//第二行绘制完毕
Console.WriteLine();
//绘制第二列
for (int i = 65; i <= 69; i++)
{
Console.WriteLine(GetMapString(i));
}
//第二列绘制完毕
//绘制第三行
for (int i = 70; i <= 99; i++)
{
Console.Write(GetMapString(i));
}
Console.WriteLine();
Console.ResetColor();
}
static int ReadInt()
{
int i=ReadInt(int.MinValue,int.MaxValue);
return i;
}
static int ReadInt(int min, int max)
{
while (true)
{
try
{
int number = Convert.ToInt32(Console.ReadLine());
if (number < min || number > max)
{
Console.WriteLine("只能输入{0}到{1}之间的数字,请重新输入:", min, max);
continue;
}
return number;
}
catch
{
Console.WriteLine("只能输入数字,请重新输入");
}
}
}
}
}
飞行棋控制台源码(仅作学习讨论)
最新推荐文章于 2021-05-27 14:35:37 发布