修复益智游戏

时间:2015-02-26 23:45:36

标签: puzzle

我是C ++和编程的新手,这是我的第一个项目'。对不起,如果这不是一个适用的问题,请告诉我,我会立即将其删除。

我想构建一个益智游戏,但是用户不是滑动瓷砖,而是将数字交换到' 0',其中' 0'是空白的瓷砖。

这是我目前的代码:

#include <iostream>
#include <ctime>
#include <algorithm>

using namespace std;

int grid[]= {1,2,3,4,5,6,7,8,0};

void shuffle()
{
    random_shuffle(&grid[0],&grid[9]);
}
void print_puzzle()
{
    shuffle();
    int a=grid[0];
    int b=grid[1];
    int c=grid[2];
    int d=grid[3];
    int e=grid[4];
    int f=grid[5];
    int g=grid[6];
    int h=grid[7];
    int i=grid[8];

    cout<<endl;
    cout<<"     "<<a<<"  "<<b<<"  "<<c<<endl;
    cout<<"     "<<d<<"  "<<e<<"  "<<f<<endl;
    cout<<"     "<<g<<"  "<<h<<"  "<<i<<endl;
}

bool check()
{
    if (grid[0]==1&&grid[1]==2&&grid[2]==3&&grid[3]==4&&grid[4]==5&&grid[6]==7&&grid[7]==8&&grid[8]==0)
    {
        return true;
    }
else
   {
        return false;
   }

}


void swap_puzzle()
{
    print_puzzle();

    int temp=0;

    cout<<"Enter the number adjacent to '0' that you want to be swapped with '0'."<<endl;
    cin>> temp;

    while(check==false)
    {
        for(int i=0; i<9; i++)
        {
            if(grid[i]==temp)
            {
                int pos_num=i;

                for(int j=0; j<9; j++)
                {

                    if(grid[j]==0)
                    {
                        int pos_0=j;
                        swap(grid[pos_num], grid[pos_0]);
                        break;
                    }

                }

            }

        }
        print_puzzle();
    }

}
int main()
{
    srand ( time(NULL) );
    cout<<"The Rules:"<<endl;
    cout<<"There will be a shuffled 3x3 grid with numbers from 1-8, with one blank space denoted by '0'. You can swap '0' only with adjacent numbers. The goal of this game is to rearrange the numbers in the grid in ascending order."<<endl;
    cout<<endl;
    cout<<"The Shuffled Grid: "<<endl;
    swap_puzzle();
    return 0;
}

将输入用户的号码换成&#39; 0&#39;后,网格只是随机播放,而不是像我预期的那样交换它们。我尝试通过将代码分解为更小的函数来解决此问题,但这并没有帮助。

任何建议都将受到赞赏。

3 个答案:

答案 0 :(得分:1)

print_puzzle功能中,你有这一行

shuffle();

这意味着每次你去打印你的拼图时,它都会改变它。你不想要那个。

这一行:

while(check==false)

应该是

while(check()==false)

check本身就是指向函数的指针,而不是对函数的调用。

您还希望将新号码的请求移动到循环中,否则您的循环将永远继续。

答案 1 :(得分:1)

您的代码有几个问题。

  • swap_puzzle()功能结束时,在while循环内,您调用print_puzzle()print_puzzle来电shuffle()。这就是为什么一切都被洗牌而不仅仅是交换操作。要解决这个问题,你必须解耦这两个功能:打印是一回事,洗牌是另一回事。这些都不应该触发另一个。或者可能你可以使用最后调用打印功能的shuffle功能来显示新状态;但是&#34; print&#34;除了打印之外,函数绝不应该做任何事情。

  • 然后,在check()函数中,您忘记了grid[5]==6。实际上这可能并不重要,因为如果所有其他人都在正确的位置,那么网格[5]应该是自动的。无论如何,为了它的成本,我肯定会添加它。

  • 然后,您的swap_puzzle()出现问题,您调用swap然后中断。你有2个嵌套for循环,你必须从两个中断。现在,你正在打破内部的那个(使用j的那个),这意味着程序将在i的下一次迭代中恢复。然后,由于先前的交换,可能再次满足交换条件。因此,用户想要进行一次移动,并且他最终得到2.准确地说,第二个将恢复第一个,当然这不是想要的。要解决此问题,您可以添加一个名为swapped的bool变量,并在while循环的开头将其设置为false;当你到达休息时,在破坏之前你将它设置为真。然后,在内循环结束后立即检查swapped的值:如果为真,则必须再次中断。

  • 由于您的程序现在正在构建,因此您只显示cout并仅使用cin读取输入一次。您必须将两个函数放在while循环中,以便每次都可以运行它们。

答案 2 :(得分:1)

我做了一些小改动,但它确实有效。

  • 开始游戏可能需要洗牌一次。 致电shuffle()中的swap_puzzle()(但打印时不要随意播放)
  • cin>> temp;放入while循环中,以便用户可以输入直到拼图解决
  • 也打破了内循环(我为此添加了一些变量)
  • 最后打电话给check()并打破,如果为真。这意味着解决了。

-

#include <iostream>
#include <ctime>
#include <algorithm>

using namespace std;

int grid[]= {1,2,3,4,5,6,7,8,0};

void shuffle()
{
    random_shuffle(&grid[0],&grid[9]);
}
void print_puzzle()
{
 //   shuffle();
    int a=grid[0];
    int b=grid[1];
    int c=grid[2];
    int d=grid[3];
    int e=grid[4];
    int f=grid[5];
    int g=grid[6];
    int h=grid[7];
    int i=grid[8];

    cout<<endl;
    cout<<"     "<<a<<"  "<<b<<"  "<<c<<endl;
    cout<<"     "<<d<<"  "<<e<<"  "<<f<<endl;
    cout<<"     "<<g<<"  "<<h<<"  "<<i<<endl;
}

bool check()
{
    if (grid[0]==1&&grid[1]==2&&grid[2]==3&&grid[3]==4&&grid[4]==5&&grid[6]==7&&grid[7]==8&&grid[8]==0)
    {
        return true;
    }
else
   {
        return false;
   }

}


void swap_puzzle()
{
    shuffle();
    print_puzzle();

    int temp=0;
    bool swaped = false;
    while(1)
    {
        swaped = false;
        cout<<"Enter the number adjacent to '0' that you want to be swapped with '0'."<<endl;
        cin>> temp;
        for(int i=0; i<9; i++)
        {
            if(grid[i]==temp)
            {
                int pos_num=i;

                for(int j=0; j<9; j++)
                {

                    if(grid[j]==0)
                    {
                        int pos_0=j;
                        swap(grid[pos_num], grid[pos_0]);
                        swaped = true;
                        break;
                    }

                }
            }
                if(swaped) break;

        }
        print_puzzle();
        if(check()==true) break;
    }

}
int main()
{
    srand ( time(NULL) );
    cout<<"The Rules:"<<endl;
    cout<<"There will be a shuffled 3x3 grid with numbers from 1-8, with one blank space denoted by '0'. You can swap '0' only with adjacent numbers. The goal of this game is to rearrange the numbers in the grid in ascending order."<<endl;
    cout<<endl;
    cout<<"The Shuffled Grid: "<<endl;
    swap_puzzle();
    return 0;
}