黑马程序员技术交流社区

标题: 关于那个飞行棋的小项目,分享一些我的方法 [打印本页]

作者: 大虾挂了    时间: 2013-9-20 17:43
标题: 关于那个飞行棋的小项目,分享一些我的方法
代码是看视频之前自己写的,所以有很多地方和老师不太一样。
投色子的时候可以让循环体中就一个玩家,通过对变量i(循环次数)的操作完成对玩家的选择。
绘制地图这里,视频的方法比较简单,我这里采用的是函数(huatu)传参的方式绘制的。
以下就是通过循环次数来操作投色子的代码。
  1. do
  2.             {
  3.                 Console.Clear();
  4.                 chu();
  5.                 huatu(Map, zb[0], zb[1]);

  6.                 if (rp[i % 2] != 0)
  7.                 {
  8.                     rp[i % 2]--;//检测上次该玩家是否踩到暂停,使用i--的目的是方便调整暂停回合数
  9.                     i++;
  10.                     continue;
  11.                 }
  12.                 sz = c.Next(1, 7);
  13.                 zb[i % 2] = zb[i % 2] + sz;
  14.                 Console.WriteLine("玩家{0}掷出了{1},按任意键继续",i%2+1,sz);
  15.                 Console.ReadKey();
  16.                
  17.                 //最优先检查该次投掷后该玩家是否获得胜利
  18.                 if (zb[i % 2] >= 99)
  19.                 {
  20.                     i++;
  21.                     break;
  22.                 }
  23.                 Console.Clear();
  24.                 chu();
  25.                 huatu(Map, zb[0], zb[1]);
  26.                 Console.WriteLine("按任意键继续");
  27.                 Console.ReadKey();
  28.                
  29.                 //其次检查该玩家是否踩到另一位玩家
  30.                 if(zb[i%2]==zb[(i+1)%2])
  31.                 {
  32.                     zb[(i + 1) % 2] = 0;
  33.                     Console.Clear();
  34.                     chu();
  35.                     huatu(Map, zb[0], zb[1]);
  36.                     Console.WriteLine("玩家{0}将玩家{1}踩回起点,按任意键继续",i%2+1,(i+1)%2+1);
  37.                     Console.ReadKey();
  38.                 }

  39.                 //最后检查其他特殊事件
  40.                 //幸运轮盘
  41.                 if (Map[zb[i % 2]] == 1)
  42.                 {
  43.                     Console.WriteLine("玩家{0}幸运轮盘,输入1交换位置,输入2轰炸对方",i%2+1);
  44.                     do
  45.                     {
  46.                         try
  47.                         {
  48.                             select = Convert.ToInt32(Console.ReadLine());
  49.                         }
  50.                         catch{}
  51.                         if(select != 1 && select != 2)
  52.                             Console.WriteLine("输入不合法,请重新输入1或者2");
  53.                     } while (select != 1 && select != 2);
  54.                     if (select == 1)
  55.                     {
  56.                         zb[i % 2] = zb[i % 2] ^ zb[(i + 1) % 2];
  57.                         zb[(i + 1) % 2] = zb[i % 2] ^ zb[(i + 1) % 2];
  58.                         zb[i % 2] = zb[i % 2] ^ zb[(i + 1) % 2];
  59.                     }
  60.                     else
  61.                     {
  62.                         zb[(i + 1) % 2] -= 5;
  63.                         if (zb[(i + 1) % 2] < 0)
  64.                             zb[(i + 1) % 2] = 0;
  65.                     }
  66.                     select = 0;
  67.                     Console.Clear();
  68.                     chu();
  69.                     huatu(Map, zb[0], zb[1]);
  70.                     Console.WriteLine("按任意键继续");
  71.                     Console.ReadKey();
  72.                 }

  73.                 //地雷
  74.                 if (Map[zb[i % 2]] == 2)
  75.                 {
  76.                     zb[i % 2] -= 5;
  77.                     Console.Clear();
  78.                     chu();
  79.                     huatu(Map, zb[0], zb[1]);
  80.                     Console.WriteLine("玩家{0}踩到地雷,退5格", i % 2 + 1);
  81.                     Console.WriteLine("按任意键继续");
  82.                     Console.ReadKey();
  83.                 }

  84.                 //暂停
  85.                 if (Map[zb[i % 2]] == 3)
  86.                 {
  87.                     Console.WriteLine("玩家{0}悲剧了,暂停一次",i%2+1);
  88.                     rp[i % 2] = 1;//这里是数字可以用来设置暂停次数
  89.                     Console.WriteLine("按任意键继续");
  90.                     Console.ReadKey();
  91.                 }

  92.                 //时空隧道
  93.                 if (Map[zb[i % 2]] == 4)
  94.                 {
  95.                     zb[i % 2] += 10;
  96.                     Console.Clear();
  97.                     chu();
  98.                     huatu(Map, zb[0], zb[1]);
  99.                     Console.WriteLine("玩家{0}happy了,进入时空隧道,前进10格",i%2+1);
  100.                     Console.WriteLine("按任意键继续");
  101.                     Console.ReadKey();
  102.                 }
  103.                 i++;
  104.             } while (zb[0] < 99 && zb[1] < 99);
  105.             //显示胜利玩家,注意有玩家获胜以后i会加一,所以(i+1)%2代表获胜玩家的下标,再+1代表获胜玩家
  106.             Console.WriteLine("玩家{0}取得胜利",(i+1)%2+1);
  107.             Console.ReadKey();
复制代码

作者: 大虾挂了    时间: 2013-9-20 17:46
这里有点小小的东西忘记了,我这里输出的内容是玩家1,和玩家2,并不是他们的名字,不过只要把它放入名字数组的下标就可以完成了。

以下是全部的代码
作者: 大虾挂了    时间: 2013-9-20 17:48
以下是main函数中内容
static void Main(string[] args)
        {
            ShowUI();

            string A = "";
            string B = "";
            int sz;//存放色子数字
            int i = 0;//用于处理色子循环投掷
            int select=0;//用于接受用户的选择
            int[] rp = new int[2];//用于记录是否踩雷
            int[] zb=new int[2];//用于存储A和B的位置
            Random c=new Random();

            Console.WriteLine("请输入玩家A的姓名。");
            A = Console.ReadLine();
            while (A == "")
            {
                Console.WriteLine("输入姓名不能为空,请重新输入");
                A = Console.ReadLine();
            }
            Console.WriteLine("请输入玩家B的姓名。");
            B = Console.ReadLine();
            while (B == "" || B == A)
            {
                if (B == "")
                    Console.WriteLine("输入不能为空,请重新输入");
                else
                    Console.WriteLine("玩家B的姓名不能与A重复,请重新输入");
                B = Console.ReadLine();
            }
            Console.Clear();

            ShowUI();
            Console.WriteLine("游戏开始........");
            Console.WriteLine("{0}的士兵用A表示", A);
            Console.WriteLine("{0}的士兵用B表示", B);
            Console.WriteLine("图例:幸运轮盘◎  地雷☆  暂停▲  时空隧道※");

            int[] Map = new int[100];

            //特殊点的下标
            int[] luckyturn = { 6, 23, 40, 55, 69, 83, 98 };
            int[] landmine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };
            int[] pause = {1,4, 9, 27, 60, 93 };
            int[] timetunnel = { 20, 25, 45, 63, 72, 88, 90 };

            Map = fuzhi(Map, luckyturn, 1);
            Map = fuzhi(Map, landmine, 2);
            Map = fuzhi(Map, pause, 3);
            Map = fuzhi(Map, timetunnel, 4);

            huatu(Map, 0, 0);
            Console.WriteLine("按任意键开始游戏!");
            Console.ReadKey();
            
            do
            {
                Console.Clear();
                chu();
                huatu(Map, zb[0], zb[1]);

                if (rp[i % 2] != 0)
                {
                    rp[i % 2]--;//检测上次该玩家是否踩到暂停,使用i--的目的是方便调整暂停回合数
                    i++;
                    continue;
                }
                sz = c.Next(1, 7);
                zb[i % 2] = zb[i % 2] + sz;
                Console.WriteLine("玩家{0}掷出了{1},按任意键继续",i%2+1,sz);
                Console.ReadKey();
               
                //最优先检查该次投掷后该玩家是否获得胜利
                if (zb[i % 2] >= 99)
                {
                    i++;
                    break;
                }
                Console.Clear();
                chu();
                huatu(Map, zb[0], zb[1]);
                Console.WriteLine("按任意键继续");
                Console.ReadKey();
               
                //其次检查该玩家是否踩到另一位玩家
                if(zb[i%2]==zb[(i+1)%2])
                {
                    zb[(i + 1) % 2] = 0;
                    Console.Clear();
                    chu();
                    huatu(Map, zb[0], zb[1]);
                    Console.WriteLine("玩家{0}将玩家{1}踩回起点,按任意键继续",i%2+1,(i+1)%2+1);
                    Console.ReadKey();
                }

                //最后检查其他特殊事件
                //幸运轮盘
                if (Map[zb[i % 2]] == 1)
                {
                    Console.WriteLine("玩家{0}幸运轮盘,输入1交换位置,输入2轰炸对方",i%2+1);
                    do
                    {
                        try
                        {
                            select = Convert.ToInt32(Console.ReadLine());
                        }
                        catch{}
                        if(select != 1 && select != 2)
                            Console.WriteLine("输入不合法,请重新输入1或者2");
                    } while (select != 1 && select != 2);
                    if (select == 1)
                    {
                        zb[i % 2] = zb[i % 2] ^ zb[(i + 1) % 2];
                        zb[(i + 1) % 2] = zb[i % 2] ^ zb[(i + 1) % 2];
                        zb[i % 2] = zb[i % 2] ^ zb[(i + 1) % 2];
                    }
                    else
                    {
                        zb[(i + 1) % 2] -= 5;
                        if (zb[(i + 1) % 2] < 0)
                            zb[(i + 1) % 2] = 0;
                    }
                    select = 0;
                    Console.Clear();
                    chu();
                    huatu(Map, zb[0], zb[1]);
                    Console.WriteLine("按任意键继续");
                    Console.ReadKey();
                }

                //地雷
                if (Map[zb[i % 2]] == 2)
                {
                    zb[i % 2] -= 5;
                    Console.Clear();
                    chu();
                    huatu(Map, zb[0], zb[1]);
                    Console.WriteLine("玩家{0}踩到地雷,退5格", i % 2 + 1);
                    Console.WriteLine("按任意键继续");
                    Console.ReadKey();
                }

                //暂停
                if (Map[zb[i % 2]] == 3)
                {
                    Console.WriteLine("玩家{0}悲剧了,暂停一次",i%2+1);
                    rp[i % 2] = 1;//这里是数字可以用来设置暂停次数
                    Console.WriteLine("按任意键继续");
                    Console.ReadKey();
                }

                //时空隧道
                if (Map[zb[i % 2]] == 4)
                {
                    zb[i % 2] += 10;
                    Console.Clear();
                    chu();
                    huatu(Map, zb[0], zb[1]);
                    Console.WriteLine("玩家{0}happy了,进入时空隧道,前进10格",i%2+1);
                    Console.WriteLine("按任意键继续");
                    Console.ReadKey();
                }
                i++;
            } while (zb[0] < 99 && zb[1] < 99);
            //显示胜利玩家,注意有玩家获胜以后i会加一,所以(i+1)%2代表获胜玩家的下标,再+1代表获胜玩家
            Console.WriteLine("玩家{0}取得胜利",(i+1)%2+1);
            Console.ReadKey();
        }
作者: 大虾挂了    时间: 2013-9-20 17:51
游戏标题
static void ShowUI()
        {
            Console.WriteLine("***************************************************");
            Console.WriteLine("*                                                 *");
            Console.WriteLine("*              骑  士  飞  行  棋                 *");
            Console.WriteLine("*                                                 *");
            Console.WriteLine("***************************************************");
        }

将特殊点(幸运轮盘 时空隧道 暂停 地雷)加入地图的函数,函数返回int类型数组赋给地图数组,输入三个参数分别为地图数组,特殊点数组,特殊点代表数字。
static int[] fuzhi(int[] a, int[] b, int c)
        {
            for (int i = 0; i < b.Length; i++)
                a[b[i]] = c;
            return a;
        }

绘制地图的方法
static void huatu(int[] a, int b, int c)
        {
            for (int i = 0; i < 30; i++)
            {
                if (b == i && c == i)
                    Console.Write("<>");
                else if (b == i && c != i)
                    Console.Write("A");
                else if (b != i && c == i)
                    Console.Write("B");
                else
                {
                    switch (a[i])
                    {
                        case 0: Console.Write("□");
                            break;
                        case 1: Console.Write("◎");
                            break;
                        case 2: Console.Write("☆");
                            break;
                        case 3: Console.Write("▲");
                            break;
                        case 4: Console.Write("※");
                            break;
                    }
                }
            }
            Console.WriteLine();
            for (int i = 30; i < 35; i++)
            {
                if (b == i && c == i)
                    Console.WriteLine("                             <>");
                else if (b == i && c != i)
                    Console.WriteLine("                             A");
                else if (b != i && c == i)
                    Console.WriteLine("                             B");
                else
                {
                    switch (a[i])
                    {
                        case 0: Console.WriteLine("                             □");
                            break;
                        case 1: Console.WriteLine("                             ◎");
                            break;
                        case 2: Console.WriteLine("                             ☆");
                            break;
                        case 3: Console.WriteLine("                             ▲");
                            break;
                        case 4: Console.WriteLine("                             ※");
                            break;
                    }
                }
            }
            for (int i = 64; i > 34; i--)
            {
                if (b == i && c == i)
                    Console.Write("<>");
                else if (b == i && c != i)
                    Console.Write("A");
                else if (b != i && c == i)
                    Console.Write("B");
                else
                {
                    switch (a[i])
                    {
                        case 0: Console.Write("□");
                            break;
                        case 1: Console.Write("◎");
                            break;
                        case 2: Console.Write("☆");
                            break;
                        case 3: Console.Write("▲");
                            break;
                        case 4: Console.Write("※");
                            break;
                    }
                }
            }
            Console.WriteLine();
            for (int i = 65; i < 70; i++)
            {
                if (b == i && c == i)
                    Console.WriteLine("<>");
                else if (b == i && c != i)
                    Console.WriteLine("A");
                else if (b != i && c == i)
                    Console.WriteLine("B");
                else
                {
                    switch (a[i])
                    {
                        case 0: Console.WriteLine("□");
                            break;
                        case 1: Console.WriteLine("◎");
                            break;
                        case 2: Console.WriteLine("☆");
                            break;
                        case 3: Console.WriteLine("▲");
                            break;
                        case 4: Console.WriteLine("※");
                            break;
                    }
                }
            }
            for (int i = 70; i < 100; i++)
            {
                if (b == i && c == i)
                    Console.Write("<>");
                else if (b == i && c != i)
                    Console.Write("A");
                else if (b != i && c == i)
                    Console.Write("B");
                else
                {
                    switch (a[i])
                    {
                        case 0: Console.Write("□");
                            break;
                        case 1: Console.Write("◎");
                            break;
                        case 2: Console.Write("☆");
                            break;
                        case 3: Console.Write("▲");
                            break;
                        case 4: Console.Write("※");
                            break;
                    }
                }
            }
            Console.WriteLine();
        }

游戏开始后界面初始化方法
static void chu()
        {
            ShowUI();
            Console.WriteLine();
            Console.WriteLine("图例:幸运轮盘◎  地雷☆  暂停▲  时空隧道※");
            Console.WriteLine();
            Console.WriteLine();
        }




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2