ترتیب ورود دشمن به بازی.
#1
سلام و عرض ادب خدمت دوستان عزیز...
میخواستم بپرسم که اگر ما بخوایم ترتیب ورود انواع دشمنان به بازی رو در هر مرحله کاملا کنترل کنیم و از حالت تصادفی خارج کنیم و کاملا هر مرحله رو با ترتیب ورود مشخصی به طور دستی و از پیش تعیین شده مهندسی کنیم و در واقع طراحی مرحله بکنیم, منطقی ترین روشش چی هست؟
من یک مثال واضح بزنم.
فرض کنیم بازی 10 مرحله داره و تو هر مرحله میخوایم با یک ترتیب طراحی شده ای از بین مثلا 20 دشمنمون فقط 4 تا رو تو این مرحله هر 10 ثانیه وارد بازی کنیم.
منطقی ترین و درست ترین روش طراحی مرحله تو این حالت چی هست؟
فرض کنین ما تو مرحله اول میخوایم فقط دشمنان 1و5و6و7 وارد بازی بشن (یعنی بعد 10 ثانیه از شروع مرحله1, اول دشمن1 بیاد و بعد10 ثانیه بعدی دشمن5 و بعد 10 ثانیه بعدی دشمن6 و بعد 10 ثانیه بعدی دشمن 7... و اینکار برای 10 مرحله و یا حتی 100 مرحله بخواد طراحی بشه)
ما دستوری داریم که مثل دستور choose(1,5,6,7) که از بین اعداد 1و 5و6و7 یکی رو تصادفی انتخاب میکنه دستوری باشه که این اعداد که هر کدوم مشخصه یک دشمن هستن رو به ترتیب انتخاب کنه و وارد بازی کنه؟
مثلا فرص کنین دستور تخیلی شبیه select(1,5,6,7) که به ترتیب اعداد 1 و بعد 5 و بعد 6 و بعد 7 رو انتخاب کنه و وارد بازی کنه؟
  پاسخ


 سپاس شده توسط: ᔕinaᗪehghani
#2
سلام.
من برای بازی مدافعان حرم تقریبا همین روش رو انجام دادم و با استفاده از json و اطلاعاتی که واردش کرده بودم، نیروهایی که در هر مرحله باید وارد بازی میشدن رو تنظیم میکردم و زمان بندی هم براشون در نظر گرفته بودم. مثلا جیسون مرحله یک بازی مدافعان حرم
کد:
{
   "c2array" : true,
   "size" : [ 13, 9, 1 ],
   "data" : [
      [
         [ 0 ],
         [ 0 ],
         [ 0 ],
         [ 0 ],
         [ 5 ],
         [ 0 ]
      ],
      [
         [ 1 ],
         [ 1 ],
         [ 4 ],
         [ 4 ],
         [ 10 ],
         [ 1 ]
      ],
      [
         [ 2 ],
         [ 1 ],
         [ 6 ],
         [ 6 ],
         [ 10 ],
         [ 2 ]
      ],
      [
         [ 3 ],
         [ 1 ],
         [ 8 ],
         [ 5 ],
         [ 10 ],
         [ 3 ]
      ],
      [
         [ 4 ],
         [ 1 ],
         [ 4 ],
         [ 6 ],
         [ 10 ],
         [ 3 ]
      ],
      [
         [ 5 ],
         [ 1 ],
         [ 7 ],
         [ 7 ],
         [ 15 ],
         [ 1 ]
      ],
      [
         [ 6 ],
         [ 1 ],
         [ 6 ],
         [ 8 ],
         [ 15 ],
         [ 3 ]
      ],
      [
         [ 7 ],
         [ 1 ],
         [ 6 ],
         [ 5 ],
         [ 10 ],
         [ 2 ]
      ],
      [
         [ 8 ],
         [ 1 ],
         [ 3 ],
         [ 6 ],
         [ 10 ],
         [ 3 ]
      ],
      [
         [ 9 ],
         [ 1 ],
         [ 5 ],
         [ 3 ],
         [ 10 ],
         [ 1 ]
      ],
      [
         [ 10 ],
         [ 3 ],
         [ 1 ],
         [ 2 ],
         [ 10 ],
         [ 1 ]
      ],
      [
         [ 11 ],
         [ 3 ],
         [ 1 ],
         [ 1 ],
         [ 10 ],
         [ 3 ]
      ],
      [
         [ 12 ],
         [ 3 ],
         [ 2 ],
         [ 4 ],
         [ 0 ],
         [ 2 ]
      ]
   ]
}
هست که برای ویرایش هم میشه همینطوری بصورت text ویرایش کرد و من خودم با برنامه JSONedit ادیت میکردم معمولا.
البته برنامه ی JsonBuddy Application هم عالیه.
 

** الان نتونستم سورس بازی رو باز کنم، چون یه سری از پلاگین ها رو الان ندارم. اگه لازمه، بگردم و پیدا کنم؟
  پاسخ


 سپاس شده توسط: nariman ، ᔕinaᗪehghani ، Master Badfar ، gc.haji
#3
سلام ، باتوجه به اینکه من چیزی از جیسون نمیفهمم اتفاقا تو اخرین بازیم نیاز شد چنین کاری انجام بدم . من واسه اینکار همه دشمن هارو در یک اسپرایت و در فریم های متفاوت ریختم . و بعد زمان بندی که دادم گفتم مثلا رندوم بین 8 تا 10 ثانیه (مثلا) دشمن ایجاد شه . و بعد از طریق اونت on created این اکشن رو دادم که فریمش رو عوض کنه مثلا : choose(1,2,3) . این میشه همون دقیقا همون سلکتی که میخواید . و بعد یه اونت زدم on frame changed و در اکشن ویژگی های خاص هر دشمن رو بهش دادم . مثلا سرعت و ...
میتونید یه متغیر level بسازید و یه ساب اونت بدید به اون اونت که گفتم on created و بعد مثلا بگید اگه مرحله 1 بود و 2 بود و ...
استودیو بازیسازی ایروید
جدید ترین ها : شهرزاد ، دربند;1357 و ATOM
[تصویر:  ads.gif]
  پاسخ


 سپاس شده توسط: nariman ، ᔕinaᗪehghani ، Master Badfar ، gc.haji
#4
آقا مصطفی سلام و عرض ادب...
از اونجاییکه هیچ چی از جیسون نمیدونم و تا حالا اصلا باهاش کار نکردم اگر راه حل بهینه دیگه ای وجود نداشته باشه ترجیح میدم فعلا برم سراغ طراحی هوش مصنوعی بر اساس اعداد رندوم تا سر یه فرصتی که وقت داشتم بشینم مبانی جیسون رو یاد بگیرم. کلا خیلی حوصله طراحی دستی لولها رو ندارم داشتم وسوسه میشدم این یه بار عین آدم لولها رو دستی طراحی کنم اما با اومدن اسم جیسون پشیمون شدم و برمیگردم سراغ هوش مصنوعی!!!
اما ممنونم بابت راهنماییتون و اینکه تکلیفم رو مشخص کردین... ارادتمند...

محمد جان سلام و عرض ادب
روش شما خیلی روش خوبیه اما برای لی اوتهای با فریم کم خوبه.
اگر قرار باشه کلی فریم و انیمیشن انواع دشمن تو یک اسپرایت باشه و همه با هم وارد لی اوت بشن تو انیمیشنها و فریمهای زیادی که معمولا من تو بازی قرار میدم مموری یوزیج منفجر میشه.
من اولین باری که تو این انجمن وارد شدم و یه سوال در مورد هنگ کردن بازیم پرسیدم به همین علت بود. اونموقع اصلا نمیدونستم مموری یوزیج چیه و چقدرش منطقیه. اومدم و سوال کردم که بازیم چرا مشکل داره و هنگ میکنه. بعد بهم گفتین مموری یوزیجت چنده؟ رفتم و نگاه کردم و گفتم 600!!! فکر کنم خود آقا مصظفی بودن که بهم گفتن که چه خبره مگه جنگه!
دلیلشم این بود که همین روش شما رو میرفتم و تمام انیمیشنهای دشمنم رو تو یک اسپرایت قرار میدادم.
این روش شما خیلی خوبه اما مناسب کار من نیست.
اما ممنونم بابت راهنماییت.
ارادتمند...
  پاسخ


 سپاس شده توسط: ᔕinaᗪehghani ، mostafanastary ، Hossein
#5
سلام مجدد، خواهش میکنم نریمان عزیز

یادمه اولین مرتبه ای که من هم اسم جیسون رو شنیدم و نمونه هاشو دیدم، خیلی به نظر سخت و پیچیده اومد، اما بعدا دیدم که اصلا کوچکترین سختی داره و جیسون اینقدر مزایا داره که نمیشه بیان کرد!!
الان برای کار با api هایی که همه بازی ها و اپلیکیشن هایی که با سرور در ارتباط هستن، داره از جیسون استفاده میشه، در خوندن اطلاعات و نوشتن اطلاعات در لوکال، حتی چیدمان مرحله و این مدلی که شما مدنظرته.

اگه لازم میدونین، من یه ویدئو یا یه آموزش متنی برای بچه های انجمن تهیه کنم؟
  پاسخ


 سپاس شده توسط: ᔕinaᗪehghani ، nariman ، Hossein ، محمد 82 ، Master Badfar
#6
سلام نريمان جان...
من يه سورس برات آماده كردم كه ميتوني از اينجا دريافتش كني! (يخورده شايد نا مفهوم باشه هرجاش رو نفهميدي حتما بپرس!)  18


اول بگم كه:

متغير Shemarande همونطور كه از اسمش معلومه ، يه شمارنده براي تعداد دشمنايي هستكه ساخته ميشن، 
متغير pos براي ذخيره ي x آبجكت هست،
متغير frame براي ذخيره ي فريم،
و در آخر متغير Level هم براي ذخيره مرحله!

توي سورس من اومدم و از ديكشنري استفاده كردم، كلن اشيايي كه مقادير رو ذخير ميكنن مثل آرايه و ديكشنري و يا همين جيسون كار كردن باهاشون كار رو بشدت سرعتش رو بالا مي بره و آسونترم هست! مطمينم يخورده باهاشون ور بري حتما نحوه ي استفاده ازشون رو ياد ميگيري!

چون جيسون رو اينجا گفتي كه تا ديديش پشيمون شدي از ساخت مراحل ، من بجاي جيسون اومدم توي خود كانس ديكشنري رو ساختم ، اما بعد ها كه به اميد حق عليه باطل با جيسون آشنا شدي ميتوني از اكشن :
کد:
load from json
فايل جيسون مراحل رو به ديكشنري بدي!


خب برم سراغ توضيحات خود سورس :


من 3 تا كليد توي ديكشنري تعريف كردم به اسم لول 1 و لول 2 و لول 3 ؛ توي اين كليد ها هم مرحله ام رو طراحي كردم... (براي درك ديكشنري ميتوني به يكي از تاپيك هاي انجمن مراجعه كني كه توسط @Master Badfar عزيز توضيح داده شده؛ اما بطور خلاصه اگر به ديكشنري يه كليد بديم مقدارش رو بر مي گردونه)...

مثلا:
کد:
"1-2|2-3|2-3|1-3|1-1|3-1|2-2|2-1|"
خوب الان اين متن يعني در دفعه ي اول در موقثيت 1 ، آبجكتي با فريم 2 بساز و دفعه 2 ، در موقعيت 2 ،يك آبجكت با فريم 3 بساز! به همين راحتي و خوشگلي!
البته ميتوني براي هر كدوم سرعت ، قدرت و ... تعريف كني و كه ديگه با خودت 4

حالا بايد يه جوري اينا رو از هم جدا كنيم ، ميتوني با توكن ات كه خيلي مهم و اساسيه ، اونها رو از هم جدا كني بطوريكه بشه يه كاريش كرد...


خب توي كدها هم اگر نگاه كني من اومدم و يه متغير به اسم شمارنده گذاشتم كه دفعات رو ميشماره ، با توكن ات صفرمين (اولين توي جاوااسكريپت و كانس و... ) | متنش رو ميگيري كه بهت :
1-2
رو ميده! خوب حالا بايد مثل بالا اين دوتا رو هم جدا كني تا به 1و 2 برسي!
براي موقعيت هم من يه ديكشنري تعريف كردم كه از 1 تا 3 ؛ كليد درست كردم و بهش موقعيت x رو دادم (ميتوني به y يا x و y هم تبديلش كني! كه زحمتش رو بكش اگر نيازه 4 ‌) ، خوبي اينكار اينه كه از هربار وارد كردن موقعيت خلاص ميشي ، همه ي اينا رو توي يه اكسپرشن ميتوني خلاصه كني:
کد:
"Pos : " & NumbertoPosition.Get(tokenat(tokenat(SettingLevel.Get(Level),Shemarande,"|"),0,"-")) & " Frame : " & tokenat(tokenat(SettingLevel.Get(Level),Shemarande,"|"),1,"-") & " SettingLevel : " & tokenat(SettingLevel.Get(Level),Shemarande,"|") & " Level : " & Level

خوب اگر اين اكسپرشن رو فهميده باشي كار حله!

البته يسري چيزا هم براي اينكه وقتي مرحله اي تموم شد خود بخود بره مرحله ي بعدي هم هست (البته تمام مراحل توي يه لايوت!) خسته نباشي! تا اينجا كار تمومه!  18
خوب اميدوارم اصلا منظورت رو درست متوجه شده باشم و چيزي رو جا ننداخته باشم!  2217
امــــــــــــــيدوارم موفق باشي!
















 
نقل قول:
 لحظه ها را ميگذرانديم تا به خوشبختي برسيم؛ غافل از اينكه خوشبختي در آن لحظه ها بود كه گذرانديم.
  پاسخ


 سپاس شده توسط: nariman ، Hossein ، mostafanastary ، Master Badfar ، mamfan
#7
(1400/4/6، 02:26 عصر)mostafanastary نوشته است: سلام مجدد، خواهش میکنم نریمان عزیز

یادمه اولین مرتبه ای که من هم اسم جیسون رو شنیدم و نمونه هاشو دیدم، خیلی به نظر سخت و پیچیده اومد، اما بعدا دیدم که اصلا کوچکترین سختی داره و جیسون اینقدر مزایا داره که نمیشه بیان کرد!!
الان برای کار با api هایی که همه بازی ها و اپلیکیشن هایی که با سرور در ارتباط هستن، داره از جیسون استفاده میشه، در خوندن اطلاعات و نوشتن اطلاعات در لوکال، حتی چیدمان مرحله و این مدلی که شما مدنظرته.

اگه لازم میدونین، من یه ویدئو یا یه آموزش متنی برای بچه های انجمن تهیه کنم؟

آقا مصطفی من یکبار به دکتر رضایی عرض کردم که "سوء استفاده از علم ایشون برای من و بچه های انجمن واجب شرعی هست"
اغراق نکرده بودم و عین واقعیت رو عرض کردم.
من با اجازتون همین جمله رو خطاب به شما هم عرض میکنم...
فکر نمیکنم کسی تو انجمن باشه که از این موضوع استقبال نکنه. بخصوص اگر ویدئوی آموزشی باشه...


(1400/4/6، 04:20 عصر)SinaDehghani نوشته است:
سلام نريمان جان...
من يه سورس برات آماده كردم كه ميتوني از اينجا دريافتش كني! (يخورده شايد نا مفهوم باشه هرجاش رو نفهميدي حتما بپرس!)  18


اول بگم كه:

متغير Shemarande همونطور كه از اسمش معلومه ، يه شمارنده براي تعداد دشمنايي هستكه ساخته ميشن، 
متغير pos براي ذخيره ي x آبجكت هست،
متغير frame براي ذخيره ي فريم،
و در آخر متغير Level هم براي ذخيره مرحله!

توي سورس من اومدم و از ديكشنري استفاده كردم، كلن اشيايي كه مقادير رو ذخير ميكنن مثل آرايه و ديكشنري و يا همين جيسون كار كردن باهاشون كار رو بشدت سرعتش رو بالا مي بره و آسونترم هست! مطمينم يخورده باهاشون ور بري حتما نحوه ي استفاده ازشون رو ياد ميگيري!

چون جيسون رو اينجا گفتي كه تا ديديش پشيمون شدي از ساخت مراحل ، من بجاي جيسون اومدم توي خود كانس ديكشنري رو ساختم ، اما بعد ها كه به اميد حق عليه باطل با جيسون آشنا شدي ميتوني از اكشن :
کد:
load from json
فايل جيسون مراحل رو به ديكشنري بدي!


خب برم سراغ توضيحات خود سورس :


من 3 تا كليد توي ديكشنري تعريف كردم به اسم لول 1 و لول 2 و لول 3 ؛ توي اين كليد ها هم مرحله ام رو طراحي كردم... (براي درك ديكشنري ميتوني به يكي از تاپيك هاي انجمن مراجعه كني كه توسط @Master Badfar عزيز توضيح داده شده؛ اما بطور خلاصه اگر به ديكشنري يه كليد بديم مقدارش رو بر مي گردونه)...

مثلا:
کد:
"1-2|2-3|2-3|1-3|1-1|3-1|2-2|2-1|"
خوب الان اين متن يعني در دفعه ي اول در موقثيت 1 ، آبجكتي با فريم 2 بساز و دفعه 2 ، در موقعيت 2 ،يك آبجكت با فريم 3 بساز! به همين راحتي و خوشگلي!
البته ميتوني براي هر كدوم سرعت ، قدرت و ... تعريف كني و كه ديگه با خودت 4

حالا بايد يه جوري اينا رو از هم جدا كنيم ، ميتوني با توكن ات كه خيلي مهم و اساسيه ، اونها رو از هم جدا كني بطوريكه بشه يه كاريش كرد...


خب توي كدها هم اگر نگاه كني من اومدم و يه متغير به اسم شمارنده گذاشتم كه دفعات رو ميشماره ، با توكن ات صفرمين (اولين توي جاوااسكريپت و كانس و... ) | متنش رو ميگيري كه بهت :
1-2
رو ميده! خوب حالا بايد مثل بالا اين دوتا رو هم جدا كني تا به 1و 2 برسي!
براي موقعيت هم من يه ديكشنري تعريف كردم كه از 1 تا 3 ؛ كليد درست كردم و بهش موقعيت x رو دادم (ميتوني به y يا x و y هم تبديلش كني! كه زحمتش رو بكش اگر نيازه 4 ‌) ، خوبي اينكار اينه كه از هربار وارد كردن موقعيت خلاص ميشي ، همه ي اينا رو توي يه اكسپرشن ميتوني خلاصه كني:
کد:
"Pos : " & NumbertoPosition.Get(tokenat(tokenat(SettingLevel.Get(Level),Shemarande,"|"),0,"-")) & " Frame : " & tokenat(tokenat(SettingLevel.Get(Level),Shemarande,"|"),1,"-") & " SettingLevel : " & tokenat(SettingLevel.Get(Level),Shemarande,"|") & " Level : " & Level

خوب اگر اين اكسپرشن رو فهميده باشي كار حله!

البته يسري چيزا هم براي اينكه وقتي مرحله اي تموم شد خود بخود بره مرحله ي بعدي هم هست (البته تمام مراحل توي يه لايوت!) خسته نباشي! تا اينجا كار تمومه!  18
خوب اميدوارم اصلا منظورت رو درست متوجه شده باشم و چيزي رو جا ننداخته باشم!  2217
امــــــــــــــيدوارم موفق باشي!
















 


سینا جان سلام
ممنونم از لطفت.
اتفاقا دیشب داشتم آموزش دیکشنری Master Badfar رو میخوندم. ممنونم حتما تستش میکنم.
خیلی ممنونم... لطف کردی...
  پاسخ


 سپاس شده توسط: Hossein ، ᔕinaᗪehghani
#8
سلام؛
سیناجان راه حل خوبی رو ارائه دادن.
به نظرم توی چند مرحله اول تصادفی یا رندوم بودن تعداد دشمن ها و موقعیت ظهورشون و ... انتخاب بدی نباشه تا با توجه به عملکرد بازیکن توی اون چند مرحله اولیه بتونیم تصمیم بگیریم که اشل پلیر برای مبارزات بعدی در چه حده.
فرض کنیم بازی ما در کل شامل ده مرحله است. یک کاربر سه مرحله اولیه بازی رو طی کرده. مشخصاً کاربر یا میتونه گیم اور شده باشه (امتیاز صفر کسب کرده باشه) و یا صرف نظر از امتیازی که کسب کرده مرحله رو با موفقیت پشت سر گذاشته باشه.
جـدول فرضی زیر عملکرد این کاربر رو در طول این سه مرحله نمایش میده: (دقت کنین که سقف امتیازی که کاربر میتونسته کسب کنه عدد 50 بوده)
[تصویر:  k389395_.png]
در ادامه سعی میکنیم به کمک تکنیک آماری رگرسیون خطی یک پیش بینی از وضعیت امتیاز کاربر در مواجه با تعداد دشمن های مختلف داشته باشیم. البته امکان استفاده از انواع رگرسیون ها وجود داره اما به خاطر سادگی محاسبات من نوع خطی رو انتخاب کردم. اما ما دقیقاً دنبال چی هستیم؟
همونطور که گفتیم ما میخوایم با دانستن تعداد دشمن هایی که کاربر باهاشون دست و پنجه نرم میکنه (متغیر یا آرگومان X) به یک عدد حدسی از امتیاز احتمالی کاربر (متغیر Y) برسیم. در ادامه کـار، هر یک از تعداد دشمن ها و عدد امتیاز مربوط به هر مرحله رو در قالب جدول زیر پیاده سازی می کنیم:
[تصویر:  p233277_.png]
وقتشه یک معادله (تابع) بنویسیم تا به ما کمک کنه امتیاز کاربر رو در مواجهه با x تعداد دشمن حدس بزنیم. فُرم کلی این معادله (تابع) به شکل زیر هست:
کد:
f(x) = a + b(x)
برای نوشتن این معادله باید دو پارامتر a و b رو محاسبه کنیم. برای این منظور باید هر یک از مقادیر جمع کلی که برای X^2 ، Y^2 و X و Y به دست آوردیم (طبق جدول بالا) رو به شکل زیر در فرمول جایگذاری کنیم: (علامت Σ نماد سیگما هست و n هم به معنی تعداد داده هایی که داریم)
[تصویر:  c249297_.png]حالا به راحتی با جایگذاری مقادیر a و b معادله (تابع) رو تشکیل میدیم:
کد:
f(x) = -2.92 + 1.84(x)
میتونیم علاوه بر محاسبه عددی، با رسم معادله خط (تابع) به دست اومده در دستگاه مختصات به طور نسبی امتیاز احـتمـالی کاربر رو برآورد کنیم.
[تصویر:  a918656_.png]
بعد از همه این کاغذ بازی، نوبت به این میرسه که عملاً از این مدلسازی استفاده کنیم! اون چیزی که تا اینجا تحلیل کردیم تنها مربوط به 3 مرحله از مجموع ده مرحله بازی هست. با این حساب هنوز باید برای هفت مرحله باقیمونده سیاست گذاری کنیم. همونطور که میدونیم سقف امتیازی که یک کاربر قادره کسب کنه طبق فرضمون برابر با 50 هست. با توجه به اینکه میانگین امتیازات کسب شده توسط کاربر 34 هست، من یک نامعادله به شکل زیر تشکیل میدم تا بتونم محدوده نسبتاً مناسب تعداد دشمن رو برای این کاربر تشخیص بدم.
[تصویر:  d430424_.png]پس به طور کلی میشه نتیجه گرفت که بین بیست تا بیست و هشت عدد دشمن میتونه برای این کاربر مطلوب باشه. در ادامه به کمک تابع (معادله) پیش بینی امتیاز، سعی میکنم امتیاز کاربر رو با توجه به تعداد دشمن پیش روی خودش حدس بزنم. دقت کنین که ما فقط به هفت پیش بینی نیاز داریم تا بتونیم تکلیف هفت مرحله باقیمونده رو روشن کنیم.
کد:
20 =>  -2.92 + 1.84(20) = 33.88 
21 =>  -2.92 + 1.84(21) = 35.72
22 =>  -2.92 + 1.84(22) = 37.56
23 =>  -2.92 + 1.84(23) = 39.4
24 =>  -2.92 + 1.84(24) = 41.24
25 =>  -2.92 + 1.84(25) = 43.08
26 =>  -2.92 + 1.84(26) = 44.92
اگر امتیازهای حدسی حاصله نیاز بود که به ترتیب مرتب بشن میتونیم از الگوریتم های مرتب سازی (مثل مرتب سازی حبابی و ...) استفاده کنیم. در اینجا چون اعداد به دست اومده به ترتیب هستن پس نیازی به مرتب سازی نداریم.
(پ.ن: چون در اینجا با تعداد داده های زیادی سر و کار نداریم ایده بدی نیست که از روش مرتب سازی حبابی (Bubble Sort) استفاده کنیم. توضیحات دقیقش رو میتونین با یه سرچ ساده توی اینترنت مطالعه کنین اما پیاده سازی اش توی کانستراکت یه چیزی شبیه نمونه پایین میشه)
[تصویر:  a074828_.png]

در صورت تمایل میتونین سورس تابع مرتب سازی حبابی رو از اینجا دریافت کنین.
اگر بخواین که این تعداد دشمن های در نظر گرفته شده رو به صورت تصادفی بین هفت مرحله باقیمانده توزیع کنین، میتونین از الگوریتمی مثل فیشر- یتس استفاده کنین و یا صرفاً با یک حلقه و استفاده از اکسپرشن هایی مثل choose و random در کانستراکت 2، سعی کنین که به صورت تصادفی تعداد دشمن ها رو بین مراحل توزیع کنین.
توضیحات الگوریتم فیشر - یتس رو میتونین در اینجا مطالعه کنین.
جمع بندی:
اگر از امتیازهای حدسی حاصله میانگین بگیریم عدد 39 به دست خواهد اومد. این مسئله نشون میده که ما میتونیم با تعداد دشمن بین 20 تا 26 عـدد برای هر یک از هفت مرحله باقیمانده امتیاز کاربر رو به نسبت سه مرحله اولیه که به طور میانگین برابر با 34 بود احتمالاً افزایش بدیم. شکی نیست که هر چقدر تعداد مراحل دست گرمی بیشتر باشن ما میتونیم پیش بینی های به مراتب دقیق تری داشته باشیم. در ضمن ما سعی به پیش بینی وضعیتی کردیم که احتمالاً عملکرد کاربر توش بهبود پیدا خواهد کرد نه پیشگویی! با این حساب عملکرد کاربر یا میتونه دقیقاً مطبوع محاسبات ما باشه، یا ضعیف تر از انتظار ما و یا کاملاً دور از انتظار مـا و در آفساید!
موفق و مؤیـد باشین.
غایب
  پاسخ


 سپاس شده توسط: ᔕinaᗪehghani ، nariman ، mostafanastary
#9
من ازین آموزشای داخل انجمن یکی دیدم نوشته بود کار با جیسون دانلودش کردم فهمیدم اما کانستراکت زیاد بلد نیستم
  پاسخ


 سپاس شده توسط: ᔕinaᗪehghani
#10
(1400/4/6، 08:08 عصر)Master Badfar نوشته است: سلام؛
سیناجان راه حل خوبی رو ارائه دادن.
به نظرم توی چند مرحله اول تصادفی یا رندوم بودن تعداد دشمن ها و موقعیت ظهورشون و ... انتخاب بدی نباشه تا با توجه به عملکرد بازیکن توی اون چند مرحله اولیه بتونیم تصمیم بگیریم که اشل پلیر برای مبارزات بعدی در چه حده.
فرض کنیم بازی ما در کل شامل ده مرحله است. یک کاربر سه مرحله اولیه بازی رو طی کرده. مشخصاً کاربر یا میتونه گیم اور شده باشه (امتیاز صفر کسب کرده باشه) و یا صرف نظر از امتیازی که کسب کرده مرحله رو با موفقیت پشت سر گذاشته باشه.
جـدول فرضی زیر عملکرد این کاربر رو در طول این سه مرحله نمایش میده: (دقت کنین که سقف امتیازی که کاربر میتونسته کسب کنه عدد 50 بوده)
[تصویر:  k389395_.png]
در ادامه سعی میکنیم به کمک تکنیک آماری رگرسیون خطی یک پیش بینی از وضعیت امتیاز کاربر در مواجه با تعداد دشمن های مختلف داشته باشیم. البته امکان استفاده از انواع رگرسیون ها وجود داره اما به خاطر سادگی محاسبات من نوع خطی رو انتخاب کردم. اما ما دقیقاً دنبال چی هستیم؟
همونطور که گفتیم ما میخوایم با دانستن تعداد دشمن هایی که کاربر باهاشون دست و پنجه نرم میکنه (متغیر یا آرگومان X) به یک عدد حدسی از امتیاز احتمالی کاربر (متغیر Y) برسیم. در ادامه کـار، هر یک از تعداد دشمن ها و عدد امتیاز مربوط به هر مرحله رو در قالب جدول زیر پیاده سازی می کنیم:
[تصویر:  p233277_.png]
وقتشه یک معادله (تابع) بنویسیم تا به ما کمک کنه امتیاز کاربر رو در مواجهه با x تعداد دشمن حدس بزنیم. فُرم کلی این معادله (تابع) به شکل زیر هست:
کد:
f(x) = a + b(x)
برای نوشتن این معادله باید دو پارامتر a و b رو محاسبه کنیم. برای این منظور باید هر یک از مقادیر جمع کلی که برای X^2 ، Y^2 و X و Y به دست آوردیم (طبق جدول بالا) رو به شکل زیر در فرمول جایگذاری کنیم: (علامت Σ نماد سیگما هست و n هم به معنی تعداد داده هایی که داریم)
[تصویر:  c249297_.png]حالا به راحتی با جایگذاری مقادیر a و b معادله (تابع) رو تشکیل میدیم:
کد:
f(x) = -2.92 + 1.84(x)
میتونیم علاوه بر محاسبه عددی، با رسم معادله خط (تابع) به دست اومده در دستگاه مختصات به طور نسبی امتیاز احـتمـالی کاربر رو برآورد کنیم.
[تصویر:  a918656_.png]
بعد از همه این کاغذ بازی، نوبت به این میرسه که عملاً از این مدلسازی استفاده کنیم! اون چیزی که تا اینجا تحلیل کردیم تنها مربوط به 3 مرحله از مجموع ده مرحله بازی هست. با این حساب هنوز باید برای هفت مرحله باقیمونده سیاست گذاری کنیم. همونطور که میدونیم سقف امتیازی که یک کاربر قادره کسب کنه طبق فرضمون برابر با 50 هست. با توجه به اینکه میانگین امتیازات کسب شده توسط کاربر 34 هست، من یک نامعادله به شکل زیر تشکیل میدم تا بتونم محدوده نسبتاً مناسب تعداد دشمن رو برای این کاربر تشخیص بدم.
[تصویر:  d430424_.png]پس به طور کلی میشه نتیجه گرفت که بین بیست تا بیست و هشت عدد دشمن میتونه برای این کاربر مطلوب باشه. در ادامه به کمک تابع (معادله) پیش بینی امتیاز، سعی میکنم امتیاز کاربر رو با توجه به تعداد دشمن پیش روی خودش حدس بزنم. دقت کنین که ما فقط به هفت پیش بینی نیاز داریم تا بتونیم تکلیف هفت مرحله باقیمونده رو روشن کنیم.
کد:
20 =>  -2.92 + 1.84(20) = 33.88 
21 =>  -2.92 + 1.84(21) = 35.72
22 =>  -2.92 + 1.84(22) = 37.56
23 =>  -2.92 + 1.84(23) = 39.4
24 =>  -2.92 + 1.84(24) = 41.24
25 =>  -2.92 + 1.84(25) = 43.08
26 =>  -2.92 + 1.84(26) = 44.92
اگر امتیازهای حدسی حاصله نیاز بود که به ترتیب مرتب بشن میتونیم از الگوریتم های مرتب سازی (مثل مرتب سازی حبابی و ...) استفاده کنیم. در اینجا چون اعداد به دست اومده به ترتیب هستن پس نیازی به مرتب سازی نداریم.
(پ.ن: چون در اینجا با تعداد داده های زیادی سر و کار نداریم ایده بدی نیست که از روش مرتب سازی حبابی (Bubble Sort) استفاده کنیم. توضیحات دقیقش رو میتونین با یه سرچ ساده توی اینترنت مطالعه کنین اما پیاده سازی اش توی کانستراکت یه چیزی شبیه نمونه پایین میشه)
[تصویر:  a074828_.png]

در صورت تمایل میتونین سورس تابع مرتب سازی حبابی رو از اینجا دریافت کنین.
اگر بخواین که این تعداد دشمن های در نظر گرفته شده رو به صورت تصادفی بین هفت مرحله باقیمانده توزیع کنین، میتونین از الگوریتمی مثل فیشر- یتس استفاده کنین و یا صرفاً با یک حلقه و استفاده از اکسپرشن هایی مثل choose و random در کانستراکت 2، سعی کنین که به صورت تصادفی تعداد دشمن ها رو بین مراحل توزیع کنین.
توضیحات الگوریتم فیشر - یتس رو میتونین در اینجا مطالعه کنین.
جمع بندی:
اگر از امتیازهای حدسی حاصله میانگین بگیریم عدد 39 به دست خواهد اومد. این مسئله نشون میده که ما میتونیم با تعداد دشمن بین 20 تا 26 عـدد برای هر یک از هفت مرحله باقیمانده امتیاز کاربر رو به نسبت سه مرحله اولیه که به طور میانگین برابر با 34 بود احتمالاً افزایش بدیم. شکی نیست که هر چقدر تعداد مراحل دست گرمی بیشتر باشن ما میتونیم پیش بینی های به مراتب دقیق تری داشته باشیم. در ضمن ما سعی به پیش بینی وضعیتی کردیم که احتمالاً عملکرد کاربر توش بهبود پیدا خواهد کرد نه پیشگویی! با این حساب عملکرد کاربر یا میتونه دقیقاً مطبوع محاسبات ما باشه، یا ضعیف تر از انتظار ما و یا کاملاً دور از انتظار مـا و در آفساید!
موفق و مؤیـد باشین.

یا ابالفضل... یا ابالفضل... یا ابالفضل...
خوندن نماز وحشت به من واجب شد!!!
یا ابالفضل...
خدایا من غلط کردم که گفتم حوصله یادگیری جیسون رو ندارم, برام عذاب بزرگتر نازل کردی!!!
اینارو دیگه چه جوری یادبگیرم؟؟؟
یا ابالفضل...
  پاسخ


 سپاس شده توسط: Master Badfar ، ᔕinaᗪehghani ، mamfan ، mostafanastary


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
  وینوس - خروجی آفلاین اندروید miladesign 476 263,309 1403/10/23، 02:18 عصر
آخرین ارسال: Tggi
Wink سوال در مورد تبلیغ بازی در تپسل _1515Team_ 2 1,963 1403/10/22، 08:05 عصر
آخرین ارسال: Tggi
  انتخاب رشته کامپیوتر M.Y 5 3,272 1401/4/11، 06:21 عصر
آخرین ارسال: M.Y
  خرید سورس بازی های شما Hamed85 4 2,772 1401/1/31، 11:02 صبح
آخرین ارسال: Hamed85
  فروش سورس شبه بازی ۴۱۱۴۸ امیرعلی فیروزبخش 0 1,665 1400/11/18، 09:09 عصر
آخرین ارسال: امیرعلی فیروزبخش

پرش به انجمن: