Как мне исправить этот скользящий код головоломки в 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
Это ты мне скажи. Это ваша задача-написать эту программу. Если вы написали его, вы должны знать, что он в настоящее время делает или не делает. Если нет, то вы провалили задание с самого начала.
Вы получили это задание, чтобы помочь вам научиться программированию. Вы не можете учиться программированию, заставляя других писать или завершать вашу программу.