Еще не готовый кубик рубика

Здравствуйте, недавно я начал учить язык C++.

Вот часть моей программы:

 #include "stdafx.h"
        #include <iostream>
        #include <string>
        #include <conio.h>


    using namespace std;

// списки являющиеся сторонами кубика, в режиме отладки буквы замещены цифрами
    char s1[9] = { '1','2','3','4','5','6','7','8','9' },
        s2[9] = { '1','2','3','4','5','6','7','8','9' },
        s3[9] = { '1','2','3','4','5','6','7','8','9' },
        s4[9] = { '1','2','3','4','5','6','7','8','9' },
        s5[9] = { '1','2','3','4','5','6','7','8','9' },
        s6[9] = { '1','2','3','4','5','6','7','8','9' };


     //  функция,замещая элементы списка ss1 элементами списками ss2  
    void rav(char ss1[9], char ss2[9]) {
        for (int i = 0; i < 9; i++) { 
            ss1[i] = ss2[i];
        }
    }

    void rev_r(char s[9]) {
        char cloud = s[0];
        s[0] = s[6];
        s[6] = s[8];
        s[8] = s[2];
        s[2] = cloud;
        cloud = s[1];
        s[1] = s[3];
        s[3] = s[7];
        s[7] = s[5];
        s[5] = cloud;
    }


    void rev_l(char s[9]) {
        char cloud = s[0];
        s[0] = s[2];
        s[2] = s[8];
        s[8] = s[6];
        s[6] = cloud;
        cloud = s[1];
        s[1] = s[5];
        s[5] = s[7];
        s[7] = s[3];
        s[3] = cloud;
    }


    // функция, которая позволяет просто повернуть сам кубик влево
    void rev_horiz_l() {
        char cloud [9];
        rav(cloud, s1);
        rav(s1,s2);
        rav(s2,s3);
        rav(s3,s4);
        rav(s4,cloud);
        rev_l(s5);
        rev_r(s6);
    }


    // аналогичная функция
    void rev_horiz_r() {
        char cloud [9];
        rav(cloud, s1);
        rav(s1, s4);
        rav(s4, s3);
        rav(s3, s2);
        rav(s2, cloud);
        rev_r(s5);
        rev_l(s6);
    }


    void dr() {
        system("cls");
        cout << "    " << s5[0] << s5[1] << s5[2] << endl;
        cout << "    " << s5[3] << s5[4] << s5[5] << endl;
        cout << "    " << s5[6] << s5[7] << s5[8] << endl;
        cout << s2[0] << s2[1] << s2[2] << " " << s1[0] << s1[1] << s1[2] << " " << s4[0] << s4[1] << s4[2] << " " << s3[0] << s3[1] << s3[2] << endl;
        cout << s2[3] << s2[4] << s2[5] << " " << s1[3] << s1[4] << s1[5] << " " << s4[3] << s4[4] << s4[5] << " " << s3[3] << s3[4] << s3[5] << endl;
        cout << s2[6] << s2[7] << s2[8] << " " << s1[6] << s1[7] << s1[8] << " " << s4[6] << s4[7] << s4[8] << " " << s3[6] << s3[7] << s3[8] << endl;
        cout << "    " << s6[0] << s6[1] << s6[2] << endl;
        cout << "    " << s6[3] << s6[4] << s6[5] << endl;
        cout << "    " << s6[6] << s6[7] << s6[8] << endl;
    }


    void input() {
        if (_kbhit()) {
            switch (_getch()) {
            case 'e':
                rev_horiz_r();
                dr();
            case 'w':
                rev_horiz_l();
                dr();
            }
        }
    }


    int main(){
        while (true){
            input();
        }

        system ("pause");
        return 0;
    }

Я столкнулся с такой проблемой:
нажимая на клавишу W цифры в развертке кубика меняються, однако нажимая на клавишу E ничего не происходит.

Так же прошу помочь мне с оптимизацией программы.

Подробно код посмотрю вечером, а сейчас скажу, где Вы можете поискать логический баг.
1) В input().
2) В rev_horiz_r().

При выполнении веток case в switch,
происходит «проваливание» в следующую ветку.
Описываю ход выполнения:

        switch (_getch()) {
        case 'e'://Если зашли сюда
            rev_horiz_r();//Выполняем
            dr();//Выполняем
            //Здесь нет break;, поэтому
        case 'w'://Проваливаемся сюда
            rev_horiz_l();//Выполняем как ни в чем не бывало
            dr();//Выполняем
        }

Итого получается, что при нажатии на 'e', у Вас сначала всё «крутится» вправо,
а «затем», сразу же, крутится влево, поэтому создается впечатление, что ничего не происходит.
Решение — поставить break;

        switch (_getch()) {
        case 'e':
            rev_horiz_r();
            dr();
            break;//Выйдем из switch
        case 'w':
            rev_horiz_l();
            dr();
            //В последней секции можно не ставить break,
            break;//но во избежании дальнейших ошибок, лучше поставить.
        }

Остальной код не смотрел.

Я просмотрела и заметила, что отсутствует оператор break(), но Вы сказали это раньше, мастер-успел.

Благодарю за проявленное терпение! Теперь при условии наличия других функций, «кубик» будет полностью функцонировать.

И у меня с брейком всё получилось. Я поняла: просто функции «налаживаются» друг на друга и прога глючит.

Могу кое-что посоветовать: Вы ещё можете сделать и так, чобы цифры менялись не только по горизонтали, но и по вертикали(при нажатии двух других клавиш).
Удачи в создании!

Вот рабочий прототип моего кубика!

    #include "stdafx.h"
#include <iostream>
#include <conio.h>


using namespace std;

char s1[9] = { 'r','r','r','r','r','r','r','r','r' },
    s2[9] = { 'g','g','g','g','g','g','g','g','g' },
    s3[9] = { 'o','o','o','o','o','o','o','o','o' },
    s4[9] = { 'b','b','b','b','b','b','b','b','b' },
    s5[9] = { 'y','y','y','y','y','y','y','y','y' },
    s6[9] = { 'w','w','w','w','w','w','w','w','w' };


void rev(char ss[9]) {
    char cloud[4];
    for (int i = 0; i < 5; i++) {
        cloud[i] = ss[i];
        ss[i] = ss[8-i];
        ss[8-i] = cloud[i];
    }
}


void rav(char ss1[9], char ss2[9]) {
    for (int i = 0; i < 9; i++) {
        ss1[i] = ss2[i];
    }
}


void rev_r(char s[9]) {
    char cloud = s[0];
    s[0] = s[6];
    s[6] = s[8];
    s[8] = s[2];
    s[2] = cloud;
    cloud = s[1];
    s[1] = s[3];
    s[3] = s[7];
    s[7] = s[5];
    s[5] = cloud;
}
void rev_l(char s[9]) {
    char cloud = s[0];
    s[0] = s[2];
    s[2] = s[8];
    s[8] = s[6];
    s[6] = cloud;
    cloud = s[1];
    s[1] = s[5];
    s[5] = s[7];
    s[7] = s[3];
    s[3] = cloud;
}


void rev_horiz_r() {
    char cloud [9];
    rav(cloud, s1);
    rav(s1,s2);
    rav(s2,s3);
    rav(s3,s4);
    rav(s4,cloud);
    rev_l(s5);
    rev_r(s6);
} 
void rev_horiz_l () {
    rev_horiz_r();
    rev_horiz_r();
    rev_horiz_r();
}


void rev_vertical_u(){
    char cloud[9];
    rav(cloud, s5);
    rav(s5 , s1);
    rav(s1 , s6);
    rav(s6 , s3);
    rev(s6);
    rav(s3 , cloud);
    rev(s3);

    rev_l(s2);
    rev_r(s4);
}
void rev_vertical_d() {
    rev_vertical_u();
    rev_vertical_u();
    rev_vertical_u();
}


void u_r(){
    char cloud[3];
    for (int i=0;i<3;i++){
        cloud[i] = s1[i];
        s1[i] = s2[i];
        s2[i] = s3[i];
        s3[i] = s4[i];
        s4[i] = cloud[i];

    }
  rev_l(s5);
  } 
void u_l() {
    u_r();
    u_r();
    u_r();
}


void r_u() {
    rev_vertical_u();
    rev_horiz_r();
    rev_vertical_d();
    u_l();
    rev_vertical_u();
    rev_horiz_l();
    rev_vertical_d();
}
void r_d() {
    rev_vertical_u();
    rev_horiz_r();
    rev_vertical_d();
    u_r();
    rev_vertical_u();
    rev_horiz_l();
    rev_vertical_d();
}


void d_l() {
    char cloud[3];
    for (int i = 0; i < 3; i++) {
        cloud[i] = s1[6 + i];
        s1[6 + i] = s4[6 + i];
        s4[6 + i] = s3[6 + i];
        s3[6 + i] = s2[6 + i];
        s2[6 + i] = cloud[i];
    }
        rev_l(s6);
}
void d_r() {
    d_l();
    d_l();
    d_l();
}


void l_d() {
    rev_vertical_u();
    rev_horiz_r();
    rev_vertical_d();
    d_r();
    rev_vertical_u();
    rev_horiz_l();
    rev_vertical_d();
}
void l_u() {
    rev_vertical_u();
    rev_horiz_r();
    rev_vertical_d();
    d_l();
    rev_vertical_u();
    rev_horiz_l();
    rev_vertical_d();
}


void b_nch() {
    rev_horiz_r();
    r_d();
    rev_horiz_l();
}
void b_ch() {
    rev_horiz_r();
    r_u();
    rev_horiz_l();
}


void f_ch() {
    rev_horiz_r();
    l_d();
    rev_horiz_l(); }
void f_nch() {
    rev_horiz_r();
    l_u();
    rev_horiz_l();
}




void dr() {
    system("cls");
    cout << "    " << s5[0] << s5[1] << s5[2] << endl;
    cout << "    " << s5[3] << s5[4] << s5[5] << endl;
    cout << "    " << s5[6] << s5[7] << s5[8] << endl;
    cout << s2[0] << s2[1] << s2[2] << " " << s1[0] << s1[1] << s1[2] << " " << s4[0] << s4[1] << s4[2] << " " << s3[0] << s3[1] << s3[2] << endl;
    cout << s2[3] << s2[4] << s2[5] << " " << s1[3] << s1[4] << s1[5] << " " << s4[3] << s4[4] << s4[5] << " " << s3[3] << s3[4] << s3[5] << endl;
    cout << s2[6] << s2[7] << s2[8] << " " << s1[6] << s1[7] << s1[8] << " " << s4[6] << s4[7] << s4[8] << " " << s3[6] << s3[7] << s3[8] << endl;
    cout << "    " << s6[0] << s6[1] << s6[2] << endl;
    cout << "    " << s6[3] << s6[4] << s6[5] << endl;
    cout << "    " << s6[6] << s6[7] << s6[8] << endl;
}


void input() {
    if (_kbhit()) {
        switch (_getch()) {
        case 'd':
            rev_horiz_r();
            dr();
            break;
        case 'a':
            rev_horiz_l();
            dr();
            break;
        case 's':
            rev_vertical_d();
            dr();
            break;
        case 'w':
            rev_vertical_u();
            dr();
            break;
        case 'l':
            u_l();
            dr();
            break;
        case 'o':
            u_r();
            dr();
            break;
        case 'k':
            d_l();
            dr();
            break;
        case 'i':
            d_r();
            dr();
            break;
        case 'j':
            r_d();
            dr();
            break;
        case 'u':
            r_u();
            dr();
            break;
        case 'h':
            l_d();
            dr();
            break;
        case 'y':
            l_u();
            dr();
            break;
        case 't':
            b_ch();
            dr();
            break;
        case 'g':
            b_nch();
            dr();
            break;
        case 'f':
            f_nch();
            dr();
            break;
        case 'r':
            f_ch();
            dr();
            break;

        }
    }
}


int main(){
    dr();
    while (true){
        input();
    }

    system ("pause");
    return 0;
}

Ниже представлены черновые версии этой же программы на языке Python3

На основе ооп

Без ооп
(Так как в предоставленном сайтом компиляторе возникае ошибка «EOF when reading a line», то лучше использовать другой компилятор, например, этот )

Итого:
w — поворот самого куба вверх
s — поворот вниз
a — поворот влево
d — поворот вправо
f/r — поворот задней стороны
g/t — поворот передней стороны
h/y — поворот левой стороны
j/u — поворот правой стороны
k/i — поворот нижней стороны
l/o — поворот верхней стороны

conio.h.
Классная прога! Вот уметь бы её в фрейме сделать...

conio.h. Классная прога! Вот уметь бы её в фрейме сделать...

Спасибо!

А Вы уже на питоне умеете?!

Чуть-чуть умею.

conio.h.
Теперь я знаю, почему у вас цифры вместо букв! Я слышала,char связан с шестнадцатеричной системой исчисления. Попробуйте string.

Теперь я знаю, почему у вас цифры вместо букв! Я слышала,char связан с
шестнадцатеричной системой исчисления. Попробуйте string.

А нет, не угадали.
Цифры нужны были, что бы проверить правильность работы функций, их роль могли выполнять любые неодинаковые символыю

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.