黑马程序员技术交流社区

标题: 骑士飞行棋-苏坤老师教学版本 [打印本页]

作者: 张林杰    时间: 2013-4-15 19:04
标题: 骑士飞行棋-苏坤老师教学版本
本人刚学C#,把苏坤老师视频中的代码分享下,跟新手一起学习~
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace 苏坤方法_飞行棋
  6. {
  7.     class Program
  8.     {

  9.         static int[] Map = new int[100];
  10.         static int[] playerPos = { 0, 0 };//playerPos[0]存玩家A的下标,playerPos[1]存玩家B的下标
  11.         static string[] names = new string[2];//names[0]存储玩家A的姓名,names[1]存储玩家B的姓名
  12.         static bool[] isStop = { false, false };//isStop[0]表示A是否上一次走到了暂停,isStop[1]表示B上一次是否走到暂停,如果走到暂停,则设置其值为true

  13.         static void Main(string[] args)
  14.         {
  15.             //在下面的数组存储我们游戏地图各个关卡
  16.             //数组的下标为0的元素对应地图上的第1格,下标为1的元素对应第2格...下标为n的元素对应n+1格
  17.             //在数组中用  1:表标幸运轮盘◎
  18.             //            2:地雷☆
  19.             //            3:暂停▲
  20.             //            4:时空隧道卐
  21.             //            5:表示普通□
  22.            
  23.             ShowUI();//显示游戏的名称
  24.             Console.WriteLine("请输入玩家A的姓名?");
  25.             names[0] = Console.ReadLine();

  26.             //判断用户输入的内容是否为空,如果为空,则让用户重新输入
  27.             while (names[0] == "")
  28.             {
  29.                 Console.WriteLine("玩家A的姓名不能为空,请重新输入!");
  30.                 names[0] = Console.ReadLine();
  31.             }

  32.             Console.WriteLine("请输入玩家B的姓名?");
  33.             names[1] = Console.ReadLine();
  34.             while (names[1] == "" || names[1] == names[0])
  35.             {
  36.                 if (names[1] == "")
  37.                 {
  38.                     Console.WriteLine("玩家B的姓名不能为空,请重新输入!");
  39.                 }
  40.                 if (names[1] == names[0])  //a和b重名
  41.                 {
  42.                     Console.WriteLine("该姓名已被玩家A占用,请重新输入!");
  43.                 }
  44.                 names[1] = Console.ReadLine();
  45.             }
  46.             Console.Clear();
  47.             ShowUI();
  48.             Console.WriteLine("对战开始......");
  49.             Console.WriteLine("{0}用A来表示", names[0]);
  50.             Console.WriteLine("{0}用B来表示", names[1]);
  51.             Console.WriteLine("如果AB在同一位置,用<>来表示");

  52.             InitialMap();//初始化地图
  53.             DrawMap();//绘制地图
  54.             Console.WriteLine("开始游戏......");

  55.             //这个循环中让玩家A和玩家B轮流掷骰子,当玩家A或者玩家B的坐标>=99时,则结束循环.
  56.             //那么循环条件就是
  57.             while (playerPos[0] < 99 && playerPos[1] < 99)
  58.             {
  59.                 if (isStop[0] == false)
  60.                 {
  61.                     Action(0);
  62.                 }
  63.                 else
  64.                 {
  65.                     //说明isStop=true
  66.                     isStop[0] = false;
  67.                 }
  68.                 if (playerPos[0] >= 99)
  69.                 {
  70.                     break;
  71.                 }

  72.                 if (isStop[1] == false)
  73.                 {
  74.                     Action(1);
  75.                 }
  76.                 else
  77.                 {
  78.                     isStop[1] = false;
  79.                 }
  80.             }

  81.             //判断谁胜利,谁失败
  82.             Console.Clear();
  83.             ShowUI();
  84.             if (playerPos[0] >= 99)  
  85.             {
  86.                 Console.WriteLine("{0}胜利了!!!!!!", names[0]);
  87.             }
  88.             else
  89.             {
  90.                 Console.WriteLine("{0}胜利了!!!!!!", names[1]);
  91.             }
  92.             Console.ReadKey();
  93.         }

  94.         /// <summary>
  95.         /// A或B掷骰子的方法
  96.         /// </summary>
  97.         /// <param name="playerNumber">A掷骰子传0过来,B掷骰子传1过来</param>
  98.         static void Action(int playerNumber)
  99.         {   
  100.             //playerNumber中存的就是当前玩家 姓名 坐标 是否暂停 这三个数组的下标
  101.             //1-playNumber就是对方的姓名 坐标 是否暂停 的下标
  102.             //当前 0,对方1
  103.             //当前 1, 对方0
  104.             Random r = new Random();//r是产生随机数用的 类的对象      
  105.             string msg = "";//用于存储用户踩到某关卡,输出的话
  106.             int step = 0;//用于存放产生的随机数
  107.             Console.WriteLine("{0}按任意键开始掷骰子......", names[playerNumber]);
  108.             ConsoleKeyInfo rec = Console.ReadKey(true);//定义一个ConsoleKeyInfo型的变量,接收Console.ReadKey(true)返回的结构体信息

  109.             step = r.Next(1, 7);//产生一个1-6之间的随机整数

  110.             if (rec.Key == ConsoleKey.Tab &&rec.Modifiers ==(ConsoleModifiers.Control | ConsoleModifiers.Shift))
  111.             {
  112.                 ConsoleKeyInfo cc = Console.ReadKey( );
  113.                 if (cc.Key == ConsoleKey.F1)
  114.                 {
  115.                     step = ReadInt(1, 100);
  116.                 }
  117.             }

  118.             Console.WriteLine("{0}掷出了:{1}", names[playerNumber], step);
  119.             Console.WriteLine("按任意键开始行动......");
  120.             Console.ReadKey(true);

  121.             playerPos[playerNumber] = playerPos[playerNumber] + step;//注意:一旦坐标发生改变,就该判断 坐标值是否>99或者<0
  122.             CheckPos();//检测坐标是否越界

  123.             if (playerPos[0] == playerPos[1])//玩家A踩到玩家B
  124.             {
  125.                 playerPos[1-playerNumber] = 0;
  126.                 msg = string.Format("{0}踩到了{1},{1}退回原点", names[playerNumber], names[1-playerNumber]);
  127.             }
  128.             else
  129.             {//没踩到,要判断玩家A现在所在的位置是否有其他关卡
  130.                 switch (Map[playerPos[playerNumber]])
  131.                 {
  132.                     case 0:
  133.                         //普通,没有效果.
  134.                         msg = "";
  135.                         break;
  136.                     case 1:
  137.                         //走到了 幸运轮盘关卡.
  138.                         Console.Clear();
  139.                         DrawMap();
  140.                         Console.WriteLine("{0}走到了幸运轮盘,请选择运气?", names[playerNumber]);
  141.                         Console.WriteLine("1---交换位置 2---轰炸对方");
  142.                         int userSelect = ReadInt(1, 2);
  143.                         if (userSelect == 1)
  144.                         {//要与对方交换位置
  145.                             int temp = playerPos[0];
  146.                             playerPos[0] = playerPos[1];
  147.                             playerPos[1] = temp;
  148.                             msg = string.Format("{0}选择了与对方交换位置!", names[playerNumber]);
  149.                         }
  150.                         else
  151.                         {
  152.                             //轰炸对方
  153.                             playerPos[1-playerNumber] = playerPos[1-playerNumber] - 6;
  154.                             CheckPos();
  155.                             msg = string.Format("{0}轰炸了{1},{1}退6格", names[playerNumber], names[1-playerNumber]);
  156.                         }

  157.                         break;
  158.                     case 2:
  159.                         //踩到了地雷.
  160.                         playerPos[playerNumber] = playerPos[playerNumber] - 6;
  161.                         CheckPos();
  162.                         msg = string.Format("{0}踩到了地雷,退6格", names[playerNumber]);
  163.                         break;
  164.                     case 3:
  165.                         //暂停一次.
  166.                         isStop[playerNumber] = true;
  167.                         msg = string.Format("{0}走到红灯,下次暂停一次!", names[playerNumber]);
  168.                         break;
  169.                     case 4:
  170.                         //时空隧道.
  171.                         playerPos[playerNumber] = playerPos[playerNumber] + 10;
  172.                         CheckPos();
  173.                         msg = string.Format("{0}进入时空隧道,爽死了,进10步!", names[playerNumber]);
  174.                         break;
  175.                 }
  176.             }
  177.             Console.Clear();
  178.             DrawMap();
  179.             if (msg != "")
  180.             {
  181.                 Console.WriteLine(msg);
  182.             }
  183.             Console.WriteLine("{0}掷出了{1},行动完成!", names[playerNumber], step);
  184.             Console.WriteLine("**********************玩家A和玩家B的位置如下***************************");
  185.             Console.WriteLine("{0}的位置为{1}", names[0], playerPos[0] + 1);
  186.             Console.WriteLine("{0}的位置为{1}", names[1], playerPos[1] + 1);         
  187.         }
复制代码

作者: 张林杰    时间: 2013-4-15 19:05
  1.       /// <summary>
  2.         /// 用于绘制飞行棋的名称
  3.         /// </summary>
  4.         static void ShowUI()
  5.         {
  6.             Console.WriteLine("*********************************************");
  7.             Console.WriteLine("*                                           *");
  8.             Console.WriteLine("*            骑  士  飞  行  棋             *");
  9.             Console.WriteLine("*                                           *");
  10.             Console.WriteLine("*********************************************");
  11.         }
  12.         /// <summary>
  13.         /// 进行玩家A和玩家B坐标越界的判断
  14.         /// </summary>
  15.         static void CheckPos()
  16.         {
  17.             for (int i = 0; i <= 1; i++)
  18.             {
  19.                 if (playerPos[i] > 99)
  20.                 {
  21.                     playerPos[i] = 99;
  22.                 }
  23.                 if (playerPos[i] < 0)
  24.                 {
  25.                     playerPos[i] = 0;
  26.                 }
  27.             }
  28.         }
  29.         /// <summary>
  30.         /// 对地图中的关卡进行初始化
  31.         /// </summary>
  32.         static void InitialMap()
  33.         {
  34.             //用于存储在地图中为地雷的下标
  35.             int[] luckTurn = { 6, 23, 40, 55, 69, 83 };//幸运轮盘1
  36.             int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//地雷2
  37.             int[] pause = { 9, 27, 60, 93 };//暂停的坐标3
  38.             int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90, 99 };//时间隧道4

  39.             for (int i = 0; i < luckTurn.Length; i++)
  40.             {
  41.                 Map[luckTurn[i]] = 1;
  42.             }

  43.             for (int i = 0; i < landMine.Length; i++)
  44.             {
  45.                 Map[landMine[i]] = 2;
  46.             }

  47.             for (int i = 0; i < pause.Length; i++)
  48.             {
  49.                 Map[pause[i]] = 3;
  50.             }

  51.             for (int i = 0; i < timeTunnel.Length; i++)
  52.             {
  53.                 Map[timeTunnel[i]] = 4;
  54.             }
  55.         }

  56.         //在数组中用  1:表标幸运轮盘◎
  57.         //            2:地雷☆
  58.         //            3:暂停▲
  59.         //            4:时空隧道卐
  60.         //            5:表示普通□

  61.         /// <summary>
  62.         /// 获得第pos坐标上应该绘制的图案
  63.         /// </summary>
  64.         /// <param name="pos">要绘制的坐标</param>
  65.         /// <returns></returns>
  66.         static string GetMapString(int pos)
  67.         {
  68.             string result = "";
  69.             //判断A和B是否在当前要画的第i格上
  70.             if (playerPos[0] == pos && playerPos[1] == pos)
  71.             {
  72.                 Console.ForegroundColor = ConsoleColor.Yellow;
  73.                 result = "<>";
  74.             }
  75.             else if (playerPos[0] == pos) //判断A在当前画的格上
  76.             {
  77.                 Console.ForegroundColor = ConsoleColor.Yellow;
  78.                 result = "A";
  79.             }
  80.             else if (playerPos[1] == pos)//判断B在当前画的格上
  81.             {
  82.                 Console.ForegroundColor = ConsoleColor.Yellow;
  83.                 result = "B";
  84.             }
  85.             else
  86.             {
  87.                 switch (Map[pos])
  88.                 {
  89.                     case 0:
  90.                         Console.ForegroundColor = ConsoleColor.White;
  91.                         result = "□";
  92.                         break;
  93.                     case 1:
  94.                         Console.ForegroundColor = ConsoleColor.Red;
  95.                         result = "◎";
  96.                         break;
  97.                     case 2:
  98.                         Console.ForegroundColor = ConsoleColor.Green;
  99.                         result = "☆";
  100.                         break;
  101.                     case 3:
  102.                         Console.ForegroundColor = ConsoleColor.Blue;
  103.                         result = "▲";
  104.                         break;
  105.                     case 4:
  106.                         Console.ForegroundColor = ConsoleColor.DarkBlue;
  107.                         result = "卐";
  108.                         break;
  109.                 }
  110.             }
  111.             return result;
  112.         }

  113.         static void DrawMap()
  114.         {
  115.             Console.WriteLine("图例:幸运轮盘:◎  地雷:☆  暂停:▲  时空隧道:卐");

  116.             //画第一行--绘制下标从0-29格的地图
  117.             for (int i = 0; i <= 29; i++)
  118.             {
  119.                 Console.Write(GetMapString(i));
  120.             }
  121.             //第一行绘制完毕
  122.             Console.WriteLine();

  123.             //绘制第一列
  124.             for (int i = 30; i <= 34; i++)
  125.             {
  126.                 //绘制29个双空格
  127.                 for (int j = 0; j < 29; j++)
  128.                 {
  129.                     Console.Write("  ");
  130.                 }
  131.                 //Console.WriteLine(GetMapString(i));
  132.                 string str = GetMapString(i);
  133.                 Console.WriteLine(str);
  134.             }

  135.             //绘制第二行
  136.             for (int i = 64; i >= 35; i--)
  137.             {
  138.                 Console.Write(GetMapString(i));
  139.             }

  140.             Console.WriteLine();
  141.             //绘制第二列
  142.             for (int i = 65; i <= 69; i++)
  143.             {
  144.                 Console.WriteLine(GetMapString(i));
  145.             }

  146.             //绘制第三行
  147.             for (int i = 70; i <= 99; i++)
  148.             {
  149.                 Console.Write(GetMapString(i));
  150.             }
  151.             Console.WriteLine();
  152.             Console.ResetColor();


  153.         }

  154.         /// <summary>
  155.         /// 输入一个整数
  156.         /// </summary>
  157.         /// <returns></returns>
  158.         static int ReadInt()
  159.         {
  160.             int i = ReadInt(int.MinValue, int.MaxValue);
  161.             return i;
  162.         }

  163.         /// <summary>
  164.         /// ReadInt方法实现输入两个整数(包含)之间的数.
  165.         /// </summary>
  166.         /// <param name="min">所给出的最小范围</param>
  167.         /// <param name="max">所给出的最大范围</param>
  168.         /// <returns></returns>
  169.         static int ReadInt(int min, int max)
  170.         {
  171.             while (true)
  172.             {
  173.                 try
  174.                 {
  175.                     int number = Convert.ToInt32(Console.ReadLine());
  176.                     if (number < min || number > max)
  177.                     {
  178.                         Console.WriteLine("只能输入{0}-{1}之间的数字,请重新输入!", min, max);
  179.                     }
  180.                     return number;
  181.                 }
  182.                 catch
  183.                 {
  184.                     Console.WriteLine("只能输入数字,请重新输入!");
  185.                 }
  186.             }
  187.         }

  188.     }
  189. }
复制代码

作者: 陈行    时间: 2013-4-15 19:20
听了苏坤老师讲的第一.二课,自己独立完成了这个游戏,但是代码多出苏坤老师200行。。。
作者: 殇_心。    时间: 2013-4-15 19:21
都是大神啊。。```  路过~~!
作者: 马伟奇    时间: 2013-4-15 20:55
多谢楼主分享,顶起,下次最好截图,然后把代码传上来
作者: 张林杰    时间: 2013-4-16 23:52
淡.。 发表于 2013-4-15 19:20
听了苏坤老师讲的第一.二课,自己独立完成了这个游戏,但是代码多出苏坤老师200行。。。 ...

{:3_57:}厉害!我刚学,照着视频打得,找时间自己一定要独立完成
作者: 张林杰    时间: 2013-4-16 23:55
马伟奇 发表于 2013-4-15 20:55
多谢楼主分享,顶起,下次最好截图,然后把代码传上来

嗯,这贴还是我的第一贴,不太熟悉论坛功能,下次注意{:3_57:}
作者: 雨中的台北    时间: 2013-4-17 14:33
我学的是JAVA  多支持支持   大家一起加油
作者: 崔宏奎    时间: 2013-4-21 16:27
额。。。。
可是我为什么只用了200行,就写完了。。。。。

http://blog.csdn.net/john123951/article/details/8802659
作者: wang346351    时间: 2013-4-23 18:50
为啥我下载的视频里没有这个呢?  你们是光盘里有的吗?
作者: 张林杰    时间: 2013-4-24 20:06
wang346351 发表于 2013-4-23 18:50
为啥我下载的视频里没有这个呢?  你们是光盘里有的吗?

就是在黑马下载视频中的,给个链接http://edu.csdn.net/dotnet/service/dotnetcourse.shtml
传智播客上下的没有这个飞行棋的




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