Продолжаю написание игры футбольный менеджер. Теперь на Delphi. Т.к почти еще ничего не знаю надеюсь на вашу помощь. Для начала: как сделать выбор 1 пункта из нескольких? (при выборе в зависимости от пункта переменной присваивается значение) Это могут быть "радио"- кнопки или выбор из списка. Не могу разобраться как связать фому с unit'ом.
Набросайте пожалуйста как сделать так: см.рис
Вобщем пока проблемы интерфейса. Ещё: Как, например, задать background ?
Если есть можно дать ссылку на материал, где это описано.
cooler
20.03.2008 1:49
Поразбирался. Понял ,что задал глупые вопросы... У меня несколько ListBox'ов. В одном- запасные,во втором - вратарь,в третьем защита... Сделал так: выделяю в одном игрока, во втором, нажимаю кнопку и они заменяются. Как сделать чтобы больше 2х не выделялось игроков?
И как связать эти ListBox'ы с массивом моих игроков? Чтобы массивы менялись вместе со списками. Неужели каждый раз переприсваивать?
cooler
20.03.2008 18:12
А как выводить значения переменных или текст что-то типа writeln?
Неужели трудно ответить. Я же не пишу: "Сделайте- ка мне игру" Просто элементарные вопросы,а мне в помощь
Может тему нужно перенести в написание игр???
мисс_граффити
21.03.2008 1:08
Не трудно ) По порядку... С первой порцией, насколько я поняла, уже разобрался.
Цитата
У меня несколько ListBox'ов.
Мне кажется, здесь лучше использовать ComboBox:
Цитата
Виджет ComboBox - это выпадающий список элеметов, из которого может быть выбран только один.
что автоматически решает вопрос с
Цитата
Как сделать чтобы больше 2х не выделялось игроков?
Цитата
И как связать эти ListBox'ы с массивом моих игроков? Чтобы массивы менялись вместе со списками. Неужели каждый раз переприсваивать?
Если честно, не совсем поняла происходящее... Кто в массиве? Кто в списках?
Цитата
А как выводить значения переменных или текст что-то типа writeln?
Сначала надо кинуть компонент, КУДА будешь выводить текст. Например, Label А потом написать:
Label1.Caption:='текст';
Либо, если это типа сообщения о неправильном действии, можно так:
ShowMessage('текст');
cooler
21.03.2008 1:39
Насчет ComboBox: Понимаешь в чем дело, У меня (на рис.) Слева запасные, а справа разделенный по группам основной состав. Я сделал так: выделяешь одного и второго, нажимаешь заменить и они меняются. Все бы хорошо, да только может выделиться больше двух, т.к разделены на группы по позициям. Про массив: Я в listbox элементы из массива игроков записываю. А как после изменения сохранить состав?
Может есть другие варианты??
мисс_граффити
22.03.2008 0:39
теперь стало понятнее ))) можно сделать так: несколько радиобаттонов (типа "заменить вратаря", "заменить кто-там-еще-бывает") и в зависимости от них - доступность выбора в листбоксе. то есть (сорри, проверить наличие свойств не могу - делфи не установлена, пишу по памяти) типа такого:
ListBox1.Enable:=RadioButton1.Checked;
а вообще - лучше всего будет, если прикрепишь проект в архиве (без ехе-шника) - разговор будет предметным.
cooler
26.03.2008 0:45
Проект выложил, если это уже можно называть проектом.
Как сделать чтобы какая-нибудь процедура выполнялась сразу после открытия формы? (А то я сейчас все к кнопкам привязываю)
Потом, как обновлять значения radiobutton.checked ? Цикл сделать? Пока какое поле с самого начало выбрано, то и доступно.
Обязательно нужно заставочку. Как посоветуешь сделать? Появляется форма, на ней рисунок (хотя бы небольшой) и название. Через несколько секунд она закрывается и появляется следующая. Как лучше рисунок там организовать?
P.S. Не в тему: Парадокс. Хотел сделать, чтобы одна форма грузилась, нажимаешь кнопку, она закрывается, открывается другая. В новом проекте сделал ч/з св-во visible - работает. Вставляю эту вещь в свой проект - грузятся обе формы.
мисс_граффити
7.04.2008 1:37
Цитата
Как сделать чтобы какая-нибудь процедура выполнялась сразу после открытия формы? (А то я сейчас все к кнопкам привязываю)
привесить на открытие формы )) сам на свой вопрос ответил единственное - я не очень поняла, речь о создании формы ("первом" открытии) или открытии после сворачивания? от этого зависит, какое событие выбрать.
Цитата
Потом, как обновлять значения radiobutton.checked ? Цикл сделать?
Что значит "обновлять"? Если пользователь изменил, менять доступность листбоксов? Опять же - на обработчик события...
Цитата
Обязательно нужно заставочку. Как посоветуешь сделать? Появляется форма, на ней рисунок (хотя бы небольшой) и название. Через несколько секунд она закрывается и появляется следующая. Как лучше рисунок там организовать?
именно несколько форм? можно бросить компонент под рисунок (paintbox или image) и через несколько секунд делать его невидимым, например.
Цитата
Парадокс. Хотел сделать, чтобы одна форма грузилась, нажимаешь кнопку, она закрывается, открывается другая. В новом проекте сделал ч/з св-во visible - работает. Вставляю эту вещь в свой проект - грузятся обе формы.
через методы close/show не пробовал?
striker
16.04.2008 0:06
Я такую же прогу делал года 2 назад, но все было проще гораздо.
cooler
16.04.2008 0:11
Всё, большое спасибо с тем что было по-тихоньку разобрался
massev: array[1..5] of string = ('забил гол', 'травма','желтая карточка','замена','красная карточка')
procedure TSimForm.Button2Click(Sender: TObject); var i,r1,r11,r2,r22,usl,g1,g2:byte; r:byte; a:array[1..16] of integer;
begin Listbox2.Items.Clear; r:=whatteam; Label1.Caption:=rus_team[1]+' - '+rus_team[2]; Label2.Caption:=Floattostr(0)+' : '+Floattostr(0); for i:=1 to 10 do begin team.init2('spartak'); randomize; r1:=random(11); randomize; r11:=random(11); randomize; r2:=random(5); randomize; r22:=random(5); if (r1=0) or (r1=1) then r1:=7; if r11=0 then exit; if r2=0 then r2:=5; if r22=0 then exit; if r2=1 then begin g1:=g1+1; Label2.Caption:=Floattostr(g1)+' : '+Floattostr(g2); end; Listbox2.Items.add('>>>'+squad[r1]^.name+' '+massev[r2]); randomize; usl:=random(2); if usl=1 then Listbox2.Items.add(' '+squad2[r11]^.name+' '+massev[r22]); if r22=1 then begin g2:=g2+1; Label2.Caption:=Floattostr(g1)+' : '+Floattostr(g2); end; end;
end;
В этой процедуре я конечно нагородил... Идея такая: пока случайно выбираются события матча из массива massev и выводятся в Листбокс. Нужно сделать чтобы события в него выводились с некоторой задержкой, и чтобы матч можно было остановить, что-то сделать с составом и возобновить, не теряя предыдущих событий. Если пользователь сделал замену игрока, соответственно выводим сообщение об этом в Листбокс.
P.S Как лучше выводить таблицу?
Да, обновленная версия, если нужно:
cooler
16.04.2008 15:10
Сорри за такой код в процедуре. Сейчас сам сел спустя 2 недели, половину не понял. Подскажите идейку как реализовать выше перечисленное. Нужно таймер, наверное, поставить и останавливать его, потом запускать?
Better Kind
16.04.2008 18:50
Гораздо проще реализовать записями.
cooler
16.04.2008 20:07
А подробнее? Приведи примерчик
cooler
4.05.2008 23:16
Помогите пожалуйста реализовать след. вещь. У меня симулируется в текстовом режиме матч. (выводятся события матча из строкового массива в listbox)
Нужно чтобы они выводились с определенной задержкой. (sleep наверное не туда ставлю) Пользователь должен нажать на кнопку команда, где между массивами игроков (запасных и основных) он произведет замены. НУЖНо чтобы после того как он вернется к матчу он продолжился, т.е опять с задержкой выводились события матча, и в этот же listbox вывелись те элементы массивов, которые поменял пользователь.
Т.е, например Иванов->Петров
Здесь наверное событийная обработка. Как её реализовать? Т.к у меня происходят изменения в команде сложно, то можно в примере просто 2 массива реализовать, а их потом под своё адаптирую.
Прикладываю "легкую" и оч.демо версию. Чтобы симулировать матч - кнопка "след. игра"
Код
massev: array[1..5] of string = ('забил гол', 'травма','желтая карточка','замена','красная карточка');
procedure TSimForm.Button2Click(Sender: TObject); var i,sobytie:byte;
begin Listbox2.Items.Clear; for i:=1 to 7 do begin sobytie:=random(5); if sobytie=0 then sobytie:=1; Listbox2.Items.Add(massev[sobytie]); sleep(100); end; end;
Если я опять загнул и ничего не понять - пишите
cooler
5.05.2008 19:06
Пожалуйста, помогите. Как это сделать?
cooler
6.05.2008 23:14
Почему?...Почему никто ничего не пишет. Напишите хоть почему не пишите
мисс_граффити
7.05.2008 1:29
ты хочешь передавать управление? то есть идет матч - пользователь, не останавливая его, меняет игроков - и матч продолжается?
cooler
7.05.2008 1:45
Идет матч, пользователь нажимает на кнопку "пауза" /"стоп"(в матче), матч останавливается, он заменяет игроков и возобновляет. Хотя можно не останавливая, только матч будет идти не долго и пока пользователь прокопается в заменах игра кончится
Мне хоть как-нибудь пока
P.S Спасибо за отклик
мисс_граффити
7.05.2008 4:22
я бы тогда сделала так примерно:
var massev: array[1..5] of string;
//обработчик срабатывания таймера procedure TForm1.Timer1Timer(Sender: TObject); var sobytie:byte; begin sobytie:=random(4)+1; Listbox2.Items.Add(massev[sobytie]); end;
procedure TForm1.FormCreate(Sender: TObject); begin massev[1]:='гол'; massev[2]:='желтая карточка'; //и так далее Timer1.Enabled:=false; //это можно в свойствах компонента Timer1 Timer1.Interval:=2000; //это тоже. задержка между событиями в игре end;
//новая игра procedure TForm1.Button1Click(Sender: TObject); begin Listbox2.Items.Clear; Timer1.Enabled:=true; end;
//кнопка стоп procedure TForm1.Button2Click(Sender: TObject); begin Timer1.Enabled:=false; end;
cooler
8.05.2008 20:14
Спасибо. Я почти также уже сделал Сам догадался. У меня дальше будут вопросы - обращусь. Спасибо большое
cooler
9.05.2008 14:43
Вот пока маленький вопросик: Можно ли вставлять в Delphi файлы .jpg В учебнике написано можно - а на деле нельзя? А то bmp много весят!
volvo
9.05.2008 14:52
Цитата
В учебнике написано можно - а на деле нельзя?
Почему ж нельзя? Uses Jpeg и работай...
cooler
13.05.2008 17:14
volvo, спасибо.
мисс граффити, вот ещё что:
События по таймеру выводятся. А как сделать так чтобы голы выводились не случайно? У меня есть процедура определения победителя. На выходе 2 переменные, у 1й значение кол-ва голов, забитых первой командой, у 2й соответственно второй. Как растянуть вывод этих голов на все время матча? Т.е голы выводятся не случайно, а согласно значениям этих переменных. И если таймер например срабатывает каждые 2 секунды, то к 90му(столько минут в матче) срабатыванию в ЛистБоксе уже должны быть выведены все забитые голы.
andriano
13.05.2008 22:09
Нужно распределить все забитые голы между началом и концом матча? Самое простое решение - ДПСЧ определить время, в которое будет забит каждый из голов. Желательно также проверить, что между вновь вычисленным голом и каждым из предыдущих интервал времени не меньше определенного, например, минута. Если меньше - еще раз вызвать ДПСЧ.
cooler
14.05.2008 14:20
А как создать файл справки и привязать его к кнопке на форме?
andriano
14.05.2008 15:44
Цитата(cooler @ 14.05.2008 11:20)
А как создать файл справки и привязать его к кнопке на форме?
Файл справки можно создать, например, в текстовом редакторе (блокноте - если другого нет). В обработчике кнопки нужно считать файл и куда-нибудь его вывести: в специально для этого предназначенное поле, окно или программу. В качестве последних, опять же, можно использовать блокнои или IE.
cooler
14.05.2008 23:02
Нет, а как windows справку там по-моему .chm файл Чтобы со скринами
А то что ты предложил можешь подробнее написать?
cooler
14.05.2008 23:30
Да, ещё не подскажете как привязать процедуру записи в файл к SaveDialog? Как задать тип файла по умолчанию? Там execute вроде бы, но что-то я никак не разберусь
andriano
15.05.2008 0:06
Цитата(cooler @ 14.05.2008 20:02)
Нет, а как windows справку там по-моему .chm файл Чтобы со скринами
Можно сделать все, что угодно. Причем разными способами. Способ 1-й: Ищешь описание формата файла и пишешь программу, создающую файл в нужном формате. Способ 2-й: Ищешь подходящий компонент и с его использованием пишешь программу, создающую файл в нужном формате.
Цитата
А то что ты предложил можешь подробнее написать?
Поподробнее написать не могу. Могу попытаться ответить на КОНКРЕТНЫЕ вопросы.
cooler
15.05.2008 0:36
Вопрос о сохранении в файл в силе. Он сейчас важнее
мисс_граффити
15.05.2008 2:30
Код
if SaveDialog1.Execute then сделать какую-нибудь фигню
В обработчике события нажатия на кнопку "Сохранить" (ну или как там у тебя это реализовано)
cooler
15.05.2008 20:10
Спасибо
cooler
28.05.2008 17:18
Ещё 1 глупый мини-вопрос Как записать в текстовый файл информацию типа
Код
строка1 число число строка2 число число ........................... строкаN число число
Где стоки берутся из массива строк, а числа из массивов чисел соответственно В паскале я делал так, а здесь чем-то отличается? Как записать это?
мисс_граффити
29.05.2008 1:06
точно так же ))) только вместо assign - assignfile вместо close - closefile вместо text - textfile вроде все отличия...
cooler
29.05.2008 1:08
Спасибо! А можешь быстренько накинуть пару строк, чтобы создавался новый файл и записывалось как у меня написано
мисс_граффити
29.05.2008 4:48
type ar1=array[1..10] of string; ar2=array[1..10] of integer; ... procedure InitArrays(var st: ar1; var num: ar2); var i: integer; begin for i:=1 to 10 do begin st[i]:='ñòðîêà'+IntToStr(i); num[i]:=i; end; end;
procedure NewFile(const st: ar1; const num: ar2); var f: TextFile; i: integer; begin AssignFile(f,'c:\res.txt'); //можно сделать проверку, удалось ли создать файл rewrite(f); for i:=1 to 10 do writeln(f,st[i],' ',IntToStr(num[i])); closeFile(f); end;
procedure TForm1.Button1Click(Sender: TObject); var st: ar1; num: ar2;
begin InitArrays(st,num); NewFile(st,num); end;
end.
cooler
3.06.2008 2:06
Спасибо, только вот у меня одна неувязочка. Может быть опять глупая ошибка, но все же. Если я пишу в файл 1 строку по указанной ниже процедуре, т.е без цикла - всё нормально А вот так выдаетя ошибка:
procedure Initarr(var st_name:ar1;var reit:ar2); var a:byte; begin for a:=1 to 17 do begin st_name[a]:=squad[a]^.name; reit[a]:=squad[a]^.koef_gk; end; end;
squad[i] - массив где все данные об игроках. Если нужно могу саму программу выложить
cooler
3.06.2008 15:43
Здесь:
Код
st_name[a]:=squad[a]^.name;
Т.е если
Код
st_name[1]:=squad[1]^.name;
всё работает
Всё, сделал уже Скажите как сделать ссылку на документ WORD из Делфи. У меня там help
cooler
3.06.2008 19:48
Ещё: как дописывать в созданный файл? Т.е я один раз записал, как не стирать то, что уже было, а дописать прямо туда ещё. Что здесь изменить:
procedure NewFile(const st: ar1; const num: ar2); var f: TextFile; i: integer; begin AssignFile(f,'c:\res.txt'); //можно сделать проверку, удалось ли создать файл rewrite(f); for i:=1 to 10 do writeln(f,st[i],' ',IntToStr(num[i])); closeFile(f); end;
Во всем разобрался уже. Что -то посещаемость здесь резко упала. Я уже сам с собой разговариваю
cooler
4.06.2008 2:56
Скорее всего финальный вопрос в этой теме Столкнулся с проблемой, при повторном запуске init_footballers , которая из файла считывает информацию и заносит в массив - появляется ошибка. Насколько разобрался нужен деструктор. Помогите пожалуйста его написать Описание на всякий случай :
var count_footballersk: integer; footb_array:array[1..max_footballers] of PTFootballer;
players,i: integer; namets:array[1..20] of string; squad,squad2: array[1 .. 20] of PTFootballer;
И сам код:
{-------------------------------------------------------} constructor TPeople.init(AName: string; AnAge: integer); begin age := AnAge; name := AName; end;
{-------------------------------------------------------} constructor TFootballer.init(AName: string; AnAge: integer;team, position: string;akoef_gk,akoef_df,akoef_md,akoef_f: byte); var p: TPosition; i: integer; Aprice:word; begin inherited init(AName, AnAge); for p := low(Tposition) to high(TPosition) do if s_position[p] = position then begin code_position := p; end; for i := 1 to max_teams do if s_team[i] = team then begin code_team := i; end; {k := Ak; } koef_gk := Akoef_gk; koef_df := Akoef_df; koef_md := Akoef_md; koef_f := Akoef_f; price:=raschet; end; {------------------------------------------------------------}