Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 18

Динамический свитч?

04.11.2015, 10:55. Показов 1910. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, такая проблема. Захотелось написать текстовый квест в консоли и сразу же появилась проблема: меню перемещения.
Есть несколько пунктов. В зависимости от того, где персонаж и стадии игры пункты убираются.
То есть, скажем у нас есть в начале 5 пунктов, а на следующей развилке - 3. Как вывести пункты - понятно. Но как сделать, чтобы действие исполнялось по номеру пункта? При этом номер был всегда последовательным.
К примеру

Куда идти?
1) Порт
2) Дворец
3) Городская площадь
4) Гильдия художников
*Выбираем 2*
Куда идти?
1) Порт
2) Городская площадь
3) Гильдия художников
4) Дом
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.11.2015, 10:55
Ответы с готовыми решениями:

свитч
чего-то не идет.. #include<iostream> #include<conio.h> using namespace std; int main() { //const int SIZE = 3; //Setting...

Структура свитч-кейс
Написать программу,которая считает количество разных чисел, в рядке символов который вводится с клавиатуры. Программа должна использовать...

Создать динамический класс Book, содержащей динамический массив Authors
всем привет. может кто-то набросать код для такой вот задачи: Создать динамический класс Book, содержащей динамический массив...

20
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.11.2015, 11:00
Граф.
0
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 18
04.11.2015, 15:21  [ТС]
nmcf, граф?
0
166 / 69 / 17
Регистрация: 22.03.2011
Сообщений: 196
04.11.2015, 15:26
krutx, граф.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.11.2015, 15:47
Ну граф переходов.
0
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 18
04.11.2015, 15:55  [ТС]
Это что за зверь такой?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.11.2015, 16:03
Задаёшь множество состояний и набор допустимых переходов для каждого. То, что пронумеровано у тебя - это переходы.
0
 Аватар для Barrent
252 / 128 / 54
Регистрация: 04.05.2013
Сообщений: 346
04.11.2015, 16:30
Цитата Сообщение от krutx Посмотреть сообщение
Это что за зверь такой?
https://ru.wikipedia.org/wiki/... A%D0%B0%29
0
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 18
04.11.2015, 16:57  [ТС]
А можно пример реализации? А то у меня так случится матан головного мозга.
0
 Аватар для Barrent
252 / 128 / 54
Регистрация: 04.05.2013
Сообщений: 346
04.11.2015, 17:21
Лучший ответ Сообщение было отмечено krutx как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <vector>
#include <string>
 
using namespace std;
 
class Node {
    //VARIABLES
    string name;
    vector<Node*> neighboors;
 
    //CONSTRUCTORS
public:
    Node(string name) :name(name) {};
 
    //METHODS
public:
    void PrintNeightboors() {
        cout << "You are at " << name << endl;
        cout << "Choose your way (or type exit):" << endl;
        for (int i = 0; i < neighboors.size(); i++)
            cout << i << "-" << neighboors[i]->name << endl;
    }
    Node* GetNeighboor(int index) {
        if (index < 0 || index > neighboors.size())
            return nullptr;
        return neighboors[index];
    }
    void AddOneWayRoad(Node* neighboor) {
        neighboors.push_back(neighboor);
    }
};
 
int main()
{   
    Node* port = new Node("Port");
    Node* palace = new Node("Palace");
    Node* market = new Node("Market");
    port->AddOneWayRoad(market);
    market->AddOneWayRoad(port);
    market->AddOneWayRoad(palace);
    palace->AddOneWayRoad(market);
 
    Node* position = market;
    while (true) {
        string choise;
        position->PrintNeightboors();
        getline(cin, choise);
        if (choise == "exit")
            break;
        int index = std::stoi(choise);
        Node* next = position->GetNeighboor(index);
        if (next)
            position = next;
    }
 
    system("pause");
    return 0;
}
0
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 18
04.11.2015, 17:41  [ТС]
Barrent, оу... Спасибо. Попробую разобраться.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.11.2015, 17:57
Предлагаю вариант попроще. Граф, разумеется лучше. Но если ТС не требуется каких-то дополнительных сведений о путях (типа времени маршрута или подобных), то есть вероятность, что подойдет.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include <vector>
 
using namespace std;
 
enum Location{
    PORT,
    CASTLE,
    TOWN,
    SQUARE,
    Guild_Artists,
    HOUSE
};
 
 
int main() {
    Location Loc = Location(0);
 
    int i=0;
    int temp;
 
  while (1){
        cout << '\n';
        switch (i){
            case 0:{
                cout << "Вы в порту. Куда идти?\n1.Замок\n2.Площадь\n";
                cin >> temp;
                    switch(temp){
                        case 1:     i = Location(CASTLE);   Loc = CASTLE; break;
                        case 2:     i = Location(SQUARE);   Loc = SQUARE; break;
                        default:;
                    }
                } break;
 
                ////////////////////
                case Location(CASTLE):{
                 cout << "Вы в замке. Куда идти?\n1.Порт\n2.Площадь\n3.Дом\n";
                 cin >> temp;
                 switch(temp){
                        case 1:     i = Location(PORT);     Loc = PORT; break;
                        case 2:     i = Location(SQUARE);   Loc = SQUARE; break;
                        case 3:     i = Location(HOUSE);    Loc = HOUSE; break;
                        default:;
                    }
            } break;
                ////////////////////
 
                case Location(SQUARE):{
                 cout << "Вы на городской площади. Куда идти?\n1.Порт\n2.Замок\n3.Дом\n4.Гильдия художников\n";
                 cin >> temp;
                 switch(temp){
                        case 1:     i = Location(PORT);     Loc = PORT; break;
                        case 2:     i = Location(SQUARE);   Loc = SQUARE; break;
                        case 3:     i = Location(HOUSE);    Loc = HOUSE; break;
                        case 4:     i = Location(Guild_Artists);    Loc = Guild_Artists; break;
 
                        default:;
                    }
            } break;
                ////////////////////
                case Location(HOUSE):{
                 cout << "Вы в доме. Куда идти?\n1.Замок\n2.Площадь\n";
                 cin >> temp;
                 switch(temp){
                        case 1:     i = Location(CASTLE);   Loc = CASTLE; break;
                        case 2:     i = Location(SQUARE);   Loc = SQUARE; break;
                        default:;
                    }
            } break;
                ////////////////////
                 case Location(Guild_Artists):{
                 cout << "Вы в гильдии художников. Куда идти?\n1.Площадь\n";
                 cin >> temp;
                 switch(temp){
                        case 1:     i = Location(SQUARE);   Loc = SQUARE; break;
                        default:;
                    }
            } break;
 
            }
 
 
        }
  }
Рисуем картинку маршрутов и на основе которой, собираем меню выбора.
Миниатюры
Динамический свитч?  
0
202 / 138 / 88
Регистрация: 21.12.2014
Сообщений: 369
04.11.2015, 18:03
Цитата Сообщение от daslex Посмотреть сообщение
Предлагаю вариант попроще. Граф, разумеется лучше. Но если ТС не требуется каких-то дополнительных сведений о путях (типа времени маршрута или подобных), то есть вероятность, что подойдет.
А если таких локаций 100, и нужно иногда добавлять или удалять локации?
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.11.2015, 18:15
Цитата Сообщение от Redzep Посмотреть сообщение
А если таких локаций 100, и нужно иногда добавлять или удалять локации?
а это нужно у ТС уточнять. может он простое делает, а может сложное. Сложное - граф. Простое - и зачем в простом граф?
0
 Аватар для Barrent
252 / 128 / 54
Регистрация: 04.05.2013
Сообщений: 346
04.11.2015, 18:44
Цитата Сообщение от daslex Посмотреть сообщение
Простое - и зачем в простом граф?
1) Меньше кода
2) Меньше повторяющегося кода
3) Простое масштабирование

Добавлено через 11 минут
Ваши кейсы в виде графа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <vector>
#include <string>
 
using namespace std;
 
class Node {
    //VARIABLES
    string name;
    vector<Node*> neighboors;
 
    //CONSTRUCTORS
public:
    Node(string name) :name(name) {};
 
    //METHODS
public:
    void PrintNeightboors() {
        cout << "You are at " << name << endl;
        cout << "Choose your way (or type exit):" << endl;
        for (int i = 0; i < neighboors.size(); i++)
            cout << i << "-" << neighboors[i]->name << endl;
    }
    Node* GetNeighboor(int index) {
        if (index < 0 || index > neighboors.size())
            return nullptr;
        return neighboors[index];
    }
    void AddOneWayRoad(Node* neighboor) {
        neighboors.push_back(neighboor);
    }
    void AddTwoWayRoad(Node* neighboor) {
        neighboors.push_back(neighboor);
        neighboor->neighboors.push_back(this);
    }
};
 
bool IsNumber(string str) {
    for (char& c : str)
        if (c <'0' || c > '9')
            return false;
    return true;
}
 
int main()
{   
    Node* port = new Node("Port");
    Node* castle = new Node("Castle");
    Node* square = new Node("Square");
    Node* guild = new Node("Guild");
    Node* house = new Node("Your house");
    square->AddTwoWayRoad(port);
    square->AddTwoWayRoad(castle);
    square->AddTwoWayRoad(house);
    square->AddTwoWayRoad(guild);
    port->AddTwoWayRoad(castle);
    castle->AddTwoWayRoad(house);
 
    Node* position = house;
    while (true) {
        string choice;
        position->PrintNeightboors();
        getline(cin, choice);
        if (choice == "exit")
            break;
        if (!IsNumber(choice))
            continue;
        int index = std::stoi(choice);
        Node* next = position->GetNeighboor(index);
        if (next)
            position = next;
    }
    return 0;
}
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.11.2015, 18:44
Barrent, ну у Вас, в первом коде, так-то, не похоже на граф. И что, много кода?
0
 Аватар для Barrent
252 / 128 / 54
Регистрация: 04.05.2013
Сообщений: 346
04.11.2015, 18:47
Цитата Сообщение от daslex Посмотреть сообщение
Вас, в первом коде, так-то, не граф.
Видимо у нас разные представления о графах
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.11.2015, 19:25

Не по теме:

Цитата Сообщение от Barrent Посмотреть сообщение
Ваши кейсы в виде графа
Не совсем мои кейсы. У меня при неправильном числе не вылетает. Только у меня проверки нет, на то, что это целое число. Но это мелочь. А еще очистки нет.



Добавлено через 26 минут

Не по теме:

хотя наверное 2 раза Enter быстро нажал и не заметил. У Вас не вылетает, прошу прощения. Отличие от моих кейсов в многократном нажатии Enter

1
 Аватар для Barrent
252 / 128 / 54
Регистрация: 04.05.2013
Сообщений: 346
04.11.2015, 19:38
Чтобы не вылетало при пустом вводе нужно расширить проверку на число
C++
1
2
3
4
5
6
7
8
bool IsNumber(string str) {
    if (str.length == 0)
        return false;
    for (char& c : str)
        if (c <'0' || c > '9')
            return false;
    return true;
}
0
0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 18
04.11.2015, 22:31  [ТС]
Цитата Сообщение от Redzep Посмотреть сообщение
А если таких локаций 100, и нужно иногда добавлять или удалять локации?
Именно! Когда в локациях не предполагается каких-то действий, они скрываются.
Для ясности покажу временный костыль.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
        while (!reset || !gameEnd) { 
            if (!inport)
                cout << "1. Отправиться в порт.\n";
            if (!inhome)
                cout << "2. Отправиться к семье.\n";
            if (!incastle)
                cout << "3. Отправиться во дворец.\n";
            if (!inartists)
                cout << "4. Отправиться в гильдию художников.\n";
            if (!inscientists)
                cout << "5. Отправиться в резиденцию научного общества.\n";
            cout << "6. Отправиться на городскую площадь.\n";
            choose=0;
            cin >> choose;
            switch (choose) {
            case 1:
                portLoc();
                break;
            case 2:
                familyLoc();
                break;
            case 3:
                castleLoc();
                break;
            case 4:
                artistsLoc();
                break;
            case 5:
                scientistsLoc();
                break;
            case 6:
                squareLoc();
                break;
            default:
                cout << "Неверное значение.";
            };
            endoflive(); //Время меняется только после смены локаций, а так же проверка, не кончилось ли время.
        }
Если кому интересно, весь индусский код: https://drive.google.com/file/... sp=sharing
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.11.2015, 22:31
Помогаю со студенческими работами здесь

Создать динамический класс Book, содержащий динамический массив Authors
Мне нужно написать программу,а я не знаю как ее написать. Знаю, тут люди за кого-то не делают, укажите хотя бы направление. вот сама...

Найти ошибку в программе со Свитч
Здраствуйте. недавно начал работать с оператором switch и при выполнении задания я где-то допустил ошибку. Не могли бы вы подсказать, что...

Не работает свитч. Не найду решение никак
// 11.cpp : Defines the entry point for the console application. // #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; ...

Динамический массив при наследовании, элементами которого являются объекты класса наследника динамический массив
Попробовал создать динамический массив, у которого элементы - объекты класса динамический массив, причем использовал класс-наследник от...

Динамический массив ,элементами которого являются объекты класса динамический массив
Доброго времени суток, захотел создать динамический массив ,элементами которого являются объекты класса динамический массив, если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru