PDA

View Full Version : ایجاد یک object (یا point) متحرک در c#



safa55
جمعه 27 شهریور 1394, 18:19 عصر
سلام دوستان
من می خواهم یک نقطه ای را در picbox ایجاد کنم که حرکت کنه. البته در ایجاد و حرکتش مشکلی ندارم ولی می خواهم که به صورت random حرکت کنه و پرش نداشته باشه ، یعنی یکدفه از نقطه ای به نقطه با فاصله زیاد پرش نکنه . و این که از picbox خارج نشه و از طرف دیگر آن وارد بشه. در کل منظورم این است که به صورت random (یعنی یک مسیر مستقیم رو طی نکنه)در داخل picbox چرخش کنه و پرش هم نداشته باشه.
چطور می تونم این کار را انجام دهم.
با تشکر

pbm_soy
شنبه 28 شهریور 1394, 01:48 صبح
شما که با ایجاد و حرکتش مشکلی ندارید پس میماند مسیر حرکتش و پرش نداشتن که من نفهمیدم منظورتون چی بود!
اگر نمیخواهید پرش کنه پس مسیر حرکت باید همیشه به مختصاتهای مجاور باید باشد منظورم اینه که شما برای حرکت دادن یک نقطه آن نقطه یا صفحه را پاک کردید و دوباره در مختصات جدید نمایش دادید و هرچقدر هم این نقاط نزدیک هم باشند حرکت بهتری را القا میکند البته به شرطی که با زمان تناسب داشته باشد!
حالا این نقاط نباید از هم خیلی دور انتخاب شوند در غیراینصورت پرش ایجاد میکند
مورد بعدی گفتید رندوم باشد اگر انتخاب نقاط رندومدباشد که هربار شاید نقطه در یک گوشه دیگر ظاهر شود معمولا مسیر حرکت یک‌مسیر مشخص باید باشد
درکل منظور شما از رندوم مشخص نیست
مورد بعدی خارج نشدن از کادر را هم با یک شرط میتوانید کنترل کنید که اگر مختصات جدید محاسبه شده مثلا از عرض کادر بزرگتر شود مختصات جدید را برابر یک ‌قرار دهید که از طرف دیگر کادر ظاهر شود

safa55
یک شنبه 29 شهریور 1394, 11:13 صبح
شما که با ایجاد و حرکتش مشکلی ندارید پس میماند مسیر حرکتش و پرش نداشتن که من نفهمیدم منظورتون چی بود!
اگر نمیخواهید پرش کنه پس مسیر حرکت باید همیشه به مختصاتهای مجاور باید باشد منظورم اینه که شما برای حرکت دادن یک نقطه آن نقطه یا صفحه را پاک کردید و دوباره در مختصات جدید نمایش دادید و هرچقدر هم این نقاط نزدیک هم باشند حرکت بهتری را القا میکند البته به شرطی که با زمان تناسب داشته باشد!
حالا این نقاط نباید از هم خیلی دور انتخاب شوند در غیراینصورت پرش ایجاد میکند
مورد بعدی گفتید رندوم باشد اگر انتخاب نقاط رندومدباشد که هربار شاید نقطه در یک گوشه دیگر ظاهر شود معمولا مسیر حرکت یک‌مسیر مشخص باید باشد
درکل منظور شما از رندوم مشخص نیست
مورد بعدی خارج نشدن از کادر را هم با یک شرط میتوانید کنترل کنید که اگر مختصات جدید محاسبه شده مثلا از عرض کادر بزرگتر شود مختصات جدید را برابر یک ‌قرار دهید که از طرف دیگر کادر ظاهر شود

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

aminmousavi
یک شنبه 29 شهریور 1394, 12:04 عصر
سلام دوست عزیز .
توضیحات کافی هست ، اما هدف کاری که میخوای انجام بدی مشخص نیست (به چه دقتی میخواید پروژه رو بنوبسید)
قاعدتا پروژه تون 2حالت داره :
1- از الگوریتم های مسیریابی استفاده کنید : مزیتی که داره این هست که اون شی در حال حرکت بدنبال یک گل (هدف) هست ، میخواد به یک نقطه برسه ، حالا میتونین وقتی به اون نقطه رسید ، یک نقطه جدید رو بهش بدین ، که تا بی نهایت مسیر طی کنه ، نکته مثبتی که این روش داره ، هیچوقت مسیر های تکراری نمیره . و بی هدف جایی نمیره . ساده ترین الگوریتم هارو که در بحث هوش مصنوعی کاربرد داره BFS , DFS هست ، که البته پیاده سازیشون مقداری سخته .

اما روش دوم : اینکه شئ شما هیچ هدفی نداشته باشه ، و رندم حرکت کنه (حتی اگه مسیر تکراری شه ) . برای اینکار اول از همه بهتر هست صفحه تون (picturebox) رو grid بندی کنید (چهارخونه) ، که یکسیری مسیر بوجود بیاد . برای اینکار از دستور DrawLine بصورت عمودی و افقی استفاده کنید به همراه دو حلقه کفایات میکنه (یک حلقه برای خط های عمودی و دیگیری برای افقی)
بعد با یک تقسیم ساده نسبت به grid بندی میاد خونه هایی که دارید رو محاسبه میکنید و در یک فیلد ذخیره میکنید ، حالا میتونید رندم شی تون رو روی صفحه رایت کنید (نسبت به تعداد خانه هایی که هست ، دو تا عدد رندم میگیرید یکی برای x یکی برای y مثلا میشه خونه 3,2 حالا باید نسبت به grid بندی که کردید این مقدار ساده شده رو به مختصات روی صفحه تبدیل کنید ، بطور کل یک متد برای تبدیل x,y های صوری مکان شئ شما به مختصات های picturebox نیاز دارید) .حالا برای حرکت توی یک timer شما دو حالت دارید یا x رو تغییر بدید یا y رو (وگرنه پرش حساب میشه ، مگر اینکه حرکت اوریب (کج) هم داشته باشید) . برای اینکه تصمیم بگیرید به کدام سمت برید ، میتونید یک آرایه یا یک لیست (generic )بسازید و به ازای جاهایی که میتونید برید یک مقدار درونش ذخیره کنید ، مثلا اگر در نقطه جاری بشه رفت بالا مقدار Top رو درون آرایه یا لیست ذخیره میکنم (مقدار top,bottom,left,right هم میتونه از نوع enum باشه یا string یا... بهتره اما از enum بسازید) . همانطور که گفتم باید دقت کنید اگر بشه به اون جهت رفت مقدارش رو ذخیره کنید یعنی باید ببنید اگر بخواد بره بالا از صفحه بیرون نره یا اگه بره بالا به جای قبلیش برنگرده و ... و بعدش با متد Random یک عدد از 0 تا Count آرایه یا لیست تون بگیرید ، مقداری که میده رو با یک Switch برسسی کنید که مقدار x یا y رو به چه مقداری باید تغییر بدید (حواستون باشه ، حتما مقادیر رو یک واحد تغییر بدید ,x--,x++ ,y--,y++

موفق باشید

safa55
یک شنبه 29 شهریور 1394, 13:45 عصر
سلام دوست عزیز .
توضیحات کافی هست ، اما هدف کاری که میخوای انجام بدی مشخص نیست (به چه دقتی میخواید پروژه رو بنوبسید)
قاعدتا پروژه تون 2حالت داره :
1- از الگوریتم های مسیریابی استفاده کنید : مزیتی که داره این هست که اون شی در حال حرکت بدنبال یک گل (هدف) هست ، میخواد به یک نقطه برسه ، حالا میتونین وقتی به اون نقطه رسید ، یک نقطه جدید رو بهش بدین ، که تا بی نهایت مسیر طی کنه ، نکته مثبتی که این روش داره ، هیچوقت مسیر های تکراری نمیره . و بی هدف جایی نمیره . ساده ترین الگوریتم هارو که در بحث هوش مصنوعی کاربرد داره BFS , DFS هست ، که البته پیاده سازیشون مقداری سخته .

اما روش دوم : اینکه شئ شما هیچ هدفی نداشته باشه ، و رندم حرکت کنه (حتی اگه مسیر تکراری شه ) . برای اینکار اول از همه بهتر هست صفحه تون (picturebox) رو grid بندی کنید (چهارخونه) ، که یکسیری مسیر بوجود بیاد . برای اینکار از دستور DrawLine بصورت عمودی و افقی استفاده کنید به همراه دو حلقه کفایات میکنه (یک حلقه برای خط های عمودی و دیگیری برای افقی)
بعد با یک تقسیم ساده نسبت به grid بندی میاد خونه هایی که دارید رو محاسبه میکنید و در یک فیلد ذخیره میکنید ، حالا میتونید رندم شی تون رو روی صفحه رایت کنید (نسبت به تعداد خانه هایی که هست ، دو تا عدد رندم میگیرید یکی برای x یکی برای y مثلا میشه خونه 3,2 حالا باید نسبت به grid بندی که کردید این مقدار ساده شده رو به مختصات روی صفحه تبدیل کنید ، بطور کل یک متد برای تبدیل x,y های صوری مکان شئ شما به مختصات های picturebox نیاز دارید) .حالا برای حرکت توی یک timer شما دو حالت دارید یا x رو تغییر بدید یا y رو (وگرنه پرش حساب میشه ، مگر اینکه حرکت اوریب (کج) هم داشته باشید) . برای اینکه تصمیم بگیرید به کدام سمت برید ، میتونید یک آرایه یا یک لیست (generic )بسازید و به ازای جاهایی که میتونید برید یک مقدار درونش ذخیره کنید ، مثلا اگر در نقطه جاری بشه رفت بالا مقدار Top رو درون آرایه یا لیست ذخیره میکنم (مقدار top,bottom,left,right هم میتونه از نوع enum باشه یا string یا... بهتره اما از enum بسازید) . همانطور که گفتم باید دقت کنید اگر بشه به اون جهت رفت مقدارش رو ذخیره کنید یعنی باید ببنید اگر بخواد بره بالا از صفحه بیرون نره یا اگه بره بالا به جای قبلیش برنگرده و ... و بعدش با متد Random یک عدد از 0 تا Count آرایه یا لیست تون بگیرید ، مقداری که میده رو با یک Switch برسسی کنید که مقدار x یا y رو به چه مقداری باید تغییر بدید (حواستون باشه ، حتما مقادیر رو یک واحد تغییر بدید ,x--,x++ ,y--,y++

موفق باشید

مرسی دوست عزیز
واقعیتش من روش ای که به فکرم رسید و قبل از اینکه پاسخ شما را بخونم را درست کردم و این بود که نقطه متحرک بعد اینکه به صورت random در صفحه قرار گرفت در جهت random نیز حرکت می کنه و بعد وقتی که به انتهای طرف دیگر صفحه می رسه تغییر جهت می ده که تا حدودی چیزی که می خواستم را جواب می ده.(مثلا حرکت مارپیچی نداره، که اشکال نداره ، ولی اگر بود بهتر می شد) . به هر حال بعد اینکه این کار را تمام کردم ، گفته شما نیز به فکرم رسید چون جاهایی در صفحه بوجود می آد که حرکت به آن سمت بهتر از حالتی می تونه باشه که به صورت random حرکت صورت بگیره. حالا سعی می کنم که هدف (به سمت مکانهایی که بهتر است دنبال بشه ) رو هم بتونه دنبال کنه .
باز ممنون بابت توجه تون.