-
Здравствуйте уважаемые программисты. У меня вот такой вопрос: Как можно сделать инвентарь как в RPG играх, чтобы предметы при покупке в торговца, добавлялись в определенные клеточки инвентаря-рюкзака персонажа. И если одинаковые предметы допустим золото, то в один и тот же слот додавались. Подскажите пожалуйста, заранее спасибо! Если не трудно приведите хоть какой-то пример) Очень буду благодарен!
-
а караваны там грабить можно будет?
-
Здорова, тёзка! Код-то показывать будешь?
-
Сделал такой вот инвентарь, но можно только по одному предмету хранить в рюкзаке. А как сделать по несколько: Вот исходник
-
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;
-
Инвентарь расчитан на 6 слотов в каждый из них можно добавить по 1 предмету, но как сделать если предмет такой уже есть в инвентаре, то добавить к нему же а не в новый слот?
-
Суровый подход:
> for i:=1 to 1 do
Но вообще нужно подумать вот тут:
> if (rukzak[1]=0) then > begin > rukzak[1]:=shlem;
На втором этапе именно тут и инкрементировать количество shlem в ячейке рюкзака за индексом [1]
ЗЫ: удачи с темных делах :)
-
Ну а как бы вы написали инвентарь на массивах?
-
> Сергей (24.07.15 19:47) [7] > Ну а как бы вы написали инвентарь на массивах?
На объектах. Ты сколько программируешь, что уже за игру взялся? Я так думаю лет восемь?
-
Та дело даже не в игре, а принцип создания хотел узнать инвентаря
-
Принципы просты: - сокрытие информации; - разделляй и властвуй; - структурируй свой код.
Судя по примеру выше вам надо научится разбивать код на функции. Чем их больше тем лучше. Код становится самодоккументированным. При этом не только упрощается чтение и понимание кода. Но и управлять им становится проще.
Разделяем код на 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-х раз должен быть сгруппирован в цикл.
-
Pavia, спасибо вам большое) Внятно написали!
-
> Pavia, спасибо вам большое) Внятно написали!
Не надо следовать этим советам
-
Я вообще думал из-за русского языка вы всё сотрёте.
> Не надо следовать этим советам
Кроме русского языка. Что вам не понравилось???
-
Pavia © (27.07.15 14:27) [13]
Я боюсь, что если я начну отвечать развернуто, это будет бесполезно. Жизнь слишком коротка, чтобы тратить время на перебуждение людей, которые не хотят, чтобы их переубеждали. Потому напишу кратко - почитай книжки по программированию, МакКоннелла, например.
-
> Игорь Шевченко © (27.07.15 22:39) [14]
Описание специально было упрощенно до уровня Сергея. При обучении нельзя всё и сразу рассказывать надо постепенно вводить в курс дела. Поэтому многое ещё и осталось не досказано. Но с другой стороны я и не вижу причины усложнять разработку программы. Код не будет повторно использоваться. Поэтому и решил, что надо показать наиболее простой, но действенный метод разработки.
Конечно это не отменяет рефакторинг кода. Да и в самом тексте наверно стоило бы переписать предложения. Но тут уж прошу простить это моя первая проба писать просто о сложном.
На перспективу Сергею советую начать изучать следующую литературу : 1) Вирт Н.-Алгоритмы + структуры данных - программы-Мир (1985) 2) Стивен МакКонналл Совершенный код (2005) 3) Кент Бек-Экстремальное программирование. Разработка через тестирование (2003) 4) Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссидес-Приемы объектно-ориентированного проектирования. Паттерны проектирования-ДМК Пресс (2010) 5) Буч Г., Максимчук Р., и др.-Объектно-ориентированный анализ и проектирование с примерами приложений-Вильямс (2008)
Эти книги я уже сам прочитал.
|