终极飞行棋地图实现和逻辑判断
来源:互联网 发布:云盘系统源码 编辑:程序博客网 时间:2024/06/06 11:13
先看下面的这个图片,是不是看着都晕呢?制作飞行棋看着特别的麻烦,刚开始都不知道如何下手,通过分析,知道了要一步步来。制作飞行棋有两个难点,一个是画图,另一个是进行逻辑判断,把这两个问题搞明白了,其他的都不是问题。
画地图
那么如何制作表头呢?
先写一个方法
public static void showU() { Console.WriteLine("********************************************"); Console.WriteLine("* *"); Console.WriteLine("* 终极骑士飞行棋 10.18 *"); Console.WriteLine("* *"); Console.WriteLine("*******************************************");
}
<span style="font-family: Arial, Helvetica, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);">然后在主函数中调用这个方法</span>
static void Main(string[] args) { //制作表头 showU();
Console.ReadKey();
}
这样,一个飞行棋的表头就做好了,我们来运行一下,效果是这样的。
我们在画图之前,先进行初始化地图,为画图做充分的准备,写一个方法。
public static void InitMap() { //初始化地图 //用0表示普通,显示给用户就是□ //用1.........幸运轮盘,显示给用户的就是◎ //用2 .........地雷,显示给用户的就是☆ //......3.........暂停,..........................................▲ //......4..........时空隧道,...............................※ int[] luckyturn = { 6, 23, 40, 55, 69, 83 };//幸运轮盘◎ int[] landMine = { 5, 13, 17, 33, 47, 60, 80, 94 };//地雷☆ int[] pause = { 9, 27, 66, 93 };//暂停▲ int[] timelunnel = { 20, 25, 45, 72, 89, 92 };//时空隧道※ for (int i = 0; i <luckyturn .Length ; i++) { Map[ luckyturn[i]] = 1; } for (int i = 0; i < landMine .Length ; i++) { Map[ landMine [i]] = 2; } for (int i = 0; i < pause .Length ; i++) { Map[pause[i]] = 3; } for (int i = 0; i < timelunnel.Length ; i++) { Map[timelunnel [i]] =4; } }
然后在主函数中调用,就一句代码,就不写了。
紧接着就是画第一行了,代码如下:
if (PlayerPos[0] == PlayerPos[1] && PlayerPos[0] ==pos ) { Console.Write("<>"); } else if (PlayerPos[0] ==pos )//如果玩家A在地图上就画A { Console.Write("A"); } else if (PlayerPos[1] ==pos)//如果玩家B在地图上就画B { Console.Write("B"); } else { switch (Map[pos ])//如果玩家A和玩家B不在一起也不在这个坐标上哪就画该显示的地图图标 { 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; }//end switch }//end else
效果展示
然后画第一列,由于画完第一行之后,其他的行和列都会用到第一行的逻辑,然后我们就可以把第一行的逻辑进行封装,这里就用到了一个逻辑封装方法,代码如下。
public static void DrawStringMap(int pos)//将第一行的逻辑代码进行封装 { 这里填写上述实现地图第一行的代码 }下面就是再主函数中调用此方法
Console.WriteLine();//换行, #region 画第一竖行 for (int i = 30; i <=34; i++) { for (int j = 0; j <=28; j++) { Console.Write(" ");//转换为隐形的字符 } DrawStringMap(i); Console.WriteLine();//换行 } #endregion效果展示
第一行和第一列都画好之后,剩下的其余行和列就好说了,直接调用方法就行。
基本的图形就完成了
为了让图形更家的美观,可以改变颜色,这里的代码就不往上添加了,感兴趣的自己研究研究。
逻辑判断
地图画完了,接下来就是进行逻辑分析了,到底是怎么在图上运行的?
玩家A和玩家B在地图上行走的思路基本上差不多,我们把它封装成一个方法,减少代码的冗余
<pre name="code" class="csharp"> public static void RowTouZI(int playerpos ) { #region 掷骰子的代码,冗余的 Random r = new Random(); int num=r.Next (1,7); string msg = ""; Console.WriteLine("{0}按任意键开始掷骰子",playerNames [playerpos]); Console.ReadKey(true ); Console.WriteLine("{0}掷出了{1}",playerNames [playerpos],num); Console.WriteLine("{0}按任意键开始行动......",playerNames [playerpos]); Console.ReadKey(true ); PlayerPos[playerpos] += num;//玩家A进4格 CheckPos(); if (PlayerPos[playerpos ]==PlayerPos[1-playerpos ]) { msg =string.Format ("玩家{0}踩到了玩家{1},玩家{2}退6格",playerNames [playerpos],playerNames [1-playerpos ],playerNames [1-playerpos ]); PlayerPos[1-playerpos ] -= 6;//玩家B退6格 CheckPos(); } else { switch (Map [PlayerPos[playerpos]]) { case 0: msg = "行动完了"; break; case 1: msg=string.Format ("{0}走到了幸运轮盘的身边,请选择1---交换位置,2---轰炸对方",playerNames [0]); int number=ReadInt(msg,1,2); if (number==1) { int temp = 0; temp = PlayerPos[playerpos]; PlayerPos[playerpos] = PlayerPos[1-playerpos]; PlayerPos[1-playerpos] = temp; msg=string.Format ("玩家{0}选择了与玩家{1}交换位置",playerNames [playerpos],playerNames [1-playerpos ]); } else { PlayerPos[1-playerpos] = 0; msg=string.Format ("玩家{0}选择了轰炸玩家{1}",playerNames [playerpos],playerNames [1-playerpos]); } break; case 2: //踩到了地雷 msg="能踩到地雷,百年不遇,退6格"; PlayerPos[playerpos] -= 6; CheckPos(); break; case 3: msg="踩到暂停了"; flag[playerpos] = true; break; case 4: msg="恭喜,获得穿越10步的机会"; PlayerPos[playerpos] += 10; CheckPos(); break; } } Console.Clear();//刷新 DrawMap();//画地图 Console.WriteLine(msg);#endregion }
</pre><span style="font-size:18px"> 封装完了,要在主函数中进行调用,使这个方法得以实现</span><p></p><pre>
<span style="font-size:18px;"></span>
<pre name="code" class="csharp"> #region 玩家A掷骰子
if (flag [0]==false ) { RowTouZI (0); } else { flag[0] = false; }#endregion if (PlayerPos [0]==99) {Console.WriteLine("恭喜玩家A胜利了"); break; } #region 玩家B掷骰子 if (flag [1]==false ) { RowTouZI (1); } else { flag[1] = false; }#endregion if (PlayerPos [1]==99) { Console.WriteLine("恭喜玩家B胜利了 "); break; } Console.WriteLine("行动完毕......"); } Console.ReadKey();
代码进行优化,防止出现bug,也是封装成方法,进行调用。
<pre name="code" class="csharp">public static void CheckPos()//判断坐标 { //如果超出范围,放在最后一个位置上 if (PlayerPos [0]> 99) { PlayerPos[0] = 99; } if (PlayerPos [1]> 99) { PlayerPos[1] = 99; } //如果小于最小的位置,放在开始的位置上 if (PlayerPos [0]< 0) { PlayerPos[0] = 0; } }
</pre><span style="font-size:18px">到这里基本上就可以玩了,剩下的就是美化了,如果你想要更好看的界面,可以自己进行修改。</span><pre>
感受
刚开始做这个飞行棋,感觉好麻烦,好多代码,好多的循环语句,查错语句,还有好多封装好的方法,看的晕乎乎的,中间也想着看看就行了,就不敲代码了,现在跟着老师的思路,敲完代码,中间有各种的冗余代码等等,都会想尽办法的去避免,让代码变的更加的简洁,完美,直到现在整个飞行棋可以运行,真的非常开心,收获也特别的多,要学习的还有很多很多,加油~~~
0 0
- 终极飞行棋地图实现和逻辑判断
- 黑马程序员-“骑士飞行棋”游戏基本逻辑和一点思考
- 黑马程序员之 C#学习笔记:飞行棋地图二维数组实现方法
- 用Json配置飞行棋地图/各类型怪物数据
- 逻辑和判断谁是小偷
- 逻辑服务器和地图服务器 【转】
- 飞行棋
- 飞行棋
- 飞行棋
- 飞行棋
- &逻辑操作符实现判断的功能
- (4.3.2.11)Android前后台判断逻辑和切换回调的实现
- JavaScript的布尔类型和逻辑判断
- shell常用符号和逻辑判断
- andriod 无网络逻辑设置和判断
- javascript的逻辑判断和循环
- 逻辑判断
- 逻辑判断
- 创建版本库
- duilib corner属性的贴图技巧——让图片自动贴到控件的的某一边或者一角并自适应控件的大小
- UIViewController的生命周期
- 学习理论之模型选择——Andrew Ng机器学习笔记(八)
- app流量优化
- 终极飞行棋地图实现和逻辑判断
- MODBUS通信协议精析(未完成待续)
- python项目之 天气程序 带GUI
- Git(一)基本介绍和安装
- iOS开发 X-code技巧
- Precision Helper:最佳免费 CHM 制作软件
- Mongodb Notes
- 获取父进程的名称
- 文件的管理