控制台实现2048小游戏 c#

需求

  • 上移
    * --从上到下 获取列数据,形成一维数组
    * --合并数据
    * --去零:将0元素移到末尾
    * --相邻相同,则合并(将后一个元素累加到前一个元素上,后一个元素清零)
    * --2 2 0 0 ==> 4 0 0 0
    * --去零:将0元素移到末尾
    * --2 2 2 0 ==> 4 0 2 0 ==> 4 2 0 0
    * --2 0 2 0 ==> 2 2 0 0 ==> 4 0 0 0
    * --2 0 2 4 ==> 2 2 4 0 ==> 4 0 4 0 ==> 4 4 0 0
    * --将一维数组元素还原至原列
  • 下移2.0
    * --从下到上 获取列数据,形成一维数组
    * --合并数据
    * --去零:将0元素移到末尾
    * --相邻相同,则合并(将后一个元素累加到前一个元素上,后一个元素清零)
    * --去零:将0元素移到末尾
    * --将一维数组元素还原至原列
  • 左移
  • 右移

编码

  1. 定义去零方法(针对一维数组):将0元素移到末尾
  2. 合并数据方法(针对一维数组)
    * --去零:将0元素移到开头
    * --相邻相同,则合并(将前一个元素累加到后一个元素上,前一个元素清零)
    * --去零:将0元素移到开头
  3. 上移
    * --从上到下获取数据列,形成一维数组
    * --调用合并数据方法
    * --将一维数组元素还原至原列
  4. 下移
    * --从下到上获取数据列,形成一维数组
    * --调用合并数据方法
    * --将一维数组元素还原至原列
  5. 左移
  6. 右移

代码实现

using System;

namespace Day05
{
    class Program
    {
        static void Main1(string[] args)
        {
            //数组分类:一维数组 多(二)维数组 交错数组
            //创建5行3列的二维数组
            int[,] array = new int[5,3];
            //将数据6赋值给数组的第一行第三列
            array[1, 2] = 6;
            array[0, 2] = 456;

            //获取二维数组中所有元素
            foreach (int item in array)
            {
                Console.WriteLine(item);
            }

            //将第一行显示到控制台中
            //array.GetLength()获取指定维数的长度
            //array.GetLength(0)获取行数
            //array.GetLength(1)获取列数
            for (int r = 0; r < array.GetLength(0); r++)
            {
                for(int c = 0;c < array.GetLength(1); c++)
                {
                    Console.Write(array[r,c]+"\t");
                }
                Console.WriteLine();
            }

            Console.ReadLine();
        }
        /***************************2048核心算法*****************************************************/
        /*
         * 需求分析**************************************************************************
          上移
         * --从上到下 获取列数据,形成一维数组
         * --合并数据
         *   --去零:将0元素移到末尾
         *   --相邻相同,则合并(将后一个元素累加到前一个元素上,后一个元素清零)
         *   --2 2 0 0 ==> 4 0 0 0 
         *   --去零:将0元素移到末尾
         *   --2 2 2 0 ==> 4 0 2 0 ==> 4 2 0 0
         *   --2 0 2 0 ==> 2 2 0 0 ==> 4 0 0 0 
         *   --2 0 2 4 ==> 2 2 4 0 ==> 4 0 4 0 ==> 4 4 0 0 
         * --将一维数组元素还原至原列
         * 
         * 
          下移1.0
         * --从上到下 获取列数据,形成一维数组
         * --合并数据
         *   --去零:将0元素移到开头
         *   --相邻相同,则合并(将前一个元素累加到后一个元素上,前一个元素清零)
         *   --去零:将0元素移到开头
         * --将一维数组元素还原至原列
         * 
         * 
          下移2.0
         * --从下到上 获取列数据,形成一维数组
         * --合并数据
         *   --去零:将0元素移到末尾
         *   --相邻相同,则合并(将后一个元素累加到前一个元素上,后一个元素清零)
         *   --去零:将0元素移到末尾
         * --将一维数组元素还原至原列
         * 
         * 
          左移
         * 
          右移
         *
         * 
         * 编码 **************************************************************************************************
         * 1.定义去零方法(针对一维数组):将0元素移到末尾
         * 2.合并数据方法(针对一维数组)
         *   --去零:将0元素移到开头
         *   --相邻相同,则合并(将前一个元素累加到后一个元素上,前一个元素清零)
         *   --去零:将0元素移到开头
         * 3.上移
         *   --从上到下获取数据列,形成一维数组
         *   --调用合并数据方法
         *   --将一维数组元素还原至原列
         * 4.下移
         *   --从下到上获取数据列,形成一维数组
         *   --调用合并数据方法
         *   --将一维数组元素还原至原列
         * 5.左移
         * 6.右移
         */
        static void Main(string[] args)
        {
            int[,] map = new int[4, 4]
                {
                    {2,2,4,8 },
                    {2,4,4,4 },
                    {2,8,4,0 },
                    {2,4,0,4 }
                };
            do
            {
                PrintDoubleArray(map);
                Console.WriteLine("输入您要进行的操作");
                Console.WriteLine("1.上移:输入w");
                Console.WriteLine("2.下移:输入s");
                Console.WriteLine("3.左移:输入a");
                Console.WriteLine("4.右移:输入d");
                char op = char.Parse(Console.ReadLine());
                switch (op)
                {
                    case 'w':
                        Console.WriteLine("上移");
                        map = MovuUp(map);
                        break;
                    case 's':
                        Console.WriteLine("下移");
                        map = MovuDown(map);
                        break;
                    case 'a':
                        Console.WriteLine("左移");
                        map = MovuLeft(map);
                        break;
                    case 'd':
                        Console.WriteLine("右移");
                        map = MovuRight(map);
                        break;
                    default:
                        Console.WriteLine("输入有误,请输入'w'、's'、'a'、'd'中的任意字符");
                        break;
                }
            } while (true);

            Console.ReadLine();

        }
        //打印二维数组
        private static void PrintDoubleArray(Array array)
        {
            for(int r= 0; r < array.GetLength(0); r++)
            {
                for(int c = 0;c < array.GetLength(1); c++)
                {
                    Console.Write(array.GetValue(r,c) + "\t");
                }
                Console.WriteLine();
            }
        }
        //去零方法
        private static int[] RemoveZero(int[] array)
        {
            //0 0 0 0
            int[] newArray = new int[array.Length];
            //将非零元素 依次 赋值给新数组
            int newIndex = 0;
            for(int i = 0; i < array.Length;i++)
            {
                if (array[i] != 0)
                {
                    newArray[newIndex++] = array[i];
                }
            }
            return newArray;
        }
        //合并
        private static int[] Merge(int[] array)
        {
            array = RemoveZero(array);
            //合并数据
            for(int i = 0; i < array.Length - 1; i++)
            {
                if(array[i] != 0 && array[i] == array[i + 1] )
                {
                    array[i] = array[i] + array[i + 1];
                    array[i + 1] = 0;
                    //统计合并位置
                }
            }
            return RemoveZero(array);
        }
        //上移
        private static int[,] MovuUp(int[,] map)
        {
            //从上到下 获取每列数据,形成一维数组
            /*
             *
             */
            int[] mergeArray = new int[map.GetLongLength(0)];
            for(int c = 0;c < map.GetLength(1); c++)
            {
                for (int r = 0; r < map.GetLength(0); r++)
                {
                    mergeArray[r] = map[r, c];
                }

                mergeArray = Merge(mergeArray);

                for (int r = 0; r < map.GetLength(0); r++)
                {
                    map[r, c] = mergeArray[r];
                }
            }
            return map;
        }
        //下移
        private static int[,] MovuDown(int[,] map)
        {
            //从下到上 获取每列数据,形成一维数组
            /*
             *
             */
            int[] mergeArray = new int[map.GetLongLength(0)];
            for (int c = 0; c < map.GetLength(1); c++)
            {
                for (int r = map.GetLength(0)-1; r >= 0; r--)
                {
                    mergeArray[map.GetLongLength(0)- 1 - r] = map[r, c];
                }

                mergeArray = Merge(mergeArray);

                for (int r = 0; r < map.GetLength(0); r++)
                {
                    map[r, c] = mergeArray[map.GetLength(0) -1 - r];
                }
            }
            return map;
        }
        //左移
        private static int[,] MovuLeft(int[,] map)
        {
            //从上到下 获取每列数据,形成一维数组
            /*
             *
             */
            int[] mergeArray = new int[map.GetLongLength(1)];
            for (int r = 0; r < map.GetLength(0); r++)
            {
                for (int c = 0; c < map.GetLength(1); c++)
                {
                    mergeArray[c] = map[r, c];
                }

                mergeArray = Merge(mergeArray);

                for (int c = 0; c < map.GetLength(1); c++)
                {
                    map[r, c] = mergeArray[c];
                }
            }
            return map;
        }
        //右移
        private static int[,] MovuRight(int[,] map)
        {
            //从下到上 获取每列数据,形成一维数组
            /*
             *
             */
            int[] mergeArray = new int[map.GetLongLength(1)];
            for (int r = 0; r < map.GetLength(0); r++)
            {
                for (int c = map.GetLength(1) - 1; c >= 0; c--)
                {
                    mergeArray[map.GetLongLength(1) - 1 - c] = map[r, c];
                }

                mergeArray = Merge(mergeArray);

                for (int c = 0; c < map.GetLength(1); c++)
                {
                    map[r, c] = mergeArray[map.GetLength(1) - 1 - c];
                }
            }
            return map;
        }
    }
}

致谢

代码以及实现过程来自祁天暄老师的课程
课程b站链接P75 2.C#基础08-10(1)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮助你创建一个简单的拳皇文字小游戏。这个游戏将在控制台中进行,玩家可以选择不同的角色和动作来与电脑对战。我将为你提供一个基本的代码框架,你可以在此基础上进行扩展和修改。 首先,我们需要创建一个角色类,用于表示游戏中的角色。每个角色都有自己的名称、生命值和攻击力。在控制台中,我们可以使用以下代码来定义角色类: ```csharp class Character { public string Name { get; set; } public int Health { get; set; } public int Attack { get; set; } public Character(string name, int health, int attack) { Name = name; Health = health; Attack = attack; } } ``` 接下来,我们可以创建一个游戏类,用于处理游戏逻辑和用户交互。在游戏类中,我们可以定义一些方法,例如选择角色、执行动作和判断胜负等。以下是一个示例: ```csharp class Game { private Character player; private Character computer; public void Start() { Console.WriteLine("Welcome to the Street Fighter game!"); SelectCharacters(); Fight(); PrintResult(); Console.WriteLine("Thanks for playing!"); } private void SelectCharacters() { // 玩家选择角色 Console.WriteLine("Select your character:"); // 这里可以列出可供选择的角色,例如:"1. Ryu", "2. Ken", "3. Chun-Li"等 // 根据玩家的选择创建角色对象并赋值给player变量 // 电脑随机选择角色 Random random = new Random(); int computerChoice = random.Next(1, 4); // 假设有3个角色可供电脑选择 // 根据电脑的选择创建角色对象并赋值给computer变量 } private void Fight() { // 实现游戏的战斗逻辑,例如玩家和电脑轮流攻击对方,直到有一方生命值为0 } private void PrintResult() { // 打印游戏结果,例如输出胜利方的信息或平局信息 } } ``` 最后,我们可以在程序的入口点(Main方法)中创建一个游戏对象并启动游戏: ```csharp class Program { static void Main(string[] args) { Game game = new Game(); game.Start(); } } ``` 这只是一个简单的示例代码,你可以根据自己的需要进行扩展和修改。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值