C#语言完成扫雷游戏的代码编写

//尝试在控制台下使用面向对象知识完成扫雷游戏,使用字符打印相关信息即可。

using System;

using System.Threading;

namespace 扫雷

{

    //地图类,用来生成地图

    class Cmap

    {

        public Cmap(int x,int y) { CreatMap(x, y, 20); CreatGameMap(x, y); }

        int x;//地图长

        int y;//地图宽

        public int p;//雷的数量---数量要小于x*y;待实现

        public int[] mapLine;//地图的一维数组

        public int[,] map;//地图的二维数组

        public string[,] gameMap;//游戏地图

        public int[] mineSet;//记录雷的位置

        public int gameState=0;//记录游戏情况:0游戏中,1游戏失败,2游戏结束

        public int n = 0;

        //创建地图

        public void CreatMap(int x, int y, int p)

        {

          Random random = new Random();

          this.x = x;

          this.y = y;

          this.p = p;

          map = new int[x, y];

          mapLine = new int[x*y];

            //生成雷的位置

            mineSet = new int[p];

            for (int i = 0; i < p; i++)

            {

                mineSet[i] = random.Next(0, mapLine.Length);

                for (int j = 0; j < i; j++)

                {

                    if (mineSet[j] == mineSet[i])

                    {

                        i--;

                    }

                }

            }

            //一维数组初始化 

            for (int i = 0; i < mapLine.Length; i++)

            {

                mapLine[i] = 0;

            }

            //一维数组装雷

            for (int i = 0; i < mineSet.Length; i++)

            {

                mapLine[mineSet[i]] = 9;

            }

            //将有雷的信息的一维数组撞填到二维数组里面

            int conter = 0;

            for (int i = 0; i < map.GetLength(0); i++)

            {

                for (int j = 0; j < map.GetLength(1); j++)

                {

                    map[i, j] = mapLine[conter++];

                }

            } 

            //数字块算法

            int SetNumber(int x,int y)

            {  int conter=0;

                if (map[x,y]==9)

                {

                    return 9;

                }

                else

                {

                    if (x - 1 >= 0 && y - 1 >= 0) { if (map[x - 1, y - 1] == 9) { conter++; } }

                    if (y - 1 >= 0) { if (map[x, y - 1] == 9) { conter++; } }

                    if (x - 1 >= 0) { if (map[x - 1, y] == 9) { conter++; } }

                    if (x - 1 >= 0 && y + 1 <= this.y-1) { if (map[x - 1, y + 1] == 9) { conter++; } }

                    if (x + 1 <= this.x - 1 && y - 1 >= 0) { if (map[x + 1, y - 1] == 9) { conter++; } }

                    if (y + 1 <= this.y-1) { if (map[x , y + 1] == 9) { conter++; } }

                    if (x + 1 <= this.x-1 ) { if (map[x + 1, y] == 9) { conter++; } }

                    if (x + 1 <= this.x-1 && y + 1 <= this.y - 1) { if (map[x + 1, y + 1] == 9) { conter++; } }

                }

                return conter;

            }

            //遍历地图,生成数字块

            for (int i = 0; i < map.GetLength(0); i++)

            {

                for (int j = 0; j < map.GetLength(1); j++)

                {

                    map[i, j] = SetNumber(i, j);

                }

            }

        }

        //展示地图

        public void ShowMap()

        {

            for (int i = 0; i < map.GetLength(0); i++)

            {

                Console.Write(" ");

                for (int j = 0; j < map.GetLength(1); j++)

                {

                    Console.Write($"{map[i, j]}  ");

                }

                Console.WriteLine();

                //Console.WriteLine();

            }

        }

        //创建游戏列表

        public void CreatGameMap(int x, int y)

        {

            gameMap = new string[x, y];

            //填充游戏界面:

            for (int i = 0; i < gameMap.GetLength(0); i++)

            {

                for (int j = 0; j < gameMap.GetLength(1); j++)

                {

                    gameMap[i, j] = "■";

                }

            }


        }

        //打印游戏界面

        public void ShowGameMap()

        {

            for (int i = 0; i < gameMap.GetLength(0); i++)

            {

                Console.Write($"{i}  ");

                for (int j = 0; j < gameMap.GetLength(1); j++)

                {

                    Console.Write($"{gameMap[i, j]} ");

                }

                Console.WriteLine();

            }

        }

        //界面转换

        public string MapChange(int x,int y)

        {

            if (map[x,y]==9)

            {

                return "☆";

            }

            else if (map[x,y]==0)

            {

                return "□";

            }

            else

            {

                return map[x, y].ToString()+" ";

            }

        }

        //交互事件

        public void Click(int x, int y)

        {


            if (map[x,y]==9)

            {

                gameState = 2;

                Console.WriteLine( $"游戏结束!");


            }

            else if (map[x,y]==0)

            {

                //递归

                AutoClick(x, y );

            }

            else

            {

                //继续游戏

            }

            gameMap[x, y] = MapChange(x, y);

        }

        public void AutoClick(int x, int y)

        {

            if (gameMap[x,y]== "■")

            {

                if (map[x, y] == 9)

                {

                    //Console.WriteLine($"{x}  {y}检测到地雷");

                    return;

                }

                else if (map[x, y] == 0)

                {

                    //Console.WriteLine($"{x}  {y}开始递归");

                    gameMap[x, y] = MapChange(x, y);

                    //递归

                    if (x - 1 >= 0 && y - 1 >= 0) { AutoClick(x - 1, y - 1); }//左上

                    if (y - 1 >= 0 ) { AutoClick(x, y - 1); }//左

                    if (x + 1 <= this.x - 1 && y - 1 >= 0) { AutoClick(x + 1, y - 1); }//左下

                    if (x - 1 >= 0 ) {  AutoClick(x - 1, y); }//左下

                  if (x - 1 >= 0 && y + 1 <= this.y - 1) {  AutoClick(x - 1, y + 1); }//


                    if (y + 1 <= this.y - 1 ) { AutoClick(x, y + 1); }

                    if (x + 1 <= this.x - 1 ) {  AutoClick(x + 1, y); }

                    if (x + 1 <= this.x - 1 && y + 1 <= this.y - 1) {  AutoClick(x + 1, y + 1); }



                }

                else

                {

                    //Console.WriteLine($"{x}  {y}检测到数字");

                    //继续游戏

                    gameMap[x, y] = MapChange(x, y);

                    return;

                }

            }



        }

        //白块递归


        //判断游戏输赢

        public void iswin()

        {

            n = 0;


            for (int i = 0; i < gameMap.GetLength(0); i++)

            {

                for (int j = 0; j < gameMap.GetLength(1); j++)

                {

                    if (gameMap[i, j]== "■")

                    {

                        n++;

                    }

                }

                //Console.WriteLine();

            }

            if (n<=p)

            {

                gameState = 1;

            }

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            Cmap map = new Cmap(16, 30);

            //map.ShowMap();

            int x = 0;

            int y = 0;

            while (map.gameState == 0)

            {

                map.ShowGameMap();

                Console.WriteLine($"请输入您要扫描的坐标:");

                x = int.Parse(Console.ReadLine());

                y = int.Parse(Console.ReadLine());

                map.Click(x, y);

                Console.ReadLine();

                map.iswin();

                if (map.gameState == 1)

                {

                    Console.WriteLine("恭喜你游戏胜利");

                }

                if (map.gameState == 2)

                {

                    Console.WriteLine("很抱歉游戏失败");

                }

                if (map.gameState == 0)

                {

                    Console.WriteLine("游戏继续");

                }


                Console.ReadLine();

                Console.Clear();

            }


        }

    }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容