2048游戏(核心代码算法类封装模拟)

主要采用的是 移动 和 界面 的架构模式

先枚举方向 和 创捷结构坐标
	enum Direction
    {
        Up,
        Down,
        Lelf,
        Right
    }
    struct location
    {
        public int r, c;
    }
游戏界面类
    class GameInterface
    {
        private int[,] copyMap;
        
        public int[,] CopyMap
        {
            get
            {
                return copyMap;
            }
            set
            {
                copyMap = value;
            }
        }
        public GameInterface()
        {
            copyMap = new int[4, 4];
        }
        public static void Show (int[,] map)
        {
            Console.WriteLine("-------------------------");
            for (int r = 0; r < map.GetLength(0); r++)
            {
                for (int c = 0; c < map.GetLength(1); c++)
                    Console.Write("|{0,5}", map[r, c] == 0 ? "" : map[r, c]);
                Console.WriteLine("|\r\n-------------------------");
            }
        }
        public bool DifferentMap(int[,] map)
        {
            for (int r = 0; r < map.GetLength(0); r++)
                for (int c = 0; c < map.GetLength(1); c++)
                    if (copyMap[r, c] != map[r, c])
                    {
                        return true;
                    }
            return false;
        }
        public bool IsWin ()
        {
            for (int r = 0; r < copyMap.GetLength(0); r++)
                for (int c = 0; c < copyMap.GetLength(1); c++)
                    if (copyMap[r, c] == 2048) return true;
            return false;
        }
    }
游戏移动类(核心代码)
class MoveDirection
    {
        private int[,] map;
        private int[] mergeMap;
        private int[] removeMap;
        private List<location> emptyElement;
        private location loc;
        private Random random;

        public int[,] Map
        {
            get
            {
                return map;
            }
        }
        public int EmptyCount{ get; set;}

        public MoveDirection()
        {
            this.map = new int[4, 4];
            this.mergeMap = new int[4];
            this.removeMap = new int[4];
            this.emptyElement = new List<location>();
            this.loc = new location();
            this.random = new Random();
            this.EmptyCount = 16;
        }
        public void Move(Direction dir)
        {
            switch(dir)
            {
                case Direction.Up:
                    MoveUp();
                    break;
                case Direction.Down:
                    MoveDown();
                    break;
                case Direction.Lelf:
                    MoveLelf();
                    break;
                case Direction.Right:
                    MoveRight();
                    break;
            }
        }
        public void AddNumer()
        {
            GetEmptyElement();
            int number = random.Next(0, emptyElement.Count);
            loc = emptyElement[number];
            map[loc.r, loc.c] = random.Next(0, 10) == 1 ? 4 : 2;
            EmptyCount--;
        }
        private void MoveZero()
        {
            Array.Clear(removeMap, 0, removeMap.Length);
            int index = 0;
            for (int i = 0; i < mergeMap.Length; i++)
                if (mergeMap[i] != 0)
                    removeMap[index++] = mergeMap[i];
            removeMap.CopyTo(mergeMap, 0);
        }
        private void Merge()
        {
            MoveZero();
            for (int i = 0; i < mergeMap.Length - 1; i++)
            {
                if (mergeMap[i] != 0 && mergeMap[i] == mergeMap[i + 1])
                {
                    mergeMap[i] += mergeMap[i + 1];
                    mergeMap[i + 1] = 0;
                    EmptyCount++;
                }
            }
            MoveZero();
        }
        private void MoveUp()
        {
            for (int c = 0; c < map.GetLength(1); c++)
            {
                Array.Clear(mergeMap, 0, mergeMap.Length);
                for (int r = 0; r < map.GetLength(0); r++)
                    mergeMap[r] = map[r, c];
                Merge();
                for (int r = 0; r < map.GetLength(0); r++)
                    map[r, c] = mergeMap[r];
            }
        }
        private void MoveDown()
        {
            for (int c = 0; c < map.GetLength(1); c++)
            {
                Array.Clear(mergeMap, 0, mergeMap.Length);
                for (int r = map.GetLength(0) - 1, ur = 0; r >= 0; r--, ur++)
                    mergeMap[ur] = map[r, c];
                Merge();
                for (int r = map.GetLength(0) - 1, ur = 0; r >= 0; r--, ur++)
                    map[r, c] = mergeMap[ur];
            }
        }
        private void MoveLelf()
        {
            for (int r = 0; r < map.GetLength(0); r++)
            {
                Array.Clear(mergeMap, 0, mergeMap.Length);
                for (int c = 0; c < map.GetLength(1); c++)
                    mergeMap[c] = map[r, c];
                Merge();
                for (int c = 0; c < map.GetLength(1); c++)
                    map[r, c] = mergeMap[c];
            }
        }
        private void MoveRight()
        {
            for (int r = 0; r < map.GetLength(0); r++)
            {
                Array.Clear(mergeMap, 0, mergeMap.Length);
                for (int c = map.GetLength(1) - 1, uc = 0; c >= 0; c--, uc++)
                    mergeMap[uc] = map[r, c];
                Merge();
                for (int c = map.GetLength(1) - 1, uc = 0; c >= 0; c--, uc++)
                    map[r, c] = mergeMap[uc];
            }
        }
        private void GetEmptyElement()
        {
            emptyElement.Clear();
            for (int r = 0; r < map.GetLength(0); r++)
                for (int c = 0; c < map.GetLength(1); c++)
                    if (map[r, c] == 0)
                    {
                        loc.r = r; loc.c = c;
                        emptyElement.Add(loc);
                    }  
        }
    }
游戏函数入口
class Program
    {
        static void Main()
        {
            MoveDirection game = new MoveDirection();
            game.AddNumer(); game.AddNumer();
            GameInterface gameInterface = new GameInterface();
            GameInterface.Show(game.Map);
            while (true)
            {
                Console.WriteLine("w 上\r\ns 下\r\na 左\r\nd 右");
                string op = Console.ReadLine();
                if (op == "w") game.Move(Direction.Up);
                else if (op == "s") game.Move(Direction.Down);
                else if (op == "a") game.Move(Direction.Lelf);
                else if (op == "d") game.Move(Direction.Right);
                else continue;
                if (gameInterface.DifferentMap(game.Map)) game.AddNumer();
                Array.Copy(game.Map, gameInterface.CopyMap, 16);
                Console.Clear();
                GameInterface.Show(game.Map);
                if (gameInterface.IsWin())
                {
                    Console.WriteLine("恭喜你通关了!!!");
                    break;
                }
                if (game.EmptyCount == 0)
                {
                    Console.WriteLine("失败了!!!");
                    break;
                }
            }
        }
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值