骑士飞行棋经典练习

前段时间用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]);
        }
    }
}

 

实现之后的效果如下:

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


继续进行中:



特点介绍:大量运用指针,结构等C语言的特色,使用OO思想编写代码. ------------------1.对战模式------------------ 1.本游戏用C语言实现,模仿大富翁4,与电脑玩家在地图上循环行走购买房屋,以一方金钱耗尽为结束 2.玩家在游戏开始时可以设置对战的难度,不同的难度初始金钱、点卷、电脑AI等都是不同的,详情请参看[难度说明] 3.在游戏过程中可以使用道具来限制对方发展或增强自己的发展,详情请参看[道具详解] 4.在地图中有许多特殊关卡,当行走到这些关卡上的时候会触发相应的事件,详情请参看[关卡详解] 5.由于开发过程比较仓促且对C语言的很多特性还不够了解,也许游戏中还有很多BUG,尽请见谅! ------------------2.难度说明------------------ 1.买和使用任何道具,不会进行股票交易,初始金钱为20万,初始点卷为100点 2.普通难度:电脑玩家会购买和使用除了核子飞弹以外的所有道具,每五轮会利用较少比例金钱进行股票交易,初始金钱为10万,初始点卷为50点 3.困难难度:电脑玩家会购买和使用所有道具,每三轮会利用较多比例金钱进行股票交易,初始金钱为5万,初始点卷为0点 ------------------3.道具详解------------------ 1.购地卡:需要点卷10点,如果玩家当前位置是对方的地,使用此卡则可以强行购买,并支付给对方2000元购地费 2.遥控骰子:需要点卷10点,使用后可以选择1-6步的行走步数 3.请神符:需要点卷10点,使用后会在以当前位置为中心,左右各3步的范围搜索最近的神灵,并让其附身 4.送神符:需要点卷8点,清楚当前附身的任何神灵附身状态 5.核子飞弹:需要点卷100点,选择轰炸目的地后,会摧毁以该位置为中心,左右各3步范围的房屋、关卡,并让此范围内的所有玩家暂停3回合 ------------------4.关卡详解------------------ 1.∷ 普通关卡:可任意行走的关卡 2.※ 暂停关卡:若玩家行走到该关卡上会暂停一回合 3.★ 地雷关卡:若玩家行走到该关卡上会暂停一回合,并将当前位置的房屋炸掉,成为空地 4.⊙ 幸运轮盘:若玩家行走到该关卡上可以选择与对方交换位置或轰炸对方(效果同 地雷关卡) 5.¥ 幸运点卷:随机获得5-20个点卷 6.〓 时空隧道:加走(1-6)步,效果与遥控骰子相同 7.@ 神秘商店:进入后可购买道具 8.X 小衰神:附身后立即随机损失500-1000金币,走到对方地盘加倍罚款,附身3回合 9.Z 大衰神:附身后立即随机损失1000-2000金币,走到对方地盘加倍罚款,无法购买房屋,附身5回合 10.◇ 小福神:附身后立即随机获得500-1000金币,走到对方地盘免费,附身3回合 11.◆ 大福神:附身后立即随机获得1000-2000金币,走到对方地盘免费,免费买地,附身5回合 12.◎ 空地:可以被玩家购买的地 13.① 玩家的地:玩家自己的地,电脑踩上后会支付玩家500元 14.② 电脑的地:电脑玩家的地,玩家踩上后会支付电脑500元 15.A 玩家位置:玩家当前位置坐标 16.B 电脑位置:电脑当前位置坐标 ------------------5.股票系统------------------ 1.玩家在游戏中可投资股票来提升自己的金钱 2.每种股票根据基价的不同会有不同的成长率 3.每开始一轮新回合,所有股票的价值都会随机变化 4.股票的状态:上涨(状态用\"↑\"表示),下跌(状态用\"↓\"表示),涨停(状态用\"▲\"表示),跌停(状态用\"▼\"表示)") 5.任何股票连续两轮上涨会进入涨停状态,处于涨停状态的股票不能买入 6.任何股票连续两轮下跌会进入跌停状态,处于跌停状态的股票不能卖出 7.可以通过观察股票价格曲线图来帮助判断该股价格的走向,该曲线图描述的是近30个回合的股票价格走向
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值