Nick McCaffery Ответов: 1

Как мне исправить этот скользящий код головоломки в C++, чтобы он соответствовал моему заданию?


Я начал разрабатывать стартовый код для задания скользящей головоломки, но теперь не знаю, как его отформатировать, чтобы удовлетворить потребности этого задания. Если кто-нибудь сможет дать мне представление о том, как исправить мой код, это будет оценено по достоинству.

Назначение:
правила
Каждая 8-головоломка имеет плитки с надписью 1-8 и одно пустое пространство, обозначенное 0.
Приведенные команды указывают, где вы должны попытаться переместить пустое пространство относительно его текущего положения.
Единственные ходы, которые вам разрешено делать, - это замена пустого пространства соседней плиткой.
Если вас попросят сделать невозможную замену (т. е. переместить пустую плитку за пределы сетки), не завершайте программу, просто проигнорируйте эту команду.
назначение
Для этого задания мы просим вас взять 8-ю головоломку и следовать последовательности команд движения вверх, вниз, влево и вправо. В конце последовательности вы должны проверить, была ли головоломка решена.

Ввод
В качестве входных данных вам будет дано некоторое начальное состояние доски в виде последовательности чисел, где 0 соответствует "пустой" плитке. Приведенный ниже пример будет представлять собой форму приведенного выше примера "начального состояния". После этого будет последовательность команд "вверх", "вниз", "влево" и "вправо", представленных символами на одной строке, разделенной пробелами. (Приведенная ниже последовательность команд не имеет никакого отношения к графическому изображению примера)

1 8 2 0 4 3 7 6 5
Д Р Р Р У Л
ваша задача
После сохранения начального состояния платы вы будете выполнять данные команды (до тех пор, пока они разрешены, как указано в разделе правил). Выполните все команды, а затем проверьте, правильно ли решена головоломка.

Выход
Ваш выход должен быть решением хорош! если головоломка находится в решенном порядке, как указано выше, и неправильное решение! если головоломка не находится в "целевом состоянии", указанном выше.

Что я уже пробовал:

#include <time.h>
#include <stdlib.h>
#include <vector>
#include <string>
#include <iostream>
class p15 {
public :
    void play() {
        bool p = true;
        std::string a;
        while( p ) {
            createBrd();
            while( !isDone() ) { drawBrd();getMove(); }
            drawBrd();
            std::cout << "\n\nCongratulations!\nPlay again (Y/N)?";
            std::cin >> a; if( a != "Y" && a != "y" ) break;
        }
    }
private:
    void createBrd() {
        int i = 1; std::vector<int> v;
        for( ; i < 16; i++ ) { brd[i - 1] = i; }
        brd[15] = 0; x = y = 3;
        for( i = 0; i < 1000; i++ ) {
            getCandidates( v );
            move( v[rand() % v.size()] );
            v.clear();
        }
    }
    void move( int d ) {
        int t = x + y * 4;
        switch( d ) {
            case 1: y--; break;
            case 2: x++; break;
            case 4: y++; break;
            case 8: x--;
        }
        brd[t] = brd[x + y * 4];
        brd[x + y * 4] = 0;
    }
    void getCandidates( std::vector<int>& v ) {
        if( x < 3 ) v.push_back( 2 ); if( x > 0 ) v.push_back( 8 );
        if( y < 3 ) v.push_back( 4 ); if( y > 0 ) v.push_back( 1 );
    }
    void drawBrd() {
        int r; std::cout << "\n\n";
        for( int y = 0; y < 4; y++ ) {
            std::cout << "+----+----+----+----+\n";
            for( int x = 0; x < 4; x++ ) {
                r = brd[x + y * 4];
                std::cout << "| ";
                if( r < 10 ) std::cout << " ";
                if( !r ) std::cout << "  ";
                else std::cout << r << " ";
            }
            std::cout << "|\n";
        }
        std::cout << "+----+----+----+----+\n";
    }
    void getMove() {
        std::vector<int> v; getCandidates( v );
        std::vector<int> p; getTiles( p, v ); unsigned int i;
        while( true ) {
            std::cout << "\nPossible moves: ";
            for( i = 0; i < p.size(); i++ ) std::cout << p[i] << " ";
            int z; std::cin >> z;
            for( i = 0; i < p.size(); i++ )
                if( z == p[i] ) { move( v[i] ); return; }
        }
    }
    void getTiles( std::vector<int>& p, std::vector<int>& v ) {
        for( unsigned int t = 0; t < v.size(); t++ ) {
            int xx = x, yy = y;
            switch( v[t] ) {
                case 1: yy--; break;
                case 2: xx++; break;
                case 4: yy++; break;
                case 8: xx--;
            }
            p.push_back( brd[xx + yy * 4] );
        }
    }
    bool isDone() {
        for( int i = 0; i < 15; i++ ) {
            if( brd[i] != i + 1 ) return false;
        }
        return true;
    }
    int brd[16], x, y;
};
int main( int argc, char* argv[] ) {
    srand( ( unsigned )time( 0 ) );
    p15 p; p.play(); return 0;
}

Stefan_Lang

Требуемым результатом является либо "решение хорошее!", либо "неправильное решение!" в соответствии с требованиями. Никакого специального форматирования не требуется. Так в чем же на самом деле твоя проблема?

Nick McCaffery

О, хорошо, значит, этот код достаточно хорош, и вам просто нужно будет добавить этот вывод?

Stefan_Lang

Это ты мне скажи. Ваша задача-написать эту программу. Если вы написали его, вы должны знать, что он в настоящее время делает или не делает. Если нет, то вы провалили задание с самого начала.

Вы получили это задание, чтобы помочь вам научиться программированию. Вы не можете учиться программированию, заставляя других писать или завершать вашу программу.

Stefan_Lang

Это ты мне скажи. Это ваша задача-написать эту программу. Если вы написали его, вы должны знать, что он в настоящее время делает или не делает. Если нет, то вы провалили задание с самого начала.

Вы получили это задание, чтобы помочь вам научиться программированию. Вы не можете учиться программированию, заставляя других писать или завершать вашу программу.

1 Ответов

Рейтинг:
2

Patrice T

Цитата:
Как мне исправить этот скользящий код головоломки в C++, чтобы он соответствовал моему заданию?

Вы должны описать проблему, с которой столкнулись.

Цитата:
я не знаю, как отформатировать

Форматирование кода имеет значение, потому что это помогает сделать ваш код легче читаемым.
Никогда не упаковывайте вещи в одну строку кода, ее трудно перечитывать:
for( i = 0; i < p.size(); i++ )
    if( z == p[i] ) { move( v[i] ); return; }

for( i = 0; i < p.size(); i++ )
    if( z == p[i] ) {
        move( v[i] );
        return;
    }

Совет: Научитесь правильно делать отступы в вашем коде, это покажет его структуру и поможет чтению и пониманию. Это также помогает выявлять структурные ошибки.
#include <time.h>
#include <stdlib.h>
#include <vector>
#include <string>
#include <iostream>
class p15 {
    public :
    void play() {
        bool p = true;
        std::string a;
        while( p ) {
            createBrd();
            while( !isDone() ) {
                drawBrd();getMove();
            }
            drawBrd();
            std::cout << "\n\nCongratulations!\nPlay again (Y/N)?";
            std::cin >> a;
            if( a != "Y" && a != "y" )
                break;
        }
    }
    private:
    void createBrd() {
        int i = 1;
        std::vector<int> v;
        for( ; i < 16; i++ ) {
            brd[i - 1] = i;
        }
        brd[15] = 0;
        x = y = 3;
        for( i = 0; i < 1000; i++ ) {
            getCandidates( v );
            move( v[rand() % v.size()] );
            v.clear();
        }
    }
    void move( int d ) {
        int t = x + y * 4;
        switch( d ) {
        case 1:
            y--;
            break;
        case 2:
            x++;
            break;
        case 4:
            y++;
            break;
        case 8:
            x--;
        }
        brd[t] = brd[x + y * 4];
        brd[x + y * 4] = 0;
    }
    void getCandidates( std::vector<int>& v ) {
        if( x < 3 )
            v.push_back( 2 );
        if( x > 0 )
            v.push_back( 8 );
        if( y < 3 )
            v.push_back( 4 );
        if( y > 0 )
            v.push_back( 1 );
    }
    void drawBrd() {
        int r;
        std::cout << "\n\n";
        for( int y = 0; y < 4; y++ ) {
            std::cout << "+----+----+----+----+\n";
            for( int x = 0; x < 4; x++ ) {
                r = brd[x + y * 4];
                std::cout << "| ";
                if( r < 10 )
                    std::cout << " ";
                if( !r )
                    std::cout << "  ";
                else
                    std::cout << r << " ";
            }
            std::cout << "|\n";
        }
        std::cout << "+----+----+----+----+\n";
    }
    void getMove() {
        std::vector<int> v;
        getCandidates( v );
        std::vector<int> p;
        getTiles( p, v );
        unsigned int i;
        while( true ) {
            std::cout << "\nPossible moves: ";
            for( i = 0; i < p.size(); i++ )
                std::cout << p[i] << " ";
            int z;
            std::cin >> z;
            for( i = 0; i < p.size(); i++ )
                if( z == p[i] ) {
                    move( v[i] );
                    return;
                }
        }
    }
    void getTiles( std::vector<int>& p, std::vector<int>& v ) {
        for( unsigned int t = 0; t < v.size(); t++ ) {
            int xx = x, yy = y;
            switch( v[t] ) {
            case 1:
                yy--;
                break;
            case 2:
                xx++;
                break;
            case 4:
                yy++;
                break;
            case 8:
                xx--;
            }
            p.push_back( brd[xx + yy * 4] );
        }
    }
    bool isDone() {
        for( int i = 0; i < 15; i++ ) {
            if( brd[i] != i + 1 )
                return false;
        }
        return true;
    }
    int brd[16], x, y;
};
int main( int argc, char* argv[] ) {
    srand( ( unsigned )time( 0 ) );
    p15 p;
    p.play();
    return 0;
}

Стиль отступа - Википедия[^]

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]


Stefan_Lang

Я действительно не думаю, что был какой-то вопрос о форматировании кода. ;-) Но в остальном хороший совет.

Patrice T

Я знаю, но упаковка в одну строку делает код действительно уродливым :)