C#实现2048小游戏

要实现这个简单的小游戏主要在于实现一个方向移动

数字的移动及合并该如何处理

然后其它方向的逻辑是相同的

我做的这个基本功能实现了

主要分为三个类

Box.cs格子类(一些格子里保存的数据,行下标,列下标,是否合并过的开关。。)

Grid.cs网格类(主要算法在里面)

Manage2048.cs控制游戏类(控制游戏流程)

经过几次简单的右移,这是控制台实现的数字变化效果(左上角的4是随机产生的所以没向右靠)

代码供参考

Box.cs格子类

/// <summary>
    /// 格子类
    /// </summary>
    class Box
    {
        //行下标
        private int rowIndex;
        //列下标
        private int colsIndex;

        public int RowIndex
        {
            get
            {
                return rowIndex;
            }

            set
            {
                rowIndex = value;
            }
        }

        //是否第一次合并
        public bool isMerge = false;

        public int ColsIndex
        {
            get
            {
                return colsIndex;
            }

            set
            {
                colsIndex = value;
            }
        }
        //格子上的数字
        public int Number { get; set; }

        public Box(int row, int cols)
        {
            this.RowIndex = row;
            this.ColsIndex = cols;
            Number = 0;
        }

    }

Grid.cs网格类

 /// <summary>
    /// 网格类
    /// </summary>
    class Grid
    {
        int row = 0;//行
        int clos = 0;//列
        Box[,] boxes;

        bool isEnableRandom = false;//是否还会产生随机数(默认不能)

        int gridNum = 2;//格子上的随机数

        bool isFirst = true; //是否是第一个

        Queue<Box> boxisMerge;//队列存储合并过的数

        Random ran;

        public bool isGameover = false;//游戏是否结束

        int total = 0;//计算格子的数

        public Grid(int row, int clos)
        {
            this.row = row < 4 ? 4 : row;
            this.clos = clos < 4 ? 4 : clos;
            boxes = new Box[row, clos];
            ran = new Random();
            boxisMerge = new Queue<Box>();

        }

        /// <summary>
        /// 初始化网格
        /// </summary>
        public void InitGrid()
        {
            for (int i = 0; i < boxes.GetLength(0); i++)
            {
                for (int j = 0; j < boxes.GetLength(1); j++)
                {
                    boxes[i, j] = new Box(i, j);

                }
            }
            this.RandomNum();
        }

        /// <summary>
        /// 产生随机数
        /// </summary>
        public void RandomNum()
        {
            int count = 0;
            //如果是第一个数 将随机出现两个数字
            if (isFirst)
            {
                count = 2;
                isFirst = false;
            }
            else
            {
                count = 1;
            }
            for (int i = 0; i < count;)
            {
                int r = ran.Next(0, row);
                int c = ran.Next(0, clos);
                //判断该格子上是否有数字了
                if (boxes[r, c].Number != 0) continue;
                //随机到4 那么下次必然出现2
                if (gridNum == 4)
                {
                    gridNum = 2;
                }
                else if (gridNum == 2)
                {
                    //如果随机数是2 那么下次随机到2的概率为80%,随机到4的概率为20%
                    int num = ran.Next(0, 10);
                    if (num < 8)
                    {
                        gridNum = 2;
                    }
                    else
                    {
                        gridNum = 4;
                    }
                }
                boxes[r, c].Number = gridNum;//将随机数放在随机格子上
                i++;
            }
            total += count;
        }

        /// <summary>
        /// 控制向右移动
        /// </summary>
        public void MoveRight()
        {

            for (var i = 0; i < boxes.GetLength(0); i++)
            {
                for (var j = 0; j < boxes.GetLength(1); j++)
                {
                    //一旦发现不为0的数
                    if (boxes[i, j].Number != 0)
                    {

                        //从右往左遍历到该数前一个
                        for (var k = boxes.GetLength(1) - 1; k > j; k--)
                        {
                            //如果最右边的数不等于0 && 最右边的数和最右边-1的数相等   说明可以合并 
                            if (boxes[i, k].Number != 0 && boxes[i, k].Number == boxes[i, k - 1].Number && !boxes[i, k].isMerge && !boxes[i, k - 1].isMerge)
                            {
                                boxes[i, k].Number *= 2;
                                boxes[i, k - 1].Number = 0;

                                boxes[i, k].isMerge = true;

                                isEnableRandom = true;//如果产生合并就能产生随机数

                                boxisMerge.Enqueue(boxes[i, k]);//把合并过数的存入队列
                                total--;

                            }
                            //如果最右边的数等于0 && 最右边-1的数不为0 (向右移动)
                            if (boxes[i, k].Number == 0 && boxes[i, k - 1].Number != 0)
                            {
                                int temp = boxes[i, k - 1].Number;
                                boxes[i, k - 1].Number = boxes[i, k].Number;
                                boxes[i, k].Number = temp;

                                isEnableRandom = true;//如果移动就能产生随机数

                            }
                        }
                    }
                }
            }
            this.ResetMegreList();//把所有数isMerge开关重置
            EnableRandom();
        }

        /// <summary>
        /// 控制向左移动
        /// </summary>
        public void MoveLeft()
        {
            for (var i = boxes.GetLength(0) - 1; i >= 0; i--)
            {
                for (var j = boxes.GetLength(1) - 1; j >= 0; j--)
                {
                    if (boxes[i, j].Number != 0)
                    {
                        for (var k = 0; k < j; k++)
                        {
                            if (boxes[i, k].Number != 0 && boxes[i, k].Number == boxes[i, k + 1].Number && !boxes[i, k].isMerge && !boxes[i, k + 1].isMerge)
                            {
                                boxes[i, k].Number *= 2;
                                boxes[i, k + 1].Number = 0;
                                boxes[i, k].isMerge = true;
                                isEnableRandom = true;
                                boxisMerge.Enqueue(boxes[i, k]);//把合并过数的存入队列
                                total--;
                            }
                            if (boxes[i, k].Number == 0 && boxes[i, k + 1].Number != 0)
                            {
                                int temp = boxes[i, k + 1].Number;
                                boxes[i, k + 1].Number = boxes[i, k].Number;
                                boxes[i, k].Number = temp;
                                isEnableRandom = true;
                            }
                        }
                    }
                }
            }
            this.ResetMegreList();//把所有数isMerge开关重置
            EnableRandom();
        }

        /// <summary>
        /// 控制向上移动
        /// </summary>
        public void MoveTop()
        {
            for (var j = boxes.GetLength(0) - 1; j >= 0; j--)
            {
                for (var i = boxes.GetLength(1) - 1; i >= 0; i--)
                {
                    if (boxes[i, j].Number != 0)
                    {
                        for (var k = 0; k < i; k++)
                        {
                            if (boxes[k, j].Number != 0 && boxes[k, j].Number == boxes[k + 1, j].Number && !boxes[k, j].isMerge && !boxes[k + 1, j].isMerge)
                            {
                                boxes[k, j].Number *= 2;
                                boxes[k + 1, j].Number = 0;
                                boxes[k, j].isMerge = true;
                                isEnableRandom = true;
                                boxisMerge.Enqueue(boxes[k, j]);//把合并过数的存入队列
                                total--;
                            }
                            if (boxes[k, j].Number == 0 && boxes[k + 1, j].Number != 0)
                            {
                                int temp = boxes[k + 1, j].Number;
                                boxes[k + 1, j].Number = boxes[k, j].Number;
                                boxes[k, j].Number = temp;
                                isEnableRandom = true;

                            }

                        }



                    }
                }
            }
            this.ResetMegreList();//把所有数isMerge开关重置
            EnableRandom();
        }

        /// <summary>
        /// 控制向下移动
        /// </summary>
        public void MoveDown()
        {
            for (var j = 0; j < boxes.GetLength(1); j++)
            {
                for (var i = 0; i < boxes.GetLength(0); i++)
                {

                    if (boxes[i, j].Number != 0)
                    {
                        for (var k = boxes.GetLength(0) - 1; k > i; k--)
                        {
                            if (boxes[k, j].Number != 0 && boxes[k, j].Number == boxes[k - 1, j].Number && !boxes[k, j].isMerge && !boxes[k - 1, j].isMerge)
                            {
                                boxes[k, j].Number *= 2;
                                boxes[k - 1, j].Number = 0;
                                boxes[k, j].isMerge = true;
                                isEnableRandom = true;
                                boxisMerge.Enqueue(boxes[k, j]);//把合并过数的存入队列
                                total--;

                            }
                            if (boxes[k, j].Number == 0 && boxes[k - 1, j].Number != 0)
                            {
                                int temp = boxes[k - 1, j].Number;
                                boxes[k - 1, j].Number = boxes[k, j].Number;
                                boxes[k, j].Number = temp;
                                isEnableRandom = true;

                            }

                        }

                    }
                }
            }
            this.ResetMegreList();//把所有数isMerge开关重置
            EnableRandom();
        }

        /// <summary>
        /// /把所有格子里的数isMerge开关重置
        /// </summary>
        public void ResetMegreList()
        {
            while (boxisMerge.Count > 0)
            {
                boxisMerge.Dequeue().isMerge = false;
            }
        }

        /// <summary>
        /// 判断是否还能移动
        /// </summary>
        public void EnableRandom()
        {
            //如果能移动和合并就产生随机数
            if (isEnableRandom)
            {
                this.RandomNum();
            }
            else
            {
                Console.WriteLine("不能再向这个方向移动了");
            }
            //重置开关
            isEnableRandom = false;
        }

        /// <summary>
        /// 检查游戏是否结束
        /// </summary>
        public void CheckGanmeisOver()
        {
            if (total < row * clos)
            {
                isGameover = false;
                return;
            }

            for (int i = 0; i < boxes.GetLength(0); i++)
            {
                for (int j = 0; j < boxes.GetLength(1); j++)
                {
                    //上下左右判断
                    if (i >= 1&&boxes[i, j].Number == boxes[i - 1, j].Number )
                    {
                        isGameover = false;
                        return;
                    }
                    if (i < boxes.GetLength(0)-1 && boxes[i, j].Number == boxes[i + 1, j].Number)
                    {
                        isGameover = false;
                        return;
                    }
                    if (j >= 1 && boxes[i, j].Number == boxes[i, j-1].Number)
                    {
                        isGameover = false;
                        return;
                    }
                    if (j < boxes.GetLength(1)-1 && boxes[i, j].Number == boxes[i, j+1].Number)
                    {
                        isGameover = false;
                        return;
                    }

                }

            }
            isGameover = true;
            
        }

        public void Test()
        {
            Console.WriteLine("-----------");
            for (int i = 0; i < boxes.GetLength(0); i++)
            {
                for (int j = 0; j < boxes.GetLength(1); j++)
                {
                    Console.Write(boxes[i, j].Number + "  ");
                }
                Console.WriteLine();
            }
            Console.WriteLine("-----------");
        }

    }

Manage2048.cs控制游戏类

    /// <summary>
    /// 管理类控制游戏
    /// </summary>
    class Manage2048
    {
       
        Grid g;
        public Manage2048()
        {
            g = new Grid(4, 4);
        }
        public void StartGame()
        {
            g.InitGrid();
            g.Test();
        }
        public void PlayGame()
        {
            while (!g.isGameover)
            {
                string op = Console.ReadLine();
                switch (op)
                {
                    case "w": g.MoveTop();  break;
                    case "s": g.MoveDown(); break;
                    case "a": g.MoveLeft(); break;
                    case "d": g.MoveRight(); break;
                    default: Console.WriteLine("输入错误"); break;
             
                }

                Console.Clear();
                g.Test();
                g.CheckGanmeisOver();
            }
            Console.WriteLine("Game Over!");
        }

    }

猜你喜欢

转载自blog.csdn.net/qq_42485607/article/details/81122096