Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.10;
Скачать: CL | DM;

Вниз

Сохранение игры   Найти похожие ветки 

 
Hater   (2004-05-20 07:45) [0]

Я создаю игру - текстовый квест. У героя будет несколько характеристик. Как запрограммиравать сохранение? Помогите пожалуйста!


 
маг Гыр ©   (2004-05-20 08:03) [1]

Создай переменную счётчик (N), к которой каждый раз при правильном ответе будет присваиваться N:=N+1; (при сохранении - записывай в файл эту переменную)


 
kas-t   (2004-05-20 08:24) [2]

Если хочешь сохранять все значения переменных в файл, то тебе нужно копать в сторону IniFiles. Они просты и удобны в использовании.


 
cyborg ©   (2004-05-20 08:50) [3]

Ответь на вопрос:
Умеешь ли ты работать с файлами?
ответ нет - читай справки, примеры и всё поймёшь
ответ да - ты врёшь, так, как твой ответ "нет", иначе бы такой вопрос не задавал ;)

Если всётаки умеешь работать с файлами, но не знаешь чего туда писать :), скажи чего нужно записать, подскажем как.


 
Hater   (2004-05-20 19:07) [4]

Работать как, ассигны там всякие. Это? Умею, но не на профуровне. А писать действительно незнаю...


 
cyborg ©   (2004-05-20 19:19) [5]

Не знал, что есть профуровень писания в файл :).

Так что писать то нужно, перечисляй?


 
Sanek_metaller ©   (2004-05-20 19:47) [6]

Юзай ини,или реестр,гораздо легче чем файлы...


 
wiz ©   (2004-05-20 20:24) [7]

2 Sanek_metaller:

Вот после таких заявлений "Юзай ини" и получаются сохранение/загрузка по пол-часа.

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

2 Hater:

Самый простой (пусть кто-нибудь придумает проще для статических структур) способ в следующем:


type
 TPlayerStats = record
   Intelligent:integer;
   Experience:integer;
...
   end;

var
 PlayerStats:TPlayerStats;

...

procedure SaveHero(filename:string);
var
 f:file of TPlayerStats;
begin
assignfile(f,filename);
rewrite(f);

write(f,PlayerStats);

closefile(f);
end;


Это не самый лучший способ, но с него можно стартовать.

---
...блондинка за рулём, все равно что обезьяна с гранатой...


 
WinPopka   (2004-05-20 20:35) [8]

wiz, тогда в процедуре какой надо все сохранить надо к этому например intelegment`y приравнять переменую временную в которой этот элемент сидит?
типа int:=intelgment; а дальше сохранять уже можно.Или напрямую указывать в качестве переменных вот те строки из класса? а в файл автоматом друг за другом все сохранит?


 
wiz ©   (2004-05-20 21:59) [9]

2 WinPopka: можно и первым способом, но второй imho менее геморройный.

Я имел ввиду, если в проекте все параметры героя собраны в одну запись (record), то записать её в файл - пять строк кода. Загрузить - еще пять. Если не собраны, то лучше (imho) собрать.

А если там уже сделано всё через ООП ( TPlayerStats = class (TObject) ), то вопросов таких задаваться не должно (т.к. понять ООП imho чуток труднее, чем вывод в файл всяцих там байтиков)

---
...превратился в Красный Космический Гонобобель и ушуршал...


 
kas-t   (2004-05-20 23:28) [10]

А что ini так долго читаются? Мне кажется, на прочтение пяти (и более) строк из ini потребуется не больше времени, чем приведенным Wiz примером. Только вот с ini проще работать.

Зы: Ну разве что может не пойти, потому что ini будет просто отредактировать ручками... :)


 
wiz ©   (2004-05-21 05:01) [11]

2 kas-t: вначале их пять, затем 10, потом пол-мега... А ini"шник это текстовая инфа, поэтому ты будешь тратить время на перевод string -> int/float.

---
...здесь был Красный Космический Гонобобель


 
Hater   (2004-05-21 07:55) [12]

to cyborg:
Писать нужно жизнь - она будет уменьшатся после встречь с гопниками и тд.;/;
Ну, сохранение позиции я уже знаю как (через переменную плюс число);
Писать ещё некоторые вещи - типа артефактов: например, без калош низзя перейти огромное болото итд. итп;
.... ну на первых порах и всё. Разве что из-за красоты можно добавить отношение всяких людишек.


 
cyborg ©   (2004-05-21 09:13) [13]

[12] Hater   (21.05.04 07:55)
А теперь напиши как ты видишь написание кода под это дело, глядишь и сам понимать начнёшь.


 
Hater   (2004-05-22 12:22) [14]

Ещё одно. Как сделать, чтоб кнопка каждый раз производила разные действия. Т.е я имею ввиду то, что на форме есь Эдит1 и кнопка Батон1. В поле Мемо1 выводится текст квеста. Как по нажатию кнопки изменять текст квеста? И изменять хар-ки персонажа. При разном варианте разные изменения. И так много раз. Теоретически, я догадываюсь как это сделать, но мне нужен авторитетный совет.
ЗЫ: Спасибо вам всем за советы. Огромное.


 
cyborg   (2004-05-22 15:45) [15]


> Как по нажатию кнопки изменять текст квеста? И изменять
> хар-ки персонажа.

Ты что, издеваешься? Вперёд за учебники по программированию, про игры забудь!


 
Hater   (2004-05-23 07:08) [16]

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


 
cyborg   (2004-05-23 08:51) [17]

Пока не покажешь как ты делаешь и не объяснишь как хотелось бы, то тебе трудно помочь. Показывай проблемные куски. Не нужно только все модули кидать, только конкретные участки кода.


 
kas-t   (2004-05-23 10:42) [18]

to wiz: Хочу тебя удивить... Из ini можно сразу читать integer, без всяких последующих переводов:

expa:=MyIni.ReadInteger("save","expa",0);


 
Sapersky   (2004-05-23 11:00) [19]

А что ini так долго читаются?

Читаются - не очень долго. Вот пишутся - очень, при большом кол-ве параметров лучше писать вручную, через StringList.

Хотя параметры игрока лучше писать в бинарном виде, записями, как тут и советовали.

Из ini можно сразу читать integer, без всяких последующих переводов:
expa:=MyIni.ReadInteger("save","expa",0);


Внутри всё равно выполняется преобразование.

А если там уже сделано всё через ООП ( TPlayerStats = class (TObject) )

Тогда ещё можно писать RTTI - хоть в бинарном, хоть в текстовом виде. Хотя это тоже не очень быстро, скорее всего.


 
asm   (2004-05-23 11:48) [20]

на нажатие Button1
begin  
 ChangeAll(p1, p2, ...); // все меняет
end;

procedure ChangeAll(p1, p2, ...);
begin
 ChangeText(..); // меняет текст в мемо
 ChangeDescr(..);  // меняет характеристики
end;

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


 
wiz ©   (2004-05-23 12:03) [21]

2 kas-t: см post [19]... и сам подумай что сказал.

2 Sapersky: про ООП я только имел ввиду, что если TPlayerStats = class (TObject), то нельзя сделать f:file of TPlayerStats; придётся делать всё ручками (через указатель+смещение). Что я обычно и делаю.

---
...здесь был Красный Космический Гонобобель


 
хм ©   (2004-05-23 12:17) [22]

>2 Sapersky: про ООП я только имел ввиду, что если TPlayerStats >= class (TObject), то нельзя сделать f:file of TPlayerStats; >придётся делать всё ручками (через указатель+смещение). Что я >обычно и делаю.
Только надо добавить, что данный способ не подходит для объектов с полями-указателями и длинными строками.


 
wiz ©   (2004-05-23 12:29) [23]

2 хм: ну я вроде сказал, что это для статических структур...


 
Ландграф Павел ©   (2004-05-23 13:37) [24]

Н-да.. а начиналось как смотрю все с проблемы сохранения:) а зачем ты делаешь сохранение, вот мне интересно, если еще как акацца ничего вообще ненакодино?!


 
TransparentGhost   (2004-05-24 10:34) [25]

Vse peremennije, kotorije nuzhno sohranit" ob"javljajesh podrjad, a pri sohranenii cherez WriteBlock s ukazanijem adresa pervoj peremennoj i kol-vo - obshij razmer vseh peremennih kotorije nuzhno sohranit". Tochno tak zhe i vizivat" cherez BlockRead.
Takim obrazom mozhno obojtis" i bez "Record". Hotja smisl tot zhe.


 
Onanim   (2004-05-24 11:38) [26]

В ОРЕШНИК ЕГО!!!


 
TransparentGhost   (2004-05-24 11:40) [27]

V ternovnik :o)


 
Дм   (2004-05-25 09:06) [28]

Удалено модератором


 
cdadmitriy ©   (2004-05-27 12:14) [29]

Можно исползовать

Var Ini:TMemIniFile;     Begin
 Ini:=TMemIniFile.Create (CurProgDir+"\"+NameIniFileParam);
 With CommP do Begin
   Ini.EraseSection(SectionEcrParam);
   Ini.WriteInteger(SectionEcrParam,"Rsn1",ECR.Rsn1);      Ini.WriteInteger(SectionEcrParam,"Rsn2",ECR.Rsn2);
   Ini.WriteInteger(SectionEcrParam,"Tsn1",ECR.Tsn1);      Ini.WriteInteger(SectionEcrParam,"Tsn2",ECR.Tsn2);
 End;
 Ini.UpdateFile; Ini.Free;

НО при больших ( размер ) данных скорость записи чтения не годится
я исползую BLOB поля в DB Paradox


 
Подкрадуха ©   (2004-05-29 17:28) [30]

[4]...
Несмотря на ухмылки и насмешки других, я понял, что ты имел ввиду, говоря про профуровень.
Сам пытался сделать всё "на профуровне" - хотел даже начать со своего абстрактного класса и выписать героя с нуля, подумывал о своей серверной игровой и клиентской компоненте =) Но жизнь оказалась проще... И чем больше ты раздумываешь над красотой - тем меньше напишешь кода. Тогда, плюнув на всё, я взялся за старые добрые записи.
Вот что получилось...
Но сначала немного о том как это работает...
С клиента приходит на сервер запрос, сервер анализирует его и возвращает параметры героя на данный момент или ошибку.
Итак...

////////////////////////////////////////
//  используется старый TServerSocket //
////////////////////////////////////////
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ScktComp;

type
 TForm1 = class(TForm)
   ServerSocket1: TServerSocket;
  procedure ServerSocket1ClientRead(Sender: TObject;
     Socket: TCustomWinSocket);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation
 uses Analizator;
{$R *.dfm}

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 Socket.SendText(CheckCommand(Socket.ReceiveText));
end;

end.


Теперь сам файл Analizator.pas...


unit Analizator;

interface

uses
Windows, Classes;

type
 THero = record
   ch00: PChar; //ник
   ch01: Cardinal; //цифровая ссылка на ник (unixtimestamp)
   ch02: Real; //склонность
                                        // 0      - нет склонности
                                        // 0.5    - нейтрал
                                        // 1-1.99 - Белое Братсво
                                        // 2      - хаос
                                        // 3      - Тёмное братство
                                        // 4      - Серое Братство (зарезервировано)
                                        // 99     - Истинный Хаос
                                        // 100    - Ангел
   ch03: Byte; //знак зодиака (от 1 до 12)
   ch04: Integer; //клан
   ch05: Byte; //уровень чара
   ch06: Integer; //количество НР на момент последнего доступа к инфе
   // ...и ещё около 70 параметров...
 end;
 procedure SaveHero(h: THero);
 function ReadHero(name: String): THero;
 function CheckCommand(cmd: String): String;
 function HeroNew(nick: PChar; email: PChar; psw: PChar; realname: PChar; birtday: PChar; sex: PChar;
         realcity: PChar; icq: PChar; homepage: PChar; deviz: PChar; color: PChar; hobby: PChar): String;

implementation

procedure SaveHero(h: THero);
var
f: file of THero;
begin
assignfile(f, h.ch00 +".txt");
rewrite(f);
write(f, h);
closefile(f);
end;

function ReadHero(name: String): THero;
var
f: file of THero;
h: THero;
begin
assignfile(f, name +".txt");
reset(f);
read(f, h);
closefile(f);
Result := h;
end;

function CheckCommand(cmd: String): String;
var
str: String;
sl: TStringList;
begin
 sl := TStringList.Create;
 sl.SetText(PChar(cmd));
 str := sl.Strings[0];
 if str = "/register" then Result := HeroNew(PChar(sl.Strings[1]), PChar(sl.Strings[2]), PChar(sl.Strings[3]),
                                             PChar(sl.Strings[4]), PChar(sl.Strings[5]), PChar(sl.Strings[6]),
                                             PChar(sl.Strings[7]), PChar(sl.Strings[8]), PChar(sl.Strings[9]),
                                             PChar(sl.Strings[10]), PChar(sl.Strings[11]), PChar(sl.Strings[12]));
 if str = "/join" then Result := "ERR000" //ERR000 - значит, такой команды пока не существует в игре,
                                          //после её отправки сервером - сервер отключает клиента
 else Result := "ERR000";
 sl.Free;
end;

function HeroNew(nick: PChar; email: PChar; psw: PChar; realname: PChar; birtday: PChar; sex: PChar;
         realcity: PChar; icq: PChar; homepage: PChar; deviz: PChar; color: PChar; hobby: PChar): String;
// создание героя,
// вместо "/register Nick Email Psw RealName Birtday Sex RealCity ICQ Homepage Deviz Color Hobby"
// вместо пробелов использовать #10#13 (TStringList!!!)
var
h: THero;
begin
 with h do
   begin
   ch00 := nick;
   ch01 := GetTickCount; // неправильно, но пока сойдет и так
   // ...тут опять очень много полей, заполняемых на основе полученных данных
   end;
   SaveHero(h);
   Result := "список всех полей героя через #10#13, типа как для стринглиста";
end;

end.

Ну вот вроде и всё, всё лишнее вроде бы поудалял.

З.Ы. Это фрагмент был из игры "Combats Offline", по мотивам Великого Бойцовского Клуба ;-)
Удачи!


 
имя   (2004-05-31 10:39) [31]

Удалено модератором


 
$HUR!K   (2004-06-14 06:43) [32]

Млин! Шоб я так жил!
Только начинающий программер озадаченно почесал макушку - так сразу вокруг него консилиум из десятка бородатых хацкеров :)

А на счет сейвгейма для новичка - по-мойму проще так:

procedure save;
var
f:textfile;
begin
assignfile(f,"save"); rewrite(f);
 save(f,live);
 save(f,bax);
 save(f,condoms);
 save(f,hrenznaetchto);
closefile(f);
end;


 
Evgeniy_K   (2004-06-14 10:48) [33]

Ини - лажа, не верь им, он не может быть тяжелее 64 Кб. Если хочешь сохранять игру, то работай с файлами:
var
 f: TextFile;

AssignFile(f, "<FileName>");// <FileName> - имя файла
Reset(f);// - открыть файл на чтение
Rewrite(f);// - перезаписать файл
Append(f);// -  дописать в файл с конца

CloseFile(f);// - закрыть файл

Писать в файл:
writeln(f, VARIABLE);// - где VARIABLE - переменная или значение
Читать из файла:
readlnln(f, VARIABLE);// - где VARIABLE - переменная

//"ln" -  переходить или нет на след. строку

Учи ObjectPascal!



Страницы: 1 вся ветка

Текущий архив: 2004.10.10;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.024 c
14-1095833817
peypivo
2004-09-22 10:16
2004.10.10
Проблема с железом?


4-1093849769
Ev1972
2004-08-30 11:09
2004.10.10
Как заменить EXE-файл во время выполнения?


1-1095842136
TUser
2004-09-22 12:35
2004.10.10
Self^


3-1095238218
Medik
2004-09-15 12:50
2004.10.10
INNER JOIN, OUTER JOIN


4-1093965391
Arnold
2004-08-31 19:16
2004.10.10
Известен Handle окна, как узнать какой его тип (TForm,TButton..)