扫雷码C ++

时间:2015-12-11 05:26:11

标签: c++ arrays graphics minesweeper

我在编写扫雷的代码部分时遇到了麻烦,当你点击一个空白区域时它就会出现,它会向外级联并产生一个数字环。我有一个数字设置数组和一个炸弹阵列。在数字数组中,零表示没有任何内容。我首先检查点击的点是否是炸弹,如果没有,那么是否有数字,然后else语句必须导致级联和数字环。基本上我经历了四个循环,向上,向下,向左,向右循环框,直到我找到一个数字。从那里我有八个for循环,沿x和y的递增和递减顺序沿着这些行中的每一行,直到找到一个数字。一旦找到一个数字,我会尝试返回原点,但是通过检查我到达那里的路径的边界,将坐标值增加1并将坐标值减1。出于某种原因,我无法让我的代码工作。这是我的while循环的一个例子。 “checkx”和“checky”是数组的坐标。 “revealxposition”和“revealyposition”是图形窗口中的坐标。

int i=0;

         while(i == 0 && checkx < length && checky < length)//right
         {
         if(numbers[checkx][checky] != 0)
         {
             revealxposition = (checkx*20) + 5;
             revealyposition = (checky*20) + 3;
             showNumber(revealxposition, revealyposition, numbers[checkx][checky]);
             xmax = checkx;
             i = 1;
         }
         else
         {
             if(checkx == (length - 1))
             {
                 i = 1;
                 xmax = length;
                 a = checkx*20;
                 b = checky*20;
                 c = a+20;
                 d = b+20;
                 line(a,b,c,d);
                 line(a,d,c,b);
             }
             else
             {
                 a = checkx*20;
                 b = checky*20;
                 c = a+20;
                 d = b+20;
                 line(a,b,c,d);
                 line(a,d,c,b);

                 checkx++;             
              }
         }
         }

这是我的一个for循环的例子:

 for(int xx = checkx; xx < xmax; xx++)
 {
         int z = 0;
         int xxx = xx;
         while(z == 0 && checky < length)
         {
         if(numbers[xx][checky] != 0)
         {
             revealxposition = (xx*20) + 5;
             revealyposition = (checky*20) + 3;

             int originalxposition = revealxposition;
             int originalyposition = revealyposition;

             showNumber(revealxposition, revealyposition, numbers[xx][checky]);

             //reveal diagonals and back
             while(bombs[xx][checky] != 1 && checky >= originaly)
             {
               counter++;
               revealxposition = originalxposition - 20;
               xx = xxx - 1;
                 showNumber(revealxposition, revealyposition, numbers[xx][checky]);
                 checky--;
                 revealyposition -= 20;
             }
             xx = xxx;
             checky = originaly;
             revealxposition = originalxposition;
             revealyposition = originalyposition;
             counter = 0;

             while(bombs[xx][checky] != 1 && checky >= originaly)
             {
               counter++;
               revealxposition = originalxposition + 20;
               xx = xxx + 1;
                 showNumber(revealxposition, revealyposition, numbers[xx][checky]);
                 checky--;
                 revealyposition -= 20;
             }
             xx = xxx;
             z = 1;
             counter = 0;
         }    
         else
         {
             a = xx*20;
             b = checky*20;
             c = a+20;
             d = b+20;
             line(a,b,c,d);
             line(a,d,c,b);
             checky++;
         }
         } 
         checky = originaly;
 }

1 个答案:

答案 0 :(得分:0)

您的代码真的难以阅读,我不知道xx或xxx是什么意思或a=xx*20; 我做了一次扫雷,我非常确定有更简单的方法来检查空白区域。目标是使用递归。让我告诉你一个例子。

void checkNumber(x,y) {
  revealNumber(x,y); // write the number
 if(Number[x,y] == 0){ // if it is blank space, check all 8 square around
       if(x>0) 
           checkNumber(x-1,y); // check left 
       if(x<maxX)
            checkNumber(x+1,y); // check right
       // repeat for up,down and diag
        }
   } 

这将为您提供一个循环,显示所有空格和最接近的空格。希望它可以帮到你。

)