using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace planeChessThree
{
class Program
{
/*
* 1. 2个玩家玩游戏, 改成3个玩家 ,玩游戏.
2. 原地图 随机4个转折点, 改成随机6个转折点.
要求: 横向4行,纵向3列, 要求4行一样长度!
* */
//logo
static void logo()
{
Console.WriteLine("*****************************************");
Console.WriteLine("** **");
Console.WriteLine("** 骑 士 飞 行 棋 **");
Console.WriteLine("** **");
Console.WriteLine("*****************************************");
}
//录入玩家名字
static string[] playName()
{
string[] players = new string[3];
Console.Write("请输入A玩家的名字:");
players[0] = Console.ReadLine();
//判断是否为空
while (players[0].Trim() == "")
{
Console.Write("输入不能为空,重新输入A:");
players[0] = Console.ReadLine();
}
Console.Write("请输入B玩家的名字:");
players[1] = Console.ReadLine();
while(true){
if (players[1].Trim() == "")
{
Console.Write("输入不能为空,重新输入B:");
players[1] = Console.ReadLine();
}
//AB玩家名字不能相同
else if (players[0].Trim() == players[1].Trim())
{
Console.Write("AB不能相同,重新输入B:");
players[1] = Console.ReadLine();
}
else
break;
}
Console.Write("请输入C玩家的名字:");
players[2] = Console.ReadLine();
while(true){
if (players[2].Trim() == "")
{
Console.Write("输入不能为空,重新输入C:");
players[2] = Console.ReadLine();
}
//AC玩家名字不能相同
else if (players[0].Trim() == players[2].Trim())
{
Console.Write("AC不能相同,重新输入C:");
players[2] = Console.ReadLine();
}
//BC玩家名字不能相同
else if (players[1].Trim() == players[2].Trim())
{
Console.Write("BC不能相同,重新输入C:");
players[2] = Console.ReadLine();
}
else
break;
}
players[0] = players[0].Trim();
players[1] = players[1].Trim();
players[2] = players[2].Trim();
return players;
}
//地图
static void map(int[] num, int[] countRan)
{
int i = 1;
Console.WriteLine("□:普通 ◎:幸运轮盘 ★:地雷 △:暂停 ※:时空隧道");
while (i <= countRan[0])
{
mapImage(i, num);
i++;
}
Console.WriteLine();
while (i <= countRan[1])
{
for (int j = 0; j < countRan[0] - 1; j++)
Console.Write(" ");
mapImage(i, num);
Console.WriteLine();
i++;
}
i = countRan[2];
while (i > countRan[1])
{
mapImage(i, num);
i--;
}
Console.WriteLine();
i = countRan[2] + 1;
while (i <= countRan[3])
{
mapImage(i, num);
Console.WriteLine();
i++;
}
while (i <= countRan[4])
{
mapImage(i, num);
i++;
}
Console.WriteLine();
while (i <= countRan[5])
{
for (int j = 0; j < countRan[0] - 1; j++)
Console.Write(" ");
mapImage(i, num);
Console.WriteLine();
i++;
}
i = countRan[5] + countRan[0];
while (i > countRan[5])
{
mapImage(i, num);
i--;
}
Console.WriteLine();
//由于最后一行最后一个格子颜色回影响下面的文字,设置字体颜色
Console.ForegroundColor = ConsoleColor.White;
}
//特殊符号处理
static void mapImage(int i, int[] num)
{
if ((num[0] == num[1] && num[0] == i) || (num[0] == num[2] && num[0] == i) || (num[1] == num[2] && num[1] == i))
{
Console.ForegroundColor = ConsoleColor.Gray;
Console.Write("<>");
}
else if (num[0] == i)
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("A");
}
else if (num[1] == i)
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("B");
}
else if (num[2] == i)
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("C");
}
else if (plays[i - 1] == 1)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.Write("★");
}
else if (plays[i - 1] == 2)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.Write("◎");
}
else if (plays[i - 1] == 3)
{
Console.ForegroundColor = ConsoleColor.Blue;
Console.Write("△");
}
else if (plays[i - 1] == 4)
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("※");
}
else
{
Console.ForegroundColor = ConsoleColor.White;
Console.Write("□");
}
}
//生成随机特殊符号
static void ranImage(int number,int index,int n,int[]countRan)
{
int count;
for (int i = 0; i < number; i++)
{
count = ran.Next(index, countRan[5] + countRan[0] - 1);
if (plays[count] == 0)
plays[count] = n;
}
}
static int[] plays;
static Random ran = new Random();
static void Main(string[] args)
{
//定义玩家名字数组
string[] players;
//定义玩家步数
int[] num = new int[] { 1, 1, 1 };
#region 生成随机拐点
int[] countRan = new int[6];
countRan[0] = ran.Next(15, 31);
countRan[1] = ran.Next(countRan[0] + 1, 36);
countRan[2] = countRan[0] + countRan[1];
countRan[3] = ran.Next(countRan[2] + 1, 71);
countRan[4] = countRan[3] + countRan[0];
countRan[5] = ran.Next(countRan[4] + 1, 106);
#endregion
//格子随总个数变换而变换
plays = new int[countRan[5] + countRan[0]];
#region 随机生成特殊符号
ranImage(15, 6, 1, countRan);//9:个数 6:从第6个之后随机 1:地雷
ranImage(10, 1, 2, countRan);//7:个数 1:从第6个之后随机 2:幸运轮盘
ranImage(40, 1, 3, countRan);//4:个数 1:从第6个之后随机 3:暂停
ranImage(7, 1, 4, countRan);//7:个数 1:从第6个之后随机 4:时空隧道
#endregion
#region clearOne
//调用logo
logo();
//获取玩家名字
players=playName();
Console.Clear();
#endregion
#region clearTwo
logo();
Console.WriteLine("对战开始......");
Console.WriteLine("{0}用A表示", players[0]);
Console.WriteLine("{0}用B表示", players[1]);
Console.WriteLine("{0}用C表示", players[2]);
Console.WriteLine("如果AB或AC或BC在同一个位置用<>表示");
Console.ReadLine();
Console.Clear();
#endregion
#region 打印地图
map(num, countRan);
#endregion
#region 掷骰子
//count:获取随机数
//temp:当遇到幸运转盘时,实现玩家位置交换功能
int isOne = 0, count, temp;
bool[] isTrue = new bool[] { true, true, true };
while (true)
{
Console.WriteLine("玩家{0},按任意键掷骰子......", players[isOne]);
Console.ReadKey(true);
count = ran.Next(1, 7);
Console.WriteLine("玩家{0}掷出了{1},按任意键行动......", players[isOne], count);
Console.ReadKey(true);
#region 终点判断
if (num[isOne] + count > plays.Length)
num[isOne] = 2 * plays.Length - num[isOne] - count;
else if (num[isOne] + count == plays.Length)
{
Console.Clear();
num[isOne] += count;
map(num, countRan);
Console.WriteLine();
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("玩家{0}获胜", players[isOne]);
break;
}
else
num[isOne] += count;
#endregion
Console.Clear();
#region 玩家步数重叠
//判断当前的玩家是否与其他玩家步数重叠
if (isOne == 0 && num[isOne] != 1)
{
if (num[isOne] == num[isOne + 1])
{
map(num, countRan);
Console.WriteLine("{0}踩到了{1},{1}退回原点", players[isOne], players[isOne + 1], players[isOne + 1]);
Console.WriteLine("按任意键继续......");
Console.ReadKey(true);
num[isOne + 1] = 1;
Console.Clear();
map(num, countRan);
}
else if (num[isOne] == num[isOne + 2])
{
map(num, countRan);
Console.WriteLine("{0}踩到了{1},{1}退回原点", players[isOne], players[isOne + 2], players[isOne + 2]);
Console.WriteLine("按任意键继续......");
Console.ReadKey(true);
num[isOne + 2] = 1;
Console.Clear();
map(num, countRan);
}
}
else if (isOne == 1 && num[isOne] != 1)
{
if (num[isOne] == num[isOne - 1])
{
map(num, countRan);
Console.WriteLine("{0}踩到了{1},{1}退回原点", players[isOne], players[isOne - 1], players[isOne - 1]);
Console.WriteLine("按任意键继续......");
Console.ReadKey(true);
num[isOne - 1] = 1;
Console.Clear();
map(num, countRan);
}
else if (num[isOne] == num[isOne + 1])
{
map(num, countRan);
Console.WriteLine("{0}踩到了{1},{1}退回原点", players[isOne], players[isOne + 1], players[isOne + 1]);
Console.WriteLine("按任意键继续......");
Console.ReadKey(true);
num[isOne + 1] = 1;
Console.Clear();
map(num, countRan);
}
}
else
{
if (num[isOne] == num[isOne - 1])
{
map(num, countRan);
Console.WriteLine("{0}踩到了{1},{1}退回原点", players[isOne], players[isOne - 1], players[isOne - 1]);
Console.WriteLine("按任意键继续......");
Console.ReadKey(true);
num[isOne - 1] = 1;
Console.Clear();
map(num, countRan);
}
else if (num[isOne] == num[isOne - 2])
{
map(num, countRan);
Console.WriteLine("{0}踩到了{1},{1}退回原点", players[isOne], players[isOne - 2], players[isOne - 2]);
Console.WriteLine("按任意键继续......");
Console.ReadKey(true);
num[isOne - 2] = 1;
Console.Clear();
map(num, countRan);
}
}
#endregion
Console.Clear();
#region 踩中地雷判断
if (plays[num[isOne] - 1] == 1)
{
map(num, countRan);
Console.WriteLine("玩家{0}踩中了地雷,后退6步", players[isOne]);
Console.ReadKey(true);
Console.Clear();
num[isOne] -= 6;
map(num, countRan);
}
#endregion
#region 踩到幸运转盘判定
else if (plays[num[isOne] - 1] == 2)
{
map(num, countRan);
Console.WriteLine("玩家{0}来到了幸运转盘,选择1:前进6步,选择2:交换位置", players[isOne]);
string choice = Console.ReadLine();
while (true)
{
if (choice.Trim() != "1" && choice.Trim() != "2")
{
Console.Write("输入错误,重新输入:");
choice = Console.ReadLine();
}
else if (choice.Trim() == "1")
{
Console.Clear();
#region 终点判断
if (num[isOne] + 6 > plays.Length)
num[isOne] = 2 * plays.Length - num[isOne] - 6;
else if (num[isOne] + 6 == plays.Length)
{
Console.Clear();
num[isOne] += count;
map(num, countRan);
Console.WriteLine();
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("玩家{0}获胜", players[isOne]);
break;
}
else
num[isOne] += 6;
#endregion
map(num, countRan);
break;
}
else
{
#region 交换功能
//temp:当遇到幸运转盘时,实现玩家位置交换功能
if (isOne == 0)
{
Console.WriteLine("选择1:和{0}交换位置,选择2:和{1}交换位置", players[isOne + 1], players[isOne + 2]);
choice = Console.ReadLine();
while (true)
{
if (choice.Trim() != "1" && choice.Trim() != "2")
{
Console.Write("输入错误,重新输入:");
choice = Console.ReadLine();
}
else if (choice.Trim() == "1")
{
temp = num[isOne];
num[isOne] = num[isOne + 1];
num[isOne + 1] = temp;
break;
}
else
{
temp = num[isOne];
num[isOne] = num[isOne + 2];
num[isOne + 2] = temp;
break;
}
}
}
else if (isOne == 1)
{
Console.WriteLine("选择1:和{0}交换位置,选择2:和{1}交换位置", players[isOne - 1], players[isOne + 1]);
choice = Console.ReadLine();
while (true)
{
if (choice.Trim() != "1" && choice.Trim() != "2")
{
Console.Write("输入错误,重新输入:");
choice = Console.ReadLine();
}
else if (choice.Trim() == "1")
{
temp = num[isOne];
num[isOne] = num[isOne - 1];
num[isOne - 1] = temp;
break;
}
else
{
temp = num[isOne];
num[isOne] = num[isOne + 1];
num[isOne + 1] = temp;
break;
}
}
}
else
{
Console.WriteLine("选择1:和{0}交换位置,选择2:和{1}交换位置", players[isOne - 2], players[isOne - 1]);
choice = Console.ReadLine();
while (true)
{
if (choice.Trim() != "1" && choice.Trim() != "2")
{
Console.Write("输入错误,重新输入:");
choice = Console.ReadLine();
}
else if (choice.Trim() == "1")
{
temp = num[isOne];
num[isOne] = num[isOne - 2];
num[isOne - 2] = temp;
break;
}
else
{
temp = num[isOne];
num[isOne] = num[isOne - 1];
num[isOne - 1] = temp;
break;
}
}
}
#endregion
Console.Clear();
map(num, countRan);
break;
}
}
Console.WriteLine("按任意键继续......");
Console.ReadKey(true);
}
#endregion
#region 踩到暂停判定
else if (plays[num[isOne] - 1] == 3)
{
Console.Clear();
map(num, countRan);
Console.WriteLine("玩家{0}暂停一局", players[isOne]);
isTrue[isOne] = false;
}
#endregion
#region 踩到时空隧道判定
else if (plays[num[isOne] - 1] == 4)
{
Console.Clear();
map(num, countRan);
Console.WriteLine("玩家{0}来到时空隧道,前进10步", players[isOne]);
Console.WriteLine("按任意键继续......");
Console.ReadKey(true);
Console.Clear();
#region 终点判断
if (num[isOne] + 10 > plays.Length)
{
num[isOne] = 2 * plays.Length - num[isOne] - 10;
map(num, countRan);
}
else if (num[isOne] + 10 == plays.Length)
{
num[isOne] += 10;
map(num, countRan);
Console.WriteLine();
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("玩家{0}获胜", players[isOne]);
break;
}
else
{
num[isOne] += 10;
map(num, countRan);
}
#endregion
}
else
map(num, countRan);
#endregion
isOne++;
if (isOne > 2)
isOne = 0;
//暂停
while (isTrue[isOne] == false)
{
isTrue[isOne] = true;
isOne++;
if (isOne > 2)
isOne = 0;
}
}
#endregion
Console.ReadLine();
}
}
}