[置顶] 骑士飞行棋经典练习

前段时间用C#写了一个骑士飞行棋的练习,现在想起了把他贴出来,用来练习基础知识非常好,如果需要完整的项目源码可以到这来去下载:完整项目代码下载

先来看看游戏规则: 

图例说明:
        幸运轮盘:◎ 地雷:☆ 暂停:▲ 时空隧道:卐 普通:□
        玩家“张三”和“李四”的士兵分别用“ Α 和 Β ”来标识
        如果Α与Β在同一个位置上时,那我们用“<>”来标识!
        ///1踩到幸运轮盘◎:可请选择下面两项进行操作【1】:交换位置 【2】:进行轰炸(对方回退6步)
        ///2踩到地雷☆ 将会被打回起点!按任意键撤回
        ///3踩到暂停▲ 对方可以进行连续走两次
        ///4踩到时空隧道卐 前进10步     
       谁先到达终点谁去的最后的胜利。


具体的实现代码如下

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

namespace chess 
{
    class Chess 
    {
        /// <summary>
        /// 存储玩家姓名
        /// </summary>
        private static String[] name = new String[2];      
               
        /// <summary>
        /// 在数组map中 
        ///1标识幸运轮盘◎ 
        ///2标识地雷☆ 
        ///3标识暂停▲ 
        ///4标识时空隧道卐 
        ///0标识普通□   
        /// </summary> 
        private static int[] map = new int[100];
        /// <summary>
        /// 存储玩家士兵在地铁上的位置
        /// </summary>
        private static int[] ab_pos = { 0, 0 };
        /// <summary>
        /// 初始化一个全局的随机产生器
        /// </summary>
        private static Random random = new Random();

        public Chess()
        {
            showUI();
            Console.WriteLine("请输入玩家Α的姓名");
            setName(out name[0],0);
            Console.WriteLine("请输入玩家Β的姓名");
            setName(out name[1],1);

            Console.Clear();
            showUI();
            drawMap();

            Console.WriteLine("开始游戏......");
            while (true)
            {
                Boolean isWin;

                action(0, out isWin);
                if (isWin)
                {
                    Console.WriteLine("\n恭喜玩家 {0} 取得胜利!", name[0]);
                    break;
                }
                action(1, out isWin);
                if (isWin)
                {
                    Console.WriteLine("\n恭喜玩家 {0} 取得胜利!", name[1]);
                    break;
                }
            }
        }

        /// <summary>
        /// 显示初始UI
        /// </summary>
        private void showUI()
        {
            Console.ForegroundColor = ConsoleColor.DarkRed;
            Console.WriteLine("************************************************************");
            Console.WriteLine("*                                                          *");
            Console.WriteLine("*                  骑   士   飞   行   棋                  *");
            Console.WriteLine("*                                                          *");
            Console.WriteLine("************************************************************");
            Console.ResetColor();
        }

        /// <summary>
        /// 用于设置玩家姓名
        /// </summary>
        /// <param name="iName"></param>
        /// <param name="i"></param>
        private void setName(out String iName,int i)
        {
            while (true)
            {
                iName = Console.ReadLine();  //输入玩家A的姓名
                if (i == 1)
                {
                    if (iName.Equals(name[0]))
                    {
                        Console.WriteLine("玩家Α和Β的姓名不能相同,请在重新输入!");
                        continue;   //继续输入
                    }
                }
                if (iName == null || iName.Equals(""))
                {
                    Console.WriteLine("玩家姓名不能为空,请在重新输入!");
                    continue;   //继续输入
                }
                else
                {
                    break;      //输入合理,退出循环
                }
            } 
        }
        /// <summary>
        /// 游戏说明
        /// </summary>
        private void introduce()
        {
            Console.WriteLine("\n图例说明:");
            Console.Write("\t幸运轮盘:");
            Console.ForegroundColor = ConsoleColor.Red; Console.Write("◎");
            Console.ResetColor();
            Console.Write(" 地雷:");
            Console.ForegroundColor = ConsoleColor.Blue; Console.Write("☆");
            Console.ResetColor();
            Console.Write(" 暂停:");
            Console.ForegroundColor = ConsoleColor.Green; Console.Write("▲");
            Console.ResetColor();
            Console.Write(" 时空隧道:");
            Console.ForegroundColor = ConsoleColor.Yellow; Console.Write("卐");
            Console.ResetColor();
            Console.Write(" 普通:");
            Console.ForegroundColor = ConsoleColor.Gray; Console.WriteLine("□ ");
            Console.ResetColor();

            Console.Write("\t玩家“{0}”和“{1}”的士兵分别用“", name[0], name[1]);
            Console.ForegroundColor = ConsoleColor.DarkRed;
            Console.Write(" Α ");
            Console.ResetColor();
            Console.Write("和");
            Console.ForegroundColor = ConsoleColor.DarkRed;
            Console.Write(" Β ");
            Console.ResetColor();
            Console.WriteLine("”来标识!");

            Console.Write("\t如果Α与Β在同一个位置上时,那我们用“");
            Console.ForegroundColor = ConsoleColor.Magenta;
            Console.Write("<>");
            Console.ResetColor();
            Console.WriteLine("”来标识!");
            Console.WriteLine();
        }

        /// <summary>
        /// 初始化参数设置
        /// </summary>
        private void intializeMapParams()
        {
            //用于存储在地图中的下标
            int[] luckTurn = { 6, 23, 40, 55, 69, 83 };//幸运轮盘
            int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//地雷 
            int[] pause = { 9, 27, 60, 93 };//暂停
            int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//时空隧道
            //幸运轮盘
            for (int i = 0; i < luckTurn.Length; i++)
            {
                int pos = luckTurn[i];
                map[pos] = 1;
            }
            //地雷 
            for (int i = 0; i < landMine.Length; i++)
            {
                int pos = landMine[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;
            } 
        }

        private void action(int i,out Boolean flag)
        {
            int step = 0;
            Boolean isChange = false;
            Console.WriteLine("{0}请按任意键投掷骰子......", name[i]);
            Console.ReadKey();
            step = random.Next(1, 6);
            Console.Write("{0}投掷出了 {1} 点,", name[i], step);
            Console.WriteLine("按任意键开始行动!");
            Console.ReadKey();
            ab_pos[i] += step; //修改玩家的位置

            if (ab_pos[i] >= 0 && ab_pos[i] < 99)
            {
                if (map[ab_pos[i]] != 0)
                {
                    Console.Clear();
                    showUI();
                    drawMap();
                }

                switch (map[ab_pos[i]])
                {
                    case 1:
                        {
                            Console.WriteLine("恭喜“{0}”捡到一个幸运轮盘!请选择下面两项进行操作!",name[i]);
                            Console.WriteLine("\t【1】:交换位置\t【2】:进行轰炸");
                            int intSelect = 0;
                            while (true)
                            {
                                try
                                {
                                    Console.Write("请选择:");
                                    intSelect = Convert.ToInt32(Console.ReadLine());    //进行选择
                                    if (intSelect > 2 || intSelect < 0)
                                    {
                                        Console.WriteLine("选择有误,请重新输入!");
                                        continue;
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                                catch
                                {
                                    Console.WriteLine("选择有误,请重新输入!");
                                    continue;
                                }
                            }
                            if (intSelect == 1)
                            {
                                isChange = true;
                                {//进行交换
                                    int temp = 0;
                                    temp = ab_pos[0];
                                    ab_pos[0] = ab_pos[1];
                                    ab_pos[1] = temp;
                                }
                                Console.WriteLine("您选择的是交换位置,按任意键进行交换!");
                                Console.ReadKey();
                            }
                            else
                            {
                                {//先得到对方的下标
                                    if (i == 0)
                                    {
                                        i = 1;
                                    }
                                    else
                                    {
                                        i = 0;
                                    }
                                }
                                if (ab_pos[i] >= 6)//对方的位置够六步就后退六步
                                {
                                    step = -6;
                                }
                                else//不够六步,则则回到起点
                                {
                                    step = -ab_pos[i];
                                }

                                ab_pos[i] += step;
                                Console.WriteLine("您选择对对方进行轰炸,对方将会被打退{0}步,按任意键开炮!", -step);
                                Console.ReadKey();
                            } 
                            break;
                        }
                    case 2:
                        {
                            step = -ab_pos[i];
                            ab_pos[i] += step;
                            Console.WriteLine("很不幸,{0}踩到了地雷将会被打回起点!按任意键撤回!",name[i]);
                            Console.ReadKey();

                            break;
                        }
                    case 3:
                        {
                            Console.WriteLine("不好意思,您可能违规被暂停了一次!");
                            {//先得到对方的下标
                                if (i == 0)
                                {
                                    i = 1;
                                }
                                else
                                {
                                    i = 0;
                                }
                            }
                            Console.WriteLine("现在“{0}”可以连续掷两次!按任意键开始!",name[i]);
                            Console.ReadKey();
                            action(i, out flag);
                            break;
                        }
                    case 4:
                        {
                            step = 10;
                            ab_pos[i] += step;
                            Console.WriteLine("[0]进入了时空隧道,按任意键可以前进10步哦!",name[i]);
                            Console.ReadKey();
                            break;
                        } 
                    case 0:
                        break;
                }

                flag = false;
            }
            else
            {
                if (ab_pos[i] >= 99)
                {
                    ab_pos[i] = 99;
                    flag = true;
                }
                else
                {
                    ab_pos[i] = 0;
                    flag = false;
                }
            }

            Console.Clear();
            showUI();
            drawMap();

            if (step >= 0&&!isChange)
            {
                Console.WriteLine("玩家“{0}”前进了‘{1}’步,行动已完成!", name[i], step);
            }
            else if (step < 0 && !isChange)
            {
                Console.WriteLine("玩家“{0}”后退了‘{1}’步,行动已完成!", name[i], -step);
            }
            else if(isChange)
            {
                Console.WriteLine("玩家“{0}”和“{1}”的士兵在位置上进行了交换,行动已完成!", name[0], name[1]);
            }
        }

        private String getStringMap(int pos)
        {
            String result = null;
            if (ab_pos[0] == pos && ab_pos[1] == pos)
            {  //A与B的位置重复了  
                Console.ForegroundColor = ConsoleColor.DarkYellow;
                result = "<>";
            }
            else
            {
                Console.ForegroundColor = ConsoleColor.DarkRed;
                if (ab_pos[0] == pos)
                {   //如果是玩家A  
                    result = "Α";
                }
                else if (ab_pos[1] == pos)
                {    //如果是玩家B 
                    result = "Β";
                }
                else
                {
                    switch (map[pos])
                    {
                        case 1:
                            Console.ForegroundColor = ConsoleColor.Red;
                            result = "◎";
                            break;
                        case 2:
                            Console.ForegroundColor = ConsoleColor.Blue;
                            result = "☆";
                            break;
                        case 3:
                            Console.ForegroundColor = ConsoleColor.Green;
                            result = "▲";
                            break;
                        case 4:
                            Console.ForegroundColor = ConsoleColor.Yellow;
                            result = "卐";
                            break;
                        case 0:
                            Console.ForegroundColor = ConsoleColor.Gray;
                            result = "□";
                            break;
                    }
                }
            }
            return result;
        }

        /// <summary>
        /// 绘制地图
        /// </summary>
        private void drawMap()
        {
            introduce(); 
            intializeMapParams();
            
            //显示第一行0-29
            for (int i = 0; i <= 29; i++)
            {
                Console.Write(getStringMap(i));
                if (i == 29)
                {
                    Console.WriteLine();
                } 
            }
            
            //显示第一列
            for (int i = 30; i <= 34; i++)
            {
                for (int j = 0; j < 29; j++)
                {
                    Console.Write("  ");
                }
                Console.WriteLine(getStringMap(i));
            }

            //显示第二行
            for (int i = 64; i >= 35; i--)
            {
                Console.Write(getStringMap(i));
                if (i == 35)
                {
                    Console.WriteLine();
                }
            }
            
            //显示第二列
            for (int i = 65; i <= 69; i++)
            {
                Console.WriteLine(getStringMap(i));
            }

            //显示第三行
            for (int i = 70; i <= 99; i++)
            {
                Console.Write(getStringMap(i));
                if (i == 99)
                {
                    Console.WriteLine();
                }
            }

            Console.ResetColor();
            Console.WriteLine();//换行
             
            Console.WriteLine("******************玩家的当前位置分别如下********************");
            Console.WriteLine("玩家{0}的位置为:{1}", name[0], ab_pos[0]);
            Console.WriteLine("玩家{0}的位置为:{1}", name[1], ab_pos[1]);
        }
    }
}

 

实现之后的效果如下:

[置顶] 骑士飞行棋经典练习_第1张图片

设置好两个玩家之后,按任意键继续:

[置顶] 骑士飞行棋经典练习_第2张图片

继续进行中:

[置顶] 骑士飞行棋经典练习_第3张图片


你可能感兴趣的:([置顶] 骑士飞行棋经典练习)