用C#实现2048小游戏

using System;

namespace _2048
{
    
    

    class Game
    {
    
    
        private const int row = 4;
        private const int col = 4;
        private const int initCount = 4;
        private const int result = 2048;
        private const float getTwoRate = 0.8f;
        private int[][] map;
        private int[] mergeArray;

        public Game()
        {
    
    
            map = new int[row][];
            for (int i = 0; i < col; i++)
            {
    
    
                map[i] = new int[col];
            }
            mergeArray = new int[col];
        }

        private void initMap()
        {
    
    
            Random random = new Random();
            for (int i = 0; i < initCount; i++)
            {
    
    
                setNextPoint(getNextPoint(), getNextValue());
            }
        }

        private void setNextPoint(Point point, int value)
        {
    
    
            map[point.x][point.y] = value;
        }

        private Point getNextPoint()
        {
    
    
            Random random = new Random();
            int n_row = random.Next(0, row), n_col = random.Next(0, col);
            while (map[n_row][n_col] != 0)
            {
    
    
                n_row = random.Next(0, row);
                n_col = random.Next(0, col);
            }
            return new Point(n_row, n_col);
        }

        private int getNextValue()
        {
    
    
            Random random = new Random();
            return random.NextDouble() <= getTwoRate ? 2 : 4;
        }

        private void display()
        {
    
    
            foreach (int[] t in map)
            {
    
    
                foreach (int value in t)
                {
    
    
                    Console.Write(value + " ");
                }
                Console.WriteLine();
            }
        }

        private void help()
        {
    
    
            Console.WriteLine("1:向上");
            Console.WriteLine("2:向下");
            Console.WriteLine("3:向左");
            Console.WriteLine("4:向右");
            Console.WriteLine("-1:退出游戏");
        }

        public void Play()
        {
    
    
            int op;
            bool isWin = false;
            initMap();
            display();
            Console.WriteLine("请输入操作码:(若需要帮助请输入0)");
            while((op = int.Parse(Console.ReadLine())) != -1){
    
    
                int res = check();
                if (res == -1)
                {
    
    
                    isWin = false;
                    break;
                }
                else if (res == 1)
                {
    
    
                    isWin = true;
                    break;
                }
                switch (op)
                {
    
    
                    case 0:
                        help();
                        continue;
                        break;
                    case 1:
                        Move(Direction.Up);
                        break;
                    case 2:
                        Move(Direction.Down);
                        break;
                    case 3:
                        Move(Direction.Left);
                        break;
                    case 4:
                        Move(Direction.Rigth);
                        break;
                    default:
                        Console.WriteLine("您的输入有误,请重新输入!");
                        break;
                }
                Console.WriteLine("更新坐标前:");
                display();
                setNextPoint(getNextPoint(), getNextValue());
                Console.WriteLine("更新坐标后");
                display();
                Console.WriteLine("------------------------------");
            }
            if (op == -1) Console.WriteLine("游戏结束");
            else if (isWin) Console.WriteLine("您赢了!");
            else if (!isWin) Console.WriteLine("您输了。");
        }

        private void Move(Direction direction)
        {
    
    
            switch (direction)
            {
    
    
                case Direction.Up:
                    toUp();
                    break;
                case Direction.Down:
                    toDown();
                    break;
                case Direction.Left:
                    toLeft();
                    break;
                case Direction.Rigth:
                    toRight();
                    break;
            }
        }

        /// <summary>
        /// 返回值为-1代表输了,0代表继续游戏,1代表赢了
        /// </summary>
        /// <returns></returns>
        private int check()
        {
    
    
            bool isFull = true;
            for(int i = 0; i < row; i++)
            {
    
    
                for (int j = 0; j < col; j++)
                {
    
    
                    if (map[i][j] == result) return 1;
                    if (map[i][j] == 0) isFull = false;
                }
            }
            return isFull ? -1 : 0;
        }

        private void toRight()
        {
    
    
            for (int i = 0; i < row; i++)
            {
    
    
                int prevValue = -1, prevDis = col - 1;
                for (int j = col - 1; j >= 0; j--)
                {
    
    
                    if(prevValue != map[i][j])
                    {
    
    
                        if(map[i][j] != 0)
                        {
    
    
                            prevValue = map[i][j];
                            prevDis = j;
                        }
                    }
                    else
                    {
    
    
                        setNextPoint(new Point(i, prevDis), prevValue * 2);
                        setNextPoint(new Point(i, j), 0);
                        break;
                    }
                }
                int pos = col - 1;
                for (int k = col - 1; k >= 0; k--)
                {
    
    
                    if (map[i][k] != 0)
                    {
    
    
                        mergeArray[pos--] = map[i][k];
                    }
                }
                for (; pos >= 0; pos--)
                {
    
    
                    mergeArray[pos] = 0;
                }
                mergeArray.CopyTo(map[i], 0);
            }
        }

        private void toLeft()
        {
    
    
            for (int i = 0; i < row; i++)
            {
    
    
                int prevValue = -1, prevDis = 0;
                for (int j = 0; j < col; j++)
                {
    
    
                    if (prevValue != map[i][j])
                    {
    
    
                        if (map[i][j] != 0)
                        {
    
    
                            prevValue = map[i][j];
                            prevDis = j;
                        }
                    }
                    else
                    {
    
    
                        setNextPoint(new Point(i, prevDis), prevValue * 2);
                        setNextPoint(new Point(i, j), 0);
                        break;
                    }
                }
                int pos = 0;
                for (int k = 0; k < col; k++)
                {
    
    
                    if (map[i][k] != 0)
                    {
    
    
                        mergeArray[pos++] = map[i][k];
                    }
                }
                for (; pos < col; pos++)
                {
    
    
                    mergeArray[pos] = 0;
                }
                mergeArray.CopyTo(map[i], 0);
            }
        }

        private void toDown()
        {
    
    
            for (int j = 0; j < col; j++)
            {
    
    
                int prevValue = -1, prevDis = row - 1;
                for (int i = row - 1; i >= 0; i--)
                {
    
    
                    if (prevValue != map[i][j])
                    {
    
    
                        if (map[i][j] != 0)
                        {
    
    
                            prevValue = map[i][j];
                            prevDis = i;
                        }
                    }
                    else
                    {
    
    
                        setNextPoint(new Point(prevDis, j), prevValue * 2);
                        setNextPoint(new Point(i, j), 0);
                        break;
                    }
                }
                int pos = row - 1;
                for (int k = row - 1; k >= 0; k--)
                {
    
    
                    if (map[k][j] != 0)
                    {
    
    
                        mergeArray[pos--] = map[k][j];
                    }
                }
                for (; pos >= 0; pos--)
                {
    
    
                    mergeArray[pos] = 0;
                }
                for (int k = row - 1; k >= 0; k--)
                {
    
    
                    map[k][j] = mergeArray[k];
                }
            }
        }

        private void toUp()
        {
    
    
            for (int j = 0; j < col; j++)
            {
    
    
                int prevValue = -1, prevDis = 0;
                for (int i = 0; i < row; i++)
                {
    
    
                    if (prevValue != map[i][j])
                    {
    
    
                        if (map[i][j] != 0)
                        {
    
    
                            prevValue = map[i][j];
                            prevDis = i;
                        }
                    }
                    else
                    {
    
    
                        setNextPoint(new Point(prevDis, j), prevValue * 2);
                        setNextPoint(new Point(i, j), 0);
                        break;
                    }
                }
                int pos = 0;
                for (int k = 0; k < row; k++)
                {
    
    
                    if (map[k][j] != 0)
                    {
    
    
                        mergeArray[pos++] = map[k][j];
                    }
                }
                for (; pos < row; pos++)
                {
    
    
                    mergeArray[pos] = 0;
                }
                for (int k = 0; k < row; k++)
                {
    
    
                    map[k][j] = mergeArray[k];
                }
            }
        }
    }

    class Point
    {
    
    
        public int x {
    
     get; set; }
        public int y {
    
     get; set; }

        public Point(int sx, int sy)
        {
    
    
            x = sx;
            y = sy;
        }
        public Point() {
    
     x = -1; y = -1; }
    }

    class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            Game game = new Game();
            game.Play();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_52855744/article/details/122300428