博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
骑士飞行棋 C#代码详解
阅读量:6185 次
发布时间:2019-06-21

本文共 16123 字,大约阅读时间需要 53 分钟。

最近看见一个骑士飞行棋的小游戏代码,感觉这个代码中将大多数C#的基础知识都运用到了,是一个新手检验学习成果的有效方法,特此将这个代码整理一遍。这是一个控制台程序。这是代码下载地址,代码中的注释非常详细介绍了每段代码的作用:

http://files.cnblogs.com/files/xiaohua92/%E9%AA%91%E5%A3%AB%E9%A3%9E%E8%A1%8C%E6%A3%8B.zip

 

首先要了解一下 骑士飞行棋 这个游戏的游戏规则:

1)参与游戏的一共有两个人,暂且称之为A和B.两个人轮流掷筛子,根据掷得的点数在地图上移动

2)地图上有5中元素,分别是无效果:□     幸运轮盘:◎   地雷:☆   暂停:▲     时空隧道:卍   。其中当走到□时候没有任何特殊效果,当走到幸运轮盘的时候会让你选择是要跟对手交换位置还是要轰炸对手(轰炸效果为让对手后退6格),当走到地雷的时候会自动倒退6格,当走到暂时的时候下一次暂停掷筛子一次,当走到时空隧道的时候会前进10格

3)如果A踩到了B,既A在B之后到了B所在的位置,此时B将要退回原点

4)为了调试方便,在代码中给游戏加了一个作弊按钮:在掷筛子的时候,按Tab键之后再按F1键的话,会让玩家自主输入想要掷的点数

 

代码构成:

一共设立了5个类,分别是Program(Main函数所在类)\drawMap(用来绘制地图)\baseUse(一些必要的基本函数)\Initial(初始化姓名以及地图等)\match(比赛逻辑) 。其中:

Program类:定义了公共的静态变量以及Main函数

drawMap类:定义了drawMaps()函数(用来绘制地图),getMapString()函数(主要用来在绘制地图的时候,确定当前位置图标)

baseUse类:定义了ShowUI()函数(用来绘制飞行棋的名称),ReadInt(int min, int max)函数(用来读取用户输入的数字), checkPos()函数(用来检查玩家当前位                   置是否超出边界)

Initial类:InitialMap()函数(用来初始化地图信息),InitialName()函数(用来记录玩家输入的用户名)

match类:Action(int playerNumber)类(用来玩家掷筛子之后的逻辑判断)

 

下面附上所有代码 :

 Program类

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5  6 namespace 骑士飞行棋 7 { 8     class Program 9     {10         //在下面的数组存储我们游戏地图各各关卡11         //数组的下标为0的元素对应地图上的第1格    下标为1的元素对应元素第2格...下标为n的元素对应n+1格12         //在数组中   1:表示幸运轮盘 ◎13         //           2: 表示地雷 ☆14         //           3: 表示暂停 ▲15         //           4: 表示时空隧道 卍16         //           0: 表示普通  □17         public static int[] map = new int[100];//地图中一共100个点18         public static string[] names = new string[2];//names[0]中存储玩家A的姓名,names[1]中存储玩家B的姓名19         public static int[] playerPos = { 0, 0 };//playerPos[0]中存储玩家A的位置,playerPos[1]中存储玩家B的位置20         public static int step = 0;//用于存放产生的随机数21         public static string input = "";//用于存储用户的输入22         public static string msg = "";//用于存储当用户踩到某个关卡,输出的话23         public static bool[] isStop = { false, false };//isStop[0]表示玩家A是否上一次走到暂停,isStop[1]表示玩家B是否上一次走到暂停24         public static Random r = new Random();25        26      27         static void Main(string[] args)28         {          29             baseUse.ShowUI();30             Initial.InitialName();31             Console.Clear();32             baseUse.ShowUI();33             Console.WriteLine("对战开始......");34             Console.WriteLine("{0}用A来表示", names[0]);35             Console.WriteLine("{0}用B来表示", names[1]);36             Console.WriteLine("如果AB在同一位置,用<>表示");37             Initial.InitialMap();38             drawMap.drawMaps();39             Console.WriteLine("开始游戏......");40             while (playerPos[0] < 99 && playerPos[1] < 99)41             {42                 match.Action(0);//玩家A掷筛子43                 if (Program.playerPos[0] < 99)//当玩家没有胜利的时候,玩家B可以继续掷筛子44                     match.Action(1);//玩家B掷筛子45             }46             Console.ReadKey();          47         }    48     }49 }
View Code

drawMap类

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5  6 namespace 骑士飞行棋 7 { 8     class drawMap 9     {10         public static void drawMaps()11         {12             Console.WriteLine("图例:幸运轮盘:◎   地雷:☆   暂停:▲     时空隧道:卍  ");//向玩家解释各个图标的含义13             //绘制第一行14             for(int i=0;i<30;i++)15                 Console.Write(getMapString(i));16                 Console.WriteLine();17             //绘制右边边第一列18                 for (int i = 30; i < 35; i++)19                 {20                     for (int j = 0; j < 29; j++)21                         Console.Write("  ");22                     Console.Write(getMapString(i));23                     Console.WriteLine();24                 }25             //绘制第二行26                 for (int i = 63; i >= 34; i--)27                     Console.Write(getMapString(i));28                 Console.WriteLine();29             //绘制左边第一列30                 for (int i = 65; i < 69; i++)31                 {32            33                     Console.Write(getMapString(i));34                     Console.WriteLine();35                 }36             //绘制第三行37                 for (int i = 69; i < 100; i++)38                     Console.Write(getMapString(i));39                 Console.WriteLine();40         }41 42         static string getMapString(int pos)43         {44             string result = "";45             if (Program.playerPos[0] == pos&&Program.playerPos[1]==pos)46             {47                 Console.ForegroundColor = ConsoleColor.Yellow;48                 result = "<>";49             }50             else if (Program.playerPos[0] == pos)51             {52                 Console.ForegroundColor = ConsoleColor.Yellow;53                 result = "A";54             }55             else if (Program.playerPos[1] == pos)56             {57                 Console.ForegroundColor = ConsoleColor.Yellow;58                 result = "B";59             }60             else61             {62                 switch (Program.map[pos])63                 {64                     case 0:65                         Console.ForegroundColor = ConsoleColor.White;//设置控制台当前位置的颜色为白色66                         result = "□";67                         break;68                     case 1:69                         Console.ForegroundColor = ConsoleColor.Red;70                         result = "◎";71                         break;72                     case 2:73                         Console.ForegroundColor = ConsoleColor.Green;74                         result = "☆";75                         break;76                     case 3:77                         Console.ForegroundColor = ConsoleColor.Blue;78                         result = "▲";79                         break;80                     case 4:81                         Console.ForegroundColor = ConsoleColor.DarkBlue;82                         result = "卍";83                         break;84                 }85             }86             return result;87         }88     }89 }
View Code

baseUse类:

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5  6 namespace 骑士飞行棋 7 { 8     class baseUse 9     {10 11         public static void ShowUI()12         {13             Console.WriteLine("*******************************************************");14             Console.WriteLine("*                                                     *");15             Console.WriteLine("*         骑     士     飞     行      棋             *");16             Console.WriteLine("*                                                     *");17             Console.WriteLine("*******************************************************");18 19         }20          /// 21         /// 用户输入一个min-max之间的数字22         /// 23         /// 最小值24         /// 最大值25         /// 
26 public static int ReadInt(int min, int max)27 {28 while (true)29 {30 try31 {32 Console.WriteLine("请输入{0}和{1}之间的数字!", min, max);33 int number = Convert.ToInt32(Console.ReadLine());34 if (number < min || number > max)35 {36 Console.WriteLine("请输入{0}和{1}之间的数字!", min, max);37 continue;38 }39 return number;40 }41 catch42 {43 Console.WriteLine("输入的不是数字,请重新输入!");44 }45 }46 }47 48 public static void checkPos()49 {50 for (int i = 0; i <= 1; i++)51 {52 if (Program.playerPos[i] > 99)53 {54 Program.playerPos[i] = 99;55 }56 if (Program.playerPos[i] < 0)57 {58 Program.playerPos[i] = 0;59 }60 }61 }62 }63 }
View Code

Initial类:

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5  6 namespace 骑士飞行棋 7 { 8     class Initial 9     {10         public static void InitialName()11         {12             Console.WriteLine("请输入玩家A的姓名");13             Program.names[0]=Console.ReadLine();14             //判断输入的姓名是否为空,如果为空的话则提示并要求用户重新输入15             while(Program.names[0]=="")16             {17                 Console.WriteLine("玩家A姓名不能为空,请重新输入!");18                 Program.names[0] = Console.ReadLine();19             }20 21 22             Console.WriteLine("请输入玩家B的姓名");23             Program.names[1] = Console.ReadLine();24             while (Program.names[1] == "" || Program.names[0] == Program.names[1])25             {26                 if (Program.names[1] == "")27                 {28                     Console.WriteLine("玩家B姓名不能为空,请重新输入!");29                     Program.names[1] = Console.ReadLine();30                 }31                 else if (Program.names[0] == Program.names[1])32                 {33                     Console.WriteLine("玩家A和玩家B的姓名不能一样,请重新输入!");34                     Program.names[1] = Console.ReadLine();35                 }36             }37 38         }39 40 41         public static void InitialMap()42         {43             //下面各组数据分别用于存储幸运转盘,地雷,暂停和时空隧道的坐标44             int[] luckyTurn = { 6, 23, 40, 55, 69, 83 };//幸运轮盘 1 45             int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//地雷 246             int[] pause = { 9, 27, 60, 93 };//暂停 3 47             int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//时空隧道  448 49             //初始化map数组的数据50             for (int i = 0; i < 100; i++)51                 Program.map[i] = 0;52 53             //将幸运轮盘的位置填入地图中54             for (int i = 0; i < luckyTurn.Length; i++)          55                 Program.map[luckyTurn[i]] = 1;56             //将地雷的位置填入地图中57             for (int i = 0; i < landMine.Length; i++)58                 Program.map[landMine[i]] = 2;59             //将暂停的位置填入地图中60             for (int i = 0; i < pause.Length; i++)61                 Program.map[pause[i]] = 3;62             //将时空隧道的位置填入地图中63             for (int i = 0; i < timeTunnel.Length; i++)64                 Program.map[timeTunnel[i]] = 4;65             66         }  67 68     }69 }
View Code

match类:

1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5   6 namespace 骑士飞行棋  7 {  8     class match  9     { 10         public static void Action(int playerNumber) 11         { 12             if (Program.isStop[playerNumber] == false) 13             { 14                 Console.WriteLine("{0}按任意键开始掷筛子......", Program.names[playerNumber]); 15                ConsoleKeyInfo sec = Console.ReadKey(true);//读取用户在键盘上键入的内容 16                     Program.step = Program.r.Next(1, 7);//产生一个1到6之间的随机数 17  18                 //当用户先输入Tab,在输入F1之后,就进入作弊环节,在状态下用户可以任意输入一个1到100之间的数字来当做自己掷的点数 19                 if (sec.Key == ConsoleKey.Tab)//如果用户键入的内容为Tab键 20                 { 21                     ConsoleKeyInfo sec1 = Console.ReadKey(true);//新建一个变量用来读取用户在键盘上的输入 22                     //如果用户按下了F1键 23                     if (sec1.Key == ConsoleKey.F1) 24                     { 25                         Program.step = baseUse.ReadInt(1, 100);//让用户输入一个1到100之间的数字 26                     } 27                 } 28  29                 Console.WriteLine("{0}掷出了{1}", Program.names[playerNumber], Program.step); 30                 Console.WriteLine("{0}按任意键开始行动......", Program.names[playerNumber]); 31                 Console.ReadKey(); 32  33                 Program.playerPos[playerNumber] += Program.step;//用户向前走step步 34                 baseUse.checkPos();//检查是否超出了边界 35  36                 if (Program.playerPos[playerNumber] == Program.playerPos[1 - playerNumber])//当玩家A/B踩到了玩家B/A的时候 37                 { 38                     Program.playerPos[1 - playerNumber] = 0; 39                     Program.msg = string.Format("{0}踩到了{1},{1}退回了原点", Program.names[playerNumber], Program.names[1 - playerNumber]); 40                 } 41                 else //如果没有踩到的话 42                 { 43                     switch (Program.map[Program.playerPos[playerNumber]]) 44                     { 45                         case 0://没有踩到任何机关 46                             Program.msg = ""; 47                             break; 48                         case 1://进入了幸运轮盘 49                             Console.Clear(); 50                             Console.WriteLine("你走到了幸运轮盘,请选择运气?"); 51                             Console.WriteLine("1 ---交换位置  2---轰炸对方"); 52                             int userSelect = baseUse.ReadInt(1, 2); 53                             if (userSelect == 1)//与对方交换位置 54                             { 55                                 int temp = Program.playerPos[playerNumber]; 56                                 Program.playerPos[playerNumber] = Program.playerPos[1 - playerNumber]; 57                                 Program.playerPos[1 - playerNumber] = temp; 58                                 Program.msg = string.Format("{0}选了与对方交换位置", Program.names[playerNumber]); 59                             } 60                             else//轰炸对方 61                             { 62                                 Program.playerPos[1 - playerNumber] -= 6; 63                                 Program.msg = string.Format("{0}轰炸了{1},{1}退回了6格", Program.names[playerNumber], Program.names[1 - playerNumber]); 64                                 baseUse.checkPos(); 65                             } 66                             break; 67                         case 2://踩到了地雷 68                             Program.playerPos[playerNumber] -= 6; 69                             baseUse.checkPos(); 70                             Program.msg = string.Format("{0}踩到了地雷,{0}退了6格", Program.names[playerNumber]); 71                             break; 72                         case 3: 73                             //暂停一次 74                             Program.isStop[playerNumber] = true; 75                             Program.msg = string.Format("{0}走到了红灯,下次暂停一次啊", Program.names[playerNumber]); 76                             break; 77                         case 4: 78                             //踩到时空隧道 79                             Program.playerPos[playerNumber] += 10; 80                             baseUse.checkPos(); 81                             Program.msg = string.Format("{0}进入了时空隧道,爽死了,进了10格", Program.names[playerNumber]); 82                             break; 83                     } 84                 } 85             } 86             else 87                 Program.isStop[playerNumber] = false; 88  89             if (Program.playerPos[playerNumber] >= 99)//当有人胜利的时候 90             { 91                 Console.Clear(); 92                 if (Program.playerPos[0] >= 99) 93                 { 94                     Console.WriteLine("{0}胜利了!!游戏结束", Program.names[0]); 95                 } 96                 else 97                 { 98                     Console.WriteLine("{0}胜利了!!游戏结束", Program.names[1]); 99                 }100             }101             else//如果没有人走到尽头102             {103                 Console.Clear();104                 drawMap.drawMaps();105                 if (Program.msg != "")106                 {107                     Console.WriteLine(Program.msg);108                 }109                 Console.WriteLine("{0}掷出了{1},行动完成!", Program.names[playerNumber], Program.step);110                 Console.WriteLine("*************玩家A和玩家B的位置*********");111                 Console.WriteLine("{0}的位置为:{1}", Program.names[0], Program.playerPos[0] + 1);112                 Console.WriteLine("{0}的位置为:{1}", Program.names[1], Program.playerPos[1] + 1);113             }114         }115 116 117 118     }119 }
View Code

学习总结:

1)如果所定义的静态变量没有声明为public,则在另外的类里无法引用,只能在所定义的类中使用。方法亦然。当声明为public之后,可以在其他类中通过  类型.方法名 的方式来引用。关于静态类型的更多说明,可以看一文。

2)在代码中新接触的语句:

ConsoleKeyInfo sec = Console.ReadKey(true);//读取用户在键盘上键入的内容  Program.step = Program.r.Next(1, 7);//产生一个1到6之间的随机数  if (sec.Key == ConsoleKey.Tab); //如果用户键入的内容为Tab键  Console.ForegroundColor = ConsoleColor.White; //设置控制台当前位置的颜色为白色

 

转载于:https://www.cnblogs.com/xiaohua92/p/5242779.html

你可能感兴趣的文章
线程同步
查看>>
Android 从零开始打造异步处理框架
查看>>
调用Interop.zkemkeeper.dll无法使用解决方案
查看>>
贪心算法(Greedy Algorithm)
查看>>
DuBrute 3.1
查看>>
【PWA学习与实践】(9)生产环境中PWA实践的问题与解决方案
查看>>
RecyclerView的复用机制
查看>>
机器学习之牛顿法
查看>>
在Ubuntu上使用MySQL设置远程数据库优化站点性能
查看>>
鹅厂优文|主播pk,如何实现无缝切换?
查看>>
编写基于PHP扩展库的后门
查看>>
Android Handler机制之Message及Message回收机制
查看>>
JSON vs Js
查看>>
css居中
查看>>
谈谈分享邀请奖励机制(附iOS实现代码)
查看>>
多隆:淘宝第一行代码撰写者的程序世界
查看>>
【刷算法】翻转单链表的递归和非递归方法
查看>>
十步零基础JavaScript学习路径
查看>>
vue-cli 3.0新特性解读
查看>>
第一个tensorflow程序
查看>>