"স্তর স্ট্রিং" জন্য সেরা সমাধান?


10

আমার একটি গেম রয়েছে যা স্তরের শুরুতে এলোমেলো স্তরের মানচিত্র তৈরি করে। স্তরটি সংরক্ষণ এবং লোড করার জন্য আমি কোনও উপায়ে বাস্তবায়ন করতে চাই।

আমি ভাবছিলাম যে এক্সএমএল সমস্ত পরিবর্তনশীল সংরক্ষণের জন্য একটি ভাল বিকল্প হবে, তবে আমার পক্ষে এমন কিছু তৈরি করা সহজ হবে যা সেই এক্সএমএলকে বিশ্লেষণ করতে এবং ঠিক একই স্তরটি উত্পন্ন করতে পারে।

তবে এক্সএমএল সম্ভবত আমার প্রয়োজনের জন্য ওভারকিল। আমার মনে আছে সেই দিনের পুরানো সেগা কনসোলটি নিয়ে আপনার গেমটি সংরক্ষণ করার ক্ষমতা ছিল না (আমার মনে হয় ওয়ার্মস গেমটি এটিও করেছিল), তারা আপনাকে এমন একগুচ্ছ চরিত্র দেবে যা আপনি লিখতে পারেন। আপনি যদি পরে সেই স্ট্রিংটিতে খোঁচা মারেন তবে এটি সঠিক স্তরটি লোড করবে।

একটি "স্তর স্তর" একটি ভাল বিকল্প হতে পারে? এটি কি কোনও ধরণের "বেস 60" রূপান্তর হবে? আমি কীভাবে এটি বাস্তবায়ন করব?

উত্তর:


20

সম্ভবত আপনার যা সংরক্ষণ করতে হবে তা হ'ল এলোমেলো বীজ, যা সাধারণত একটি অন্তর্নিহিত। আপনি যদি এটিকে আরও কিছুটা অস্বচ্ছ করতে চান তবে আপনি বেস 64 কে ইনকোড করতে পারেন, তবে সম্ভবত এটির প্রয়োজন নেই।


আপনি আসল শব্দ থেকে বীজও তৈরি করতে পারেন (সম্ভবত আপনার বীজ পেতে চরিত্রগুলি যোগ করে কিনুন) এবং সেভাবে আরও কিছু অর্থবহ প্রত্যাবর্তন ঘটবে। আপনাকে আপনার গেমটিতে শব্দগুলি সংরক্ষণ করতে হবে বা সেগুলি পুনরুদ্ধার করতে হবে।
জোনাথন ফিশফফ

ঠিক আছে, তবে গেমটি খেললে এটি গতিশীল ডেটাও সঞ্চয় করতে হবে। স্ট্রিংয়ের অক্ষর অবস্থান / স্কোর ইত্যাদি সংরক্ষণ করা দরকার তাই এই স্ট্রিংটি উত্পন্ন করার সর্বোত্তম উপায় কী?
অ্যাডাম হার্ট

আমি সম্ভবত জেএসএন (বা আপনি যদি পছন্দ করেন এক্সএমএল) বিশ্ব রাষ্ট্রটি সিরিয়াল করতে এবং তারপরে সেই স্ট্রিংটি বেস 64-এনকোড করে থাকি। নিশ্চিত না যে এই সমস্ত দরকারী তবে, কেন কেবলমাত্র আরও GUI- ভিত্তিক সেভ / লোড সিস্টেম তৈরি করবেন না? আমি ধরে নিই যে এটি ওয়েব ভিত্তিক এবং আপনি এই সার্ভারটি পরিচালনা করতে চান না। উদাহরণস্বরূপ shygypsy.com/farm/p.cgi তাকান ?
কোডরেঞ্জার

23

আপনার সংরক্ষণের গেমগুলির জন্য আপনি যে কোনও ফর্ম্যাট ব্যবহার করুন না কেন, সদ্ব্যবহারের জন্য সংস্করণ নম্বরটি রেখে দিন You লোড করা।

না দিলে আপনি আফসোস করবেন।


7
+1 সত্যই প্রশ্নের উত্তর দেয় না তবে এটি গুরুত্বপূর্ণ।
জোনাথন ফিশফফ

10

জেএসএন ভাল, তবে ওয়াইএএমএল আরও ভাল। :) ব্যবহারযোগ্য সুন্দর ব্যবহারের জন্য http://www.yaml.org/ এবং http://code.google.com/p/yaml-cpp/

ওয়াইএএমএল হ'ল জেএসএনের একটি সুপারস্টার যা কয়েকটি দুর্দান্ত বৈশিষ্ট্যের জন্য সমর্থন যোগ করে, উল্লেখযোগ্য:

  • বাইনারি নোড আপনি স্তরের বর্ণনার জন্য যে ধরণের ডেটা নিয়ে কাজ করছেন সেটিকে সিরিয়ালাইজ করার জন্য এটি দুর্দান্ত। জেএসওনকে আপনার পছন্দের কিছু মধ্যবর্তী বিন্যাসে অনুবাদ করতে হবে যেমন বেস 64 লিখার আগে / পার্সিংয়ের আগে 64 YAML এর একটি বাইনারি নোড টাইপ রয়েছে যা পার্সার লাইব্রেরিকে আপনার জন্য এটি করতে বলে।
  • ইন্ট্রা-ডকুমেন্ট রেফারেন্স। যদি একই জিনিসটি নথিতে দু'বার উপস্থিত হয়, JSON এটি দুটি বার লিখবে এবং আপনি যখন এটি আবার পড়বেন তখন আপনি দুটি অনুলিপি পাবেন। অনেক YAML প্রেরণকারীরা এই পরিস্থিতি সনাক্ত করতে পারে এবং দ্বিতীয় অনুলিপিটির পরিবর্তে, প্রথমে একটি রেফারেন্স আউটপুট দেয়, কখন লোড করার সময় সনাক্ত করা যায়।
  • কাস্টম নোড প্রকার। আপনি একটি তালিকায় প্রতিটি ম্যাপকে ফ্ল্যাগ করতে পারেন উদাহরণস্বরূপ !! প্লেয়ার, !! শত্রু ইত্যাদির সাহায্যে, এবং তাই আপনার টাইপ তথ্য আরও ব্যান্ড-ব্যান্ড রাখুন।
  • YAML আরও পঠনযোগ্য ফর্ম্যাটিং সমর্থন করে।
  • JSON যেহেতু YAML এর একটি উপসেট, তাই বেশিরভাগ YAML পাঠকদের JSON নথি পড়তে কোনও সমস্যা হবে না।

1
ইয়ামল খুব দুর্দান্ত, এবং যদি আপনি সুপারসেটের কয়েকটি বৈশিষ্ট্য এড়িয়ে যান তবে কোনও অসুবিধা ছাড়াই এটি জসনে রূপান্তরিত হতে পারে।
জেথ্রো লারসন

3

আপনি যদি গেমের সমস্ত ডেটা সিরিয়াল করতে চান তবে আমি জেএসওএনকে আপনার ফাইল ফর্ম্যাট হিসাবে সুপারিশ করব, এটি কারণেই এক্সএমএল ব্যবহার করা সহজ এবং বহু ভাষাতে সমর্থনটি খুব ভাল।

আমি এই লাইব্রেরিটি সি ++ এর জন্য ব্যবহার করেছি এবং এটি খুব ভালভাবে কাজ করে।

http://jsoncpp.sourceforge.net/


3

XML হ'ল একটি ভাল পছন্দ যদি আপনি আকারের মাধ্যমে সীমাবদ্ধ না হন এবং এটি দেশীয়ভাবে সমর্থিত (যেমন। নেট এবং ফ্ল্যাশ) তবে আপনি যদি স্লিম ফর্ম্যাট চান তবে আপনি নিজের ফর্ম্যাট এবং পার্সার তৈরি করতে পারবেন বেশ সহজ। আমি সাধারণত 1 টি অক্ষর ব্যবহার করি। কমা প্রতিটি বস্তু পৃথক করতে। স্ট্রিংটি ডিকোড করতে কমাতে একটি স্প্লিট করুন। এখন প্রতিটি বস্তুর আলাদা আলাদা বৈশিষ্ট্য প্রয়োজন তাই এগুলি আলাদা অক্ষরের সাথে পৃথক করুন যেমন আধা কোলন, এবং সম্পত্তি ভেলস থেকে সম্পত্তি নাম আলাদা করতে অন্য একটি অক্ষর ব্যবহার করুন use কোলন। এইভাবে সমস্ত স্ট্রিং.স্প্লিট ব্যবহার করে রেজেেক্স ছাড়াই সহজেই ডিকোড করা যায়। এখানে একটি উদাহরণ:

id:1;x:5;y:45.2;angle:45,id:28;x:56;y:89;angle:12;health:78

সম্পত্তির নামটি 1 টি অক্ষর পর্যন্ত রেখে আপনি আরও বেশি জায়গা বাঁচাতে পারেন, যেমন স্বাস্থ্যের জন্য h। যেমন।

i:1;x:5;y:45.2;a:45,i:28;x:56;y:89;a:12;h:78

জেএসএন বিকল্পের সাথে তুলনা করুন:

{"o":[{"i":1, "x":5, "y":45.2, "a":45}, {"i":28, "x":56, "y":89, "a":12, "h":78}]}

এছাড়াও, আপনি যদি নিজের সংখ্যার আকার কম করতে চান তবে মুদ্রণযোগ্য UTF16 অক্ষরের পুরো সেটটি ব্যবহার করে এগুলি এনকোড করতে পারেন। এই থ্রেডটি আপনাকে অন-স্ক্রিন চরিত্রের মধ্যে কতটা ডেটা প্যাক করতে পারে তার স্ট্যাক ওভারফ্লোতে একটি প্রশ্ন জিজ্ঞাসা করতে আমাকে অনুপ্রাণিত করেছিল । উত্তরটি কোনও পূর্ণসংখ্যার জন্য 40,000 এরও বেশি মান বলে মনে হচ্ছে, যদি আপনি ব্রেইল, কঞ্জি এবং দাবা টুকরা রাখতে আপত্তি করেন না: ♔♕♖♗♘♙♚♛♜♝♞♟

আরও আকার হ্রাস পেতে, আপনি কোন মানটি নির্ধারণ করতে পাঠ / লেখার ক্রমটি ব্যবহার করতে পারেন, তাই প্রথম দুটি অক্ষর আইডি উপস্থাপন করে, পরের দুটিটি এক্স অবস্থান, পরের দুটি y, তার পরে কোণ, তারপরে স্বাস্থ্য ইত্যাদি। সুতরাং:

F5DGP@%&002DFTK#OP1F

অন্যান্য উদাহরণগুলির মতো সমস্ত তথ্য সংরক্ষণ করতে পারে।

টাইল গ্রিডগুলি প্রতিটি অক্ষরকে বিভিন্ন ধরণের টাইল উপস্থাপন করে এমন একটি স্ট্রিং হিসাবে সংরক্ষণ করা যেতে পারে যেমন:

i789pog5h3kl

যেখানে আমার অর্থ লাভা, 9 টি ঘাস ইত্যাদি


এটি আমি যা জিজ্ঞাসা করছি তার লাইনের সাথে আরও বেশি। আমি আমার প্রশ্নে এক্সএমএল উল্লেখ করেছি, তবে এখনও লোকেরা এটির পরামর্শ দেয়!
অ্যাডাম হার্ট

1
এর চারপাশে} Add যুক্ত করুন এবং আপনার মূলত JSON ;-) রয়েছে
কোডরেঞ্জার

আপনাকে উদ্ধৃতি চিহ্নের একটি ভারও যুক্ত করতে হবে। অক্ষরের সংখ্যা সম্ভবত দ্বিগুণ হবে তবে আপনি বস্তুর বাসা পাবেন।
আয়ান

1

আপনি যদি কোডিং করছেন et

TheMap হবে এমন মানচিত্রের একটি পরিবর্তনশীল যা আপনার সমস্ত ডেটা লোড করে রেখেছিল into

Dim TheMap As New Map

আপনার মানচিত্রের ক্লাস ইতিমধ্যে নির্মিত হয়েছে বলে ধরে নেওয়া, এটি আপনার মানচিত্রটি এক্সএমএলে সংরক্ষণ করবে:

Dim Serializer As New System.Xml.Serialization.XmlSerializer(GetType(TheMap))
Dim Strm As New FileStream("c:\Map.xml", FileMode.Create, FileAccess.Write, FileShare.None)
Serializer.Serialize(Strm, TheMap)
Strm.Close()

এরপরে কোডটিতে আবার ব্যবহারের জন্য এটি XMLটিকে আপনার মানচিত্রের ক্লাসে ফেরত দেবে।

Dim Reader As New StreamReader("map.xml")
Dim Serializer As New System.Xml.Serialization.XmlSerializer(GetType(TheMap))

TheMap = Serializer.Deserialize(Reader)
Reader.Close()

এ থেকে আপনার এক্সএমএল ফাইলটি এখন সহজেই ব্যবহারের জন্য আপনার ক্লাসে লোড করা হয়েছে।

আপনার "লেভেল স্ট্রিং" ইস্যু হিসাবে, এর আগে যা বলা হয়েছিল তা দুর্দান্ত কাজ করবে, আপনি কেবল "স্তর স্তর" হিসাবে বীজ সংখ্যাটি ব্যবহার করতে পারেন।

অন্যথায়, আপনি চাইলেও অনেকগুলি বিভিন্ন মানচিত্র প্রাক-জেনারেট করতে পারতেন এবং সেগুলি একটি "লেভেল স্ট্রিং" দিয়ে সংরক্ষণ করতে পারেন এবং তারপরে যথাযথ মানচিত্রটি টানতে এটি ব্যবহার করতে পারেন।


+1 যদিও আমি এক্সএমএলকে ঘৃণা করি - যদি ভাষাটি একটি ডিফল্ট সিরিয়ালাইজেশন ফর্ম্যাট সরবরাহ করে তবে প্রথমে এটি বিবেচনা করা ভাল, বিশেষত যদি এটি অন্য সরঞ্জামগুলি তাত্ত্বিকভাবে পার্স করতে পারে (যেমন এক্সএমএল / জেএসএন / ওয়াইএমএল)।

0

আমি একটি সাধারণ ব্যবহার করব structসমস্ত গেমের রাজ্য কেন্দ্রীয় স্থানে সঞ্চয় করতে বা অনুরূপ ডিভাইস (আপনার ভাষার উপর নির্ভর করে) ব্যবহার করব। আপনি যদি সেটার / গেটারদের সুরক্ষা চান তবে আপনি স্ট্রাকটি একটিতে মোড়াতে পারেন class

যদি আপনি এটি আপ মনে করেন, এটি ব্যবহার করুন বিটফিল্ড বা কেবল বিটওয়াইস অপারেটরগুলি ব্যবহার করে নিজেকে বিট ম্যানিপুলেশন করুন।

কিছু ভাষায়, সচেতন হন স্ট্রাক্ট প্যাডিং এবং প্যাকিংয়ের নিয়মগুলি কিছুটা জটিল হতে পারে - তবে আপনার যদি বাইট বা দুটি প্যাডিং থাকে তবে এটি আপনার ক্ষেত্রেও খুব বেশি গুরুত্বপূর্ণ নয়।

আপনি একটি ব্যবহার করতে সক্ষম হতে পারেন #pragma(যেমন#pragma pack(1)__attribute__প্যাডিং দূর করে কাঠামোটি খুব কাছ থেকে প্যাক ) বা একটি । এটি আপনার সংকলক এবং লক্ষ্য স্থাপত্যের উপর নির্ভর করে কাজ করতে পারে বা নাও করতে পারে।

নোট করুন যে বিটফিল্ড এবং প্যাক প্রাগমাস বা বৈশিষ্ট্যগুলি বহনযোগ্যতা হ্রাস করতে পারে। হার্ডওয়্যার আর্কিটেকচার জুড়ে স্ট্রাক্ট ফিল্ড এন্ডিয়নেস (বাইট অর্ডার) এছাড়াও পরিবর্তন হতে পারে। সুতরাং আপনি বহনযোগ্যতার জন্য চেষ্টা করে থাকলে আপনি এড়াতে চাইতে পারেন।

(যেমন, প্যাক ম্যান, উদাহরণস্বরূপ, এই কাঠামোটিতে নির্লজ্জভাবে একটি মানচিত্রের আইডি বা মানচিত্রের বীজ, একটি প্যাক-ম্যান এক্স এবং ওয়াই অবস্থান, চারটি ভুত এক্স এবং ওয়াই পজিশন এবং 32-64 পাটের উপস্থিতি বা অনুপস্থিতির জন্য একটি বিটফিল্ড থাকতে পারে, সর্বাধিক যাই হোক না কেন।)

আপনার স্ট্রাক্ট হয়ে গেলে এটি এক্সএক্সেনকোড ফাংশনের মতো কিছুতে প্রেরণ করুন :

encode_save( char * outStringBuf, size_t outStringBufSize,
             const SaveStruct * inSaveData, size_t inSaveDataSize )

এই ফাংশনটি লিখতে কিছুটা ত্রুটি-ঝুঁকিপূর্ণ; একবারে at টি বিট পাওয়ার জন্য আপনার প্রয়োজনীয় বাইটগুলি স্থানান্তরিত এবং সংযুক্ত করতে হবে, তারপরে একটি উপযুক্ত চরিত্রে অনুবাদ করুন। আমি ব্যক্তিগতভাবে অন্যের কোডটি অনুসন্ধান করার চেষ্টা করব, যদি না আমি "মজা" করার জন্য এটি না করতাম (এবং আমি সম্ভবত এটির জন্য একটি পরীক্ষার স্যুট চাই) want

কখনই structসঠিক জায়গায় পুরানো-বিদ্যালয়ের শক্তিকে হ্রাস করবেন না । আমরা এটি জিবিএ এবং ডিএস গেমগুলির জন্য একটি টন ব্যবহার করেছি।


কাঁচা কাঠামোর সিরিয়ালাইজেশন অ-বহনযোগ্য এবং অত্যন্ত ভঙ্গুর আর্ট নতুন কোড। যদি না খুব সীমিত সংস্থানযুক্ত প্ল্যাটফর্মের জন্য ডেটা বেকিংয়ের চূড়ান্ত পদক্ষেপ না হয় তবে এটি খুব অকাল অপটিমাইজেশন। আপনি কি 8 টির জন্য 6 বিট পছন্দ করার কোনও কারণ আছে? ফর্ম্যাটটি যাইহোক মানব-পঠনযোগ্য হবে না, আপনি সম্ভবত একটি বাস্তব কাঠামোর বিন্যাসের গতি এবং ডিবাগিবিলিটির সুবিধা নিতে পারেন।

@ জো: আমি উল্লেখ করেছি যে এটি অ-বহনযোগ্য এবং কিছু সম্ভাব্য উদ্বেগ। প্রশ্নটি বিশেষত পুরাতন সেগা গেমগুলির মতো একটি মানব-পঠনযোগ্য "স্তরের স্ট্রিং" এর জন্য জিজ্ঞাসা করেছিল এবং বেস 60 রূপান্তর উল্লেখ করেছে; xxencode এর মতো কোনও কিছুর মধ্য দিয়ে একটি কাঠামো পাস করা এটি করবে। এই অগত্যা একটি অকাল অপ্টিমাইজেশান নয়: একটি সহজ struct হয়, bitpacked না, একটি সুন্দরভাবে "সেন্ট্রাল" তথ্য সংরক্ষণ দোকান থেকে উপায়, এবং পারে প্রক্রিয়া সহজ অনেক কোডের তথ্য সাথে মিথস্ক্রিয়া যে। উদাহরণস্বরূপ নোয়েল লোলোপিসের অ-সদস্য নন-বন্ধু কাঠামো এবং "ইনস আউট" প্রোগ্রামিংয়ের সাম্প্রতিক নিবন্ধগুলি দেখুন। এটি কেবল KISS।
লন্ডার

1
আমি পুরোপুরি এইভাবে একমত। হ্যাঁ, এটি সংস্করণগুলিতে বা সিস্টেমগুলিতে পোর্টেবল নয়, তবে আবার সেভ-গেমস এমন সংস্থান নয় যা বিকাশের সময় পুনরায় ব্যবহার করা দরকার, বা প্ল্যাটফর্মগুলি অনুলিপি করে। ডিবাগ্যাবিলিটি কোনও জায়গাতেই পড়ুন / লেখার সমস্যা নেই, এটি একবার প্রয়োগ করুন এবং এটি চিরকাল কাজ করবে। যদি এক্সটেনসিবিলিটি সত্যিই একটি সমস্যা হয় - প্রথম ybyte / শব্দ হিসাবে একটি সংস্করণ নম্বর যুক্ত করুন এবং আপনি এটি স্যুইচ করতে পারেন (যদিও এটি ডেটা দুর্বলতার পরিচয় দেয়)। এটি এক্সএমএল সংস্করণের সমস্যাগুলি সমাধান করার মতো নয় - কেবল একটি মান নির্ধারণের চেয়ে বেশি জড়িত হওয়ার প্রবণতা। হ্যাঁ, আমি বাস্তববাদী।
কাজ

0

এক্সএমএল নির্বিচারে কাঠামোগত দলিলগুলির জন্য (উপাদান গাছের বিভিন্ন স্তরে উপস্থিত হতে পারে) বা বিদেশী ফর্ম্যাট এম্বেডিং (যেমন কোনও এক্সএইচটিএমএল পৃষ্ঠায় এসভিজি লাগানোর জন্য) ভাল। আপনার যদি সেই প্রয়োজনীয়তাগুলি না থাকে তবে এটি সত্যিই অদৃশ্য ফর্ম্যাট এবং সিএসভি বা জসন এর মতো আরও সাধারণ কিছু পছন্দনীয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.