在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → C# 飞行棋 游戏示例代码

C# 飞行棋 游戏示例代码

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:0.09M
  • 下载次数:20
  • 浏览次数:371
  • 发布时间:2016-06-18
  • 实例类别:C#语言基础
  • 发 布 人:13452441900
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 娱乐

实例介绍

【实例简介】

【实例截图】

【核心代码】

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

namespace 飞行棋
{
    class Program
    {
        //数组的下标为0的元素对应地图上的第1格,下标为1的元素对应第2格…下标为n的元素对应第n 1格 

        /// <summary> 
        /// Map数组用来存放地图的格数 
        /// </summary> 
        private static int[] Map = new int[100];

        /// <summary> 
        /// playerPos数组存放玩家的坐标 
        /// </summary> 
        private static int[] playerPos;

        /// <summary> 
        /// playerIco数组用来存放玩家的标识字符(不能小于玩家人数) 
        /// </summary> 
        private static string[] playerIco = { "A", "B", "C", "D" };

        /// <summary> 
        /// playerNum变量用来存放玩家的人数 
        /// </summary> 
        private static int playerNum = 0;

        private static void Main(string[] args)
        {
            Random r = new Random();    //产生一个随机数 
            int step = 0;   //用于存放临时产生的随机数 

            string msg = "";    //设置msg变量用来接收玩家掷骰子后的信息 

            bool win = false;   //设置win变量来存放是否有玩家获胜 

            ShowUI();

            playerNum = PlayerNum();    //调用PlayerNum()方法获得用户输入的人数 

            playerPos = new int[playerNum];     //根据玩家人数产生初始坐标 

            string[] name = PlayerName(playerNum);  //调用PlayerName()方法得到每一个玩家的昵称 

            bool[] isStop = new bool[playerNum];  //根据玩家人数产生一个数组,存放玩家是否处于暂停状态 

            Console.Clear();

            ShowUI();

            //初始化地图数据 
            InitialMap();

            //绘制地图 
            DrawMap();

            Console.WriteLine("开始游戏……");

            while (win == false)    //判断是否有人胜出 
            {
                for (int i = 0; i < playerNum; i  )     //根据玩家人数循环游戏 
                {
                    if (isStop[i] == true)      //当前玩家是否暂停一次 
                    {
                        isStop[i] = false;      //恢复暂停标记为未暂停 
                        Console.WriteLine("{0}暂停一次!", name[i]);
                        Console.WriteLine("*****************************");
                        continue;  //当前玩家暂停一次,继续循环 
                    }
                    else
                    {
                        Console.WriteLine("{0}按任意键开始掷骰子……", name[i]);

                        //取得用户按下的键 
                        ConsoleKeyInfo rec = Console.ReadKey(true);    //Console.ReadKey(true)不显示用户按下的键 

                        //作弊键 
                        if (rec.Key == ConsoleKey.F12 && rec.Modifiers == ConsoleModifiers.Control)  //按下 Ctrl   F12 键 
                        {
                            step = Num(1, 100);
                        }
                        else
                        {
                            step = r.Next(1, 7);    //得到一个1到6之间的随机数 
                        }

                        Console.WriteLine("{0}掷出了:{1}", name[i], step);

                        Console.WriteLine("按任意键开始行动……");

                        Console.ReadKey(true);

                        playerPos[i]  = step;   //玩家向前走了掷出点数的格数 
                        CheckPos(); //判断玩家走动后的格数是否超界 

                        bool encounter = false;     //用来存储是否有玩家被踩到 

                        //判断当前玩家是否踩到某一位玩家 
                        for (int j = 0; j < playerNum; j  )
                        {
                            if (i != j && playerPos[i] == playerPos[j])
                            {
                                playerPos[j] = 0;       //被踩到的玩家退回到起点 
                                encounter = true;       //标志有玩家被踩到 
                                msg = string.Format("{0}踩到了{1},{1}退回起点!", name[i], name[j]);
                                break;
                            }
                        }

                        //没人被踩到 
                        if (encounter == false)
                        {
                            switch (Map[playerPos[i]])  //当前玩家位置 
                            {
                                case 1:     //幸运轮盘 
                                    Console.Clear();
                                    ShowUI();
                                    DrawMap();

                                    //获得前一个玩家的编号 
                                    int ex;
                                    if (i == 0)
                                    {
                                        ex = playerNum - 1;
                                    }
                                    else
                                    {
                                        ex = i - 1;
                                    }

                                    Console.WriteLine("请选择运气(1:和{0}交换位置;2:轰炸{0}):", name[ex]);

                                    int userSelect = Num(1, 2);     //让用户选择使用哪种运气 

                                    if (userSelect == 1)    //和前一位玩家交换位置 
                                    {
                                        int temp = playerPos[i];
                                        playerPos[i] = playerPos[ex];
                                        playerPos[ex] = temp;

                                        msg = string.Format("{0}和{1}交换了位置", name[i], name[ex]);
                                    }
                                    else   //轰炸前一位玩家,使其退6格 
                                    {
                                        playerPos[ex] = playerPos[ex] - 6;
                                        CheckPos();
                                        msg = string.Format("{0}轰炸{1},{1}退六格", name[i], name[ex]);
                                    }

                                    break;

                                case 2:     //地雷 
                                    playerPos[i] = playerPos[i] - 6;    //当前玩家退后六格 
                                    CheckPos();
                                    msg = string.Format("{0}踩到了\"地雷\"退六格", name[i]);
                                    break;

                                case 3:     //暂停 
                                    isStop[i] = true;   //设置当前玩家暂停标记 
                                    break;

                                case 4:     //时空隧道 
                                    playerPos[i] = playerPos[i]   10;   //当前玩家前进10格 
                                    CheckPos();
                                    msg = string.Format("{0}走到了\"时空隧道\"前进十格", name[i]);
                                    break;

                                default:
                                    msg = "";
                                    break;
                            }
                        }
                    }

                    Console.Clear();
                    ShowUI();
                    DrawMap();

                    //显示玩家遇到关卡等信息 
                    if (msg != "")
                    {
                        Console.WriteLine(msg);
                        Console.WriteLine("*****************************");
                    }

                    if (playerPos[i] == 99)   //如果当前玩家走到终点,则游戏结束 
                    {
                        Console.Clear();
                        ShowUI();
                        DrawMap();
                        Console.WriteLine("{0}最先走到终点,获得胜利!!!!", name[i]);
                        win = true;
                        Console.ReadKey();
                        break;
                    }
                }
            }

            Console.ReadKey();
        }

        /// <summary> 
        /// 游戏名称及规则等介绍 
        /// </summary> 
        private static void ShowUI()
        {
            Console.SetWindowSize(80, 50);

            Console.WriteLine("*********************************************************************");
            Console.WriteLine("*                     骑    士    飞    行    棋                    *");
            Console.WriteLine("*         游戏制作:五子连星(http://stwzlx.blog.51cto.com)        *");
            Console.WriteLine("*                                                                   *");
            Console.WriteLine("*最多4名玩家,轮流掷骰子,有一位先达到终点结束游戏。                *");
            Console.WriteLine("*被踩到的玩家退回起点                                               *");
            Console.WriteLine("*走到“幸运轮盘”可以选择和前一位玩家交换位置或者轰炸他(使其退6格)*");
            Console.WriteLine("*走到“地雷”需要退后6格                                            *");
            Console.WriteLine("*走到“暂停”需要暂停掷骰子一次                                     *");
            Console.WriteLine("*走到“时空隧道”可以往前移动10格                                   *");
            Console.WriteLine("*********************************************************************");
        }

        /// <summary> 
        /// 得到用户输入的一个minValue和maxValue之间的整数 
        /// </summary> 
        /// <param name="minValue">最小值</param> 
        /// <param name="maxValue">最大值</param> 
        /// <returns></returns> 
        private static int Num(int minValue, int maxValue)
        {
            while (true)
            {
                try
                {
                    int number = Convert.ToInt32(Console.ReadLine());
                    if (number < minValue || number > maxValue)
                    {
                        Console.WriteLine("必须输入一个{0}到{1}之间的整数!请重新输入:", minValue, maxValue);

                        continue;
                    }

                    return number;
                }
                catch
                {
                    Console.WriteLine("只能输入一个整数!请重新输入:");
                    continue;
                }
            }
        }

        /// <summary> 
        /// 获得参加游戏的人数。 
        /// 最小人数为1,playerMax控制最大人数。 
        /// </summary> 
        /// <returns>参加的人数</returns> 
        private static int PlayerNum()
        {
            int playerMax = 4;  //最大参加人数 

            Console.WriteLine("请输入参加的人数(1—{0}人):", playerMax);

            return Num(1, playerMax);    //返回游戏人数 
        }

        /// <summary> 
        /// 让用户输入每一个玩家的姓名,并返回所有玩家的姓名。 
        /// </summary> 
        /// <param name="number">玩家的人数</param> 
        /// <returns>所有玩家的昵称</returns> 
        private static string[] PlayerName(int number)
        {
            //定义一个数组存放玩家姓名 
            string[] name = new string[number];

            for (int i = 0; i < name.Length; i  )
            {
                Console.WriteLine("请输入第{0}位玩家的姓名:", i   1);
                name[i] = Console.ReadLine();
                while (name[i] == "")   //判断玩家姓名是否为空,为空则重新输入 
                {
                    Console.WriteLine("姓名不能为空,请重新输入第{0}位玩家姓名:", i   1);
                    name[i] = Console.ReadLine();
                }
                if (i > 0)  //判断玩家人数,两位以上需要核对姓名是否相同 
                {
                    for (int j = 0; j < i; j  )     //当前输入的玩家姓名与已经存在的所有玩家姓名进行对照,看是否相同 
                    {
                        if (name[i] == name[j])
                        {
                            Console.WriteLine("该姓名与第{0}位玩家相同,请重新输入第{1}位玩家姓名:", j   1, i   1);
                            name[i] = Console.ReadLine();
                        }
                    }
                }
            }
            return (string[])name;      //返回玩家姓名 
        }

        /// <summary> 
        /// 设置地图关卡的位置 
        /// </summary> 
        private static void InitialMap()
        {
            //在下面的数组存储我们游戏地图各个关卡 

            //在数组中用以下数字表示相关图标 
            //1:幸运轮盘—◎ 
            //2:地雷—★ 
            //3:暂停—▲ 
            //4:时空隧道—※ 
            //0:普通—□ 

            //定义相关关卡的位置 
            int[] luckyTurn = { 6, 23, 40, 55, 69, 83 };      //幸运轮盘1 
            int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };      //地雷2 
            int[] pause = { 9, 27, 60, 93 };        //暂停3 
            int[] timeTunel = { 20, 25, 45, 63, 72, 88, 90 };      //时空隧道4 

            for (int i = 0; i < luckyTurn.Length; i  )
            {
                Map[luckyTurn[i]] = 1;  //把地图Map的第luckyTurn[i]格设置为1(幸运轮盘) 
            }

            for (int i = 0; i < landMine.Length; i  )
            {
                Map[landMine[i]] = 2;   //把地图Map的第landMine[i]格设置为2(地雷) 
            }

            for (int i = 0; i < pause.Length; i  )  //把地图Map的第pause[i]格设置为3(暂停) 
            {
                Map[pause[i]] = 3;
            }

            for (int i = 0; i < timeTunel.Length; i  )  //把地图Map的第timeTunel[i]格设置为4(时空隧道) 
            {
                Map[timeTunel[i]] = 4;
            }
        }

        /// <summary> 
        /// 判断当前格应该绘制的图标 
        /// </summary> 
        /// <param name="pos">当前格位置</param> 
        /// <returns>当前格图标</returns> 
        private static string MapIco(int pos)
        {
            string ico = "";     //存放要绘制的图标字符 

            //判断是否有两个以上的玩家处于当前格上 
            int j = 0;
            for (int i = 0; i < playerNum; i  )
            {
                if (playerPos[i] == pos)     //判断玩家是否在当前格上 
                {
                    j  ;
                    if (j >= 2)     //有两个以上玩家在同一个格上 
                    {
                        Console.ForegroundColor = ConsoleColor.Yellow;  //设置图标颜色 
                        ico = ("<>");
                        return ico;
                    }
                }
            }

            //判断当前格上是否有某一位玩家存在 
            for (int i = 0; i < playerNum; i  )
            {
                if (playerPos[i] == pos)    //当前格有玩家playerPos[i]存在 
                {
                    Console.ForegroundColor = ConsoleColor.Yellow;  //设置图标颜色 
                    ico = playerIco[i];     //获得该玩家的标识字符 
                    return ico;
                }
            }

            switch (Map[pos])     //根据当前格的值来显示相应的图标 
            {
                case 1:
                    Console.ForegroundColor = ConsoleColor.Magenta; //设置图标颜色 
                    ico = ("◎");     //1:幸运轮盘—◎ 
                    break;

                case 2:
                    Console.ForegroundColor = ConsoleColor.Red;    //设置图标颜色 
                    ico = ("★");     //2:地雷—★ 
                    break;

                case 3:
                    Console.ForegroundColor = ConsoleColor.Cyan;    //设置图标颜色 
                    ico = ("▲");     //3:暂停—▲ 
                    break;

                case 4:
                    Console.ForegroundColor = ConsoleColor.Green;   //设置图标颜色 
                    ico = ("※");     //4:时空隧道—※ 
                    break;

                default:
                    Console.ForegroundColor = ConsoleColor.White;   //设置图标颜色 
                    ico = ("□");     //0:普通—□ 
                    break;
            }
            return ico;
        }

        /// <summary> 
        /// 绘制地图 
        /// </summary> 
        private static void DrawMap()
        {
            //图例及玩家说明文字 
            Console.WriteLine("图例说明:幸运轮盘—◎   地雷—★   暂停—▲   时空隧道—※   普通—□");
            Console.Write("玩家说明:多名玩家—<>  ");
            for (int i = 0; i < playerNum; i  )
            {
                Console.Write("第{0}位玩家:{1}  ", i   1, playerIco[i]);
            }
            Console.WriteLine();    //新起一行 

            //画第一行 
            for (int i = 0; i <= 29; i  )
            {
                Console.Write(MapIco(i));       //绘制当前格的图标 
            }

            Console.WriteLine();    //第一行结束,换行 

            //画第右边列(包含5行,每行前29格为空字符) 
            for (int i = 30; i <= 34; i  )      //循环绘制5行 
            {
                for (int j = 0; j < 29; j  )    //有图标的字符串需要绘制在第30格,因此需要每行前29格绘制两个空字符串 
                {
                    Console.Write("  ");
                }
                Console.WriteLine(MapIco(i)); ;      //绘制当前格的图标,并换行 
            }

            //画第二行 
            for (int i = 64; i >= 35; i--)
            {
                Console.Write(MapIco(i));     //绘制当前格的图标 
            }

            Console.WriteLine();    //第二行结束,换行 

            //画第左边列 
            for (int i = 65; i <= 69; i  )
            {
                Console.WriteLine(MapIco(i));      //绘制当前格的图标,并换行 
            }

            //画第三行 
            for (int i = 70; i <= 99; i  )
            {
                Console.Write(MapIco(i));       //绘制当前格的图标 
            }

            Console.WriteLine();

            Console.ResetColor();   //重置控制台的前景色为默认 
        }

        /// <summary> 
        /// 对玩家的坐标是否越界进行判断 
        /// </summary> 
        private static void CheckPos()
        {
            for (int i = 0; i < playerNum; i  )
            {
                if (playerPos[i] > 99)      //如果坐标超过99格则设置为到99格 
                {
                    playerPos[i] = 99;
                }
                else if (playerPos[i] <= 0) //如果坐标超过0格则设置为到0格 
                {
                    playerPos[i] = 0;
                }
            }
        }
    }
}

标签: 娱乐

实例下载地址

C# 飞行棋 游戏示例代码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警