在代码371行这边,代码封装后出现死循环,为黑屏状态,地图有的,但没有AB角色事件。感觉是传参int 0,1在传到嵌套方法下的问题。
谢谢解答
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _13飞行棋
{
class Program
{
//我们用静态字段模拟全局变量
public static int[] Maps = new int[100];
//声明一个静态数组来存储玩家A和B的坐标,0是A的坐标,1是B的坐标
static int[] PlayerPos = new int[2];
//存储两个玩家的姓名
static string[] PlayerNames = new string [2];
static void Main(string[] args)
{
GameShow();
InputPlayerName();
InitailMap();
DrawMap();
PlayerOperation();
}
#region 游戏开头图案
//打印星号
public static void GameShow_asterisk()
{
Console.WriteLine("***************************************");
}
//飞行棋开头
public static void GameShow()
{
Console.ForegroundColor = ConsoleColor.DarkCyan;
GameShow_asterisk();
Console.ForegroundColor = ConsoleColor.Red;
GameShow_asterisk();
Console.ForegroundColor = ConsoleColor.Gray;
Console.WriteLine("**********飞行棋-控制台版**************");
Console.ForegroundColor = ConsoleColor.Magenta;
GameShow_asterisk();
Console.ForegroundColor = ConsoleColor.DarkYellow;
GameShow_asterisk();
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine();
}
#endregion
#region 输入玩家信息
public static void InputPlayerName()
{
Console.WriteLine("请输入玩家A的姓名");
PlayerNames[0] = Console.ReadLine();
while(PlayerNames[0] == "")
{
Console.WriteLine("玩家A的姓名不能为空,请重新输入");
PlayerNames[0] = Console.ReadLine();
}
Console.WriteLine("请输入玩家B的姓名");
PlayerNames[1] = Console.ReadLine();
while (PlayerNames[1] == ""|| PlayerNames[1] == PlayerNames[0])
{
if (PlayerNames[1] == "")
{
Console.WriteLine("玩家B的姓名不能为空,请重新输入");
}
else if(PlayerNames[1] == PlayerNames[0])
{
Console.WriteLine("玩家A和B的姓名不能相同,请重新输入");
}
PlayerNames[1] = Console.ReadLine();
}
Console.Clear();
Console.WriteLine();
GameShow();
Console.WriteLine("{0}的棋子用A表示\n{1}的棋子用B表示\n", PlayerNames[0], PlayerNames[1]);
}
#endregion
#region 初始化地图
/// <summary>
/// 初始化地图
/// </summary>
/// <param name="Maps">静态地图</param>
public static void InitailMap()
{
int[] luckyturn = { 6, 23, 40, 55, 69, 83 };//抽奖◎,数组中下标为的6..这些数组存放的值都为1
for(int i=0;i<luckyturn.Length;i++)
{
int index = luckyturn[i];
Maps[index] = 1;
}
int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//地雷☆
for (int i = 0; i < landMine.Length; i++)//地雷☆,数组中下标为的5..这些数组存放的值都为2
{
int index = landMine[i];
Maps[index] = 2;
}
int[] pause = { 9, 27, 60, 93 };//暂停▲
for (int i = 0; i < pause.Length; i++)//暂停▲,数组中下标为的9..这些数组存放的值都为3
{
int index = pause[i];
Maps[index] = 3;
}
int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//快速通道卍
for (int i = 0; i < timeTunnel.Length; i++)//快速通道卍,数组中下标为的20..这些数组存放的值都为4
{
int index = timeTunnel[i];
Maps[index] = 4;
}
int[] end = { 99 };
for (int i = 0; i <end.Length; i++)//终点★,数组中下标为的99..这些数组存放的值都为5
{
int index = end[i];
Maps[index] = 5;
}
}
#endregion
#region 画地图
#region 画各种图形
/// <summary>
/// 用于打印字符串
/// </summary>
public static void Str(string str)
{
Console.Write(str);
}
/// <summary>
/// 画方块,地图的格子
/// </summary>
public static void Block()
{
Console.ForegroundColor = ConsoleColor.White;
Str("□");
Console.BackgroundColor = ConsoleColor.Black;
}
/// <summary>
/// 画圆圈,代表抽奖
/// </summary>
public static void Circle()
{
Console.ForegroundColor = ConsoleColor.Red;
Console.BackgroundColor = ConsoleColor.White;
Str("◎");
Console.BackgroundColor = ConsoleColor.Black;
}
/// <summary>
/// 画星号,代表地雷
/// </summary>
public static void Stars()
{
Console.ForegroundColor = ConsoleColor.DarkBlue;
Console.BackgroundColor = ConsoleColor.Yellow;
Str("☆");
Console.BackgroundColor = ConsoleColor.Black;
}
/// <summary>
/// 画三角形,代表暂停
/// </summary>
public static void Triangle()
{
Console.ForegroundColor = ConsoleColor.Gray;
Console.BackgroundColor = ConsoleColor.Red;
Str("▲");
Console.BackgroundColor = ConsoleColor.Black;
}
/// <summary>
/// 画卍字,代表快速通道
/// </summary>
public static void Thousandwords()
{
Console.ForegroundColor = ConsoleColor.Black;
Console.BackgroundColor = ConsoleColor.Magenta;
Str("卍");
Console.BackgroundColor = ConsoleColor.Black;
}
/// <summary>
/// 画¤,代表重合点
/// </summary>
public static void CoincidencePoint()
{
//玩家AB坐标相同的话,并都在地图上,显示为绿色¤
Console.ForegroundColor = ConsoleColor.Green;
Str("¤");
}
/// <summary>
/// 画★,代表终点
/// </summary>
public static void EndPoint()
{
Console.ForegroundColor = ConsoleColor.Black;
Console.BackgroundColor = ConsoleColor.Red;
Str("★");
Console.BackgroundColor = ConsoleColor.Black;
}
/// <summary>
/// 画字符A
/// </summary>
/// //shift+空格全角
public static void CharacterA()
{
Console.ForegroundColor = ConsoleColor.DarkCyan;
Str("A");
}
/// <summary>
/// 画字符B
/// </summary>
public static void CharacterB()
{
Console.ForegroundColor = ConsoleColor.DarkYellow;
Str("B");
}
#endregion
#region 逻辑判断,AB和图形符号
/// <summary>
/// 元素符号类型判断,判定AB坐标是否相同
/// </summary>
/// <param name="i">0-99号数组中的值</param>
public static void ABDetermineANDGraphicSymbolJudgment(int i)
{
if (PlayerPos[0] == PlayerPos[1] && PlayerPos[0] == i && PlayerPos[1] == i)
{
CoincidencePoint();
}
else if (PlayerPos[0] == i)
{
CharacterA();
}
else if (PlayerPos[1] == i)
{
CharacterB();
}
else
{
//如果不是AB或者重合点则进行进行多条件的判断
switch (Maps[i])
{
case 0:
Block();
break;
case 1:
Circle();
break;
case 2:
Stars();
break;
case 3:
Triangle();
break;
case 4:
Thousandwords();
break;
case 5:
EndPoint();
break;
}
}
}
#endregion
#region 画横竖行地图(画地图前,首先要求初始化)
/// <summary>
/// 画第一行横行
/// </summary>
public static void Rampant_1()
{
//第一横行
for (int i = 0; i < 30; i++)
{
ABDetermineANDGraphicSymbolJudgment(i);
}
//画完第一横行后,进行换行
Console.WriteLine();
}
/// <summary>
/// 画第一竖列
/// </summary>
public static void Column_1()
{
for(int i = 30;i < 35;i++)
{
for(int j = 0;j<=28;j++)
{
Console.Write(" ");
}
ABDetermineANDGraphicSymbolJudgment(i);
//画完第一竖列后,进行换行
Console.WriteLine();
}
}
/// <summary>
/// 画第二横行
/// </summary>
public static void Rampant_2()
{
for(int i =64;i>=35;i--)
{
ABDetermineANDGraphicSymbolJudgment(i);
}
//画完第二横行后,进行换行
Console.WriteLine();
}
/// <summary>
/// 画第二竖列
/// </summary>
public static void Column_2()
{
for(int i =65;i<=69;i++)
{
ABDetermineANDGraphicSymbolJudgment(i);
Console.WriteLine();
}
}
public static void Rampant_3()
{
for (int i = 70; i <= 99; i++)
{
ABDetermineANDGraphicSymbolJudgment(i);
}
//画完第三横行后,进行换行
Console.WriteLine("\n");
}
public static void DrawMap()
{
//添加图例
Console.WriteLine("图例:抽奖:◎\t地雷:☆\t暂停:▲\t快速通道:卍\n");
//第一横行
Rampant_1();
//第一竖列
Column_1();
//第二横行
Rampant_2();
//第二竖列
Column_2();
//第三横行
Rampant_3();
}
#endregion
#endregion
/// <summary>
/// 游戏运行
/// </summary>
public static void PlayerOperation()
{
//当玩家A和玩家B没有一个人在终点的时候,可以一直进行游戏
while (PlayerPos[0] <99 && PlayerPos[1] <99)
{
PlayGames(0);
PlayGames(1);
}
}
/// <summary>
/// 封装踩到格子的几种情况
/// </summary>
/// <param name="playerNumber"></param>
public static void PlayGames(int playerNumber)
{
//玩家A有可能踩到了玩家B,方块,轮盘,地雷,暂停,快速通道
if (PlayerPos[playerNumber] == PlayerPos[1 - playerNumber])
{
Console.WriteLine("玩家{0}踩到了玩家{1},玩家{1}退后6步", PlayerNames[playerNumber], PlayerNames[1 - playerNumber]);
PlayerPos[1] = PlayerPos[1 - playerNumber] - 6;
Console.ReadKey(true);
}
else//踩到了关卡
{
PlayerEvent(playerNumber);
}
Console.Clear();
DrawMap();
}
/// <summary>
/// AB踩到各类特殊事件的情形
/// </summary>
public static void PlayerEvent(int playerNumber)
{
//玩家的坐标
switch (Maps[PlayerPos[playerNumber]])// 0,1,2,3,4,5
{
case 0:Console.WriteLine("玩家{0}踩到了方块,无事发生", PlayerNames[playerNumber]);
Console.ReadKey(true);
break;
case 1:Console.WriteLine("玩家{0}进行抽奖◎,进行以下事件\n1.交换位置\t2.轰炸对方", PlayerNames[playerNumber]);
string input = Console.ReadLine();
while (true || input == "2")
{
if (input == "1")
{
Console.WriteLine("玩家{0}选择和玩家{1}交换位置", PlayerNames[playerNumber], PlayerNames[1- playerNumber]);
Console.ReadKey();
//交换玩家1和2的位置
int middle = 0;
middle = PlayerPos[playerNumber];
PlayerPos[playerNumber] = PlayerPos[1- playerNumber];
PlayerPos[1- playerNumber] = middle;
Console.WriteLine("交换完成!按任意键继续游戏!");
Console.ReadKey(true);
break;
}
else if (input == "2")
{
Console.WriteLine("玩家{0}选择轰炸{1},玩家{1}退4格", PlayerNames[playerNumber], PlayerNames[1- playerNumber]);
Console.ReadKey(true);
PlayerPos[1] = PlayerPos[1- playerNumber] - 4;
Console.WriteLine("玩家{0}退4格", PlayerNames[1- playerNumber]);
Console.ReadKey(true);
break;
}
else
{
Console.WriteLine("请重新输入,只能输入1或2进行以下事件\n1.交换位置\t2.轰炸对方");
input = Console.ReadLine();
}
}
break;
case 2: Console.WriteLine("玩家{0}踩到了地雷☆,玩家{0}退5格", PlayerNames[playerNumber]);
Console.ReadKey(true);
PlayerPos[playerNumber] = PlayerPos[playerNumber] - 5;
break;
case 3: Console.WriteLine("玩家{0}踩到了暂停▲,玩家{0}暂停一回合", PlayerNames[playerNumber]);
Console.ReadKey(true);
break;
case 4: Console.WriteLine("玩家{0}踩到了快速通道卍,玩家{0}暂停一回合", PlayerNames[playerNumber]);
Console.ReadKey(true);
PlayerPos[playerNumber] = PlayerPos[playerNumber] + 5;
break;
case 5: Console.WriteLine("玩家{0}通关了!!!!", PlayerNames[playerNumber]);
Console.ReadKey(true);
break;
}
}
/// <summary>
/// AB踩到常规的情形
/// </summary>
public static void PlayerAction(int playerNumber)
{
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("{0}按任意键开始掷骰子", PlayerNames[playerNumber]);
Console.ReadKey(true);
int r = RandomNumber();
Console.WriteLine("{0}得到了{1}点", PlayerNames[playerNumber], r);
PlayerPos[0] += r;
Console.ReadKey(true);
Console.WriteLine("{0}按任意键开始行动", PlayerNames[playerNumber]);
for (int i = 0; i < r; i++)
{
Console.WriteLine("往前走了一步");
}
Console.ReadKey(true);
Console.WriteLine("{0}行动完了", PlayerNames[playerNumber]);
}
/// <summary>
/// 取得随机数
/// </summary>
/// <returns>随机数1-6</returns>
public static int RandomNumber()
{
Random random = new Random();
return random.Next(1,6);
}
}
}