Помощь - Поиск - Пользователи - Календарь
Полная версия: Object pascal
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Страницы: 1, 2
cooler
Не подскажете какую тему выбрать для разработки объектно- ориентированной программы?
Нужно в общем создать какую-нибудь программу с перспективой перенесения её в Delphi.
Стандартные темы нам предложили не так уж что бы интересные: шашки, дурак, типа озера с щуками чё то.
Может кто подскажет что-нибудь поинтереснее. Нужно в общем, что бы наследование было, описать свойства и т.п
Я вообще то футболом увлекаюсь, но сомневаюсь, что здесь можно что- то придумать связанное с этим.....
мисс_граффити
blink.gif
да что угодно!
класс человек
у него наследники - футболист, судья, болельщик...
у каждого - еще наследники: футболист команды <название>, фанат команды <название>...
класс поле
класс мяч и т.п.

какие к этому алгоритмы приделать - надо думать... чтобы не получилось сложнее, чем в FIFA2008 какой-нить ;) а то сорвешь EA все продажи.
Lapp
Цитата(мисс_граффити @ 8.10.2007 21:40) *
да что угодно!

Эт'точно! smile.gif
Можно замутить такую стратегию!! Например, можно покупать клубы, прибыль пускать на разные цели: в рекламу, в тренировку, в перекупку игроков, тренеров.. При этом игры не нужно визулизировать - просто случайным образом (с весами вложенных денег, набора игроков и т.п.) выдавать результат. Типа если нападение - супер, и защита - супер, а вратаря вообще забыли поставить - игра сливается с крупным счетом..
Цитата(мисс_граффити @ 8.10.2007 21:40) *

чтобы не получилось сложнее, чем в FIFA2008 какой-нить ;) а то сорвешь EA все продажи.

Да, есть реальная опасность.. Кстати, тогда 50% - Форуму! smile.gif.
cooler
Я конечно понимаю насчет продаж, но пока нет свободного времени с EA Sports конкурировать...
Не а реально что-нибудь простенькое для начала?
Потом может разовью smile.gif
Мы типа в Delphi переносить будем.
Наверное в графике делать. А че там рисовать? Типа футбольного менеджера что-ли?

Может подкинете начинающему программисту пару идей по реализации этой перспективной выдумки?
Как и с чего начать? Какие алгоритмы?
мисс_граффити
Цитата(cooler @ 10.10.2007 21:18) *

Я конечно понимаю насчет продаж, но пока нет свободного времени с EA Sports конкурировать...

А я уже распланировала, на что свою долю потрачу sad.gif(((

По теме.
Можно что-то типа менеджера.
Самая примитивная схема:
Есть массив футболистов (11 шт) - твоя команда.
Есть массив "свободных" футболистов (штук 30, например). У каждого есть "коэффициент качества". Можно менять своего на любого из этого массива с определенной доплатой (если твой лучше - доплатят тебе). Когда ты сформируешь свою команду, случайным образом формируется команда - соперник (из свободных 30 выбирается 11). У кого выше средний коэфф качества - тот победил и получил призовые деньги.
В таком виде наша иерархия классов упрощается до 2 классов: игрок и команда.

Можем добавить судей. Тогда будет куда приделать наследование )))
У судьи есть 2 коэффициента симпатии - для каждой из команд. Более высокий повышает шансы команды... допустим, коэффициент качества будем умножать на этот коэффициент - и сравнивать уже такие модифицированные коэффициенты.

Итак, получаем:
1) Класс "человек". Поля: ФИО, дата рождения... еще какая-нибудь ерунда.
2) Наследники класса "человек":
-класс "футболист" (+коэффициент качества)
-класс "судья" (+2 коэффициента отношения)
3) Класс "футбольная команда": поля "игроки" (массив из 11 футболистов), название, деньги на счету (выигрыши+обмен игроков+что-то изначально дается), статистика побед/поражений....

Ну, это все очень примитивно. Можно футболистов поделить на вратарей, нападающих... кто там еще... (сорри, не сильна в футболе. тебе виднее). Добавить запасных для каждой команды. Дать возможность игрокам получать травмы. Добавить желтые и красные карточки......
----
Смутное ощущение, что после 13 часов написания своей программки надавала дурацких советов. Завтра перечитаю.... а может, сумеешь извлечь рациональное зерно.
Прошу прощения за пропущенные знаки препинания и опечатки.
cooler
Спасибо большое.

Согласен можно сделать так.
Только вот игроков надо бы разбить и коэффициенты у них разные должны быть.
Так например вратаря не поставил - коэф. вратаря - 0, следовательно шансов на победу не очень много.
Например
KG - коэф. вратаря (goalkeeper)
KD - защитника (defender)
KM - полузащитника (middle player)
KF - нападающего (forward)

И во время симуляции игры чтобы можно было паузу (например, в перерыве сделать) и игроков некоторых заменить => коэф. поменялись и игра в другом направлении пошла.

Только как всё это реализовать на pascal, большой вопрос.
Может подскажете как начать, какие процедуры для того, чтобы игроков менять в составе
(16= 11+5 запасных), как компьютер будет набирать игроков (ксати, это тоже обЪект?)
Или может сделать игроков тоже не в кучу, а на команды разбить и у этих команд покупать/продавать и
с ними играть, а не просто любых игроков набирать.


В общем вопросов много, опыта мало, надеюсь на вашу помощь.
мисс_граффити
можно и на команды разбить... я ж сказала, что привела примитивнейший вариант.
Давай разбираться с иерархией классов... пока самый минимум, потом будешь добавлять и усложнять.
Человек
Методов нет.
Поля: ФИО, дата рождения.

Судья (наследник Человека)
Методов нет.
Поля: отношение к команде1, отношение к команде2.

Футболист (наследник Человека)
Методы: расчет цены исходя из коэффициента.
Поля: коэффициент качества, тип (вратарь, защитник...).

Команда
Методы: рассчет коэффициента качества исходя из коэффициентов игроков.
Поля: название, сумма на счету, состав игроков (массивчики на каждый из типов, чтобы не путаться в них... чтобы не получилось 5 вратарей и ни одного нападающего).

Игра
Методы: определение победителя и счета (придумай алгоритмы.. как угодно можно).
Поля: команды, судья.

Игровая среда
Методы: обмен между командами, начало матча (создается объект класса "игра" и выводится информация о победителе).
Поля: массив (или список) команд, массив (список) судей.

Ну и к каждому классу конструктор/деструктор.

Попробуй реализовать первые классы (Человек, Судья, Футболист). Там проблем возникнуть не должно по идее.
cooler
Спасибо большое за помощь.

Вот ещё вопрос: будет(есть) ли здесь полиморфизм и агрегирование?

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

Программу как начну делать выложу первые классы.


...А ещё наверное данные человека лучше в файл записей записывать?...
мисс_граффити
Возраст придется изменять.

По твоей диаграмме, Футболист и Судья связаны наследованием... а на самом деле - они скорее "братья" - наследники Человека.

Записывать - ну, если хочешь сохранять игру, тогда в файл.

Что такое агрегирование?
Я знаю наследование, полиморфизм и инкапсуляцию...
А вот насчет полиморфизма - подумай сам. Что это такое - знаешь?
volvo
Цитата
Что такое агрегирование?

Агрегирование smile.gif
cooler
Блин, дату на возраст заменил, а тип нет. byte конечно
Полиморфизм знаю,
А как будут связаны другие объекты TTeam, TPLay, TPLayzone?

Так здесь агрегирование будет между командой и игроком?
Команда содержит Игрока т.е., команда НЕ является некоторым видом игрока, а содержит игрока внутри себя.
volvo
Цитата
А как будут связаны другие объекты TTeam, TPLay, TPLayzone?
Никак не будут... Здесь нет наследования, чтобы они были связаны. Здесь именно агрегирование.

Кстати, при первом взгляде на твою диаграмму возникает впечатление, что у тебя TFootballer - наследник TReferee. На самом деле - они "братья", у них всего навсего один предок.
мисс_граффити
Ух ты )))
Первый раз в жизни, когда отвечаем с volvo одинаково, я написала раньше...

Сорри за офф.
cooler
Полиморфизм -
Возможность определения единого по имени действия (процедуры или функции), применимого одновременно ко всем объектам иерархии наследования.

Так здесь у нас что получается нет полиморфизма?
У нас же нет одинаковых процедур для Судьи и футболиста например.

Здесь тоже нужны Конструкторы/ деструкторы? Объясните пожалуйста зачем, непонятно.

volvo
Цитата
Так здесь у нас что получается нет полиморфизма?
Где "тут"? Ты что, уже привел все методы, которые будут в классах, образующих дерево наследования? Полиморфизм и заключается в том, что действие определяется над предком, а потомок (если нужно) его переопределяет, причем при вызове ты можешь не знать, какой именно метод (предка или потомка) отработает... На то и полиморфизм...

Так что ответом на твой вопрос может быть: "сделаешь - будет, не сделаешь - не будет".

Цитата
Здесь тоже нужны Конструкторы/ деструкторы?
Желательны, особенно если у тебя есть наследование, полиморфизм -> виртуальные методы. Пока не вызван конструктор объекта, ты не имеешь права работать с его виртуальными методами.

То же самое касается и деструкторов - чтобы корректно освободить память потребуется виртуальный деструктор... Ты вот это внимательно читал:
ООП. Объектно-ориентированное программирование
?
cooler
Конечно читал, если бы не читал, то не задавал бы вопросов.
Что не понял, то и спрашиваю
cooler
Я просто не понимаю какие-методы брать. Ведь тех методов, которые мы обговорили, которые в диаграмме, их мало и нет одинаковых для разных объектов. Так что я пока не понимаю куда прилепить эти Конструкторы и Деструкторы.

Начинаю делать программу с конструкторами, так нет методов, берусь реализовывать те методы, которые есть так нет ещё основы для их реализации. А уж про графику вообще заикаться рано...
С чего начать, за что ухватиться?

Вот только описание к начальным обЪектам:

type TPeople=object
Sername,name:string;
age:byte;
end;
TFootballer=object(TPeople)
k:byte;
position:string;
procedure Raschet(price:real);
end;
TReferee=object(TPeople)
s1,s2:byte;
end;




Что делать???? nea.gif
мисс_граффити писала, чтобы я начал реализовывать первые классы. Так там одна простая процедура расчета цены игрока и больше ничего.
мисс_граффити
Цитата
Sername

По-моему, не так пишется. Если ты про фамилию...
Цитата
нет одинаковых для разных объектов.

ну... можешь попробовать придумать общие для футболиста и судьи методы...
пожалуй, если будет графика, таким методом может стать перемещение по полю (вынести в человека... а потом заместить)
правда, не поняла, зачем это так уж нужно.

а ты уже
procedure Raschet(price:real);
написал?
кстати, почему процедура, а не функция?...

//сорри за офф. добрый препод по технологии разработки ПО сегодня во всех подробностях рассказывал, как с помощью ООП реализовать метеостанцию. Про делфи речь шла.
Узнала, что поля и свойства - по сути, одно и то же. Что функции - методы, а процедуры - нет (видимо, процедуры - это тоже по сути поля... или свойства... не важно).
cooler
фамилия - surname;
Я не собираюсь графически визуализировать матч.( во всяком случае пока)
Мне хотя бы сделать программу, выводящую результат матча.
Так как хотя бы просто сделать, связать с графикой (чтобы игроков можно было менять, матч запускать)
С полиморфизмом и виртуальными методами будем тогда потом усложнять, т.к пока вообще по сути ничего нет.
Как реализовать игровую среду? Куда и нужно ли сейчас создавать игроков, хотя бы нескольких (всмысле данные)

------------------
Прошу прощения, но мне кажется я сейчас такую ерунду написал.(только что проснулся)
мисс_граффити
Игроков нужно будет создавать, когда начнешь делать команды
cooler
Да,sorry, raschet - функция
Начну, с маленького введения в футбольную жизнь.
Во всех футбольных комп. играх коэффициент игрока - от 0 до 100 (100 - предел, которого не
может быть)
Цена игрока в нынешнем футболе: коэффициент,например, 90 стоит игрок ~ 19000000 евро
Чем меньше коэффициент, те меньше цена, поэтому так много условий.

С возрастом я сделал так: игрок моложе 23 лет=> цена чуть-чуть больше.
Чтобы удобнее было и нагляднее я сделал целочисленным типом цену, поэтому функция немного
корявая. ( с вещественным можно было бы молодым игрокам цену +10%)



function TFootballer.Raschet(age,k:byte;price:word):word;
begin
if k<30 then price:=k*5
else if k<50 then price:=k*30
else if k<80 then price:=k*70
else price:=k*210;

if age<=22 then if k<50 then price:=price+200
else if k<80 then price:=price+300
else price:=price+500;
end;





Итак получается цена коэф. 90 - 18900 (не хватает 3х нулей, ну это при выводе
на экран поправлю)
мисс_граффити
1) зачем тебе лишний формальный параметр price? лучше сделай внутри функции такую локальную переменную (а в делфи и она не понадобится).
2) можешь делать +10% а потом округлять до ближайшего целого (trunc/round в помощь)


Добавлено через 42 сек.
кстати... пишешь функцию, а работаешь с ней, как с процедурой
cooler
Как понять работаешь как с процедурой?
1)Дальше-то что, делать остальные процедуры?
Вот описание команды:

 TTeam=object
namet:string[15];
moneys:word;
squadG:array[1..5] of TFootballer;
squadD:array[1..5] of TFootballer;
squadM:array[1..5} of TFootballer;
squadF:array[1..5] of TFootballer;
procedure Koef;
end;

Здесь тоже процедура или функция?
2) Как массивы игроков вводить?
мисс_граффити
Цитата
Как понять работаешь как с процедурой?

ну грубо говоря:
procedure kvadr(const a: integer; var res: integer);
begin
res:=a*a;
end;
--------
function kvadr (const a: integer): integer;
begin
kvadr:=a*a;
end;

видишь - разные механизмы возвращения результата?

Цитата
Как массивы игроков вводить?

может быть, написать конструктор?
cooler
Так что переменную price убрать и поставить название функции вместо неё
Или потом присвоить функции значение price?
cooler
Всё-таки с конструкторами никак не пойму.

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

type     TTeam=object
namet:string[15];
moneys:word;
squadG:array[1..5] of TFootballer;
squadD:array[1..5] of TFootballer;
squadM:array[1..5} of TFootballer;
squadF:array[1..5] of TFootballer;
constructor TO;
destructor Done:virtual;
procedure Koef;virtual;
end;

А какой метод должен быть заменен на constructor? Или просто сделать пустой ?
У нас же нет наследования между командой и игроком.
Что дальше?
volvo
Цитата
У нас же нет наследования между командой и игроком.
Зато у тебя в объекте TTeam есть поля, в свою очередь являющиеся объектами... И для того чтобы корректно создать экземпляр типа TType тебе надо написать конструктор, который мало того, что заполняет поля nameT и moneys, так еще и инициализирует содержимое всех массивов (ты же должен их, игроков в смысле, инициализировать при создании экземпляра TTeam? Или ты будешь делать это позже?)...

Понимаешь, тот путь, который ты избрал - не приведет тебя к успеху. Прежде чем начать реализовывать подобную программу, ты должен для себя решить, на каком этапе что делается, как именно инициализируются игроки (или ты вводишь все данные вручную, или поля заполняются рандомно), когда это происходит (до создания экземпляра Команда, во время создания или после, по запросу пользователя; от ответа на этот вопрос зависит, правильно ли ты вообще хранишь игроков, ведь если есть уже массив доступных футболистов, и тебе на этапе создания команды надо просто выбрать из него 11 человек, то не надо хранить массив из TFootballer-ов, достаточно хранить указатели на тех футболистов, которые формируют команду...)
cooler
Игроки должны инициализироваться при создании экземпляра Tteam.
Вот какая вещь: когда пользователь входит, ему предлагаются на выбор уже сформированные
команды, из которых он выбирает одну и играет ей.

Получается, что я (а не пользователь) ввожу все данные игроков вручную и когда
создается экземпляр Команда набираютя игроки в эту команду.
Например команда Челси, из тех игроков которые уже есть, при создании экземляра Команды,
выбираются не случайно, а только те игроки, которые должны быть в Челси.

Значит в TFootballer нужно добавить поле "команда"?
И получается, что массивы игроков не надо, а достаточно хранить указатели?
И constructor - процедура, которая и будет набирать игроков? Как её написать?
volvo
Вот набросок того, как я себе это представляю:

Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
cooler
Volvo, спасибо конечно за помощь.
Как снег на голову, сразу столько всего..
Сам понимаешь как чужой код разбирать, но тут не сложно, разберусь.
Вопросы будут (а я думаю они будут), напишу.
А пока по первому взгляду могу одно сказать: Pahtakor рулит. good.gif
cooler
Да, вот ещё что. Полиморфизм всё-таки придется делать.
Не подскажете идейку. Была идея с графической визуализацией матча, но я думаю это бессысленно будет

В Graph' е можно как-нибудь на экран вывести значение переменной?
Как, например, writeln'ом? Или только текст?
volvo
Цитата
можно как-нибудь на экран вывести значение переменной?
Легко... Только переменная должна быть строкой...

Str используется для преобразования чисел в строку, OutTextXY или просто OutText - для вывода ...
cooler
Вот обещанные вопросы: (я конечно понимаю что вам надоело разжевывать мне всё,но всё же)
1)
 for p := low(Tposition) to high(TPosition) do
if s_position[p] = position then begin
code_position := p;
end;


Как я понимаю, low и high здесь от самого маленького к самому большому.
2) Практически полностью непонятна процедура
из-за функций _toint и _copy (НЕ Понятно что делают)
Как я понял эта процедура считывает игроков из файла

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_c: 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_c := _toint(s);

new(
footb_array[count_footballers],
init(f_n, f_a, f_t, f_p, f_c)
);
end;
close(f);
end;


volvo
Цитата
Как я понимаю, low и high здесь от самого маленького к самому большому.
Именно так... Кстати, я всегда рекомендую пользоваться именно Low/High (особенно при работе с пользовательскими типами): допустим, ты написал
for p := _goalkeeper to _forward do ...

, а потом тебе понадобилось поменять содержимое TPosition, например, ты добавил после _forward еще один тип игрока (это я для примера)... Тебе придется искать по всей программе слово _forward и заменять его на новое значение. А если использовать Low/High - то ничего делать не надо, оно как считало от первого до последнего , так и будет считать...


Цитата
Как я понял эта процедура считывает игроков из файла
Угу... Только кроме того, что строку с данными об игроках надо прочесть, ее еще надо разбить на составляющие: до первого пробела - имя, потом до следующего пробела - возраст (число), потом... Ну, и так далее. Этим и занимаются функции _toint и _copy. Первая - преобразует переданную ей строку в число (такой примитивный аналог дельфийской StrToInt), а вторая - возвращает содержимое переданной строки до определенной позиции, при этом удаляя эту же самую часть из исходной строки, т.е., при исходной строке
s = 'ivanov1 23 spartak goalkeeper 50';

первый вызов _copy(s, pos(' ', s)) вернет 'ivanov', при этом s станет равна '23 spartak goalkeeper 50'... Второй вызов вычленяет строку '50', передаем ее в _toint - получаем, собственно, число 50...

Идея ясна? wink.gif
cooler
Так точно.
Начал по-тихонечку в графику реализовывать.
Как в графе переходить на другую строку?
Пробовал outtextxy , потом y в цикле увеличиваю а на след. строку не переходит! mad.gif
Это я вывожу команду на экран.

Вот ещё что у нас агрегирование между Командой и игроком.
Там надо owner ' ом помечать или что-то описывать или необязательно?
volvo
Цитата
Пробовал outtextxy , потом y в цикле увеличиваю а на след. строку не переходит!
Код в студию...

Цитата
агрегирование между Командой и игроком. Там надо owner ' ом помечать или что-то описывать или необязательно?
code_team в моем коде - это что по-твоему? Не Owner?
cooler
1)Ой-ойоой...
Не аккуратненько как-то. (sorry за спешку)


2)Я понял, сейчас бессмысленно выводить на экран состав команды.
Там потом будет перемещение игроков из основного состава в резерв и наоборот, так что сразу надо
делать это.
Я пока не представляю как это реализовать, примерно как меню: выбираешь игрока, нажимаешь Enter,
нажимаешь на другого и они меняются. Там скорее всего массивчиком...
Но как ?
cooler
1) Когда пытаюсь запустить из модуля процедуру в основной программе, пишет
--==Field identifier expected==--, хотя процедура объявлена в описании объекта
Что такое?

2)Можно ли на экран 2 отдельными процедурами выводить какой-либо текст(рисунок) и
меню одновременно?

3)Как реализовать процедуру изменений в составе?
Я так думаю из файла данные об игроках считать в массив строк,из этого массива перемещать
игроков в другой массив(основной) Но всё равно до конца не понимаю.


И САМОЕ ГЛАВНОЕ, помогите пожалуйста с полиморфизмом и виртуальными методами.
Остальное как нибудь разрулю сам, а это - сомневаюсь.
volvo
cooler, сегодня в Гугле совершенно случайно (искал кое-что другое) набрел на статью, которая в принципе может тебе помочь в написании твоего проекта: Design Your Soccer Engine, and Learn How To Apply Design Patterns
cooler
Идея заманчивая, но на каком языке это написано?
Я конечно понимаю, что главное-модель,
но пока главная моя проблема - реализация. Идеи так и прут из головы.
Если бы я хотя бы в Delphi писал, а о надо сначала на pascal и получается я больше мучаюсь с
визуализацией, чем со схемой игры.

Только я так и не понял, что там у них за наблюдатели?
Owen говорит мяч там то, Ronaldo - там то.
Ладно ещё поразбираюсь. Пока подкиньте идейку с простеньким полиморфизмом.
И ответьте пожалуйста на мои вопросы

----------------------

P.S. Да, как я понял игра происходит по их схеме без вмешательства пользователя.
И проект не совсем доработан. Все красиво, еще бы пользователь вмешивался, да счет выводился - цены бы не было.
Реализовать то......
Объекты там описаны.
Но та идея и то что мы пока тут пытались, никак не сходятся у меня в голове в одну.
cooler
Вот кое-что решил взять:
Можно сделать, чтобы во время матча(до матча) можно было менять стратегию на игру.
Например, атакующая и защищающаяся.Если по ходу матча команда забивает гол=> защищаемся и
у команды соперника меньше шансов забить гол.
У меня даже уже есть мысли по реализации этих методов.

Имеем: объект TeamStrategy(метод play), у него 2 наследника: Attacktrategy(метод play)
и DefendStrategy(метод play)
см.рис.
Отсюда полиморфизм: для разных стратегий - разный play.

Выскажите пожалуйста своё мнение.Помогите хоть немного с реализацией(хоть для начала
описание)
Play будет виртуальным??

volvo
Цитата
Play будет виртуальным??
Да, в этом случае Play должен быть виртуальным, иначе наследование теряет смысл... А насчет реализации... Приходит в голову вот такой вариант использования:

type
PStrategy = ^TStrategy;
TStrategy = object
constructor init;
destructor done; virtual;

procedure Play; virtual;
end;

PTAttackStrategy = ^TAttackStrategy;
TAttackStrategy = object(TStrategy)
constructor init;
procedure Play; virtual;
end;
PTDefendStrategy = ^TDefendStrategy;
TDefendStrategy = object(TStrategy)
constructor init;
procedure Play; virtual;
end;


TTeam = object
{ ну, тут что-то что у тебя уже было - игроки и т.д... }

constructor init;
destructor done;

procedure SetStrategy(s: PStrategy);
procedure Run;
private
str: PStrategy;
end;

constructor TStrategy.init;
begin end;
destructor TStrategy.done;
begin end;
procedure TStrategy.Play;
begin end;

constructor TAttackStrategy.init;
begin inherited init; end;
procedure TAttackStrategy.Play;
begin
writeln('attacking');
end;

constructor TDefendStrategy.init;
begin inherited init; end;
procedure TDefendStrategy.Play;
begin
writeln('defending');
end;


constructor TTeam.init;
begin
writeln('team initialization');
SetStrategy(new(PTDefendStrategy, init));
end;
destructor TTeam.done;
begin
if assigned(str) then dispose(str, done);
end;
procedure TTeam.SetStrategy(s: PStrategy);
begin
if assigned(str) then dispose(str, done);
str := s;
end;
procedure TTeam.Run;
begin
str^.Play;
SetStrategy(new(PTAttackStrategy, init));
str^.Play;
SetStrategy(new(PTDefendStrategy, init));
str^.Play;
end;


var
team: TTeam;

begin
team.init;
team.Run;
team.done;
end.


Используя это, ты сможешь на лету менять стратегию игры команды, для этого достаточно будет вызвать SetStrategy в любой момент...
cooler
Спасибо, volvo, за понимание.

Вот какая вещь уже долго мучаюсь. Ведь простая штука. Или вовсе отупел.

Как сделать, чтобы при выводе на экран каждый игрок писался на отдельной строке.
Куда сунуть приплюсовку координат yy? В цикл пытался - не фурычит.

procedure TFootballer.print_info;
var
a,b:string;
key:char;
begin
str(coeff,a);
str(age,b);
xx:=0;yy:=00;
outtextxy(xx,yy,s_position[code_position]);
outtextxy(xx+25,yy,name);
outtextxy(xx+135,yy,a);
outtextxy(xx+180,yy,'(age ');outtextxy(xx+215,yy,b);
outtextxy(xx+230,yy,')');
end;

procedure TTeam.test_print;
var i: integer;
begin
for i := 1 to players do
squad[i]^.print_info;
end;

procedure printer;
var j:integer;
begin
setbkcolor(1);
setcolor(15);cleardevice;
team.test_print;
readkey;
end;



P.S так как test_print не вызывается из основной программы, то я сделал printer.
volvo
Добавляешь параметр в метод print_info...
procedure TFootballer.print_info(i: integer);
var
a,b:string;
key:char; { <--- Вот это тебе зачем? }
begin
str(coeff,a);
str(age,b);
xx:=0; yy := pred(i) * textheight('W') + 5;
outtextxy(xx,yy,s_position[code_position]);
outtextxy(xx+25,yy,name);
outtextxy(xx+135,yy,a);
outtextxy(xx+180,yy,'(age ');outtextxy(xx+215,yy,b);
outtextxy(xx+230,yy,')');
end;

procedure TTeam.test_print;
var i: integer;
begin
for i := 1 to players do
squad[i]^.print_info(i);
end;
... и все в порядке...

А вообще - ты лучше сразу приведи код в порядок, иначе потом не разберешься в том, что делаешь... Не надо заранее описывать переменные, и пользоваться переменными, которые описаны выше по тексту программы. Вообще, в идеале, переменная должна иметь как можно меньшее "время жизни", для чего описываться она должна локально, как можно ближе к тому месту, где используется. Например:

var
i: integer;

type
T = object
j: integer;

procedure P;
end;

...
procedure T.P;
var k: integer;
begin
{
здесь использовать для локальных расчетов переменную i или j - это очень
плохой тон... Если результаты вычисления не должны использоваться в
других методах (это КРАЙНЕ нежелательно, потому что программа получается
запутанной и при изменении одного метода могут быть многочисленные
побочные эффекты), то пользуйся ЛОКАЛЬНОЙ переменной k
}
end;

(небольшое отклонение от темы, но я думаю оно будет полезно)

У тебя же вычисления "местного значения" (я про текущую позицию по X) почему-то производятся с использованием переменной, описания которой я не вижу. Посему можно предположить, что и в каком-нибудь другом месте у тебя будет соблазн использовать эту же переменную, а вдруг ты забудешь ее обнулить или еще как-то инициализировать? Результат - потратишь очень много времени на отладку, потому что в зависимости от порядка вызова методов будешь получать разные результаты...
cooler
Я вернулся. smile.gif

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

Решил с графикой не маяться и дальше в "тексте" делать. Меню только оставил.
Сделал процедуру, которая меняет игроков местами.
Стал делать процедуру расчета общего коэффициэнта команды, да вот какая штука:
переменная коэф. игрока у меня в классе Футболист, а процедура Команды.
Как мне переменную оттуда вытянуть, чтобы сложить и поделить?

Похоже для махинаций с тактиками и составами нужно будет коэффициэнты делить на коэф. вртаря,
защитника и т.д.
Потому что, если я вратаря поставлю в нападение, то ничего не изменится.
А при определении победителя сравнивать коэф. вратаря, защиты ... по отдельности.


P.S. Код -ESC- скажите.
Tan
Код ESC - 27
cooler
Нужно, наверное,сделать функцию, которая будет инициализировать коэф.Но как?
Перемещение игроков внутри одной команды сделал.
Между командами как?
Здесь событиями нужно делать?
Например, у одной команды пользователь покупает игрока => отправляется событие,
в команду пользователя прибавляется игрок => тоже событие.
И после каждого изменения состава пересчитывать общий коэф. команды.
Помогите реализовать хоть основу.
volvo
Цитата
Помогите реализовать хоть основу.
Ты бы показал, что у тебя сейчас-то реализовано, а то ты каждый раз меняешь концепцию, за тобой не угонишься. Неохота собирать какой-то отвлеченный пример, лучше было бы добавить функциональность в уже существующую программу...
cooler
Выкладываю на ваш суд...
Понимаю, программа мягко говоря не лишена изъянов...
Да и переменные..
Но всё же
cooler
Просили, а что не смотрите?
Я конечно понимаю, что лень скачивать, но выкладывать всю программу в сообщение.... blink.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.