骑士飞行棋第一版(掷骰子方法分开)

  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 }
原文地址:https://www.cnblogs.com/start-from-scratch/p/5040700.html