C# 控制台 骑士飞行棋

using System;
using System.Collections.Generic;
using System.Text;

namespace 飞行棋
{
    class Program
    {
        static string[] username = new string[2];   //存储玩家姓名
        static int[] map = new int[100];  //存储地图
        static int[] playerpos ={ 0, 0 };
        static bool[] isRight ={ true, true };
        static Random r = new Random();
        static int step = 0;
        static string msg = "";
        static void Main(string[] args)
        {
            ShowUI();   //方法:显示游戏LOGO
            UserName();
            Console.Clear();    //清屏
            GameState();
            SetBar();   //设置地雷、暂停....在地图中的坐标
            DrawMap();
            Console.WriteLine("按任意键开始游戏........");
            Console.ReadKey(true);  //不将用户的按键显示在屏幕上
            Throw();


        }

        #region 方法
        /// <summary>
        /// 显示游戏LOGO
        /// </summary>
        public static void ShowUI()
        {
            Console.WriteLine("********************************************************************");
            Console.WriteLine("*                                                                  *");
            Console.WriteLine("*                          飞   行   棋                            *");
            Console.WriteLine("*                                                                  *");
            Console.WriteLine("********************************************************************");
        }

        /// <summary>
        /// 玩家姓名
        /// </summary>
        public static void UserName()
        {
            for (int i = 0; i < username.Length; i++)
            {
                while (true)
                {
                    Console.WriteLine("请输入第{0}个玩家的姓名?", i + 1);
                    username[i] = Console.ReadLine();
                    if (i == 0)
                    {
                        if (username[i] == "")
                        {
                            Console.WriteLine("玩家姓名不能为空,请重新输入!");
                            continue;   //当姓名为空时,执行当前while循环
                        }
                        break;  //当姓名不为空时,跳出当前while循环执行for循环
                    }
                    else
                    {
                        if (username[i] == "" || username[i] == username[0])
                        {
                            Console.WriteLine("玩家姓名不能为空或重复,请重新输入!");
                            continue;
                        }
                        break;
                    }
                }

            }
        }

        /// <summary>
        /// 游戏说明
        /// </summary>
        public static void GameState()
        {
            Console.WriteLine("游戏说明:");
            Console.WriteLine("\t1、{0}:A表示   {1}:B表示", username[0], username[1]);
            Console.WriteLine("\t2、当A和B同时在同一位置时用<>表示");
        }

        /// <summary>
        /// 设置地雷、暂停....在地图中的坐标
        /// </summary>
        public static void SetBar()
        {
            int[] mine ={ 5, 12, 19, 25, 34, 48, 56, 63, 69, 74, 80, 94 };  //地雷
            int[] stop ={ 9, 13, 24, 36, 40, 55, 68, 93 };  //暂停
            int[] luck ={ 10, 29, 33, 46, 58, 70 }; //幸运轮盘
            int[] time ={ 44, 65, 89, 50, 77 }; //幸运轮盘

            //设置地雷在地图中的坐标
            for (int i = 0; i < mine.Length; i++)
            {
                map[mine[i]] = 1;
            }

            for (int i = 0; i < stop.Length; i++)
            {
                map[stop[i]] = 2;
            }

            for (int i = 0; i < luck.Length; i++)
            {
                map[luck[i]] = 3;
            }

            for (int i = 0; i < time.Length; i++)
            {
                map[time[i]] = 4;
            }
        }

        /// <summary>
        /// 初始化地图
        /// </summary>
        public static void DrawMap()
        {
            Console.WriteLine("图例:〓  地雷   ◆  暂停   ⊙  幸运轮盘   ※  时空隧道");
            for (int i = 0; i <= 29; i++)
            {
                Console.Write(ReturnIco(i));
            }
            Console.WriteLine();
            for (int i = 30; i <= 34; i++)
            {
                Console.WriteLine("                                                          " + ReturnIco(i));
            }
            for (int i = 64; i >= 35; i--)
            {
                Console.Write(ReturnIco(i));
            }
            Console.WriteLine();
            for (int i = 65; i <= 69; i++)
            {
                Console.WriteLine(ReturnIco(i));
            }
            for (int i = 70; i <= 99; i++)
            {
                Console.Write(ReturnIco(i));
            }
            Console.WriteLine();
        }

        /// <summary>
        /// 判断地图当前坐标的图形
        /// </summary>
        /// <param name="i"></param>
        /// <returns>带颜色的图形</returns>
        public static string ReturnIco(int i)
        {
            Console.ForegroundColor = ConsoleColor.Gray;    //初始化为默认颜色
            string result = "";
            if (i == playerpos[0] && i == playerpos[1])
            {
                result = "<>";
            }
            else if (i == playerpos[0])
            {
                result = "A";
            }
            else if (i == playerpos[1])
            {
                result = "B";
            }
            else
            {
                switch (map[i])
                {
                    case 0:
                        result = "□";
                        break;
                    case 1:
                        Console.ForegroundColor = ConsoleColor.Cyan;    //图标颜色
                        result = "〓";
                        break;
                    case 2:
                        Console.ForegroundColor = ConsoleColor.Red;
                        result = "◆";
                        break;
                    case 3:
                        Console.ForegroundColor = ConsoleColor.DarkYellow;
                        result = "⊙";
                        break;
                    case 4:
                        Console.ForegroundColor = ConsoleColor.White;
                        result = "※";
                        break;
                }
            }
            return result;
        }

        /// <summary>
        /// 掷骰子
        /// </summary>
        public static void Throw()
        {

            while (playerpos[0] < 99 && playerpos[1] < 99)
            {
                //根据标志位判断是否暂停
                if (isRight[0] == true)
                {
                    Action(0);
                }
                else
                {
                    isRight[0] = true;
                }

                //当玩家A坐标大于等于99时,跳出循环!游戏结束
                if (playerpos[0] >= 99)
                {
                    break;
                }
                if (isRight[1] == true)
                {
                    Action(1);
                }
                else
                {
                    isRight[1] = true;
                }
            }
            Console.Clear();
            if (playerpos[0] >= 99)
            {
                GameOver(0);
            }
            else
            {
                GameOver(1);
            }
            Console.ReadKey();

        }

        /// <summary>
        /// 坐标越界判断
        /// </summary>
        public static void CrossBorder()
        {
            for (int i = 0; i < playerpos.Length; i++)
            {
                if (playerpos[i] >= 99)
                {
                    playerpos[i] = 99;
                }
                else if (playerpos[i] <= 0)
                {
                    playerpos[i] = 0;
                }

            }
        }

        /// <summary>
        /// 当用户走到幸运轮盘时选择运气
        /// </summary>
        /// <param name="min">最小值</param>
        /// <param name="max">最大值</param>
        /// <returns>输入的值</returns>
        public static int ReadInt(int min, int max)
        {
            int numselect;
            while (true)
            {
                try
                {
                    numselect = Convert.ToInt16(Console.ReadLine());
                    if (numselect == 1 || numselect == 2)
                    {
                        break;
                    }
                    else
                    {
                        Console.WriteLine("只能输入1或,请重新输入!");
                        continue;
                    }

                }
                catch
                {
                    Console.WriteLine("只能输入数字1或2,请重新输入");
                    continue;
                }
            }
            return numselect;
        }

        /// <summary>
        /// 游戏结束
        /// </summary>
        /// <param name="x">玩家姓名</param>
        public static void GameOver(int x)
        {
            Console.WriteLine("********************************************************************");
            Console.WriteLine("*                      {0}  赢  得  胜  利                           *",username[x]);
            Console.WriteLine("*                                                                  *");
            Console.WriteLine("*                                                                  *");
            Console.WriteLine("*                        Game        Over                          *");
            Console.WriteLine("********************************************************************");
        }

        /// <summary>
        /// 掷骰子过程
        /// </summary>
        public static void Action(int playnumber)
        {
            #region
            Console.WriteLine("\"{0}\"按任意键掷骰子.......", username[playnumber]);
            //Console.ReadKey(true);
            //当用户按TAB键时,开启后门
            ConsoleKeyInfo key = Console.ReadKey(true);
            if (key.Key == ConsoleKey.Tab)
            {
                step = 50;
            }
            else
            {
                step = r.Next(1, 7);
            }
            Console.WriteLine("\"{0}\"掷出{1}", username[playnumber], step);
            Console.WriteLine("******************按任意键开始行动******************");
            Console.ReadKey(true);
            playerpos[playnumber] = playerpos[playnumber] + step;
            CrossBorder();
            if (playerpos[playnumber] == playerpos[1 - playnumber])
            {
                playerpos[1 - playnumber] = 0;
                msg = string.Format("{0}踩到了{1},{1}回到起点!", username[playnumber], username[1-playnumber]);
            }
            else
            {
                switch (map[playerpos[playnumber]])
                {
                    case 0:
                        msg = "";
                        break;
                    case 1:
                        playerpos[playnumber] = playerpos[playnumber] - 6;
                        CrossBorder();
                        msg = string.Format("\"{0}\"踩到\"地雷\"退六格", username[playnumber]);
                        break;
                    case 2:
                        Console.WriteLine("\"{0}\"踩到\"暂停\",暂停一次", username[playnumber]);
                        isRight[playnumber] = false;
                        msg = string.Format("\"{0}\"踩到\"暂停\",暂停一次", username[playnumber]);
                        break;
                    case 3:
                        Console.WriteLine("\"{0}\"踩到幸运轮盘,请选择运气", username[playnumber]);
                        Console.WriteLine("1、  轰炸对方    2、  交换位置");
                        if (ReadInt(1, 2) == 1)
                        {
                            playerpos[1-playnumber] = playerpos[1-playnumber] - 6;
                            CrossBorder();
                            msg = string.Format("\"{0}\"选择轰炸对方,{1}退六格", username[playnumber], username[1 - playnumber]);
                        }
                        else
                        {
                            int temp = playerpos[playnumber];
                            playerpos[playnumber] = playerpos[1 - playnumber];
                            playerpos[1 - playnumber] = temp;
                            CrossBorder();
                            msg = string.Format("\"{0}\"选择了交换位置,\"乾坤大挪移\".......打完收功!", username[playnumber]);
                        }
                        break;
                    case 4:
                        playerpos[playnumber] = playerpos[playnumber] + 10;
                        CrossBorder();
                        msg = string.Format("\"{0}\"掉入\"时空隧道\"飞跃十格", username[playnumber]);
                        break;
                }
            }
            Console.Clear();
            DrawMap();
            if (msg != "")
            {
                Console.WriteLine(msg);
            }
            Console.WriteLine("******************行  动  完  成******************");
            Console.WriteLine("{0}目前在地图{1}方位", username[0], playerpos[0]);
            Console.WriteLine("{0}目前在地图{1}方位", username[1], playerpos[1]);
            #endregion 
        }
        #endregion
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值