• 贪吃蛇小游戏的初步尝试制作


    这里利用二维数组做为地图,利用集合来存放蛇头和蛇尾的位置坐标,初步实现一个需要键盘控制的贪吃蛇小游戏。

    首先,Main函数下面需要一个大循环来让游戏失败的时候能够重新开始,这里我们用了定义了一个bool型的sc,判断sc的true和flase来确定游戏是否开始;

    static void Main(string[] args)
            {

              bool sc = true;

    while (sc) //大循环,用于游戏失败重新开始
                {

    下面是定义一个集合snake_x来存放蛇的x坐标,定义一个集合snake_y来存放蛇的y坐标,;然后对x,y进行初始化;定义一个蛇身的长度len=1,后续用来判断长度达到设定值之后游戏成功通过,这里我们设定的值为30;

                    //贪吃蛇
                    ArrayList snake_x = new ArrayList();//定义x坐标的集合
                    ArrayList snake_y = new ArrayList();//定义y坐标的集合

                    snake_x.Add(1);//x坐标初始化
                    snake_y.Add(1);//y坐标初始化
                    int x, y, a, b;
                    int i; int j;
                    int len = 1; //定义蛇的长度为1,用来判断游戏是否成功

    之后开始定义一个10*10的二维数组,作为地图,数字3代表墙壁,数字2代表蛇身,数字1代表食物,数字0代表路。
                    //定义地图
                    int[,] map = new int[10, 10] {
                {3,3,3,3,3,3,3,3,3,3},
                {3,2,0,0,0,0,0,0,0,3},
                {3,0,0,0,0,0,0,0,0,3},
                {3,0,0,0,0,0,0,0,0,3},
                {3,0,0,0,0,0,0,0,0,3},
                {3,0,0,0,0,0,0,0,0,3},
                {3,0,0,0,0,0,0,0,0,3},
                {3,0,0,0,0,0,0,0,0,3},
                {3,0,0,0,0,0,0,0,0,3},
                {3,3,3,3,3,3,3,3,3,3}
                };

    地图定义完之后,进行提示,玩家需要按空格键开始,这里用了一个while循环来判断输入的按键是不是空格键,是的话break出循环,开始下面的程序(即开始游戏)。

     Console.WriteLine("按空格键开始");
                   
                    while (true) //循环,用于按空格键开始
                    {
                       

                        ConsoleKeyInfo kf = Console.ReadKey(true);
                        string k = kf.Key.ToString().ToLower();
                        if (k == "spacebar")
                        {
                            break;
                        }
                    }

    利用随机数生成器,生成一组范围在0-9之间的x,y;判断x,y坐标的数值是不是0,如果是0代表这个坐标可以生成食物,否则继续随机生成。

     //随机出食物
                    while (true)
                    {
                        Random c = new Random();
                        Random d = new Random();
                        int e = c.Next(9);
                        int f = d.Next(9);
                        if (map[e, f] == 0)
                        {
                            map[e, f] = 1;
                            break;
                        }

                    }

    食物生成之后,可以进行游戏开始的第一次显示,这时屏幕上会有1个食物,蛇身子也为1。五星代表食物,如下图:

    //显示
                    Console.Clear();

                    for (i = 0; i < 10; i++)
                    {
                        for (j = 0; j < 10; j++)
                        {
                            if (map[i, j] == 0)
                            {
                                Console.Write("  ");
                            }
                            else if (map[i, j] == 1)
                            {
                                Console.Write("☆");
                            }
                            else if (map[i, j] == 2)
                            {
                                Console.Write("◎");
                            }
                            else if (map[i, j] == 3)
                            {
                                Console.Write("■");
                            }

                        }
                        Console.Write(" ");
                    }

    地图显示完成,下面开始读取按键,需要一直循环着读取,所以用了个while循环。

    while (true) //读取按键循环
                    {

                        ConsoleKeyInfo kf = Console.ReadKey(true);
                        string k = kf.Key.ToString().ToLower();

    下面开始判断按下的键是哪个,以下为按“下”键时的操作程序,从xy集合中取出坐标,判断蛇的下面是什么,如果是食物,食物变成蛇头,蛇尾不变,集合中压入蛇头的坐标,蛇身的长度+1,并且随机生成一个新的食物;如果是路,蛇下一格变为蛇头,蛇尾变为路,相当于蛇向下移动了一格;如果是其他的,跳出循环,并且游戏结束。

    if (k == "downarrow")
                        {
                            x = (int)snake_x[0];
                            y = (int)snake_y[0];


                            if (map[x + 1, y] == 1)
                            {
                                map[x + 1, y] = 2;

                                snake_x.Insert(0, x + 1);
                                snake_y.Insert(0, y);
                                len++;

                                //吃掉之后随机出食物
                                while (true)
                                {
                                    Random c = new Random();
                                    Random d = new Random();
                                    int e = c.Next(9);  //限制范围
                                    int f = d.Next(9);
                                    if (map[e, f] == 0)
                                    {
                                        map[e, f] = 1;
                                        break;
                                    }

                                }
                            }
                            else if (map[x + 1, y] == 0)
                            {

                                a = (int)snake_x[snake_x.Count - 1];
                                b = (int)snake_y[snake_y.Count - 1];

                                map[a, b] = 0;
                                map[x + 1, y] = 2;

                                snake_x.Insert(0, x + 1);  //将x+1放进0位置
                                snake_x.RemoveAt(snake_x.Count - 1);//将末端位置的数移除
                                snake_y.Insert(0, y);
                                snake_y.RemoveAt(snake_y.Count - 1);

                            }
                            else
                            {
                                Console.Write("a");

                                break;
                            }
                        }

    下面分别为向上,向右,向左时的程序,道理同向下一样,这里不说了。

     else if (k == "uparrow")
                        {
                            x = (int)snake_x[0];
                            y = (int)snake_y[0];


                            if (map[x - 1, y] == 1)
                            {
                                map[x - 1, y] = 2;

                                snake_x.Insert(0, x - 1);
                                snake_y.Insert(0, y);
                                len++;

                                //吃掉之后随机出食物
                                while (true)
                                {
                                    Random c = new Random();
                                    Random d = new Random();
                                    int e = c.Next(9);
                                    int f = d.Next(9);
                                    if (map[e, f] == 0)
                                    {
                                        map[e, f] = 1;
                                        break;
                                    }

                                }
                            }
                            else if (map[x - 1, y] == 0)
                            {

                                a = (int)snake_x[snake_x.Count - 1];
                                b = (int)snake_y[snake_y.Count - 1];

                                map[a, b] = 0;
                                map[x - 1, y] = 2;

                                snake_x.Insert(0, x - 1);
                                snake_x.RemoveAt(snake_x.Count - 1);
                                snake_y.Insert(0, y);
                                snake_y.RemoveAt(snake_y.Count - 1);

                            }
                            else
                            {
                                Console.Write("a");

                                break;
                            }
                        }
                        else if (k == "rightarrow")
                        {
                            x = (int)snake_x[0];
                            y = (int)snake_y[0];


                            if (map[x, y + 1] == 1)
                            {
                                map[x, y + 1] = 2;

                                snake_x.Insert(0, x);
                                snake_y.Insert(0, y + 1);
                                len++;

                                //吃掉之后随机出食物
                                while (true)
                                {
                                    Random c = new Random();
                                    Random d = new Random();
                                    int e = c.Next(9);
                                    int f = d.Next(9);
                                    if (map[e, f] == 0)
                                    {
                                        map[e, f] = 1;
                                        break;
                                    }

                                }
                            }
                            else if (map[x, y + 1] == 0)
                            {
                                a = (int)snake_x[snake_x.Count - 1];
                                b = (int)snake_y[snake_y.Count - 1];

                                map[a, b] = 0;
                                map[x, y + 1] = 2;

                                snake_x.Insert(0, x);
                                snake_x.RemoveAt(snake_x.Count - 1);
                                snake_y.Insert(0, y + 1);
                                snake_y.RemoveAt(snake_y.Count - 1);

                            }
                            else
                            {
                                Console.Write("a");

                                break;
                            }
                        }
                        else if (k == "leftarrow")
                        {
                            x = (int)snake_x[0];
                            y = (int)snake_y[0];


                            if (map[x, y - 1] == 1)
                            {
                                map[x, y - 1] = 2;

                                snake_x.Insert(0, x);
                                snake_y.Insert(0, y - 1);
                                len++;

                                //吃掉之后随机出食物
                                while (true)
                                {
                                    Random c = new Random();
                                    Random d = new Random();
                                    int e = c.Next(9);
                                    int f = d.Next(9);
                                    if (map[e, f] == 0)
                                    {
                                        map[e, f] = 1;
                                        break;
                                    }

                                }
                            }
                            else if (map[x, y - 1] == 0)
                            {

                                a = (int)snake_x[snake_x.Count - 1];
                                b = (int)snake_y[snake_y.Count - 1];

                                map[a, b] = 0;
                                map[x, y - 1] = 2;

                                snake_x.Insert(0, x);
                                snake_x.RemoveAt(snake_x.Count - 1);
                                snake_y.Insert(0, y - 1);
                                snake_y.RemoveAt(snake_y.Count - 1);


                            }
                            else
                            {
                                Console.Write("a");

                                break;
                            }
                        }

    读取完按键,并且操作完地图之后,显示一遍地图。

     //显示

                        Console.Clear();

                        for (i = 0; i < 10; i++)
                        {
                            for (j = 0; j < 10; j++)
                            {
                                if (map[i, j] == 0)
                                {
                                    Console.Write("  ");
                                }
                                else if (map[i, j] == 1)
                                {
                                    Console.Write("☆");
                                }
                                else if (map[i, j] == 2)
                                {
                                    Console.Write("◎");
                                }
                                else if (map[i, j] == 3)
                                {
                                    Console.Write("■");
                                }

                            }
                            Console.Write(" ");
                        }

    这里用一个if语句判断蛇的长度是否达到了设定的值,是的话游戏成功通过,跳出循环结束游戏。
                        //如果蛇的长度为30,结束游戏
                        if (len == 30)
                        {
                            break;
                        }

                    }


       用一个while循环显示结束后的提示,判断一下如果是游戏成功之后结束,则提示"你成功了!按ESC退出",按下ESC之后将sc的值变为flase,,跳出本循环,并且大循环结束,退出游戏;   如果判断到不是游戏成功时结束的,则说明是游戏失败,这里提示“ 游戏失败!请按R键重新开始 ”,按下R键跳出本循环,重新开始大循环,即重新开始游戏。              

      //游戏结束之后提醒

                 while (true)   
                        {
                            //如果成功,按ESC退出
                            if (len == 30)
                            {
                                Console.WriteLine("你成功了!按ESC退出");
                                ConsoleKeyInfo kf = Console.ReadKey(true);
                                string k = kf.Key.ToString().ToLower();
                                if (k == "escape")
                                {
                                    sc = flase;
                                    break;
                                }
                            }


                            else
                            {
                                //如果失败,按R重新开始
                                Console.Clear();
                                Console.WriteLine("游戏失败!请按R键重新开始");
                                ConsoleKeyInfo kf = Console.ReadKey(true);
                                string k = kf.Key.ToString().ToLower();
                                if (k == "r")
                                {
                                    break;
                                }
                            }

                        }
                   
                }
            }

            public static bool flase { get; set; }
        }
    }

    到这里一个简单的需要键盘控制的贪吃蛇游戏就制作完成了。

    下面是游戏文件和程序文件网盘地址,可以下载试玩,这个游戏也是适用与WIN7及以上版本或者安装了.net framework3.5及以上的电脑:

    http://pan.baidu.com/s/1jG0ykJW

  • 相关阅读:
    hdu1003 最大连续子序和
    ACM 线性规划
    ACM 概率&&动态规划
    ACM 数论 质因数分解
    ACM 计数
    ACM 概率
    ACM矩形嵌套问题LIS
    ACM 编辑距离
    ACM线性方程
    ACM 错排
  • 原文地址:https://www.cnblogs.com/Alvin-ftd/p/3940556.html
Copyright © 2020-2023  润新知