编程技术是改变世界的力量。
本站
当前位置:网站首页 > 后端语言 > 正文

C# - 飞行棋小游戏4-关卡判断逻辑,游戏程序完成 060

gowuye 2024-05-16 14:46 3 浏览 0 评论

关卡逻辑

 while (pos[0] <= 99 && pos[1] <= 99)   
上面条件存在bug,将判断循环的条件改为
 while (pos[0] < 99 && pos[1] < 99)

各种类型的关卡的逻辑判断(关卡只判断一次)

1)判断两个玩家,谁踩到谁了,被踩到的玩家坐标为0

2)普通关卡 没有任何逻辑代码,在绘制地图方法中会将当前玩家替换掉普通关卡的图案

3)地雷关卡 因为是先投掷骰子后判断玩家当前坐标加骰子数后再判断关卡,一次有两种判断模式:1)在加上骰子数基础上-6 2)在减去骰子数基础上-6

switch-case结构中的一个
case 1://地雷(-6)
    msg = string.Format("玩家{0}走到地雷关卡~@-_-@~,将要后退6格!!!", players[0]);
    //模式1
    //在减去骰子数的基础上后退6格关卡
    //如果再次遇到关卡不再判断
    pos[0] -= 6 - rdm;
    //模式2
    //在加上骰子数的基础上后退6格关卡
    //如果再次遇到关卡不再判断
    //骰子数在此判断结构之前已加上,然后-6    
    // pos[0] -= 6;    
    break;

4)暂停关卡 本游戏使用的是减去骰子数的方式;另一种是设置一个标志变量(默认值为false),如果遇到暂停关卡,标志变量为true,则跳过投掷骰子与各类型关卡的判断

case 2://暂停(0)
    //减去增加的骰子数
    pos[0] -= rdm;
    msg = string.Format("玩家{0}走到暂停关卡~@-_-@~,需要休息一下!!!", players[0]);
    break;

5)飞盘关卡 与地雷关卡类似有两种模式,只是飞盘是前进10格关卡

case 3://飞盘(+10)
    msg = string.Format("玩家{0}走到飞盘关卡~@^_^@~,就要前进10格!!!", players[0]);    
    //在减去骰子数的基础前进格
    pos[0] += 10 - rdm;
    break;

整个游戏玩家遇到关卡的逻辑判断代码

class Program
{
    //地图数组声明为 类的成员变量
        //表示游戏中所有关卡的格子
    static int[] levelData = new int[100];
    //表示两个玩家在地图中的坐标(对应levelData中的下标)
        //static int player1 = 0, player2=0;
        //使用数组表示两个玩家的坐标
    static int[] pos = new int[] { 0, 0 };
    static string[] players = { "A", "B" };
    //程序入口方法
    static void Main(string[] args)
    {
        while (true)
        {
            ShowMapInfo();
            InitData();
            DrawMap();
            //用于产生随机数
            Random r = new Random();
            int rdm = 0;//用于接收产生的随机数    
            //
            while (pos[0] < 99 && pos[1] < 99)
            {  
                //用于显示遇到的关卡信息
                string msg = "";
                #region 玩家A
                    Console.WriteLine("玩家A按任意键开始投掷骰子");
                    Console.ReadKey(true);//true 不显示所按的是什么键
                    rdm = r.Next(1, 7);//产生1-6之间任意的整数
                    Console.WriteLine("玩家A骰子数为{0}", rdm);
                    Console.WriteLine("按任意键玩家A开始行走");
                    Console.ReadKey(true);
                    //骰子数就是玩家A马上行走的关卡数
                    pos[0] = pos[0] + rdm;
                    CheckPos();
                    if (pos[0] == pos[1])
                    {
                        pos[1] = 0;
                        msg = string.Format("玩家{0}踩到了玩家{1},玩家{2}从头开始", players[0], players[1], players[1]);
                    }
                    else
                    {
                        switch (levelData[pos[0]])
                        {
                            case 0://可有可无
                                //普通关卡,没有逻辑判断
                                //与default对应使用
                                break;
                            case 1://地雷(-6)
                                msg = string.Format("玩家{0}走到地雷关卡~@-_-@~,将要后退6格!!!", players[0]);
                                //在减去骰子数的基础上退6格
                                pos[0] -= 6 - rdm;
                                break;
                            case 2://暂停(0)
                                //减去增加的骰子数
                                pos[0] -= rdm;
                                msg = string.Format("玩家{0}走到暂停关卡~@-_-@~,需要休息一下!!!", players[0]);
                                break;
                            case 3://飞盘(+10)
                                msg = string.Format("玩家{0}走到飞盘关卡~@^_^@~,就要前进10格!!!", players[0]);                             
                                //在减去骰子数的基础前进格
                                pos[0] += 10 - rdm;
                                break;
                            default://防止意外数字(可有可无)
                                msg = "意外数字,不影响游戏运行";
                                break;
                        }
                       //检测玩家坐标是否在0-99之间
                      //主要是检测遇到地雷关卡
                      //地雷关卡会出现负数下标
                        CheckPos();
                    }
                    if (msg != "")
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine(msg);
                        Console.ResetColor();
                        Console.ReadKey();
                    }
                    msg = "";
                    //清屏
                    Console.Clear();
                    //重新绘制地图
                    DrawMap();
                    #endregion
                //如果玩家A或玩家B走到下标为99的关卡格子
               //退出当前投掷骰子是循环     
                 if (pos[0] == 99 || pos[1] == 99)
                {
                    break;
                }                    
                //==================================
                #region 玩家B
                    Console.WriteLine("玩家B按任意键开始投掷骰子");
                    Console.ReadKey(true);//true 不显示所按的是什么键
                    rdm = r.Next(1, 7);//产生1-6之间任意的整数
                    Console.WriteLine("玩家B骰子数为{0}", rdm);
                    Console.WriteLine("按任意键玩家B开始行走");
                    Console.ReadKey(true);
                    pos[1] = pos[1] + rdm;
                    CheckPos();
                    if (pos[1] == pos[0])
                    {
                        pos[0] = 0;
                        msg = string.Format("玩家{0}踩到了玩家{1},玩家{2}从头开始", players[1], players[0], players[0]);
                    }
                    else
                    {
                        switch (levelData[pos[1]])
                        {
                            case 0://可有可无
                                //普通关卡,没有逻辑判断
                                //与default对应使用
                                break;
                            case 1://地雷(-6)
                                msg = string.Format("玩家{0}走到地雷关卡~@-_-@~,将要后退6格!!!", players[1]);
                                //在加上骰子数的基础上退6格
                                pos[1] -= 6;
                                break;
                            case 2://暂停(0)
                                //减去增加的骰子数
                                //相当于暂停一次
                                pos[1] -= rdm;
                                msg = string.Format("玩家{0}走到暂停关卡~@-_-@~,需要休息一下!!!", players[1]);
                                break;
                            case 3://飞盘(+10)
                                msg = string.Format("玩家{0}走到飞盘关卡~@^_^@~,就要前进10格!!!", players[1]);
                                //在加上骰子数的基础前进格
                                pos[1] += 10;
                                break;
                            default://防止意外数字(可有可无)
                                msg = "意外数字,不影响游戏运行";
                                break;
                        }
                        //检测玩家坐标是否在0-99之间
                        CheckPos();
                    }
                    if (msg != "")
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine(msg);
                        Console.ResetColor();
                        Console.ReadKey();
                    }
                    //清屏
                    Console.Clear();
                    //重新绘制地图
                    DrawMap();
                    #endregion
            }
            if (pos[0] == 99)
            {
               Console.WriteLine("恭喜玩家A赢得胜利,按任意键重新开始下次游戏");
            }
            else
            {
                 Console.WriteLine("恭喜玩家B赢得胜利,按任意键重新开始下次游戏");
            }
          //用于while(true)循环
          //下次循环之前两个玩家坐标恢复为0
          //否则就会陷入死循环
          //玩家坐标等于99,条件一直成立
          //不再进入投掷骰子的循环中
            pos[0] = 0;
            pos[1] = 0;
          //程序暂停,显示玩家胜利信息
           Console.ReadKey();
          //清除之前的地图与投掷骰子的信息
            Console.Clear();
        }
    }
  
    #region 检测并限制玩家坐标必须在0-99
        // 检测当前玩家坐标
        static void CheckPos()
        {
            for (int i = 0; i < pos.Length; i++)
            {
                //假设骰子数为3,地图中下标为3的是地雷
                //按照规则退6步,玩家坐标就会变为-3
                //因此需要限制玩家坐标在0-99
                if (pos[i] < 0)
                {
                    pos[i] = 0;
                }
                if (pos[i] > 99)
                {
                    pos[i] = 99;
                }
            }
        }
        #endregion

    #region 3 依据关卡数据绘制地图
        static void DrawMap()
        {
            Console.WriteLine("● 地雷(-6)  ▲ 暂停(0)  ◎ 飞盘(+10)");
            Console.WriteLine("");
            Console.WriteLine("玩家A的坐标: {0}", pos[0]);
            Console.WriteLine("玩家B的坐标: {0}", pos[1]);
            #region 绘制第一横排30个关卡
            //绘制第一横排30个关卡
            for (int i = 0; i <= 29; i++)
            {
                //string str = GetPattern(i);
                //Console.Write(str);
                //调用方法即可
                Console.Write(GetPattern(i));
            }
            #endregion

            //换行绘制竖排
            Console.WriteLine("");

            #region 绘制第一竖排5个关卡
            for (int i = 30; i < 35; i++)
            {
                //绘制竖排关卡前面的空格

                ////一个半角空格
                //for (int j = 0; j < 58; j++)
                //{
                //    Console.Write(" ");
                //}
                //一个全角空格(就是两个半角空格)
                for (int j = 0; j < 29; j++)
                {
                    Console.Write("  ");
                }

                //绘制关卡
                Console.WriteLine(GetPattern(i));
            }
            #endregion

            //绘制第二横排关卡
            for (int i = 64; i >= 35; i--)
            {
                Console.Write(GetPattern(i));
            }
            //绘制第二竖排关卡
            Console.WriteLine("");
            for (int i = 65; i < 70; i++)
            {
                Console.WriteLine(GetPattern(i));
            }
            //绘制第三横排
            for (int i = 70; i < 100; i++)
            {
                Console.Write(GetPattern(i));
            }
            //恢复默认颜色,否则下面再输入其他字符
            //就会是之前最后设置的颜色
            //Console.ResetColor();
            //或者设置为
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine("");
        }

        /// <summary>
        /// 根据下标返回对应的关卡图案
        /// </summary>
        /// <param name="index">下标</param>
        /// <returns>返回对应关卡图案</returns>
        static string GetPattern(int index)
        {
            string strPt = "";
            //判断两个玩家坐标是否相同
            if (index == pos[0] && pos[0] == pos[1])
            {
                //设置输出字符时要显示的颜色
                Console.ForegroundColor = ConsoleColor.Cyan;
                strPt = "><";
            }
            //判断玩家A
            else if (index == pos[0])
            {
                Console.ForegroundColor = ConsoleColor.Cyan;
                strPt = "A";
            }
            //判断玩家B
            else if (index == pos[1])
            {
                Console.ForegroundColor = ConsoleColor.Cyan;
                strPt = "B";
            }
            //排除前面条件后判断各类型关卡
            else
            {
                //判断各类型关卡
                switch (levelData[index])
                {
                    //普通关卡
                    case 0:
                        Console.ForegroundColor = ConsoleColor.White;
                        strPt = "□";
                        break;
                    //地雷关卡
                    case 1:
                        Console.ForegroundColor = ConsoleColor.Red;
                        strPt = "●";
                        break;
                    //暂停关卡
                    case 2:
                        Console.ForegroundColor = ConsoleColor.Yellow;
                        strPt = "▲";
                        break;
                    //飞盘关卡
                    case 3:
                        Console.ForegroundColor = ConsoleColor.DarkGreen;
                        strPt = "◎";
                        break;
                    //防止意外数据(可以忽略不要)
                    default:
                        Console.ForegroundColor = ConsoleColor.White;
                        strPt = "□";
                        break;
                }
            }
            return strPt;
        }
        #endregion

    #region 2 手动初始化关卡数据
        //初始化地图关卡数据
        static void InitData()
        {
            //●表示地雷 设置元素值为 1
            int[] mine = { 3, 23, 35, 47, 52, 66, 79, 82, 93 };
            //▲表示暂停 设置元素值为 2
            int[] suspend = { 7, 26, 55, 69, 88 };
            //◎表示飞盘 设置元素值为 3
            int[] frisbee = { 9, 33, 59, 85 };
            for (int i = 0; i < mine.Length; i++)
            {
                //int a=mine[i];  
                //chequer[a]=1;
                //等同于下面
                levelData[mine[i]] = 1;
            }
            for (int i = 0; i < suspend.Length; i++)
            {
                levelData[suspend[i]] = 2;
            }
            for (int i = 0; i < frisbee.Length; i++)
            {
                levelData[frisbee[i]] = 3;
            }
        }
        #endregion

    #region 1 显示游戏信息
        //显示游戏信息
        static void ShowMapInfo()
        {
            string title = "飞行棋小游戏 1.0";
            Console.Title = title;
            Console.WriteLine("\t\t\t***************************");
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("\t\t\t*    " + title + "     *");
            Console.ForegroundColor = ConsoleColor.Gray;
            Console.WriteLine("\t\t\t***************************");
            Console.WriteLine("\t\t\t\t飞行棋游戏规则");
            Console.WriteLine("\t\t\t●地雷(-6) ▲暂停(0) ◎飞盘(+10)");
            Console.WriteLine("");
        }
        #endregion
}

上面玩家A,B遇到关卡的逻辑判断代码90%以上都一样,有许多的冗余代码,因此将其提取为一个方法,方法只需传入当前玩家即可

  static void Main(string[] args)
  {
      while (true)
      {
          ShowMapInfo();
          InitData();
          DrawMap();
          //任意玩家坐标没有到达99
          //进入循环依次投掷骰子
          while (pos[0] <= 99 && pos[1] <= 99)
          {
              //用于判断玩家A
              CheckLeve(0);
              //判断有任意玩家坐标到达99
              //退出投掷骰子的循环
              if (pos[0] == 99 || pos[1] == 99)
              {
                  break;
              }
              //==================================
              //判断玩家B
              CheckLeve(1);
          }
          //退出投掷骰子的循环
          //判断哪个玩家赢得胜利
          if (pos[0] == 99)
          {
              Console.WriteLine("恭喜玩家A赢得胜利,按任意键重新开始下次游戏");
          }
          else
          {
              Console.WriteLine("恭喜玩家B赢得胜利,按任意键重新开始下次游戏");
          }
          //玩家A,B坐标重置,游戏重新开始运行
          pos[0] = 0;
          pos[1] = 0;
          Console.ReadKey();
          Console.Clear();
      }
  }
//检测当前玩家遇到关卡的逻辑判断
static void CheckLeve(int curIndex)
{
    Random r = new Random();
    int rdm = 0;//用于接收产生的随机数     
    string msg = "";//用于显示关卡信息

    Console.WriteLine("玩家{0}按任意键开始投掷骰子", players[curIndex]);
    Console.ReadKey(true);//true 不显示所按的是什么键
    rdm = r.Next(1, 7);//产生1-6之间任意的整数
    Console.WriteLine("玩家{0}骰子数为{1}", players[curIndex], rdm);
    Console.WriteLine("按任意键玩家{0}开始行走", players[curIndex]);
    Console.ReadKey(true);
    //骰子数就是当前玩家马上行走的关卡数
    pos[curIndex] = pos[curIndex] + rdm;
    CheckPos();
    if (pos[0] == pos[1])
    {
      //如果是玩家A 玩家B回到起点
      //如果是玩家B 玩家A回到起点
        pos[1 - curIndex] = 0;
        msg = string.Format("玩家{0}踩到了玩家{1},玩家{2}从头开始", players[curIndex], players[1 - curIndex], player
curIndex]);
    }
    else
    {
        switch (levelData[pos[curIndex]])
        {
            case 0://可有可无
                //普通关卡,没有逻辑判断
                //与default对应使用
                break;
            case 1://地雷(-6)
                msg = string.Format("玩家{0}走到地雷关卡~@-_-@~,将要后退6格!!!", players[curIndex]);
                //在加上骰子数的基础上退6格
                pos[curIndex] -= 6;
                break;
            case 2://暂停(0)
                //减去增加的骰子数
                pos[curIndex] -= rdm;
                msg = string.Format("玩家{0}走到暂停关卡~@-_-@~,需要休息一下!!!", players[curIndex]);
                break;
            case 3://飞盘(+10)
                msg = string.Format("玩家{0}走到飞盘关卡~@^_^@~,就要前进10格!!!", players[curIndex]);
                ////在加上骰子数的基础前进格
                //pos[curPos] += 10;
                //在减去骰子数的基础前进格
                pos[curIndex] += 10 - rdm;
                break;
            default://防止意外数字(可有可无)
                msg = "意外数字,不影响游戏运行";
                break;
        }
        //检测玩家坐标是否在0-99之间
        CheckPos();
    }
    if (msg != "")
    {
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine(msg);
        Console.ResetColor();
        Console.ReadKey();
    }
    //清屏
    Console.Clear();
    //重新绘制地图
    DrawMap();
}

玩家A投掷骰子后必须判断两个玩家坐标是否达到99,如果玩家A被玩家B踩到,就有可能玩家B先达到条件,赢得比赛;如果只判断A,就不会退出投掷骰子的循环

玩家B坐标先达到99,赢得胜利

相关推荐

Nginx 响应提速10倍,你需要知道的缓存性能优化——FastCGI调优
Nginx 响应提速10倍,你需要知道的缓存性能优化——FastCGI调优

Nginx缓存优化是帮助大家提升网站性能的重要操作之一,proxy_cache主要用于反向代理时,对后端内容源服务器进行缓存;fastcgi_cache主要用于...

2024-05-20 14:44 gowuye

王者荣耀天魔缭乱和逐梦之音返场活动地址 3月22日开启返场活动
王者荣耀天魔缭乱和逐梦之音返场活动地址 3月22日开启返场活动

王者荣耀官方终于确定了天魔缭乱和逐梦之音的返场活动,这让不少小伙伴乐开了花,返场活动将会在3月22日开启,下面就带来王者荣耀天魔缭乱和逐梦之音返场活动地址!王者...

2024-05-20 14:44 gowuye

常见的嵌入式web服务器有哪些?

嵌入式WEB服务器常见的有:Lighttpd,Shttpd,Thttpd,Boa,Mini_httpd,Appweb,Goahead。Lighttpd地址:http://www.light...

简述几款常见的嵌入式web服务器
简述几款常见的嵌入式web服务器

嵌入式web服务器,是web服务器当中的一种,是基于嵌入式系统而实现的web服务器。指的是在嵌入式系统(通俗点就是单片机系统)上实现的一个web服务器,可以通过...

2024-05-20 14:44 gowuye

教你如何利用fastcgi_cache缓存加速WordPress

在使用nginx缓存之前,必须在nginx里面加载专门的模块,这个模块叫做ngx_cache_purge。添加ngx_cache_purge模块下载ngx_cache_purge模块ngx_cache...

扫描WordPress漏洞

检测已知漏洞WPScan是一款广泛使用的WordPress安全扫描工具,它的一项重要功能是检测已知漏洞。在这篇文章中,我们将深入探讨WPScan如何检测已知漏洞,并结合实际示例,帮助读者更好地理解和应...

消灭 Bug!推荐几个给力的开源 Bug 跟踪工具
消灭 Bug!推荐几个给力的开源 Bug 跟踪工具

在这个充满bug的世界里,最遥远的距离不是生与死,而是你亲手制造的bug就在你眼前,你却怎么都找不到它。因此本文准备了7款优秀的开源bug跟踪系...

2024-05-20 14:43 gowuye

生物信息分析入门全攻略

生物信息学是生命科学研究的重大前沿领域,未来将占据生命科学研究的半壁江山。已经有越来越多的小伙伴投入到生物信息的学习中,但是入门难、深入慢、摸不到方向等都成为持续学习的拦路虎。本文根据生物信息技术大牛...

elkb实践经验,再赠送一套复杂的配置文件
elkb实践经验,再赠送一套复杂的配置文件

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。宝剑锋从磨砺出,梅花香自苦寒来。诗人白居易,三月下江南,看到沿路开放的桃花,心潮澎湃...

2024-05-20 14:43 gowuye

超详细从0到1 搭建ELK监控
超详细从0到1 搭建ELK监控

监控分类?Metrics用于记录可聚合的数据。例如,1、队列的当前深度可被定义为一个度量值,在元素入队或出队时被更新;HTTP请求个数可被定义为一个计数器,...

2024-05-20 14:42 gowuye

嵌入式开发 之Web配置页面开发
嵌入式开发 之Web配置页面开发

1.PHP是最好的语言??开发动态页面首选的语言是PHP,村村不能在这里忽悠人,如果你的硬件性能允许切略懂PHP,看到这里就可以退出了。本文面向的受众是Linu...

2024-05-20 14:42 gowuye

Python开发一个网站目录扫描工具用来检测网站是否有漏洞?
Python开发一个网站目录扫描工具用来检测网站是否有漏洞?

开发一个网站目录扫描工具是用来检测网站是否有非法目录请求的一个常见需求之一,我们要通过这个扫描工具来找到通过某个域名可以访问到的网站路径,可能对于有些系统来讲,...

2024-05-20 14:42 gowuye

创建一个类似Youtube的Id——使用PHP/Python/JS/Java/SQL

id通常都是用数字,不巧的是只有10个数字来使用,所以如果你有很多的记录,id往往变得非常冗长。当然对于计算机来说无所谓,但我们更希望id尽可能短。所以我们如何能使id变短?我们可以利用字母让它们附加...

快速云:有助于移动应用安全开发的五条妙计
快速云:有助于移动应用安全开发的五条妙计

许多企业不断地向其开发团队提供培训。但是某些漏洞,如早在十多年前就发现的SQL注入,如今仍广泛存在于各种应用中。因而,安全培训永不过时。在开发移动应用时,开发者...

2024-05-20 14:41 gowuye

洛杉矶国际电影节最佳动画短片奖影片《G’DAY》正式全网上映
洛杉矶国际电影节最佳动画短片奖影片《G’DAY》正式全网上映

7月2日,由M&CSaatchi创作,由深受好评的澳大利亚导演迈克尔·格雷西执导的动画短片《G’day》,正式在全网上映。该影片因其出色的创意赢得了洛...

2024-05-20 14:41 gowuye

取消回复欢迎 发表评论: