Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.03.2013, 14:32
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию Помогите с работой со строками

Здравствуйте! Я вот решил написать игру "Кто хочет стать миллионером".
Столкнулся с такой трудностью как создания массивов с вопросами и ответами. Инфа берется с файла. Там вот такая "иерархия":
Код:
[Questions for "Кто хочет стать миллионером"]
---
^Завершите философскую русскую пословицу: "Век живи, век учись - ..."
-Академиком станешь
-Богатеньким будешь
-В люди выйдешь
+Дураком помрешь
---
^Какое небесное тело используется для определения известных актеров, спортсменов и музыкантов?
-Астероид
-Комета
+Звезда
-Планета
---
Так вот: есть такие массивы:
Код:
  Vopros: array of string;
  Variant1: array of string;
  Variant2: array of string;
  Variant3: array of string;
  Variant4: array of string;
  Otvet: array of string;
Как считывать файл, что бы
--- обозначало новый вопрос (разделитель).
^ обозначало новый вопрос и заполнялось в массив Vopros
+ и - обозначало вариант ответа и все 4 варианта писались в массивы Variant (1-4)
+ обозначало правильный вариант ответа и заполнялось в массив Otvet
И еще один вопрос: как потом послать строку массива в Lable каждый раз РАНДОМНО?
Буду очень благодарен за ответы!!
Ответить с цитированием
  #2  
Старый 28.03.2013, 14:34
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

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

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 28.03.2013, 14:37
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от Aristarh Dark
Пересмотри архитектуру игры.
У меня нету архитектуры игры. У меня есть только вопросы от компьютерной игры. А саму игру на Delphi я делаю с нуля..
Ответить с цитированием
  #4  
Старый 28.03.2013, 15:08
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Подумай как по другому хранить вопросы и ответы. Подумай о том, что, например, вопросов у тебя 10 гигов. И ты их будешь загружить в программу все кучей?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #5  
Старый 28.03.2013, 16:25
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

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

и еще
Цитата:
Variant1: array of string;
Variant2: array of string;
Variant3: array of string;
Variant4: array of string;
Otvet: array of string;
почему идёт четыре варианта и еще ответ? ведь ответ это тоже один из вариантов.
и почему каждый вариант идёт как массив? они что каждый раз в одном и том же порядке будут?
лучше рандомно варианты распологать .а массив с вариантами сделать размером всего 4.
примерная БД будет такая:
таблица Вопросы:
id вопроса, вопрос, уровень сложности вопроса.
Таблица Ответы:
id ответа, ответ, номер вопроса к которому относится ответ, правильность ответа.
ну и примерная логика выборки. допустим нужно показать первый вопрос уровня сложности 1.
у тебя в БД несколько вопросов с уровнем сложности 1.ты выбираешь id'ы всех таких вопросов и потом из них рандомно выбираешь один ИД и загружаешь варианты ответа для этого ид.
Ответить с цитированием
  #6  
Старый 28.03.2013, 17:37
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Зачем новичку БД, если он ещё string от array of string не отличает.

Dmitry_DM, прочитай про типы данных и ключевое слово type

Собери тип которой будет в себе содержать вопросы и к каждому вопросу 3и варианта + 1н правильный ответ.
Код:
type TMyQuestion : record
  fquest: string
  fopt1: string
  fopt2: string
  fopt3: string;
  fans: string;
end;

Заведи массив таких вопросов и файл из этого типа данных:

Код:
var
FQuestions : file of TMyQuestion;
MyQuestions : array [0..99] of TMyQuestion;

Запись типизированных данных в файл и считывание оных оттуда:

Записывать:
Код:
AssignFile(FQuestions, 'c:\FQuestions.dat');
Rewrite(FQuestions, 1);
For i:=0 to Length(MyQuestions)-1 do
  BlockWrite(FQuestions, MyQuestions[i], Sizeof(FQuestions));
CloseFile(FQuestions);

Читать по аналогии.

Последний раз редактировалось Uniq!, 28.03.2013 в 17:39.
Ответить с цитированием
  #7  
Старый 28.03.2013, 19:46
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

спасибо за предложенные варианты! но я хочу пояснить более детально как все устроено.. есть 15 файлов (на 15 уровней сложности), я их сделал в ini формате. Каждый файл содержит множество вопросов. Вот пример 2 вопросов в ini на 1 уровне сложности.
Код:
[Question1]
Question = 'Завершите философскую русскую пословицу: "Век живи, век учись - ..."'
Otvet1 = 'Академиком станешь'
Otvet2 = 'Богатеньким будешь'
Otvet3 = 'В люди выйдешь'
Otvet4 = 'Дураком помрешь'
PrOtvet = 'Дураком помрешь'

[Question2]
Question = 'Какое небесное тело используется для определения известных актеров, спортсменов и музыкантов?'
Otvet1 = 'Астероид'
Otvet2 = 'Комета'
Otvet3 = 'Звезда'
Otvet4 = 'Планета'
PrOtvet = 'Звезда'

Потом я делаю так (знаю что не правильно, но понять что я хочу из этого можно..)
Код:
...
  Question: array[1..15] of string;
  Otvet1: array[1..15] of string;
  Otvet2: array[1..15] of string;
  Otvet3: array[1..15] of string;
  Otvet4: array[1..15] of string;
  PrOtvet: array[1..15] of string;
...
Ini := TIniFile.Create(ExtractFilePath(application.ExeName) + '\Data\Resources\Questions\100.ini');

for i := 1 to "конца файла" do
  begin
   Question[i] := Ini.ReadString('Question1', 'Question', '');
  end;

  form1.Label3.Caption:= Question[i];
Так вот.. как сделать что бы массив заполнился всеми вопросами с ini файла для первого уровня? а потом (в случае правильного ответа) перезаписывались и содержали вопросы (ну и ответы) второго уровня и т.д. Но так же не стоит упускать рандомность выдачи в Lable3 вопросов каждого уровня. И как реализовать что бы ответы так же меняли позицию (быть в Lable, который отвечает за вариант A, B, C, D).
Ответить с цитированием
  #8  
Старый 28.03.2013, 19:53
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Значит, и типы сложно. Окей. начнём с простого:

Код:
Question: array[1..15] of string;

После этого у тебя создасться пустой массив, в каждую ячейку которого ты сможешь положить целую строку. Зачем? Если тебе сюда нужно положить лишь один вопрос?

Question: string; - правильный вариант. Сюда ты сможешь положить ТОЛЬКО одну строку (только один вопрос)

Дальше перестраивай картину у себя в голове, и думай что будем менять дальше.

Потуги сделать массив из 15ти вопросов\ответов я вижу. Но смысл их тогда перезаписывать?

Из приведённого тобой примера:

Код:
var
  Questions: array[1..15] of string;
  Otvet1: array[1..15] of string;
for i := 1 to 15 do
  begin
   Questions[i] := Ini.ReadString('Question' + IntToStr(i), 'Question', '');
   Otvet[i] := Ini.ReadString('Question' + IntToStr(i), 'Otvet1', '');
   // и так далее... 
  end;

Но это ужасный код=\

Последний раз редактировалось Uniq!, 28.03.2013 в 19:58.
Ответить с цитированием
  #9  
Старый 28.03.2013, 19:58
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от Uniq!
После этого у тебя создасться пустой массив, в каждую ячейку которого ты сможешь положить целую строку. Зачем? Если тебе сюда нужно положить лишь один вопрос?
Так мне нужно положить не один вопрос, а столько, сколько есть в ini файле. Где в свою очередь не известно сколько будет вопросов. А потом надо рандомно выдавать элементы массива в Lable3. Именно поэтому я считал, что нужен массив..
Ответить с цитированием
  #10  
Старый 28.03.2013, 20:16
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Верным путем идете товарищ! Не бойтесь экспериментировать. Набьете шишек, но это будут ваши шишки. На свои ошибках учатся, над чужими смеются... и т.д. и тому подобное.
Я так понял INI вы выбрали с точки зрения удобства доступа к исходному тексту.
Можно конечно и в Ini все хранить, но пока вы еще только начали, я бы рекомендовал вам про XML почитать. Он тоже позволяет хранить данные в виде текста, но возможности его на порядок выше чем Ini.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #11  
Старый 28.03.2013, 23:56
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Dmitry_DM
...У меня есть только вопросы от компьютерной игры. А саму игру на Delphi я делаю с нуля..
Чтоб не снуля, вот вам "трамблёрный" примерчик, почти рабочий, разбирайтесь.

Последний раз редактировалось Alegun, 09.05.2013 в 12:21.
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Dmitry_DM (29.03.2013)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:07.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025