zoukankan      html  css  js  c++  java
  • 骑士飞行棋第一版(掷骰子方法分开)

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Threading.Tasks;
      6 
      7 namespace 骑士飞行棋
      8 {
      9     class Program
     10     {
     11 
     12         //在下面的数组存储我们游戏地图各个关卡
     13         //数组的小标为0的元素对应地图上的第一格   下标为1的元素对应第二格。。。下标为n的元素对应n+1格
     14         //在数组中用 1.表格幸运轮盘◎
     15         //           2.地雷☆
     16         //           3.暂停▲
     17         //           4.时空隧道※
     18         //           0.表示普通□
     19         static int[] Map = new int[100];//设置地图格数并为每格赋值初始值为0
     20         static int[] playerPos = { 0, 0 };//playerPos[0]存玩家A的坐标,playerPos[1]存玩家B的坐标 ps:注意这里等于号后面的是{},并不是[],只表示数组长度为2,分别都为零→ static int[] playerPos = new int[1];
     21 
     22         #region//主程序
     23         static void Main(string[] args)
     24         {
     25             Random r = new Random();//r是产生随机数用的
     26             bool[] isStop = { false, false };//isStop[0]表示A是否上一次走到了暂停,isStop[1]表示B上一次是否走到了暂停,如果走到暂停则设置其值为true
     27             int step = 0;//用于存放临时产生的随机数
     28             string[] names = new string[2]; //names[0]存玩家A的姓名,names[1]存玩家B的姓名
     29             string input = "";//存储用户的输入
     30             string msg = "";//用于存储用户踩到某关卡,输出的话
     31 
     32             ShowUI();//显示游戏名称
     33             Console.WriteLine("请输入玩家A的姓名:");//输出提示
     34             names[0] = Console.ReadLine();//把玩家A的姓名赋值给names[0]
     35             //判断用户输入的内容是否为空,如果为空,则让用户重新输入
     36             while (names[0] == "")//只要用户输入为空则执行下面的循环
     37             {
     38                 Console.WriteLine("姓名不能为空,请重新输入玩家A的姓名:");//提示不能输入空值
     39                 names[0] = Console.ReadLine();//把玩家A的姓名赋值给names[0]
     40 
     41             }
     42             Console.WriteLine("请输入玩家B的姓名:"); //输出提示
     43             names[1] = Console.ReadLine();//把玩家B的姓名赋值给names[1]
     44             while ((names[1] == "") || (names[0] == names[1]))//只要用户输入空值或者与玩家A的姓名重复则执行下面的循环
     45             {
     46                 if (names[1] == "")//如果玩家B的姓名为空则
     47                 {
     48                     Console.WriteLine("姓名不能为空,请重新输入玩家B的姓名:");
     49                 }
     50                 else//如果玩家B的姓名与玩家A的姓名重复则
     51                 {
     52                     Console.WriteLine("姓名不能重复,请重新输入玩家B的姓名:");
     53                 }
     54                 names[1] = Console.ReadLine();//把玩家B的姓名赋值给names[1]
     55             }
     56             Console.Clear();//清屏
     57             ShowUI();//显示游戏名称
     58             Console.WriteLine("对战开始......");//输出提示
     59             Console.WriteLine("{0}用A来表示", names[0]);//输出玩家A的姓名
     60             Console.WriteLine("{0}用B来表示", names[1]);//输出玩家B的姓名
     61             Console.WriteLine("如果AB同一位置,用<>来表示");//输出提示
     62             InitialMap();//初始化地图
     63             DrawMap();//绘制地图
     64             Console.WriteLine("开始游戏......");
     65 
     66             //这个循环中让玩家A和玩家B轮流掷骰子    当玩家A或者玩家B的坐标>=99时,则结束循环
     67             //那循环条件就是
     68             //产生一个m到n之间的随机数
     69             //Random r = new Random();
     70             //int i = r.Next(m,n+1);
     71             while (playerPos[0] < 99 && playerPos[1] < 99)//判断胜利条件,如果没有胜利,程序继续循环运行
     72             {
     73                 if (isStop[0] == false)
     74                 {
     75 
     76                     #region 玩家A掷骰子
     77                     Console.WriteLine("{0}按任意键开始掷骰子......", names[0]);
     78                     //Console.ReadKey(true);//不显示输入的按键并等待
     79                     //step = r.Next(1, 7);//产生一个1-6之间的随机整数(掷骰子结果)
     80                     //取消上面的正常代码,改作弊代码:
     81                     ConsoleKeyInfo rec = Console.ReadKey(true);//ConsoleKeyInfo类似于类型(即int,string等等的类型),这里是ReadKey的类型,此行代码意思:把键盘动作赋值给rec
     82                     step = r.Next(1, 7);//产生一个1-6之间的随机整数(掷骰子结果)
     83                     if (rec.Key == ConsoleKey.Tab)//如果键盘动作为Tab
     84                     {
     85                         ConsoleKeyInfo cc = Console.ReadKey();//ConsoleKeyInfo类似于类型(即int,string等等的类型),这里是ReadKey的类型,此行代码意思:把键盘动作赋值给cc
     86                         if (cc.Key == ConsoleKey.F1)//如果键盘动作为F1
     87                         {
     88                             step = ReadInt(1, 100);//选择1至100间的数为掷骰子结果
     89                         }
     90                     }
     91                     else
     92                     {
     93                         
     94                     }
     95 
     96                     Console.WriteLine("{0}掷出了:{1}", names[0], step);//输出玩家A(names[0])掷骰子结果(随机数step)
     97                     Console.WriteLine("按任意键开始行动......");
     98                     Console.ReadKey(true);//不显示输入的按键并等待
     99                     playerPos[0] = playerPos[0] + step;//注意,一旦坐标发生改变,就要判断,坐标值是否>99或者<0
    100                     CheckPos();// 进行玩家A和玩家B坐标越界的判断
    101 
    102                     if (playerPos[0] == playerPos[1])//玩家A踩到玩家B
    103                     {
    104                         playerPos[1] = 0;//玩家B坐标归零
    105                         msg = string.Format("{0}踩到了{1},{1}退回原点", names[0], names[1]);//string.Format方法提供了不需即时输出又能实现占位符功能
    106                     }
    107                     else
    108                     {
    109                         //没踩到,要判断玩家A现在所在的位置是否有其他关卡
    110                         switch (Map[playerPos[0]])
    111                         {
    112                             case 0:
    113                                 //普通,没有效果
    114                                 msg = "";
    115                                 break;
    116                             case 1:
    117                                 //走到了幸运轮盘关卡
    118                                 Console.Clear();//清屏
    119                                 DrawMap();//绘制地图
    120                                 Console.WriteLine("{0}走到了幸运轮盘,请选择运气?", names[0]);
    121                                 Console.WriteLine("1--交换位置 2--轰炸对方");
    122                                 int userSelect = ReadInt(1, 2);
    123                                 if (userSelect == 1)//选择1,要与对方交换位置
    124                                 {
    125                                     int temp = playerPos[0];
    126                                     playerPos[0] = playerPos[1];
    127                                     playerPos[1] = temp;
    128                                     msg = string.Format("{0}选择了与对方交换位置!", names[0]);//string.Format方法提供了不需即时输出又能实现占位符功能
    129                                 }
    130                                 else//选择2,轰炸对方
    131                                 {
    132                                     playerPos[1] = playerPos[1] - 6;//B坐标退6格
    133                                     CheckPos();//检测退六格后有没有坐标越界,有则纠正
    134                                     msg = string.Format("{0}轰炸了{1},{1}退6格!", names[0], names[1]);//string.Format方法提供了不需即时输出又能实现占位符功能
    135                                 }
    136                                 break;
    137                             case 2:
    138                                 //踩到了地雷
    139                                 playerPos[0] = playerPos[0] - 6;//退六格
    140                                 CheckPos();//检测退六格后有没有坐标越界,有则纠正
    141                                 msg = string.Format("{0}踩到了地雷,退六格", names[0]);//string.Format方法提供了不需即时输出又能实现占位符功能
    142                                 break;
    143                             case 3:
    144                                 //暂停一次
    145                                 isStop[0] = true;//赋值给isStop[0]为true,让下回合暂停
    146                                 msg = string.Format("{0}走到红灯,下次暂停一次!",names[0]);//string.Format方法提供了不需即时输出又能实现占位符功能
    147                                 break;
    148                             case 4:
    149                                 //时空隧道
    150                                 playerPos[0] = playerPos[0] + 10;//前进10格
    151                                 CheckPos();//检测前进10格后有没有坐标越界,有则纠正
    152                                 msg = string.Format("{0}进入时空隧道,爽死了,进10步!", names[0]);//string.Format方法提供了不需即时输出又能实现占位符功能
    153                                 break;
    154                         }
    155                     }
    156 
    157                     Console.Clear();//清屏
    158                     DrawMap();//绘制地图
    159                     if (msg != "")//如果msg不为空,则输出msg
    160                     {
    161                         Console.WriteLine(msg);
    162                     }
    163                     Console.WriteLine("{0}掷出了{1},行动完成!", names[0], step);//step掷骰子结果
    164                     Console.WriteLine("****************玩家A和玩家B的位置如下****************");
    165                     Console.WriteLine("{0}的位置为:{1}", names[0], playerPos[0] + 1);
    166                     Console.WriteLine("{0}的位置为:{1}", names[1], playerPos[1] + 1);
    167                     Console.ReadKey();
    168                     #endregion
    169                 }
    170                 else
    171                 { 
    172                     //说明 isStop == true
    173                     isStop[0] = false;
    174                 }
    175 
    176                 if (playerPos[0] >= 99)//如果玩家A坐标为最后一格,则退出循环,胜利
    177                 {
    178                     break; //退出循环
    179                 }
    180 
    181                 if (isStop[1] == false)
    182                 {
    183                     #region 玩家B掷骰子
    184                     Console.WriteLine("{0}按任意键开始掷骰子......", names[1]);
    185                     Console.ReadKey(true);//不显示输入的按键并等待
    186                     step = r.Next(1, 7);//产生一个1-6之间的随机整数(掷骰子结果)
    187                     Console.WriteLine("{0}掷出了:{1}", names[1], step);//输出玩家B(names[1])掷骰子结果(随机数step)
    188                     Console.WriteLine("按任意键开始行动......");
    189                     Console.ReadKey(true);//不显示输入的按键并等待
    190                     playerPos[1] = playerPos[1] + step;//注意,一旦坐标发生改变,就要判断,坐标值是否>99或者<0
    191                     CheckPos();// 进行玩家A和玩家B坐标越界的判断
    192 
    193                     if (playerPos[0] == playerPos[1])//玩家B踩到玩家A
    194                     {
    195                         playerPos[0] = 0;
    196                         msg = string.Format("{0}踩到了{1},{1}退回原点", names[1], names[0]);//string.Format方法提供了不需即时输出又能实现占位符功能
    197                     }
    198                     else
    199                     {
    200                         //没踩到,要判断玩家B现在所在的位置是否有其他关卡
    201                         switch (Map[playerPos[1]])
    202                         {
    203                             case 0:
    204                                 //普通,没有效果
    205                                 msg = "";
    206                                 break;
    207                             case 1:
    208                                 //走到了幸运轮盘关卡
    209                                 Console.Clear();//清屏
    210                                 DrawMap();//绘制地图
    211                                 Console.WriteLine("{0}走到了幸运轮盘,请选择运气?", names[1]);
    212                                 Console.WriteLine("1--交换位置 2--轰炸对方");
    213                                 int userSelect = ReadInt(1, 2);
    214                                 if (userSelect == 1)//选择1,要与对方交换位置
    215                                 {
    216                                     int temp = playerPos[0];
    217                                     playerPos[0] = playerPos[1];
    218                                     playerPos[1] = temp;
    219                                     msg = string.Format("{0}选择了与对方交换位置!", names[1]);//string.Format方法提供了不需即时输出又能实现占位符功能
    220                                 }
    221                                 else//选择2,轰炸对方
    222                                 {
    223                                     playerPos[0] = playerPos[0] - 6;//A坐标退6格
    224                                     CheckPos();//检测退六格后有没有坐标越界,有则纠正
    225                                     msg = string.Format("{0}轰炸了{1},{1}退6格!", names[1], names[0]);//string.Format方法提供了不需即时输出又能实现占位符功能
    226                                 }
    227                                 break;
    228                             case 2:
    229                                 //踩到了地雷
    230                                 playerPos[1] = playerPos[1] - 6;//退六格
    231                                 CheckPos();//检测退六格后有没有坐标越界,有则纠正
    232                                 msg = string.Format("{0}踩到了地雷,退六格", names[1]);//string.Format方法提供了不需即时输出又能实现占位符功能
    233                                 break;
    234                             case 3:
    235                                 //暂停一次
    236                                 isStop[1] = true;//赋值给isStop[1]为true,让下回合暂停
    237                                 msg = string.Format("{0}走到红灯,下次暂停一次!",names[1]);//string.Format方法提供了不需即时输出又能实现占位符功能
    238                                 break;
    239                             case 4:
    240                                 //时空隧道
    241                                 playerPos[1] = playerPos[1] + 10;//前进10格
    242                                 CheckPos();//检测前进10格后有没有坐标越界,有则纠正
    243                                 msg = string.Format("{0}进入时空隧道,爽死了,进10步!", names[1]);//string.Format方法提供了不需即时输出又能实现占位符功能
    244                                 break;
    245                         }
    246                     }
    247 
    248                     Console.Clear();//清屏
    249                     DrawMap();//绘制地图
    250                     if (msg != "")//如果msg不为空,则输出msg
    251                     {
    252                         Console.WriteLine(msg);
    253                     }
    254                     Console.WriteLine("{0}掷出了{1},行动完成!", names[1], step);//step掷骰子结果
    255                     Console.WriteLine("****************玩家A和玩家B的位置如下****************");
    256                     Console.WriteLine("{0}的位置为:{1}", names[0], playerPos[0] + 1);
    257                     Console.WriteLine("{0}的位置为:{1}", names[1], playerPos[1] + 1);
    258                     Console.ReadKey();
    259                     #endregion
    260                 }
    261                 else
    262                 {
    263                     //说明 isStop == true
    264                     isStop[1] = false;
    265                 }
    266 
    267             }
    268 
    269             //判断谁胜利,谁失败
    270             Console.Clear();//清屏
    271             ShowUI();//绘制游戏开头画面
    272             if (playerPos[0] >= 99)
    273             {
    274                 Console.WriteLine("{0}胜利了!!!!!", names[0]);//提示玩家A胜利
    275             }
    276             else
    277             {
    278                 Console.WriteLine("{0}胜利了!!!!!", names[1]);//提示玩家B胜利
    279             }
    280 
    281             Console.ReadKey();//等待
    282         }
    283         #endregion
    284         #region//绘制飞行棋的开头画面
    285         /// <summary>
    286         /// 用于绘制飞行棋的名称
    287         /// </summary>
    288         static void ShowUI()//显示游戏名称的方法 
    289         {
    290             Console.WriteLine();
    291             Console.WriteLine("******************************************");
    292             Console.WriteLine("*                                        *");
    293             Console.WriteLine("*         骑  士   飞   行  棋           *");
    294             Console.WriteLine("*                                        *");
    295             Console.WriteLine("******************************************");
    296         }
    297         #endregion
    298 
    299         /// <summary> 
    300         /// 进行玩家A和玩家B坐标越界的判断
    301         /// </summary>
    302         static void CheckPos()//进行玩家A和玩家B坐标越界的判断
    303         {
    304             for (int i = 0; i <= 1; i++)
    305             {
    306                 if (playerPos[i] > 99)
    307                 {
    308                     playerPos[i] = 99;
    309                 }
    310                 if (playerPos[i] < 0)
    311                 {
    312                     playerPos[i] = 0;
    313                 }
    314             }
    315         }
    316 
    317         #region//对地图中的关卡进行初始化
    318         /// <summary>
    319         /// 对地图中的关卡进行初始化
    320         /// </summary>
    321         static void InitialMap()
    322         {
    323             //用于存储在地图中为地雷的下标
    324             int[] luckyTurn = { 6, 23, 40, 55, 69, 83, 98 };//幸运轮盘1
    325             int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//地雷2
    326             int[] pause = { 9, 27, 60, 93 };//暂停的坐标3
    327             int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//时空隧道※4
    328 
    329             for (int i = 0; i < luckyTurn.Length; i++)//循环,从零开始/到luckyTurn的数组长度结束/每循环运行一次i增加1
    330             {
    331                 int pos = luckyTurn[i];//赋值给pos
    332                 Map[pos] = 1;// 地图数组[下标]=1,把地雷的下标赋值给地图
    333             }
    334             for (int i = 0; i < landMine.Length; i++)//循环,从零开始/到landMine的数组长度结束/每循环运行一次i增加1
    335             {
    336                 Map[landMine[i]] = 2;//把地雷的下标赋值给地图
    337             }
    338             for (int i = 0; i < pause.Length; i++)//循环,从零开始/到pause的数组长度结束/每循环运行一次i增加1
    339             {
    340                 Map[pause[i]] = 3;//把暂停的下标赋值给地图
    341             }
    342             for (int i = 0; i < timeTunnel.Length; i++)//循环,从零开始/到timeTunnel的数组长度结束/每循环运行一次i增加1
    343             {
    344                 Map[timeTunnel[i]] = 4;//把时空隧道的下标赋值给地图
    345             }
    346         }
    347         #endregion
    348 
    349         /// <summary>
    350         /// 获得第pos坐标上应该绘制的图案
    351         /// </summary>
    352         /// <param name="pos">要绘制的坐标</param>
    353         /// <returns></returns>
    354         static string GetMapString(int pos)//获得第pos坐标上应该绘制的图案 ps:DrawMap()方法需要用到该方法来判断并输出图案
    355         {
    356             string result = "";
    357             //判断A和B是否在当前要画的第i格上,是则先绘制A和B的位置
    358             if (playerPos[0] == pos && playerPos[1] == pos)
    359             {
    360                 Console.ForegroundColor = ConsoleColor.Yellow;//更改输出的字符颜色为黄色
    361                 result = "<>";
    362             }
    363             else if (playerPos[0] == pos)//判断A在当前画的格上
    364             {
    365                 Console.ForegroundColor = ConsoleColor.Yellow;//更改输出的字符颜色为黄色
    366                 result = "A";
    367             }
    368             else if (playerPos[1] == pos)//判断B在当前画的格上
    369             {
    370                 Console.ForegroundColor = ConsoleColor.Yellow;//更改输出的字符颜色为黄色
    371                 result = "B";
    372             }
    373             else
    374             {
    375                 //绘制除开A和B位置的地图
    376                 switch (Map[pos])//以外层循环到的地图格数为判定
    377                 {
    378                     case 0:
    379                         Console.ForegroundColor = ConsoleColor.White;
    380                         result = "";//如果为0则绘制□,正常地图格
    381                         break;//退出循环
    382                     case 1:
    383                         Console.ForegroundColor = ConsoleColor.Red;
    384                         result = "";//如果为1则绘制◎,幸运轮盘
    385                         break;//退出循环
    386                     case 2:
    387                         Console.ForegroundColor = ConsoleColor.Green;
    388                         result = "";//如果为2则绘制☆,地雷
    389                         break;//退出循环
    390                     case 3:
    391                         Console.ForegroundColor = ConsoleColor.Blue;
    392                         result = "";//如果为3则绘制▲,暂停
    393                         break;//退出循环
    394                     case 4:
    395                         Console.ForegroundColor = ConsoleColor.Magenta;
    396                         result = "";//如果为4则绘制※,时空隧道
    397                         break;//退出循环
    398                 }
    399             }
    400             return result;
    401         }
    402 
    403         static void DrawMap()
    404         {
    405             Console.WriteLine("图例: 幸运轮盘:◎  地雷:☆  暂停:▲  时空隧道:※");
    406             //画第一行 绘制下标从0-29格的地图
    407             for (int i = 0; i <= 29; i++)
    408             {
    409                 //判断A和B是否在当前要画的第i格上,是则先绘制A和B的位置
    410                 Console.Write(GetMapString(i));
    411             }
    412             //绘制第一行完毕
    413             Console.Write("
    ");//换行
    414             //绘制第一列
    415             for (int i = 30; i <= 34; i++)
    416             {
    417                 //绘制29个双空格
    418                 for (int j = 0; j < 29; j++)
    419                 {
    420                     Console.Write("  ");
    421                 }
    422                 Console.WriteLine(GetMapString(i));
    423             }
    424             //绘制第二行
    425             for (int i = 64; i >= 35; i--)
    426             {
    427                 Console.Write(GetMapString(i));
    428             }
    429             Console.Write("
    ");//换行
    430             //绘制第二列
    431             for (int i = 65; i <= 69; i++)
    432             {
    433                 Console.WriteLine(GetMapString(i));
    434             }
    435             //绘制第三行
    436             for (int i = 70; i <= 99; i++)
    437             {
    438                 Console.Write(GetMapString(i));
    439             }
    440             Console.WriteLine();
    441             Console.ResetColor();
    442         }
    443 
    444         #region//产生随机数方法???判断是否为一或者二的整数
    445         static int ReadInt()//产生一个整数
    446         {
    447             int i = ReadInt(int.MaxValue, int.MinValue);
    448             return i;
    449         }
    450 
    451         static int ReadInt(int min, int max)//产生min--max 之间的数
    452         {
    453             while (true)
    454             {
    455                 try
    456                 {
    457                     int number = Convert.ToInt32(Console.ReadLine());
    458                     if (number < min || number > max)
    459                     {
    460                         Console.WriteLine("只能输入{0}--{1}之间的数字,请重新输入", min, max);
    461                         continue;//跳出本次循环,继续下次循环
    462                     }
    463                     return number;//退出循环,并返回number值
    464                 }
    465                 catch
    466                 {
    467                     Console.WriteLine("只能输入数字,请重新输入!");
    468                 }
    469             }
    470         }
    471         #endregion
    472 
    473     }
    474 }
  • 相关阅读:
    修改带!important的css样式
    解决Eclipse导入项目是提示错误:Some projects cannot be imported because they already exist in the workspace
    HTML5——canvas:使用画布绘制卡片
    vue:更改组件样式
    导入导出大量excel文件
    winfrom控件Treeview绑定数据库中的资料(节点控件)
    Winfrom将excel中的数据导入sqlserver数据库中的方法
    C# 将DataTable表中的数据批量插入到数据库表中的方法
    创建Sql数据表的sql代码
    Winfrom之SplitContainer控件
  • 原文地址:https://www.cnblogs.com/start-from-scratch/p/5040700.html
Copyright © 2011-2022 走看看