Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Инвентарь для игры [Delphi, Windows]


Сергей   (23.07.15 23:39

Здравствуйте уважаемые программисты. У меня вот такой вопрос:
Как можно сделать инвентарь как в RPG играх, чтобы предметы при покупке в торговца, добавлялись в определенные клеточки инвентаря-рюкзака персонажа. И если одинаковые предметы допустим золото, то в один и тот же слот додавались. Подскажите пожалуйста, заранее спасибо!
Если не трудно приведите хоть какой-то пример) Очень буду благодарен!


brother ©   (24.07.15 09:48[1]

а караваны там грабить можно будет?


Сергей   (24.07.15 10:25[2]

Здорова, тёзка! Код-то показывать будешь?


Сергей   (24.07.15 18:19[3]

Сделал такой вот инвентарь, но можно только по одному предмету хранить в рюкзаке. А как сделать по несколько:
Вот исходник


Сергей   (24.07.15 18:21[4]

var
 Form1: TForm1;
 predmets: array [0..6] of TBitmap;
 rukzak: array [1..6] of integer;
 shlem: integer;
 yach: integer;

 // Добавляем слоты
 slots: array [1..2] of integer; // 1 слот - головной убор

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin

for i:=0 to 6 do
begin
predmets[i]:=tbitmap.Create;
predmets[i].LoadFromFile('pic/'+inttostr(i)+'.bmp');
end;

for i:=1 to 6 do
begin
rukzak[i]:=0;

image1.Canvas.Draw(0,0,predmets[0]);
image2.Canvas.Draw(0,0,predmets[0]);
image3.Canvas.Draw(0,0,predmets[0]);
image4.Canvas.Draw(0,0,predmets[0]);
image5.Canvas.Draw(0,0,predmets[0]);
image6.Canvas.Draw(0,0,predmets[0]);
end;

for i:=1 to 2 do
begin
slots[i]:=0;
image8.Canvas.Draw(0,0,predmets[0]);
end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin

if (rukzak[1]=0) then
begin
rukzak[1]:=shlem;
image1.Canvas.Draw(0,0,predmets[shlem]);
end
else

if (rukzak[2]=0) then
begin
rukzak[2]:=shlem;
image2.Canvas.Draw(0,0,predmets[shlem]);
end
else

if (rukzak[3]=0) then
begin
rukzak[3]:=shlem;
image3.Canvas.Draw(0,0,predmets[shlem]);
end
else

if (rukzak[4]=0) then
begin
rukzak[4]:=shlem;
image4.Canvas.Draw(0,0,predmets[shlem]);
end
else

if (rukzak[5]=0) then
begin
rukzak[5]:=shlem;
image5.Canvas.Draw(0,0,predmets[shlem]);
end
else

if (rukzak[6]=0) then
begin
rukzak[6]:=shlem;
image6.Canvas.Draw(0,0,predmets[shlem]);
end
else

for i:=1 to 1 do
if rukzak[i]>0 then
showmessage ('Рюкзак заполнен!');

if combobox1.ItemIndex=-1 then
showmessage ('Нечего покупать!');

end;

procedure TForm1.Image2Click(Sender: TObject);
begin

if rukzak[2]>0 then
begin
yach:=2;
form2.ShowModal;
end
else
begin
yach:=0;
showmessage ('Слот 2 пуст!');
end;

end;

procedure TForm1.Image3Click(Sender: TObject);
begin

if rukzak[3]>0 then
begin
yach:=3;
form2.ShowModal;
end
else
begin
yach:=0;
showmessage ('Слот 3 пуст!');
end;

end;

procedure TForm1.Image4Click(Sender: TObject);
begin

if rukzak[4]>0 then
begin
yach:=4;
form2.ShowModal;
end
else
begin
yach:=0;
showmessage ('Слот 4 пуст!');
end;

end;

procedure TForm1.Image5Click(Sender: TObject);
begin

if rukzak[5]>0 then
begin
yach:=5;
form2.ShowModal;
end
else
begin
yach:=0;
showmessage ('Слот 5 пуст!');
end;

end;

procedure TForm1.Image6Click(Sender: TObject);
begin

if rukzak[6]>0 then
begin
yach:=6;
form2.ShowModal;
end
else
begin
yach:=0;
showmessage ('Слот 6 пуст!');
end;

end;

procedure TForm1.ComboBox1Change(Sender: TObject);
var
i: integer;
begin
i:=combobox1.itemIndex;

if i=0 then
begin
shlem:=1;
image7.Canvas.Draw(0,0,predmets[shlem]);
end;

if i=1 then
begin
shlem:=2;
image7.Canvas.Draw(0,0,predmets[shlem]);
end;

if i=2 then
begin
shlem:=3;
image7.Canvas.Draw(0,0,predmets[shlem]);
end;

if i=3 then
begin
shlem:=4;
image7.Canvas.Draw(0,0,predmets[shlem]);
end;

if i=4 then
begin
shlem:=5;
image7.Canvas.Draw(0,0,predmets[shlem]);
end;

if i=5 then
begin
shlem:=6;
image7.Canvas.Draw(0,0,predmets[shlem]);
end;

end;

procedure TForm1.Image1Click(Sender: TObject);
begin

if rukzak[1]>0 then
begin
yach:=1;
form2.showmodal;
end
else
begin
yach:=0;
showmessage ('Слот 1 пуст!');
end;

end;

procedure TForm1.Image8Click(Sender: TObject);
var
i: integer;
begin

if (slots[1]>0) and (rukzak[1]=0) then
begin
rukzak[1]:=slots[1];
image1.Canvas.Draw(0,0,predmets[slots[1]]);

slots[1]:=0;
image8.Canvas.Draw(0,0,predmets[0]);
image8.Hint:='';
end
else

if (slots[1]>0) and (rukzak[2]=0) then
begin
rukzak[2]:=slots[1];
image2.Canvas.Draw(0,0,predmets[slots[1]]);

slots[1]:=0;
image8.Canvas.Draw(0,0,predmets[0]);
image8.Hint:='';
end
else

if (slots[1]>0) and (rukzak[3]=0) then
begin
rukzak[3]:=slots[1];
image3.Canvas.Draw(0,0,predmets[slots[1]]);

slots[1]:=0;
image8.Canvas.Draw(0,0,predmets[0]);
image8.Hint:='';
end
else

if (slots[1]>0) and (rukzak[4]=0) then
begin
rukzak[4]:=slots[1];
image4.Canvas.Draw(0,0,predmets[slots[1]]);

slots[1]:=0;
image8.Canvas.Draw(0,0,predmets[0]);
image8.Hint:='';
end
else

if (slots[1]>0) and (rukzak[5]=0) then
begin
rukzak[5]:=slots[1];
image5.Canvas.Draw(0,0,predmets[slots[1]]);

slots[1]:=0;
image8.Canvas.Draw(0,0,predmets[0]);
image8.Hint:='';
end
else

if (slots[1]>0) and (rukzak[6]=0) then
begin
rukzak[6]:=slots[1];
image6.Canvas.Draw(0,0,predmets[slots[1]]);

slots[1]:=0;
image8.Canvas.Draw(0,0,predmets[0]);
image8.Hint:='';
end
else

for i:=1 to 1 do
begin
if (slots[1]>0) and (rukzak[i]>0) then
showmessage ('В рюкзаке нет места, выбросите вещь!');
end;

end;


Сергей   (24.07.15 18:38[5]

Инвентарь расчитан на 6 слотов в каждый из них можно добавить по 1 предмету, но как сделать если предмет такой уже есть в инвентаре, то добавить к нему же а не в новый слот?


Rouse_ ©   (24.07.15 19:44[6]

Суровый подход:

> for i:=1 to 1 do


Но вообще нужно подумать вот тут:

> if (rukzak[1]=0) then
> begin
> rukzak[1]:=shlem;

На втором этапе именно тут и инкрементировать количество shlem в ячейке рюкзака за индексом [1]

ЗЫ: удачи с темных делах :)


Сергей   (24.07.15 19:47[7]

Ну а как бы вы написали инвентарь на массивах?


Rouse_ ©   (24.07.15 20:13[8]


> Сергей   (24.07.15 19:47) [7]
> Ну а как бы вы написали инвентарь на массивах?

На объектах.
Ты сколько программируешь, что уже за игру взялся? Я так думаю лет восемь?


Сергей   (24.07.15 20:24[9]

Та дело даже не в игре, а принцип создания хотел узнать инвентаря


Pavia ©   (26.07.15 12:34[10]

Принципы просты:
- сокрытие информации;
- разделляй и властвуй;
- структурируй свой код.

Судя по примеру выше вам надо научится разбивать код на функции. Чем их больше тем лучше. Код становится самодоккументированным. При этом не только упрощается чтение и понимание кода. Но и управлять им становится проще.

Разделяем код на 3 составляющих:
-  управление;
- модель;
- отображение.
Это стандартный шаблон используемый в сложных программах. Называется MCV и предпологается что реализуется все эти части отдельными объектами.

Модель рюкзака проще описать объектом. Но можно и без объекта. А сразу дать доступ к внутреннему представленмю.
Следующим шагом
Выпишем структуры данных и их свойства.
TPredmetId=Integer; // Номер предмета в классификаторе предметов, т.е. в перечень всех предметов мира.

TElementRykzak=record
 count:integer;
 premet:TPredmetId;
 end

TRukzak=array of TElementRykzak;

Теперь свойства.
RukzakAdd(Rykzak:TRukzak; predmet:TPremetId; count:Integer):boolean
RykzakSize(Rykzak:TRykzak):Integer;
RykzakIsFull(Rykzak:TRykzak):boolean; // Рюкзак полон?
RykzakHavePredmet(Rykzak:TRykzak; Predmet:Tpredmetid):Boolean;  // Проверяет есть предмет или нет.

При добавлении пользуешься функциями.
Реализация функций простая увеличиваешь и уменьшаешь счетчик в массиве нужного предмета.

----------------
Отрисовка. При отрисовке проходишься по массиву рюкзака получаешь номер предмета. По номеру предмета находишь в перечне картинку. И её выводишь.

TImage лучше не использоват. А заменить на TPaintBox.
И сделать его одним на всю форму.

-----------------
Что касается управления. То управления сводится к вызову функций модели.
Тут нужно описать события которые надо обработать. нажати, Отпускание Мыши над рюкзаком. Перемещение.

------------------
Управление кодом или то как создавать функции. Советов тут много. Но пожалуй дам те что не встречал.
Если подряд идут 2 цикла то их надо разбить на 2 функции.
В функции должно быть не более 3-х условий.
Код который повторяется более 3-х раз должен быть сгруппирован в цикл.


Сергей   (26.07.15 21:07[11]

Pavia, спасибо вам большое) Внятно написали!


Игорь Шевченко ©   (27.07.15 12:56[12]


> Pavia, спасибо вам большое) Внятно написали!


Не надо следовать этим советам


Pavia ©   (27.07.15 14:27[13]

Я вообще думал из-за русского языка вы всё сотрёте.

> Не надо следовать этим советам

Кроме русского языка. Что вам не понравилось???


Игорь Шевченко ©   (27.07.15 22:39[14]

Pavia ©   (27.07.15 14:27) [13]

Я боюсь, что если я начну отвечать развернуто, это будет бесполезно. Жизнь слишком коротка, чтобы тратить время на перебуждение людей, которые не хотят, чтобы их переубеждали. Потому напишу кратко - почитай книжки по программированию, МакКоннелла, например.


Pavia ©   (28.07.15 01:54[15]


> Игорь Шевченко ©   (27.07.15 22:39) [14]

Описание специально было упрощенно до уровня Сергея.  При обучении нельзя всё и сразу рассказывать надо постепенно вводить в курс дела. Поэтому многое ещё и осталось не досказано. Но с другой стороны я и не вижу причины усложнять разработку программы. Код не будет повторно использоваться. Поэтому и решил, что надо показать наиболее простой, но действенный метод разработки.

Конечно это не отменяет рефакторинг кода. Да и в самом тексте наверно стоило бы переписать предложения.
Но тут уж прошу простить это моя первая проба писать просто о сложном.

На перспективу Сергею советую начать изучать следующую литературу :
1) Вирт Н.-Алгоритмы + структуры данных - программы-Мир (1985)
2) Стивен МакКонналл Совершенный код (2005)
3) Кент Бек-Экстремальное программирование. Разработка через тестирование (2003)
4) Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес-Приемы объектно-ориентированного проектирования. Паттерны проектирования-ДМК Пресс (2010)
5) Буч Г., Максимчук Р., и др.-Объектно-ориентированный анализ и проектирование с примерами приложений-Вильямс (2008)

Эти книги я уже сам прочитал.


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо