Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Футбольный менеджер comes back

Автор: cooler 19.03.2008 0:11

Продолжаю написание игры футбольный менеджер.
Теперь на 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

Не трудно smile.gif)
По порядку... С первой порцией, насколько я поняла, уже разобрался.

Цитата
У меня несколько 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 - работает. Вставляю эту вещь в свой
проект - грузятся обе формы.


Прикрепленные файлы
Прикрепленный файл  worked.rar ( 6.49 килобайт ) Кол-во скачиваний: 341

Автор: мисс_граффити 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 Как лучше выводить таблицу?

Да, обновленная версия, если нужно:


Прикрепленные файлы
Прикрепленный файл  15.04.rar ( 18.23 килобайт ) Кол-во скачиваний: 345

Автор: cooler 16.04.2008 15:10

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

Автор: Better Kind 16.04.2008 18:50

Гораздо проще реализовать записями.

Автор: cooler 16.04.2008 20:07

А подробнее? smile.gif
Приведи примерчик

Автор: 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;


Если я опять загнул и ничего не понять - пишитеsmile.gif


Эскизы прикрепленных изображений
Прикрепленное изображение

Прикрепленные файлы
Прикрепленный файл  to_forum.rar ( 14.55 килобайт ) Кол-во скачиваний: 323

Автор: cooler 5.05.2008 19:06

Пожалуйста, помогите. Как это сделать?

Автор: cooler 6.05.2008 23:14

Почему?...Почему никто ничего не пишет.
Напишите хоть почему не пишите

Автор: мисс_граффити 7.05.2008 1:29

ты хочешь передавать управление?
то есть идет матч - пользователь, не останавливая его, меняет игроков - и матч продолжается?

Автор: cooler 7.05.2008 1:45

Идет матч, пользователь нажимает на кнопку "пауза" /"стоп"(в матче), матч останавливается,
он заменяет игроков и возобновляет.
Хотя можно не останавливая, только матч будет идти не долго и пока пользователь прокопается в заменах
игра кончитсяsmile.gif

Мне хоть как-нибудь пока

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

Спасибо.
Я почти также уже сделалsad.gif
Сам догадался.
У меня дальше будут вопросы - обращусь.
Спасибо большое

Автор: 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 , которая из файла считывает информацию и заносит в массив - появляется ошибка.
Насколько разобрался нужен деструктор. Помогите пожалуйста его написать
Описание на всякий случай :

TPeople = object
age: integer;
name: string;
constructor init(AName: string; AnAge: integer);
end;

PTFootballer = ^TFootballer;

TFootballer = object(TPeople)
code_position: TPosition;
code_team: integer;
k,koef_gk,koef_df,koef_md,koef_f: byte;
price:word;
acting: TPosition;
procedure print;
constructor init(AName: string; AnAge: integer;team, position: string;akoef_gk,akoef_df,akoef_md,akoef_f: byte);
{procedure print_info(i:integer); }
function Raschet:word;
end;

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;
{------------------------------------------------------------}

procedure init_footballers(const filename: string);

function _toint(s: string): integer;
var _result, _error: integer;
begin
val(s, _result, _error);
_toint := _result;
end;

function _copy(var s: string; count: integer): string;
begin
_copy := copy(s, 1, pred(count));
delete(s, 1, count);
end;

var
f: text;
s: string;
f_n, f_t, f_p: string; f_a,f_ccc, f_cgk, f_cdf, f_cmd, f_cf: integer;
begin
assign(f, filename); reset(f);

count_footballers := 0;
while not seekeof(f) do begin
inc(count_footballers);
readln(f, s);

f_n := _copy(s, pos(' ', s));
f_a := _toint(_copy(s, pos(' ', s)));
f_t := _copy(s, pos(' ', s));
f_p := _copy(s, pos(' ', s));
f_cgk := _toint(_copy(s, pos(' ', s)));
f_cdf := _toint(_copy(s, pos(' ', s)));
f_cmd := _toint(_copy(s, pos(' ', s)));
f_cf := _toint(s);

new(
footb_array[count_footballers],
init(f_n, f_a, f_t, f_p,f_cgk, f_cdf, f_cmd, f_cf)
);
end;
close(f);
end;


P.S Т.к код остался паскалевский теперь нужен деструктор

Автор: pefeUnsaste 29.06.2012 6:11

посоветуйте пожалуйста хорошую зоо клинику в москве