আমি কীভাবে একটি সি ++ গেমের জন্য একটি সেভ ফাইল তৈরি করব?


33

আমি একটি ভিডিও গেম প্রোগ্রামিং কোর্সের জন্য আমার ফাইনাল কোডিং করছি, এবং আমি আমার গেমের জন্য একটি সেভ ফাইল কীভাবে তৈরি করতে হবে তা জানতে চাই, যাতে কোনও ব্যবহারকারী খেলতে পারে এবং তারপরে পরে ফিরে আসে। এটি কীভাবে করা হয় তার কোনও ধারণা, এর আগে আমি যা করেছি প্রতিটি কাজই একক রান প্রোগ্রাম been




1
@ শেভেলো যখন আপনি এটি করতে পারতেন তখন মনে হয় এটি অনেক জটিলতা যুক্ত করবে যা প্রয়োজনীয়ভাবে প্রয়োজন হয় না।
Nate

উত্তর:


38

আপনার হার্ড ড্রাইভে মেমরিতে আপনার ভেরিয়েবলগুলি সংরক্ষণ করতে আপনার ক্রমিক ব্যবহার করতে হবে । বাইনারি এবং জেএসওএন সিরিয়ালাইজার উপলব্ধ থাকলেও .NET XML এ অনেক ধরণের সিরিয়ালাইজেশন রয়েছে common আমি খুব বেশি সি ++ প্রোগ্রামার নই, তবে তাত্ক্ষণিক অনুসন্ধানে সি ++ এ সিরিয়ালাইজেশনের একটি উদাহরণ তৈরি হয়েছিল:

লাইব্রেরি রয়েছে, যা ক্রিয়াকলাপগুলির ক্রিয়াকলাপ সরবরাহ করে। কিছু অন্যান্য উত্তর উল্লেখ করা হয়।

আপনি যে ভেরিয়েবলগুলিতে আগ্রহী তা সম্ভবত গেমের সাথে সম্পর্কিত হতে চলেছে। উদাহরণস্বরূপ, আপনি সম্ভবত এই ধরণের তথ্য জানতে চাইবেন

  1. খেলোয়াড়টি খেলছিলেন স্তর 3 3
  2. প্লেয়ারটি এক্স, ওয়াই ওয়ার্ল্ড কোঅর্ডিনেটে ছিল
  3. প্লেয়ারটির ব্যাকপ্যাকটিতে তিনটি আইটেম রয়েছে
    1. অস্ত্র
    2. বর্ম
    3. খাদ্য

আপনি কোন টেক্সচার ব্যবহার করছেন তা সত্যিই যত্নশীল হবেন না (যদি না আপনার প্লেয়ার তাদের চেহারা পরিবর্তন করতে না পারে তবে এটি একটি বিশেষ ক্ষেত্রে), কারণ এটি সাধারণত একই রকম হয়। গুরুত্বপূর্ণ গেমস্টেট ডেটা সংরক্ষণে আপনার ফোকাস করা দরকার।

আপনি যখন আপনার গেমটি শুরু করেন, আপনি "নতুন" গেমের জন্য স্বাভাবিক হিসাবে শুরু করেন (এটি আপনার টেক্সচার, মডেলগুলি বোঝায়) তবে উপযুক্ত সময়ে আপনি আপনার সেভ ফাইল থেকে মানগুলি "ডিফল্ট" নতুন প্রতিস্থাপনের মাধ্যমে গেমের স্টেটে ফিরিয়ে আনুন load খেলা অবস্থা। তারপরে আপনি প্লেয়ারটিকে আবার খেলা শুরু করার অনুমতি দিন।

আমি এখানে এটিকে খুব সরল করে দিয়েছি, তবে আপনার সাধারণ ধারণাটি পাওয়া উচিত। আপনার যদি আরও নির্দিষ্ট প্রশ্ন থাকে তবে এখানে একটি নতুন প্রশ্ন জিজ্ঞাসা করুন এবং আমরা এটিতে আপনাকে সহায়তা করার চেষ্টা করতে পারি।


আমি কী সংরক্ষণ করতে হবে তা আমি বুঝতে পেরেছি তবে সঠিক উপায়টি কী তা জানতে চাই, আপনি কি প্রকল্পের একটি টেক্সট ফাইল, সেই পরিবর্তিত ভেরিয়েবলগুলি বা অন্য কোনও উপায়ে সংরক্ষণ করতে পারেন
টাকার মরগান

হ্যাঁ, যদি আপনার গেমটি সহজ হয় তবে একটি পাঠ্য ফাইল যথেষ্ট হতে পারে; আপনার মনে রাখতে হবে যে যে কোনও পাঠ্য ফাইল সম্পাদনা করতে পারে এবং এইভাবে তাদের নিজস্ব সেভ গেমস তৈরি করতে পারে ...
নট

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

1
@ ড্যানিয়েলি একটি সুস্পষ্ট পয়েন্ট, আপনি জটিল তথ্য প্রচুর সঞ্চয় করার জন্য কোনও পাঠ্য বিন্যাসটি ব্যবহার করতে পারবেন না এমন কোনও কারণ নেই, তবে সাধারণভাবে বলতে গেলে, যখন আপনার ডেটাটি জটিল হয়, অন্য বিন্যাসের (বাইনারি, এক্সএমএল, ইত্যাদি) সুবিধাগুলি আরও সুস্পষ্ট হয়ে যায়।
Nate

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

19

সাধারণত এটি আপনার গেমের সাথে নির্দিষ্ট। আমি নিশ্চিত আপনি এ পর্যন্ত আপনার ক্লাসে ফাইল থেকে লেখা এবং পড়া সম্পর্কে শিখেছি। মূল ধারণাটি হ'ল:

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

আপনি যা লিখছেন তা নির্ভরশীল, এটি আপনার গেমের উপর নির্ভর করে। লেখার একটি উপায় হ'ল বাইট স্ট্রিম হিসাবে নির্দিষ্ট ক্রমে আপনি যে পরিবর্তনগুলি চান তা লিখুন write তারপরে লোড করার সময় এগুলি একই ক্রমে আপনার প্রোগ্রামে পড়ুন।

উদাহরণস্বরূপ (দ্রুত সিউডো কোডে):

SaveGame(FileInput file) {
    file.writeInt(playerLevel);
    file.writeInt(playerHealth);
    file.writeInt(gameProgress);
}

LoadGame(FileInput file) {
    if(file.exists()) {
        playerLevel= file.readInt();
        playerHealth = file.readInt();
        gameProgress = file.readInt();
    } else {
        playerLevel = 1;
        playerHealth = 100;
        gameProgress = 0;
    }
}

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

1
হ্যাঁ, এটি ভবিষ্যতে-সংরক্ষণের ফাইলগুলি উত্পন্ন করে না। এটি স্ট্রিংয়ের মতো পরিবর্তনশীল বাইট আকারের ডেটাতেও কাজ করে না। প্রথমটি যে ডেটাটি লিখতে চলেছে তার আকারটি লিখে প্রথমে ঠিক করা সহজ, তারপরে বাইটের সঠিক সংখ্যাটি পড়তে লোড করার সময় এটি ব্যবহার করে।
MichaelHouse

6

এটি করার জন্য সম্ভবত প্রচুর সংখ্যক উপায় রয়েছে তবে আমি সর্বদা ব্যক্তিগত এবং পেশাগত উভয়ই খুঁজে পেয়েছি এবং ব্যবহার করেছি সবচেয়ে সহজতমটি হ'ল এমন একটি কাঠামো তৈরি করা যাতে আমি সংরক্ষণ করতে চাই এমন সমস্ত মান রয়েছে।

struct SaveGameData
{
    int              characterLevel; // Any straight up values from the player
    int              inventoryCount; // Number of items the player has on them or stored or what not
    int[STAT_COUNT]  statistics;     // This is usually a constant size (I am tracking X number of stats)
    // etc
}

struct Item
{
    int itemTypeId;
    int Durability; // also used as a 'uses' count for potions and the like
    int strength;   // damage of a weapon, protection of armor, effectiveness of a potion
    // etc
}

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

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

আবার এটি করার বেশ কয়েকটি উপায় এবং এটি সি ++ এর চেয়ে সিটির দিকে আরও বেশি দিকে পরিচালিত করতে পারে তবে এটি কাজটি সেরে ফেলেছে!


1
এটি লক্ষ করার মতো বিষয় যে এটি প্ল্যাটফর্ম-স্বতন্ত্র নয়, সি ++ স্ট্রিংগুলির জন্য, বা রেফারেন্স বা পয়েন্টারগুলির মাধ্যমে উল্লেখ করা বস্তুগুলির জন্য বা উপরের যে কোনও উপাদান সহ কোনও পদার্থের জন্য কাজ করবে না!
কাইলোটান

কেন এই প্ল্যাটফর্মটি স্বাধীন নয়? এটি পিসি, পিএস * সিস্টেম এবং 360 এ দুর্দান্ত কাজ করেছে ... fwrit (pToDataBuffer, আকারের (ডেটাটাইপ), countOfE উপাদান, pToFile); আপনি তাদের তথ্য, এবং বস্তুর আকার এবং তারপরে আপনি কী লিখতে চান সেগুলির সংখ্যা পেতে পারেন এবং এইগুলি ম্যাচগুলি পড়তে পারেন এই ধারণা ধরে those সমস্ত বস্তুর পক্ষে কাজ করে
জেমস

এটা তোলে হয় প্ল্যাটফর্ম-স্বাধীন, আছে শুধু কোন গ্যারান্টি যে এক প্ল্যাটফর্মে সংরক্ষিত ফাইলগুলি অন্য এক লোড করা যাবে। যা বরং গেমের ডেটা সংরক্ষণের জন্য অপ্রাসঙ্গিক। পয়েন্টার-থেকে-ডেটা-এবং-আকার-ম্যাকপি উপাদানগুলি অবশ্যই কিছুটা বিশ্রী হতে পারে, তবে এটি কার্যকর হয় works
বাম দিকের বাইরে

3
আসলে এটির কোনও গ্যারান্টি নেই যে এটি চিরকাল আপনার জন্য কাজ করে চলেছে - আপনি যদি নতুন সংকলক বা স্ট্রাক প্যাডিংগুলিকে পরিবর্তন করে এমন একটি নতুন সংকলন বিকল্প দিয়ে নির্মিত একটি নতুন সংস্করণ প্রকাশ করেন তবে কী হবে? আমি দৃ reason়ভাবে, দৃ raw়ভাবে দৃ f়রূপে কাঁচা-কাঠামোগুলির লেখার ব্যবহারের সুপারিশ করব () একা এই কারণে (আমি ঘটনাক্রমে এই বিষয়ে অভিজ্ঞতা থেকে বলছি)।
ফ্লাফি

1
এটি '32 বিটের ডেটা 'সম্পর্কে নয়। মূল পোস্টারটি কেবল "আমি কীভাবে আমার ভেরিয়েবলগুলি সংরক্ষণ করব" জিজ্ঞাসা করছে। আপনি যদি ভেরিয়েবলটি সরাসরি লিখে ফেলেন, তবে আপনি প্ল্যাটফর্মের তথ্য হারাবেন। আপনার যদি উক্ত লেখার পূর্বে প্রিপ্রোসেস করতে হয় তবে আপনি উত্তরের সর্বাধিক গুরুত্বপূর্ণ অংশটি রেখে গেছেন। কীভাবে ডেটা প্রক্রিয়াকরণ করা যায় যাতে এটি সঠিকভাবে সংরক্ষণ করা হয় এবং এতে কেবল তুচ্ছ বিট অন্তর্ভুক্ত থাকে ie ডিস্কে কিছু রাখতে ফোরিটকে ফোন করা।
কাইলোটন

3

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

এর পরে, এটিকে কোনও ফাইলে সংরক্ষণের জন্য কোড লিখুন (স্ট্রিমের ব্যবহার)। আপনি যে তুলনামূলক সহজ ফর্ম্যাটটি ব্যবহার করতে পারেন তা নিম্নরূপ:

x y score coins

এবং তাই ফাইলটি দেখতে হবে:

14 96 4200 100

যার অর্থ দাঁড়ায় যে তিনি 4200 এবং 100 কয়েনের স্কোর নিয়ে (14, 96) পজিশনে ছিলেন।

এই ফাইলটি লোড করার জন্য আপনার কোডও লিখতে হবে (ifstream ব্যবহার করুন)।


ফাইলগুলিতে তাদের অবস্থান অন্তর্ভুক্ত করে শত্রুদের সংরক্ষণ করা সম্ভব। আমরা এই ফর্ম্যাটটি ব্যবহার করতে পারি:

number_of_enemies x1 y1 x2 y2 ...

প্রথমে number_of_enemiesপঠিত হয় এবং তারপরে প্রতিটি অবস্থান একটি সাধারণ লুপ দিয়ে পড়া হয়।


1

একটি যোগ / পরামর্শ আপনার ক্রমিকায়নের একটি স্তর এনক্রিপশন যুক্ত করতে হবে যাতে ব্যবহারকারীরা তাদের মানগুলি "9999999999999999999" এ সম্পাদনা করতে পারবেন না। এটি করার একটি ভাল কারণ হ'ল পূর্ণসংখ্যা ওভারফ্লো প্রতিরোধ করা (উদাহরণস্বরূপ)।


0

আমি মনে করি আপনার সেরা বেট হ'ল :: সিরিয়ালাইজেশন হ'ল কারণ আপনার শ্রেণিবদ্ধত্বে প্রচার করা সহজ। আপনাকে কেবল শীর্ষ পদটির সেভ / লোড ফাংশনটি কল করতে হবে এবং আপনার সমস্ত ক্লাস সহজেই তৈরি করা হবে।

দেখুন: http://www.boost.org/doc/libs/1_49_0/libs/serialization/doc/index.html


0

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


0

আপনার গেমটি ডেটা স্ট্রাকচারের সাথে আপস করবে (আশা করি?) যে আপনাকে বাইটে রূপান্তরিত করতে হবে (সিরিয়ালাইজ করা) যাতে আপনি সেগুলি সঞ্চয় করতে পারেন। ভবিষ্যতে, আপনি এই বাইটগুলি পিছনে লোড করতে পারেন এবং সেগুলি আবার আপনার মূল কাঠামোয় (ডিসরিয়ালাইজেশন) রূপান্তর করতে পারেন। সি ++ তে এটি এতটা জটিল নয় যেহেতু প্রতিফলন খুব সীমাবদ্ধ। তবে এখনও, কিছু গ্রন্থাগার আপনাকে এখানে সহায়তা করতে পারে। আমি এটি সম্পর্কে একটি নিবন্ধ লিখেছি: https://rubentorresbonet.wordpress.com/2014/08/25/an-overview-of-data-seialization-techniques-in-c/ মূলত, আমি আপনাকে একটি নজর দেওয়ার পরামর্শ দেব সিরিয়াল লাইব্রেরি যদি আপনি সি ++ 11 সংকলক লক্ষ্য করতে পারেন। প্রোটোবুফের মতো মধ্যবর্তী ফাইলগুলি তৈরি করার দরকার নেই, তাই যদি আপনি দ্রুত ফলাফল চান তবে আপনি সেখানে কিছুটা সময় সাশ্রয় করবেন। আপনি বাইনারি এবং জেএসএন এর মধ্যেও চয়ন করতে পারেন, সুতরাং এটি এখানে ডিবাগ করতে বেশ সহায়তা করতে পারে।

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


-5

আপনাকে fstreamইনপুট / আউটপুট ফাইলগুলির জন্য ব্যবহার করতে হবে । সিনট্যাক্সটি সহজ এক্স:

#include <fstream>
// ...
std::ofstream flux ; // to open a file in ouput mode
flux.open("myfile.whatever") ; 

অথবা

#include <fstream>
// ...
std::ifstream flux ; // open a file in input mode
flux.open("myfile.whatever") ;

আপনার ফাইলে অন্যান্য ক্রিয়াকলাপগুলি সম্ভব: সংযোজন , বাইনারি , ট্রাঙ্ক ইত্যাদি আপনি উপরের মত একই সিনট্যাক্স ব্যবহার করবেন পরিবর্তে আমরা স্টাডি :: আইওএস: :( পতাকাগুলি রেখেছি ), উদাহরণস্বরূপ:

  • ios::out আউটপুট অপারেশন জন্য
  • ios::in ইনপুট অপারেশন জন্য
  • ios::binary বাইনারি (কাঁচা বাইট) অক্ষরের উপর ভিত্তি করে আইও অপারেশনের জন্য
  • ios::app ফাইলের শেষে লিখতে শুরু করার জন্য
  • ios::trunc যদি ফাইলটি ইতিমধ্যে বিদ্যমান থাকে তবে পুরানো সামগ্রী মুছুন এবং নতুন দ্বারা প্রতিস্থাপন করুন
  • ios::ate - ইনপুট / আউটপুট জন্য "শেষে" ফাইল পয়েন্টার অবস্থান

উদা:

#include <fstream>
// ...
std::ifstream flux ;
flux.open("myfile.whatever" , ios::binary) ;

এখানে আরও একটি সম্পূর্ণ কিন্তু সহজ উদাহরণ।

#include <iostream>
#include <fstream>

using namespace std ;

int input ;
int New_Apple ;
int Apple_Instock ;
int Eat_Apple ;
int Apple ;

int  main()
{
  bool shouldQuit = false;
  New_Apple = 0 ;
  Apple_Instock = 0 ;
  Eat_Apple = 0 ;

  while( !shouldQuit )
  {
    cout << "------------------------------------- /n";
    cout << "1) add some apple " << endl ;
    cout << "2) check apple in stock " << endl ;
    cout << "3) eat some apple " << endl ;
    cout << "4) quit " << endl ;
    cout << "------------------------------------- /n";
    cin >> input ;

    switch (input)
    {
      case 1 :
      {
        system("cls") ;

        cout << "------------------------------------ /n";
        cout << " how much apple do you want to add /n";
        cout << "------------------------------------ /n";      
        cin >> New_Apple ;

        ifstream apple_checker ;
        apple_checker.open("apple.apl") ;
        apple_checker >> Apple_Instock ;
        apple_checker.close() ; 

        Apple = New_Apple + Apple_Instock ;

        ofstream apple_adder ;
        apple_adder.open("apple.apl") ;
        apple_adder << Apple ;
        apple_adder.close() ;

        cout << "------------------------------------ /n";
        cout << New_Apple << " Apple has been added ! /n";
        cout << "------------------------------------ /n";
        break;
      }

      case 2 :  
      {
        system("cls") ;

        ifstream apple_checker ;
        apple_checker.open("apple.apl") ;
        apple_checker >> Apple_Instock ;
        apple_checker.close() ;

        cout << "------------------------------------ /n";
        cout << " there is " << Apple_Instock ;
        cout << "apple in stock /n" ;
        cout << "------------------------------------ /n";
        break;
      }

      case 3 :
      {
        system("cls") ;

        cout << "------------------------------------ /n";
        cout << "How many apple do you want to eat /n" ;
        cout << "------------------------------------ /n";
        cin >> Eat_Apple ;

        ifstream apple_checker ;
        apple_checker.open("apple.apl") ;
        apple_checker >> Apple_Instock ;
        apple_checker.close() ;

        Apple = Apple_Instock - Eat_Apple ; 

        ofstream apple_eater ;
        apple_eater.open("apple.apl") ;
        apple_eater << Apple ;
        apple_eater.close() ;

        cout << "----------------------------------- /n";
        cout << Eat_Apple ;
        cout << " Apple has been eated! /n";
        cout << "----------------------------------- /n";
        cout << Apple << " Apple left in stock /n";
        cout << "----------------------------------- /n";
        break;
      }

      case 4 :
      {
        shouldQuit = true;
        break;
      }

      default :
      {
        system("cls") ;

        cout << "------------------------------------ /n";
        cout << " invalide choice ! /n";
        cout << "------------------------------------ /n"; 
        break;
      }
    }
  }
  return 0;
}

4
-1 এটি একটি খুব খারাপ উত্তর। আপনার কোডটি সঠিকভাবে ফর্ম্যাট এবং প্রদর্শন করা উচিত এবং আপনি কী করছেন তা ব্যাখ্যা করা উচিত , কেউই কোডের একটি অংশ বোঝাতে চায় না।
ভায়ল্যানকোর্ট

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

থেকে এই সাইটে, বা জন্য এই সাইট? পোস্টগুলির বিন্যাসে সহায়তার জন্য, আপনি ফর্ম্যাটিং সহায়তা পৃষ্ঠাটি দেখতে পারেন । আপনাকে পাঠাতে যে পাঠ্য অঞ্চলটি পোস্ট করতে ব্যবহার করেন সেটির শিরোনামের পাশে একটি বিস্ময়বোধক চিহ্ন রয়েছে you
ভায়ল্যানকোর্ট

যা জিজ্ঞাসা করা হয়েছে তা দলিল করার চেষ্টা করুন; আপনার সব কিছু মন্তব্য করার দরকার নেই। এবং আমার মন্তব্যে আপনি কী করছেন তা ব্যাখ্যা না করে আমি বোঝাতে চাইছিলাম যে আপনি সাধারণত কৌশলটি প্রবর্তন করেন যা আপনি কমপক্ষে একটি সংক্ষিপ্ত অনুচ্ছেদে পরামর্শ করেন। (যেমন "কৌশলগুলির মধ্যে একটি হ'ল একটি স্ট্রিম অপারেটরের সাথে বাইনারি ফাইল ফর্ম্যাট ব্যবহার করা You একই ক্রমে আপনাকে পড়তে এবং লিখতে সাবধানতা অবলম্বন করতে হবে" ব্লেব এলবিএ))
Vaillancourt

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