欢迎光临散文网 会员登陆 & 注册

控制台2048游戏

2018-01-17 22:09 作者:程序员小明哥  | 我要投稿

众所周知,unity中用的最多的脚本是C#。所以,为了巩固大家的C#语法,特给大家带来一个练习c#函数和二维数组的实例——控制台2048。

现将代码贴出,大家来学习学习吧!代码中有详细的注释,大家很容易理解哒!如果大家觉得太多一点一点翻看太麻烦的话,可以先复制到IDE里,然后在详细的看哦!

这个是主类,“Program.cs”这个是整个游戏的逻辑代码。

using System;

namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            bool isReset = true;


            while (isReset)

            {

                ArrayTwoMove move = new ArrayTwoMove();

                int[,] map = new int[4, 4];//2048游戏地图

                map = CreateNewNumber(map);

                map = CreateNewNumber(map);


                bool b = true;


                while (b)

                {

                    Console.Clear();//控制台清除

                    PrintMap(map);

                    Console.Write("请按“↑”、“↓”、“←”、“→”方向键执行相对应的操作!");

                    var v = Console.ReadKey();

                    switch (v.Key)

                    {

                        case ConsoleKey.UpArrow: map = move.MoveArray2Up(map); break;//上

                        case ConsoleKey.DownArrow: map = move.MoveArray2Down(map); break;//下

                        case ConsoleKey.LeftArrow: map = move.MoveArray2Left(map); break;//左

                        case ConsoleKey.RightArrow: map = move.MoveArray2Right(map); break;//右

                    }


                    if (IsGameOver(map)) { b = false; }

                }

                bool d=true ;

                while (d)

                {

                    Console.Clear();//控制台清除

                    GameOverMap();

                    Console.WriteLine("\t\t   ============是否重新开始游戏!============");

                    Console.WriteLine("\t\t   ============Enter\"开始\",Esc\"结束\"============");

                    var xv = Console.ReadKey();

                    switch (xv.Key)

                    {

                        case ConsoleKey.Enter: isReset = true; d = false; break;

                        case ConsoleKey.Escape: isReset = false; d = false; break;

                        default: d = true; break;

                    }

                }

            }

        }


        /// <summary>

        /// 2048地图控制台打印

        /// </summary>

        /// <param name="map"></param>

        private static void PrintMap(int[,] map)

        {

            Console.Write("\n\n");

            Console.WriteLine("\t\t   ============控制台2048游戏============");

            for (int r = 0; r <= map.GetUpperBound(0); r++)

            {

                Console.Write("\n\n\t\t|----------|----------|----------|----------|\n");

                Console.Write("\t\t|   ");


                for (int c = 0; c <= map.GetUpperBound(0); c++)

                {

                    if (map[r, c] == 0)

                    {

                        //Console.ForegroundColor = ConsoleColor.Cyan;

                        Console.Write("    " + "   |   ");

                    }

                    else

                    {

                        switch (map[r, c])

                        {

                            case 2: Console.ForegroundColor = ConsoleColor.DarkGray; break;//深灰色

                            case 4: Console.ForegroundColor = ConsoleColor.Gray; break;//灰色

                            case 8: Console.ForegroundColor = ConsoleColor.White; break;//白色

                            case 16: Console.ForegroundColor = ConsoleColor.Blue; break;//蓝色

                            case 32: Console.ForegroundColor = ConsoleColor.Cyan; break;//青色

                            case 64: Console.ForegroundColor = ConsoleColor.DarkYellow; break;//深黄色

                            case 128: Console.ForegroundColor = ConsoleColor.Yellow; break;//黄色

                            case 256: Console.ForegroundColor = ConsoleColor.Magenta; break;//紫红色

                            case 512: Console.ForegroundColor = ConsoleColor.Red; break;//红色

                            case 1024: Console.ForegroundColor = ConsoleColor.Green; break;//绿色

                            default: Console.ForegroundColor = ConsoleColor.Green; break;

                        }

                        Console.Write("{0,4}   |   ", map[r, c]);

                    }

                }

                //Console.Write("\n\t\t|----------|----------|----------|----------|\n");

                //Console.Write("\n\t\t|          |          |          |          |\n");

            }

            Console.Write("\n\t\t|----------|----------|----------|----------|\n");

        }


        private static Random random = new Random();

        /// <summary>

        /// 在2048地图上生成新的数组(2(80%)或4(20%))

        /// </summary>

        /// <param name="map"></param>

        public static int[,] CreateNewNumber(int[,] map)

        {

            bool b = true;

            while (b)

            {

                int x = random.Next(0, map.GetUpperBound(0) + 1);

                int y = random.Next(0, map.GetUpperBound(0) + 1);

                if (map[x, y] == 0)

                {

                    b = false;

                    int res = random.Next(1, 6) == 1 ? 4 : 2;

                    map[x, y] = res;

                }

            }

            return map;


        }


        /// <summary>游戏结束界面

        /// 游戏结束界面

        /// </summary>

        private static void GameOverMap()

        {

            Console.Write("\n\n");

            Console.WriteLine("\t\t   ============游戏结束============\n\n\n\n");

        }


        /// <summary>查找2048地图里面是否还有空的位置

        /// 查找2048地图里面是否还有空的位置

        /// </summary>

        /// <param name="map">2048地图</param>

        /// <returns></returns>

        public static bool IsNull(int[,] map)

        {

            int[] tem = new int[map.GetUpperBound(0) + 1];

            for (int r = 0; r < map.GetUpperBound(0) + 1; r++)

            {

                for (int c = 0; c < map.GetUpperBound(0) + 1; c++)

                {

                    tem[c] = map[r, c];

                }

                foreach (var item in tem)

                {

                    if (item == 0) { return true; }

                }

            }

            return false;

        }


        /// <summary>判断2048游戏是否结束

        /// 判断2048游戏是否结束

        /// </summary>

        /// <param name="map">2048地图</param>

        /// <returns></returns>

        private static bool IsGameOver(int[,] map)

        {

            if (IsNull(map)) { return false; }//地图有空位置  不满足游戏结束的条件

            else//地图没有有空位置

            {

                if (IsHNoAdd(map) && IsVNoAdd(map))

                { return true; }

                else { return false; }

            }

        }


        /// <summary>判断数组里面的所有成员有没有符合相邻相同非零的条件存在

        /// 判断数组里面的所有成员有没有符合相邻相同非零的条件存在

        /// </summary>

        /// <param name="array">数组</param>

        /// <returns></returns>

        private static bool IsAddOk(int[] array)

        {

            for (int i = 0; i < array.Length - 1; i++)

            {

                if (array[i] == array[i + 1] && array[i] != 0)

                {

                    return true;

                }

            }

            return false;

        }


        /// <summary>查阅2048地图每一行有没有符合相邻相同非零的条件存在

        /// 查阅2048地图每一行有没有符合相邻相同非零的条件存在

        /// </summary>

        /// <param name="map">2048地图</param>

        /// <returns></returns>

        public static bool IsHNoAdd(int[,] map)

        {

            int[] tem = new int[map.GetUpperBound(0) + 1];

            for (int r = 0; r < map.GetUpperBound(0) + 1; r++)

            {

                for (int c = 0; c < map.GetUpperBound(0) + 1; c++)

                {

                    tem[c] = map[r, c];

                }

                if (IsAddOk(tem)) { return false; }

            }

            return true;

        }


        /// <summary>查阅2048地图每一列有没有符合相邻相同非零的条件存在

        /// 查阅2048地图每一列有没有符合相邻相同非零的条件存在

        /// </summary>

        /// <param name="map">2048地图</param>

        /// <returns></returns>

        public static bool IsVNoAdd(int[,] map)

        {

            int[] tem = new int[map.GetUpperBound(0) + 1];

            for (int r = 0; r < map.GetUpperBound(0) + 1; r++)

            {

                for (int c = 0; c < map.GetUpperBound(0) + 1; c++)

                {

                    tem[c] = map[c, r];

                }

                if (IsAddOk(tem)) { return false; }

            }

            return true;

        }

    }

}

接下来是游戏数据的处理。即交换数字,移动数字,合并数字等等。

using System;


namespace ConsoleApplication1

{

    class ArrayTwoMove

    {   //                     去零          相加            去零

        //   0,2,2,4     ==>  2,2,4,0   ==>  4,0,4,0   ==>  4,4,0,0

        private int[]MoveLeftOrUp(int[]array)//去零

        {

            int[] newA = new int[array.Length];//   0,0,0,0

            int index=0;


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

            {

                if(array [i]!=0)

                {

                    newA[index] = array[i];//  2,0,0,0

                    index++;

                }

            }

            return newA;

        }

        private int[] Add(int[] array)//相邻相同非零相加   2,2,4,0   4,0,4,0

        {

            for (int i = 0; i < array.Length-1; i++)

            {

                if(array [i]==array [i+1]&&array [i]!=0)

                {

                    array[i] *= 2;

                    array[i + 1] = 0;

                }

            }

            return array;

        }


        /// <summary>2048左移动算法

        /// 2048左移动算法

        /// </summary>

        /// <param name="map">地图二维数组</param>

        /// <returns></returns>

        public int[,] MoveArray2Left(int[,]map)

        {

            //0,2,2,4     4,4,0,0

            //2,0,8,4     2,8,4,0

            //0,0,2,2     4,0,0,0

            //2,4,4,4     2,8,4,0


            bool b = true;

            if (Program.IsHNoAdd(map)&&!Program .IsNull(map)) { b = false; }

            if (b)

            {

                int[] tem = new int[map.GetUpperBound(0) + 1];

                for (int r = 0; r < map.GetUpperBound(0) + 1; r++)

                {

                    for (int c = 0; c < map.GetUpperBound(0) + 1; c++)

                    {

                        tem[c] = map[r, c];

                    }

                    tem = MoveLeftOrUp(tem);

                    tem = Add(tem);

                    tem = MoveLeftOrUp(tem);

                    for (int c = 0; c < map.GetUpperBound(0) + 1; c++)

                    {

                        map[r, c] = tem[c];

                    }

                }

                map = Program.CreateNewNumber(map);

                return map;

            }

            return map;

        }

        /// <summary>2048右移动算法

        /// 2048右移动算法

        /// </summary>

        /// <param name="map">地图二维数组</param>

        /// <returns></returns>

        public int[,] MoveArray2Right(int[,] map)

        {

            //0,2,2,4     0,0,4,4

            //2,0,8,4     0,2,8,4

            //0,0,2,2     0,0,0,4

            //2,4,4,4     0,2,4,8

            bool b = true;

            if (Program.IsHNoAdd(map) && !Program.IsNull(map)) { b = false; }

            if (b)

            {

                int[] tem = new int[map.GetUpperBound(0) + 1];


                for (int r = 0; r < map.GetUpperBound(0) + 1; r++)

                {

                    for (int c = 3; c >= 0; c--)

                    {

                        tem[3 - c] = map[r, c];

                    }

                    tem = MoveLeftOrUp(tem);

                    tem = Add(tem);

                    tem = MoveLeftOrUp(tem);

                    for (int c = 0; c < map.GetUpperBound(0) + 1; c++)

                    {

                        map[r, c] = tem[3 - c];

                    }

                }

                map = Program.CreateNewNumber(map);

                return map;

            }

            return map;

        }

        /// <summary> 2048上移动算法

        /// 2048上移动算法

        /// </summary>

        /// <param name="map">地图二维数组</param>

        /// <returns></returns>

        public int[,] MoveArray2Up(int[,] map)

        {

            bool b = true;

            if (Program.IsVNoAdd(map) && !Program.IsNull(map)) { b = false; }

            if (b)

            {

                int[] tem = new int[map.GetUpperBound(0) + 1];


                for (int r = 0; r < map.GetUpperBound(0) + 1; r++)

                {

                    for (int c = 0; c < map.GetUpperBound(0) + 1; c++)

                    {

                        tem[c] = map[c, r];

                    }

                    tem = MoveLeftOrUp(tem);

                    tem = Add(tem);

                    tem = MoveLeftOrUp(tem);

                    for (int c = 0; c < map.GetUpperBound(0) + 1; c++)

                    {

                        map[c, r] = tem[c];

                    }

                }

                map = Program.CreateNewNumber(map);

                return map;

            }

            return map;

        }

        /// <summary>2048下移动算法

        /// 2048下移动算法

        /// </summary>

        /// <param name="map">地图二维数组</param>

        /// <returns></returns>

        public int[,] MoveArray2Down(int[,] map)

        {

            bool b = true;

            if (Program.IsVNoAdd(map) && !Program.IsNull(map)) { b = false; }

            if (b)

            {

                int[] tem = new int[map.GetUpperBound(0) + 1];


                for (int r = 0; r < map.GetUpperBound(0) + 1; r++)

                {

                    for (int c = 3; c >= 0; c--)

                    {

                        tem[3 - c] = map[c, r];

                    }

                    tem = MoveLeftOrUp(tem);

                    tem = Add(tem);

                    tem = MoveLeftOrUp(tem);

                    for (int c = 0; c < map.GetUpperBound(0) + 1; c++)

                    {

                        map[3 - c, r] = tem[c];

                    }

                }

                map = Program.CreateNewNumber(map);

                return map;

            }

            return map;

        }

    }

}

好啦,今天的分享就到这里,内容可能有点多,大家可以直接复制到IDE里面测试,在IDE里面具体查看代码哟!我们下期再见吧!!

控制台2048游戏的评论 (共 条)

分享到微博请遵守国家法律