现在的位置: 首页 > 综合 > 正文

黑马程序员_学习日记2_飞行棋

2013年12月08日 ⁄ 综合 ⁄ 共 11340字 ⁄ 字号 评论关闭

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

4月13日
       今天看了一天的视频,把骑士飞行棋的代码讲解看完了,自己边看边写,终于完成了374行代码的编写,算是我的第一个完整的程序。该程序是对面向过程编程的总结,多看注释,其中体现了各种编程方法的思想。贴出来算我今天的学习日记,也算一个小小的纪念。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace 骑士飞行棋

{

    classProgram

    {

        //在下面数组中存储我们游戏地图各关关卡

        //数组下标为0的元素对应地图上的第一格  下标为1的元素对应第2格...下标为n的元素对应n+1格

        //在数组中用 
1:表示幸运轮盘◎

        //            2:地雷☆

        //            3:暂停▲

        //            4:时空隧道卐

        //            0:表示普通□

        //isStop[0]表示A是否上一次走到了暂停,isStop[1]表示B是否上一次走到了暂停。如果走到暂停,则设其值为true

        staticbool[] isStop = {
false,false };

        staticint[] Map =
newint[100];

        staticint[] playerPos = { 0, 0 };//playerPos[0]存玩家A的下标,playerPos[1]存玩家B的下标

        staticstring[] names =
newstring[2];
//names[0]
存玩家A;names[1]存玩家B

        staticvoid Main(string[] args)

        {

           

          

           

            ShowUI(); //显示游戏名称

            Console.WriteLine("请输入玩家A的姓名?");

            names[0] = Console.ReadLine();

            //判断用户输入的内容是否为空,空则重输

            while(names[0] ==
""
)

            {

                Console.WriteLine("玩家A的姓名不能为空,请重输!");

                names[0] = Console.ReadLine();

            }

            Console.WriteLine("请输入玩家B的姓名?");

            names[1] = Console.ReadLine();

            while(names[1] ==
""
|| names[1] ==names[0])

            {

                if (names[1] ==
""
)

                    Console.WriteLine("玩家B姓名不能为空,请重输!");

                if (names[1] == names[0])

                    Console.WriteLine("改姓名已被玩家A占用,请重输!");

                names[1] = Console.ReadLine();

            }

            Console.Clear();

            ShowUI();

            Console.WriteLine("对战开始......");

            Console.WriteLine("{0}用A来表示",names[0]);

            Console.WriteLine("{0}用B来表示",names[1]);

            Console.WriteLine("如果AB在同一位置,用<>来表示");

            InitialMap(); //初始化地图

            DrawMap(); //绘制地图

            Console.WriteLine("开始游戏......");

            //循环中让两玩家轮流掷骰子,当有一个玩家的坐标>=99时结束循环

            while(playerPos[0]<99&&playerPos[1]<99)

            {

                if (isStop[0] ==
false
)

                {

                    Action(0);

                }

                else

                {// 说明isStop==true

                    isStop[0] = false;

                }

                if (playerPos[0] >= 99)

                {

                    break;

                }

                if(isStop[1] ==
false
)

                {

                    Action(1);

                }

                else

                {

                    isStop[1] = true;

                }

            }

            //判断谁胜谁负

            Console.Clear();

            ShowUI();

            if(playerPos[0] >= 99)

            {

                Console.WriteLine("{0}胜利了!!!", names[0]);

            }

            if(playerPos[1] >= 99)

            {

                Console.WriteLine("{0}胜利了!!!", names[1]);

            }

            Console.ReadKey();

        }

        ///<summary>

        /// A或B掷骰子的方法  

        ///</summary>

        ///<paramname="playerNumber">A掷骰子传0过来  B掷骰子传1过来</param>

        staticvoid Action(intplayerNumber)

        {

            //playerNumber中村的是当前玩家姓名、坐标、是否暂停这三个数组的下标

            //1-playerNumber就是对方下标

           

            Randomr =
new
Random();//r是产生随机数用的

            stringmsg =
""
;//用于存储用户踩到某关卡输出的话

            intstep = 0;//用于存放产生的随机数

            Console.WriteLine("{0}按任意键开始掷骰子......", names[playerNumber]);

            ConsoleKeyInforec =
Console.ReadKey(true);
//确定是否在控制台窗口中显示按下的键。true
表示不显示按下的键;否则为 false

            if(rec.Key ==
ConsoleKey
.Tab)

            {

                step = 20;

            }

            else

            {

                step = r.Next(1, 7);//产生一个1-6间的随机整数。可不可以直接写step=Ramdom.Next(1,7);

            }

            Console.WriteLine("{0}掷出了:{1}", names[playerNumber], step);

            Console.WriteLine("按任意键开始行动......");

            Console.ReadKey(true);

            playerPos[playerNumber]= playerPos[playerNumber] + step;//注意一旦坐标发生改变,就要判断坐标值是否>99或<0

            CheckPos(); //检测坐标是否越界

            if(playerPos[0] == playerPos[1])//玩家A踩到玩家B

            {

                playerPos[1-playerNumber]= 0;

                msg = string.Format("{0}踩到了{1},{1}退回原点!", names[playerNumber],names[1-playerNumber]);

            }

            else

            {//没踩到,要判断玩家A所在位置是否有关卡

                switch (Map[playerPos[playerNumber]])

                {

                    case 0:

                        //普通,没有效果

                        msg = "";

                        break;

                    case 1:

                        //幸运轮盘

                        Console.Clear();

                        DrawMap();

                        Console.WriteLine("欢迎{0}来到幸运轮盘,请选择一种好运:", names[playerNumber]);

                        Console.WriteLine("1——交换位置 
2——轰炸对方");

                        int userSelect = ReadInt(1, 2);

                        if (userSelect == 1)

                        {//要与对方交换位置

                            int temp = playerPos[0];

                           playerPos[0] = playerPos[1];

                           playerPos[1] = temp;

                            msg = string.Format("{0}选择了与对方交换位置!", names[playerNumber]);

                        }

                        else

                        { //轰炸对方

                           playerPos[1-playerNumber] = playerPos[1-playerNumber] - 6;

                           CheckPos();

                            msg = string.Format("{0}轰炸了{1},{1}退6格!", names[playerNumber],names[1-playerNumber]);

                        }

                        break;

                    case 2:

                        //地雷

                       playerPos[playerNumber] = playerPos[playerNumber] - 6;

                        CheckPos();

                        msg = string.Format("{0}踩到了地雷,退6格!", names[playerNumber]);

                        break;

                    case 3:

                        //暂停一次

                        isStop[playerNumber] =
true
;

                        msg = string.Format("{0}走到红灯,暂停一次", names[playerNumber]);

                        break;

                    case 4:

                        //时空隧道

                       playerPos[playerNumber] += 10;

                        CheckPos();

                        msg = string.Format("{0}进入时空隧道,恭喜你,进10格!", names[playerNumber]);

                        break;

                }

            }

            Console.Clear();

            DrawMap();

            if(msg !=
""
)

            {

                Console.WriteLine(msg);

            }

            Console.WriteLine("{0}掷出了{1},行动完成!", names[playerNumber], step);

            Console.WriteLine("*************玩家A和玩家B的位置如下************");

            Console.WriteLine("{0}的位置为:{1}", names[0], playerPos[0] + 1);

            Console.WriteLine("{0}的位置为:{1}", names[1], playerPos[1] + 1);

        }

        ///<summary>

        ///用于绘制飞行棋的名称

        ///</summary>

        staticvoid ShowUI()

        {

            Console.WriteLine("********************************************");

            Console.WriteLine("*                                        
*");

            Console.WriteLine("*       
骑   士   飞   行   棋            *");

            Console.WriteLine("*                                        
*");

            Console.WriteLine("********************************************");

        }

        ///<summary>

        ///进行玩家A和玩家B坐标越界的判断

        ///</summary>

        staticvoid CheckPos()

        {

            for(int i = 0; i <= 1; i++)

            {

                if (playerPos[i] > 99)

                {

                    playerPos[i] =99;

                }

                if (playerPos[i] < 0)

                {

                    playerPos[i] =0;

                }

            }

        }

        ///<summary>

        ///对地图中的关卡进行初始化

        ///</summary>

        staticvoid InitialMap()

        {

            //用于存储在地图上为特殊符号的下标

            int[]luckyTurn = { 6, 23, 40, 55, 69, 83 };//幸运轮盘 
1

            int[]landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//地雷 
2

            int[]pause = { 9, 27, 60, 93 };//暂停 
3

            int[]timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//时空隧道 
4

            for(int i = 0; i < luckyTurn.Length; i++)

            {

                int pos = luckyTurn[i];

                Map[pos] = 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 < timeTunnel.Length; i++)

               Map[timeTunnel[i]]=4;

        }

        ///<summary>

        ///获得第pos坐标上要绘的图案

        ///</summary>

        ///<param name="pos">要绘制的坐标</param>

        ///<returns></returns>

        staticstring GetMapString(intpos)

        {

            stringresult="";   

            //判断A和B是否在当前要画的第i格上

            if(playerPos[0] == pos && playerPos[1] == pos)

            {

                Console.ForegroundColor=
ConsoleColor.Yellow;

                result="<>";

            }

            elseif (playerPos[0] == pos)
//A在当前格上

            {

                Console.ForegroundColor =
ConsoleColor.Yellow;

                result="A";

            }

            elseif (playerPos[1] == pos)
//B在当前格上

            {

                Console.ForegroundColor =
ConsoleColor.Yellow;

                result="B";

            }

            else

            {

                switch (Map[pos])

                {

                    case 0:

                        Console.ForegroundColor =
ConsoleColor.White;

                        result="□";

                        break;

                    case 1:

                        Console.ForegroundColor =
ConsoleColor.Red;

                        result = "◎";

                        break;

                    case 2:

                        Console.ForegroundColor =
ConsoleColor.Green;

                        result = "☆";

                        break;

                    case3:

                        Console.ForegroundColor =
ConsoleColor.Blue;

                        result = "▲";

                        break;

                    case 4:

                        Console.ForegroundColor =
ConsoleColor.DarkBlue;

                        result = "卐";

                        break;

                }

            }

            returnresult;

        }

        staticvoid DrawMap()

        {

            Console.WriteLine("图例:幸运轮盘:◎ 
地雷:☆  暂停:▲  时空隧道:卐");

            //画第一行 
绘制下标从0到29的

            for(int i=0;i<=29;i++)

            {

                Console.Write(GetMapString(i));

            }

            //第一行绘制完

            Console.WriteLine();

           

            //绘制第一列

            for(int i=30;i<=34;i++)

            {

                //绘制29个双空格

                for(intj=0;j<29;j++)

                {

                    Console.Write(
");

                }

                Console.WriteLine(GetMapString(i));

            }

            //绘制第二行

            for (int i = 64; i >= 35; i--)

            {

                Console.Write(GetMapString(i));

            }

            Console.WriteLine();

            //绘制第二列

            for(int i = 65; i <= 69; i++)

            {

                Console.WriteLine(GetMapString(i));

            }

            //绘制第三行

            for(int i = 70; i <=99; i++)

            {

                Console.Write(GetMapString(i));

            }

            Console.WriteLine();

            Console.ResetColor();

        }

        staticint ReadInt()

        {

            inti = ReadInt(int.MaxValue,
int.MinValue);

            returni;

        }

        staticint ReadInt(intmin,
int max)

        {

            while(true)

            {

                try

                {

                    intnumber =
Convert
.ToInt32(Console.ReadLine());

                    if (number < min || number > max)

                    {

                        Console.WriteLine("只能输入{0}-{1}之间的数字!", min, max);

                        continue;

                    }

                    return number;

                }

                catch

                {

                    Console.WriteLine("只能输入数字,请重新输入!");

                }

            }

        }

    }

}

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

抱歉!评论已关闭.