Game2048

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace SeqListSort
{
    /// <summary>
    /// <ather>
    /// <lihonglin>
    /// </ather>
    /// <countent>
    /// 2048游戏规则:
  ///开始时棋盘内随机出现两个数字,出现的数字仅可能为2或4
  ///玩家可以选择上下左右四个方向,若棋盘内的数字出现位移或合并,视为有效移动
  ///玩家选择的方向上若有相同的数字则合并,每次有效移动可以同时合并,但不可以连续合并
    ///合并所得的所有新生成数字相加即为该步的有效得分
  ///玩家选择的方向行或列前方有空格则出现位移
  ///每有效移动一步,棋盘的空位(无数字处)随机出现一个数字(依然可能为2或4)
  ///棋盘被数字填满,无法进行有效移动,判负,游戏结束
  ///棋盘上出现2048,判胜,游戏结束
    /// </countent>
    /// </summary>
    //public struct Point
    //{
    //    public int x;
    //    public int y;
    //    public Point(int _x, int _y)
    //    {
    //        this.x = _x;
    //        this.y = _y;
    //    }
    //}
    public enum DIR_TYPE
    {
        TOP,
        LEFT,
        RIGHT,
        BOTTOM
    }
    class Game2048
    {
        const int n = 4;
        static int[,] map = new int[n,n];//定义棋盘
        static int[] temp = new int[n+1];//一个临时数组,存放十六个位置数据

        static int score = 0;
        
        static Stack<Point> fullCell = new Stack<Point>();//格子是否已满 这个暂时没有用到,愿意是用它来充当临时数组

        public static void GameRandom()
        {
            Random r = new Random();
            int x = 0;
            int y = 0;
            do 
            {
                x = r.Next(0, n);
                y = r.Next(0, n);
            } while ( map[x,y] != 0);
            Thread.Sleep(10);
            if (r.Next(0, n + 1) % n == 0)
            {
                map[x,y] = 4;
            } 
            else
            {
                map[x, y] = 2;
            }
            fullCell.Push(new Point(x, y));
        }
        public static void GameInit()
        {
            GameRandom();
            GameRandom();
            Display();
        }
        public static void Display()
        {
            Console.WriteLine("分数 = " + score);
            for (int i = 0; i < n; ++i)
            {
                for (int j = 0; j < n; ++j)
                {
                    Console.Write("{0,-6}" , map[i, j]);
                }
                Console.WriteLine();
            }
            GameOverOrWine();
        }
        public static void GameContral()
        {
            DIR_TYPE type = DIR_TYPE.TOP; 
            while (true)
            {
                
                Console.WriteLine("请按w、a、s、d键上下左右控制'0'键退出");
                char ch = Convert.ToChar(Console.ReadLine());
                if (ch == 'a'|| ch == 'A' || ch == 'W'|| ch == 'w' || ch == '0'
                    || ch == 'S'|| ch == 's' ||ch == 'D'|| ch == 'd' )
                {
                    Console.Clear();
                } 
                else
                {
                    Console.WriteLine("按下非法键,请重新按!");
                    continue;
                }
                
                switch (ch)
                {
                    case '0':
                        {
                            Console.WriteLine("是否退出游戏!(y/n)");
                            ch = Convert.ToChar(Console.ReadLine());
                            if (ch == 'y' || ch == 'Y')
                            {
                                Environment.Exit(0);
                            }
                            else
                            {
                                Console.Clear();
                            }
                        }
                        break;
                    case 'A':
                    case 'a':
                        {
                            type = DIR_TYPE.LEFT;
                        }
                        break;
                    case 'D':
                    case 'd':
                        {
                            type = DIR_TYPE.RIGHT;
                        }
                        break;
                    case 'W':
                    case 'w':
                        {
                            type = DIR_TYPE.TOP;
                        }
                        break;
                    case 'S':
                    case 's':
                        {
                            type = DIR_TYPE.BOTTOM;
                        }
                        break;
                }
                GameRun(type);
                Display();
            }
        }
        //玩家可以选择上下左右四个方向,若棋盘内的数字出现位移或合并,视为有效移动
        public static int GameMove( )
        {
            int change = 0;
            int i = 0;
            int j = 0;
            do //去掉中间的0
            {  
                for (i = 0; i < n; ++i )
                {
                    if (0 == temp[i])//玩家选择的方向行或列前方有空格则出现位移
                    {
                        if (temp[i] != temp[i + 1])//不相等移动
                        {
                            change = 1;//有效移动
                        }
                        temp[i] = temp[i + 1];
                        temp[i + 1] = 0;
                    }
                }
                j++;
            } while (j < n);

            for (i = 1; i < n; ++i )
            {
                //玩家选择的方向上若有相同的数字则合并,每次有效移动可以同时合并,但不可以连续合并
                if (temp[i] == temp[i - 1])//相同的数字则合并
                {
                    if (0 != temp[i])
                    {
                        change = 1;
                        score += temp[i];
                    }
                    temp[i - 1] += temp[i - 1];//前一个数字乘自己
                    temp[i] = 0;// 后一个位置 置0    
                }
                
            }
            return change;
        }
        public static void GameOverOrWine()
        {
            int count = 0;//记录格子里不为0 的个数
            if (score >= 4096 << 1 )
            {
                Console.WriteLine("您胜利了 88!");
                Thread.Sleep(500);
                Environment.Exit(0);
            }
            else
            {
                for (int i = 0; i < n; ++i)
                {
                    for (int j = 0; j < n; ++j)
                    {
                        if ( map[i,j] != 0 )
                        {
                            count++;
                            if ( count == n * n )
                            {
                                Console.WriteLine("game over");
                                Thread.Sleep(3000);
                                Environment.Exit(0);
                            } 
                        }
                        if ( map[i,j] >= 2048 )
                        {
                            Console.WriteLine("您胜利了 88!");
                            Thread.Sleep(500);
                            //Environment.Exit(0);
                        }
                    }
                }
            }

        }
        public static void GameRun(DIR_TYPE type)
        {
            
            int i = 0;
            int j = 0;
            int change = 0;/*判断格子中的数是否改变,0不变*/
                    
            if (type == DIR_TYPE.LEFT || type == DIR_TYPE.RIGHT)
            {
                for (i = 0; i < n; ++i)
                {
                    for (j = 0; j < n; ++j)
                    {
                        if (type == DIR_TYPE.LEFT)
                        {
                            temp[j] = map[i, j];//把每一行数据放到临时数组中
                        }
                        else
                        {
                            temp[j] = map[i, 3 - j];
                        }
                    }
                    //temp[4] = 0;

                    change += GameMove();//处理每一行数据,进行移除中间的0,合并相同数字,根据change的值可以产生随机数

                    for (j = 0; j < n; ++j)
                    {
                        if (type == DIR_TYPE.LEFT)
                        {
                            map[i, j] = temp[j];// 把每一行处理完的数据在放回到地图中
                        }
                        else
                        {
                            map[i, 3 - j] = temp[j];
                        }
                    }
                }
            }
            else
            {

                for (i = 0; i < n; ++i)
                {
                    for (j = 0; j < n; ++j)
                    {

                        if (type == DIR_TYPE.TOP)
                        {
                            temp[j] = map[j, i];//把每一列数据存进去
                        }
                        else if (type == DIR_TYPE.BOTTOM)
                        {
                            temp[j] = map[3 - j, i];
                        }

                    }
                    temp[4] = 0;
                    change += GameMove();

                    for (j = 0; j < n; ++j)
                    {
                        if (type == DIR_TYPE.TOP)
                        {
                            map[j, i] = temp[j]; //把处理好的中间变量移回来
                        }
                        else if (type == DIR_TYPE.BOTTOM)
                        {
                            map[3 - j, i] = temp[j];
                        }
                    }
                }
            }
            
            
            if (change > 0)
            {
                GameRandom();
            }
        }
    }
}
原文地址:https://www.cnblogs.com/lihonglin2016/p/4307874.html