首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奇怪的错误,似乎是通过增加多余的代码行来解决的。十五局

奇怪的错误,似乎是通过增加多余的代码行来解决的。十五局
EN

Stack Overflow用户
提问于 2016-02-29 12:48:43
回答 1查看 46关注 0票数 0

这是一个益智游戏,在一个4x4网格中,必须排列15个编号的瓷砖的顺序。大多数情况下,程序运行良好。然而,当将" 1“数字交换到第n行,n-2列时,程序似乎会出现错误,并复制数字1。

这是陷阱。当我添加一行随机代码时,比如说

代码语言:javascript
复制
int blah = 0;

代码语言:javascript
复制
printf("abc");

这个问题神奇地消失了。

因为我找不到问题的根源,所以我必须把问题的全部内容都张贴出来。

要查看问题,请在没有任何命令行参数的情况下运行代码,然后输入2,后面跟着1。

当我在main()函数的末尾添加随机代码行时,问题就消失了。请你试一试,帮我找出发生了什么事,真是令人费解。

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

int n=4;
int win(int board[n][n]);
void print(int board[n][n]);

int main(int argc, char * argv[])
{
    if(argc != 2)
    {
        printf("No valid number accepted. Board size set as 4x4.\n");
    }
    else if(argc == 2)
    {
        n = atoi(argv[1]);
        if(n<2 || n>5)
        {
            printf("No valid number accepted. Board size set as 4x4.\n");
        }
        else
        {
            printf("Preparing board of size %dx%d\n",n,n);
        }
    }

    int board[n][n];
    printf("\n The aim of the game is to sort the board so that it runs in ascending order, from 1 to %d, from left to right and up to down starting from the top left square. To make a move, enter the number of the tile you want to move. No diagonal movement is allowed.\n\n",n*n-1);
    int c = n*n-1;
    for(int x = 0;x<n;x++)
    {
        for(int y=0;y<n;y++)
        {
            board[x][y] = c;
            c--;
        }
    }
    if(n%2==0)
    {
        int temp1 = board[n-1][n-2];
        board[n-1][n-2] = board[n-1][n-3];
        board[n-1][n-3] = temp1;
    }
    print(board);
    int spacex = n-1;
    int spacey = n-1;
    char buffer[10];
    while(win(board) == 0)
    {
        printf("To move, enter the number you wish to move. Take note that this number must be adjacent to the blank space. Diagonal movement is not allowed.\nYour move: ");
        fgets(buffer,10,stdin);
        int move;
        char temp[20];
        if(sscanf(buffer," %d %s",&move,temp)!= 1)
        {
            printf("Enter a number please.\n");
            continue;
        }
        if(move == board[spacex+1][spacey])
        {
            board[spacex][spacey] = board[spacex+1][spacey];
            board[spacex+1][spacey] = 0;
            spacex++;
        }
        else if(move == board[spacex-1][spacey])
        {
            board[spacex][spacey] = board[spacex-1][spacey];
            board[spacex-1][spacey] = 0;
            spacex--;
        }
        else if(move == board[spacex][spacey+1])
        {
            board[spacex][spacey] = board[spacex][spacey+1];
            board[spacex][spacey+1] = 0;
            spacey++;
        }
        else if(move == board[spacex][spacey-1])
        {
            board[spacex][spacey] = board[spacex][spacey-1];
            board[spacex][spacey-1] = 0;
            spacey--;
        }
        else if(move == 0)
        {
            printf("Enter a valid digit please.\n");
            continue;
        }
        else
        {
            printf("Enter a valid number please.\n");
            continue;
        }
        printf("\n");
        print(board);
    }
    printf("You won!\n");
}
///////////////////////////////////////////////////////
void print(int board[n][n])
{
    for(int x=0;x<n;x++)
    {
        for(int y=0;y<n;y++)
        {
            if(board[x][y] == 0)
            {
                printf("__ ");
            }
            else
                printf("%2d ",board[x][y]);
        }
        printf("\n\n");
    }
}
///////////////////////////////////////////////////////
int win(int board[n][n])
{
    int check = 1;
    for(int x=0;x<n;x++)
    {
        for(int y=0;y<n;y++)
        {
            if(board[x][y] != check)
            {
                if(x==n-1 && y == n-1);
                else
                {
                    return 0;
                }
            }
            check++;
        }
    }
    return 1;
}

任何其他关于代码的评论也将是非常感谢的。提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-29 12:56:54

代码正在超出界限。

这两个变量指向数组board的最后一个元素

代码语言:javascript
复制
   int spacex = n-1;
   int spacey = n-1;

但在所有if语句中使用都不正确。每当使用+1时,它们都会超出界限读出或读取不正确的元素:

代码语言:javascript
复制
if(move == board[spacex+1][spacey])
{
    board[spacex][spacey] = board[spacex+1][spacey];
    board[spacex+1][spacey] = 0;
    spacex++;
}
else if(move == board[spacex-1][spacey])
{ 
...
else if(move == board[spacex][spacey+1])
{
    board[spacex][spacey] = board[spacex][spacey+1];
...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35700001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档