Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.032 c
14-1095281471
Marser
2004-09-16 00:51
2004.10.10
Рома-Динамо


1-1096217032
tormoz
2004-09-26 20:43
2004.10.10
Градиент


6-1091108162
MetalFan
2004-07-29 17:36
2004.10.10
определить "свободные" UDP&amp;TCP порты


1-1095775511
misha123
2004-09-21 18:05
2004.10.10
ООП тип?


3-1095328995
_alex_
2004-09-16 14:03
2004.10.10
Защита данных в Access





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский