Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/75: Рейтинг темы: голосов - 75, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 19.11.2017
Сообщений: 4

Создание квест-игры

25.04.2018, 22:25. Показов 14731. Ответов 7

Студворк — интернет-сервис помощи студентам
Нужно создать текстовую квест-игру или скорее визуальную новеллу. По типу: сделал одно действие (нажал кнопку), стало доступно другое действие, а если до этого ты нажал другую кнопку, то будет другое. Самое главное - реализовать разветвление сюжета. Проблема в том, что одна и та же кнопка в разных случаях должна выполнять разные действия.
Для начала, у нас есть форма, на ней внизу 6 кнопок (максимальное число вариантов), выше - лэйбл, куда выводится результат действия, ещё выше - пикчербокс, где сменяются картинки, в зависимости от локации и ваших действий. Так вот, каким образом, можно реализовать простую схему? На форме видимы 2 кнопки - b1 и b2, при нажатии на b1 в лэйбл добавляется текст, изменяется название кнопок на другие варианты, становится видимой кнопка b3. Теперь уже, если ещё раз нажать на b1 - в лэйбл добавится другой текст, так же сменится текст на кнопках. Но если бы мы в самом начале нажали бы на b2, то сейчас бы у нас в лэйбле был бы совсем другой текст, а при следующем нажатии на b1, кнопка b3 скрылась и мы бы возвратились в самую первую позицию. Я понимаю, что такое можно сделать с помощью условий. Но это только для двух последовательных действий, а если надо прописать целое дерево сюжета? Как тогда быть? Вот в консоле это реально сделать, потому что там есть возможность остановки кода - ReadLine(). Таким образом, можно легко весь сюжет построчно прописать. А как бы подобное реализовать в WindowsForms, подскажите, пожалуйста...
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.04.2018, 22:25
Ответы с готовыми решениями:

Текстовый рпг-квест
Доброго всем времени суток. С недавних пор (по просьбе пары друзей и знакомых) взялся разрабатывать простенький текстовый (со статичными...

Создание мини-игры c#
Надо сделать в C#. Дано несколько красных квадратов, расположенных в ряд. Необходимо перекрасить все красные квадраты в зеленый, щелкая на...

Создание игры наподобие монополии
Всем, доброго времени суток. хочу попробовать создать игру на подобии монополии. Какой элемент windows forms лучше использовать для...

7
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
25.04.2018, 23:11
Романов Сергей, если честно, так и не понял в чем суть вопроса... Как сделать, чтобы одна кнопка выполняла разные действия в зависимости от сюжета?
0
 Аватар для Aferuga
645 / 529 / 324
Регистрация: 20.05.2015
Сообщений: 1,471
26.04.2018, 09:33
Я так понял что вам надо последовательность путем нажатия на кнопки задавать. Так это просто сделать:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private Step tekStep; 
public class Step
{
     private string name; //текст на кнопке  
     private string disc;  //описание последствия
     private Image img;
     public List<Step>;
}
      public nextStep(int id)
      {
              tekStep = tekStep[id-1];
      }
        private void button1_Click(object sender, EventArgs e)
        {
          game.nextStep(int.Parse((sender as Button).Name.Last().ToString()));
        }

Остальное только загрузка текста и т. д.
1
0 / 0 / 0
Регистрация: 19.11.2017
Сообщений: 4
07.05.2018, 21:09  [ТС]
Aferuga, Не понятно, как сделать дерево сюжета. Если я, допустим, начинаю, прописывать последствия через вложеные switch, то код у меня просто выполняется до конца и всё, то есть от игрока уже ничего не зависит. Я хочу, чтобы програма дожидалась действия пользователя и только потом двигалась дальше на следующий вложеный в определённый case switch или даже на предыдущий.
Каждая кнопка у меня переопределяет переменную b, а переключатели уже смотрят на какой case отправиться. А в case уже идёт изменение текста в label, изображения и названия кнопок.

Добавлено через 10 минут
Shogun31337, именно. Допустим, у нас в начале игры доступна только одна кнопка - Начать. Мы её нажимаем, тепер у нас уже есть выбор из 3х кнопок - Поесть, Поспать, Погулять (это та кнопка, которая раньше была "Начать"). Теперь, если мы нажмём Поесть, нам предложатся варианты еды, Поспать - время отдыха, а Погулять - где. И всё это выполняют одни и те же кнопки. Надо сделать как то так, чтобы при нажатии Поспать нам не предложились варианты еды...
0
 Аватар для Toros1992
899 / 554 / 275
Регистрация: 26.11.2015
Сообщений: 1,758
Записей в блоге: 2
07.05.2018, 21:16
Я бы в данном случае сделал бы сюжет в виде сложносвязной структуры, где каждый элемент - это одно из состояний игры, то есть экземпляр класса, который хранит в себе массив экземпляров этого же класса ( все возможные состояния игры, в которые можно перейти из текущего) а так же в нем может быть куча другой информации (текст сюжета, задания, делегаты)
Мысль в том, что содержимое вашей формы будет генерится исходя из текущего состояния игры.
0
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
08.05.2018, 14:31
Лучший ответ Сообщение было отмечено Романов Сергей как решение

Решение

Цитата Сообщение от Романов Сергей Посмотреть сообщение
именно
Ну это то достаточно просто можно сделать. В первом варианте можно в одном обработчике накидать кучу условий и, в зависимости оттого какое условие выполнено, выполняется определенный код. Правда, придется еще сделать переменную, в которой будет храниться состояние кнопки.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int state = 0;
private void button1_Click(object sender, EventArgs e)
{
    switch (state)
    {
        case 0:
            // Поспать
            break;
        case 1:
            // Поесть
            break;
        // И так далее
    }
}
Для улучшения читабельности можно сделать enum состояний и переменную state делать не int, а этого типа:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    public enum State
    {
        Eat,
        Sleep
    }
 
State state;
private void button1_Click(object sender, EventArgs e)
{
    switch (state)
    {
        case State.Sleep:
            // Поспать
            break;
        case State.Eat:
            // Поесть
            break;
        // И так далее
    }
}
В таком варианте нужно учитывать, что код одной кнопки может разрастись до неприличных размеров, что ухудшит читаемость кода.

Во втором варианте можно сделать несколько обработчиков события Click и подключать их в зависимости от состояния игры. Тут уже никакие дополнительные переменные не нужны. Ну и читаемость кода, на мой взгляд, значительно лучше.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Жмем чтобы поесть
private void button1_Click_Eat(object sender, EventArgs e)
{
    // ...
    // Поели, теперь можно и поспать
    button1.Click += button1_Click_Sleep;
    button1.Click -= button1_Click_Eat;
}
 
// Жмем чтобы поспать
private void button1_Click_Sleep(object sender, EventArgs e)
{
    // ...
}
1
0 / 0 / 0
Регистрация: 19.11.2017
Сообщений: 4
08.05.2018, 18:05  [ТС]
Shogun31337, первым вариантом я пробовал делать. У меня в итоге весь код выполнялся до конца, как только нажимаешь любую кнопку. То есть зависит только от первого выбора, на вложеных swith программа не останавливается. А если делать без вложенных swith, то тогда нет зависимости от других кнопок. В общем, это очень мутный вариант...
А вот последний вариант с несколькими обработчиками событий мне очень даже понравился. Надо будет попробовать так сделать. Здесь, на мой взгляд, даже проще реализовать сохранения. Можно же как то, перед закрытием формы, записать в текстовый файл номер обработчика, а при следующем запуске программы считывать значение и назначать каждой кнопке определённый обработчик? (Или для этого вопроса лучше создать другую тему, да?)
И ещё, если у меня будет ОЧЕНЬ много обработчиков событий, это как-то скажется на быстродействии программы?
0
 Аватар для Shogun31337
557 / 534 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
09.05.2018, 04:53
Цитата Сообщение от Романов Сергей Посмотреть сообщение
Shogun31337, первым вариантом я пробовал делать. У меня в итоге весь код выполнялся до конца, как только нажимаешь любую кнопку. То есть зависит только от первого выбора, на вложеных swith программа не останавливается. А если делать без вложенных swith, то тогда нет зависимости от других кнопок. В общем, это очень мутный вариант...
Не очень понял смысл, кроме того, что сделать не получилось... А не получилось не потому что такой способ не подходит, а потому что была допущена какая то логическая ошибка.

Цитата Сообщение от Романов Сергей Посмотреть сообщение
Можно же как то, перед закрытием формы, записать в текстовый файл номер обработчика, а при следующем запуске программы считывать значение и назначать каждой кнопке определённый обработчик?
Ну номер обработчика вряд ли получится записать. Т.к. у него просто нет никакого номера. Это просто функция... А вот создать переменную, однозначно характеризующую состояние программы (об этом говорилось в первом варианте), и записывать в файл ее значение вполне себе можно.

Цитата Сообщение от Романов Сергей Посмотреть сообщение
если у меня будет ОЧЕНЬ много обработчиков событий, это как-то скажется на быстродействии программы?
быстродействие зависит от кода в самих функциях, а не от их количества. Обработчиков может быть сколько угодно - на производительность это никак не повлияет.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.05.2018, 04:53
Помогаю со студенческими работами здесь

Создание лаунчера для игры
В общем от нечего делать решил я сделать (попытаться) лаунчер для любимой игры. Пытаюсь сделать это чудо я через VS2010E. (не бейте...

Создание бота для игры
Появилась задача создать бота, в игре 1 vs 1 fight стиле . Бот должен быть достаточно простым, но должен различать, где мы на карте и...

Создание карточной игры по сети и интернету
Всем привет. Более менее освоил язык C# и хотел бы создать свое первое нормальное приложение. Хотелось бы сделать карточную игру между 2-4...

Создание стен из picturebox для игры
Игра являет собой подобие Танчиков на Денди, каждый элемент в ней реализован с помощью PictureBox. Вся загвоздка на данный момент...

Создание Игры, похожей на карты Петры Баланс в Warcraft III
Я хочу сделать игру на WF... Ну бла бла бла.... Смысл в том что сначало хотел сделать тупо пародию на фермера. Но потом передумал и хочу...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Камера 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, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru