# Native Code > برنامه نویسی با C > برنامه نویسی با زبان C و ++C > حرفه ای: حرکت دسته جمعی ماهیها

## sahar.13

عرض سلام خدمت تمام دوستان برنامه نویس.

من باید تو صفحه ی کنسول چندتا دایره رو که هرکدوم نماد یه ماهی هستند با شعاعها ی مختلف و متمایز از هم به طور هم زمان جابه جا کنم.به طوری که شعاع هر دایره ومختصات وسرعت اون به صورت تصادفی انتخاب بشه.حالا در این زمینه چندتا سوال اساسی برای من ایجاد شده : 

1- اصلا چطور میشه همزمان این همه دایره رو به طور همزمان اونم با این همه تفاوت که باهم دارند حرکت داد؟

2- حالا اگه این دایره ها حرکت کنند مسلما رد قبلی اونها روی صفحه میمونه برای اینکه این اتفاق نیوفته باید چی کار کنم؟

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

راستی زبان مورد نظرم شی گراست (++c ).از همکاریتونم بسیار متشکرم.

----------


## quiet_programmer

> راستي زبان مورد نظرم شي گراست (++c ).


خوب اين عاليه. ميتوني يه آبجکت از ماهي تعريف کني.

به عنوان نمونه کد زير (فقط بخاطر اينکه بتوني الگو بگيري نه اينکه همونو پياده سازي کني چون من فقط 5 دقيقه تجزيه تحليل کردم شايد يه چيزايش اضافه يا کم باشه):
class Fish
{
    private:
        struct StLocation
        {
            unsigned int Top;
            unsigned int Left;
        };
        unsigned int Radius;
        StLocation Location;
        int TopDirection;
        int LeftDirection;
        void Clear();
    public:
        Fish();
        void Draw();
        void Mov();
        void ChangeDirection();
};
Location مرکز دايره رو نگهداري ميکنه
Radius شعاع دايه رو نگهداري ميکنه
TopDirection جهت و سرعت حرکت رو به سمت بالا يا پايين نگهداري ميکنه. اگه منفي باشه يعني برو بالا و اگه مثبت باشه به سمت پايين
LeftDirection جهت و سرعت حرکت به چپ يا راست رو نگهداري ميکنه. اگه منفي باشه يعني برو به سمت چپ و اگر مثبت به سمت راست
void Clear دايره قبلي که رسم کرده بود را پاک ميکنه. براي اينکار فقط دوباره دايره رو با همون اطلاعاتي که الان داخل آبجکت هست رسم کن با رنگ زمينه. که اينطوري به نظر ميرسه دايره پاک شد
Fish به عنوان constructor اين آبجکت. توي اين رويه مقدار Location.Top به صورت random انتخاب ميشه. عددي مابين Radius تا ارتفاع صفحه نمايش.(گفتم ازRadiuse بخاطر اينکه دايره رسم شده از بالاي صفحه نمايش بيرون نزنه)
همچنين مقدار Location.Left هم مابين Radius تا طول صفحه به صورت رندوم انتخاب ميشه. Radius رو هم به صورت تصادفي انتخاب ميکني(بازش دلبخواهي ولي کوچيک انتخاب کن). TopDirection رو هم که قبلا گفتم براي چه کاري قراره استفاده کني رو هم به صورت رندم انتخاب کن.(abs(TopDirection)l هرچه قدر بزرگتر باشه سرعت هم همونقدر زياد ميشه). LeftDirection هم مثل TopDirection.

void Draw قراره با اطلاعاتي که داره رسم کنه
void Mov دايره رو حرکت ميده. اول بايد Clear رو فراخواني کنه. بعد مقدار Location.Top+=TopDirectio و Location.Left+=LeftDirection. بعد فراخواني رويه draw اينجا بايد هواست باشه دايره خواست از صفحه خارج بشه ChangeDirection رو فراخواني کني يا خوت به صورت دستي اگه ميخواد از بالا بره بيرون TopDirection رو در منفي يک ضرب کني و اگه خواست از سمت راست يا چپ خارج بشه LeftDirection رو در منفي يک ضرب کني
void ChangeDirection علامت LeftDirection و TopDirection رو به صورت رندوم در عدد منفي يک ضرب ميکنه.
ميتوني يه متد هم براي تغيير سرعت بنويسي که TopLocation و LeftDirection رو به صورت رندم مقدار دهي کنه.

بعد تو قسمت main ميتوني n تا از اون آبجکت رو ايجاد کني. بهشون دستور حرکت بدي.

----------


## sahar.13

خیلی ممنون از اینکه جواب بنده رو دادید اون هم به این خوبی و کاملی...

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

برای حل این مشکل نظری دارید؟

----------


## Felony

> برای حل این مشکل نظری دارید؟


لزومی نداره تو هر دور حلقه به یک عنصر آرایه دسترسی داشته باشید ! 
اول کار که برنامه اجرا میشه به هر ماهی یک Position به صورت Default بدید ، مثلا ماهی 1 : 0,10 ؛ ماهی 2 : 0,20 ؛ ماهی 3 : 0,30 حالا تو حلقه به مختصات هر کدوم تو هر دور حلقه مثلا 10 تا اصافه کنید ، این طوری ماهی ها هر بار مختصاتشون 10 تا اضافه میشه و همزمان حرکت میکنن   ، افتاد ؟

----------


## sahar.13

> افتاد؟


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

با تشکر...

----------


## ashkan_d13

سلام،
قبلاً یه برنامه نوشته بودم که همین حرکت همزمان رو می‌تونید توش ببینید:

----------


## Felony

بعد از اینکه از کلاستون یک آرایه ساختید ، در داخل حلقه ای که برای حرکت ماهی ها نوشتید .

----------


## quiet_programmer

با سلام




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


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




> حالا سوال من اینه که این کاری که شما گفتید رو توی همون کلاس انجام بدم یا وقتی که ازش آرایه تعریف کردم؟


در تائید فرمایش جناب *مجتبی تاجیک* باید بگم که مسلمه که باید خارج از آبجکت ماهی باشه. چون تو تعریف کلاس فقط یه ماهی تعریف کردی و این ماهی از ماهی های دیگه اطلاعاتی نداره.(انزوا)

----------


## sahar.13

اول باید بگم واقعا ممنونم از این همه کمک و لطف شما... :تشویق: 




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


اما من دانشجو ترم دو هستم  و این درسی رو که شما فرمودید نخوندم هنوز!اگه میشه جسارتا یه کم بیشتر راجع به thread توضیح بدید،اصلا چیه؟تابعه؟کارش چیه؟
با تشکر

----------


## sahar.13

در پاسخ به : ashkan_d13

سلام و ممنون...
من این کد شما رو همراه خروجیش دانلود کردم اما با خوندن و دیباگ کردن کد خیلی متوجه نشدم...اگر امکان داشت کمی بیشتر در مورد الگوریتم توضیح بدید...
با تشکر.

----------


## quiet_programmer

با سلام.




> یه کم بیشتر راجع به thread توضیح بدید،اصلا چیه؟تابعه؟کارش چیه؟


هر پروسس میتونی در زمان اجرا چندتا پروسس رو ایجاد کنه که بهش میگن نخ یا پروسس فرزند و یا ... حالا برنامه تو هم قراره 20 تا نخ ایجاد کنه که هر کدوم از این نخها در انزوا دارن اجرا میشن. یعنی هیچکدوم از نخها از حال نخهای دیگه اطلاعی نداره و فقط برنامه اصلیه که میتونه نخهای ایجاد شده رو run یا terminate کنه. هرکدوم از نخها مثل پروسس ها cpu دریافت میکنن.
حالا برای ایجاد یه نخ تو برنامه باید یه تابع تعریف کنی و اون تابع رو بدی به نخ ایجاد شده و بگی که اجراش کنه. این نحوه فراخوانی تابع با فراخوانی معمولی چنتا فرق اساسی داره که یکی از اونها اینه که برنامه بعد از فراخوانی تابع منتظر نمیونه تا تابع اجراش تموم بشه و بلافاصله دستور بعدی رو جهت اجرا واکشی میکنه. امیدوارم که متوجه شده باشی چون من خودم اصلا نفهمیدم چی نوشتم :بامزه: 

الان حالش نیست که کد نمونه بزارم ولی یه سرچ کوچولو تو رو به نتیجه میرسونه.

----------


## Felony

> با سلام
> 
> ببینید چون سرعت کامپیوتر ها بالاست به این کار به نطر میرسه که ماهی ها دارن دسته جمعی حرکت میکنن.
> ولی برای اینکه بخواین به صورت همروند ماهی ها رو حرکت بدین از thread استفاده کنید و به هر thread یه آبجکت ماهی بدین تا اونها رو حرکت بده. تو این روش هم نمیشه گفت که واقعا دارن همه باهم حرکت میکنن (پردازش شبه موازی درس سیستم عامل) ولی نسبت به روش حلقه کارایی بیشتری داره.
> 
> 
> 
> در تائید فرمایش جناب *مجتبی تاجیک* باید بگم که مسلمه که باید خارج از آبجکت ماهی باشه. چون تو تعریف کلاس فقط یه ماهی تعریف کردی و این ماهی از ماهی های دیگه اطلاعاتی نداره.(انزوا)


مشکل شما و ایشون تو درک مسئله هست ، نیازی به Thread نیست !
پست قبلی من رو با دقت بخونید ، حرکت دسته جمعی ماهی ها نیازی به Thread نداره ، کافیه تو حلقه به تمام عناصر ( ماهی ها ) مقدار بدید و مکانشون رو تغییر بدید ، برای اینکه ماهی ها روی هم نیافتن و دیده بشن هم باید به هر کدوم یه مقدار اولیه بدید ، همین !




> هر پروسس میتونی در زمان اجرا چندتا پروسس رو ایجاد کنه که بهش میگن نخ یا پروسس فرزند و یا ...


این تعریفتون هم از لحاظ فنی سر تا پا مشکل هست ، Thread ، Thread هست نه بیشتر و نه کمتر و به پروسه هم ربطی نداره !

----------


## sahar.13

دوستان تاپیک قبل مشکل داشت مجبور به حذفش شدم...

همه این کارها رو کردم اما بازهم مشکل داره ... دونه دونه رد شدن و پرش صفحه نمایش و خلاصه .... جناب تاجیک اگر امکان داره شما این ایدتون رو که بنده نتونستم پیاده کنم مقداریش رو بنویسید...ببینم مشکل کد من کجاست... کامپیوتر من ایراد پیدا کرده نه آپلود میشه کرد و نه میتونم کد رو قرار بدم وگرنه میذاشتم که ببینید و اشکالاتش رو بگید. در اولین فرصتی که این امکان برام میسر شد حتما کد رو میذارم.

----------


## quiet_programmer

با سلام.




> کافیه تو حلقه به تمام عناصر ( ماهی ها ) مقدار بدید و مکانشون رو تغییر  بدید


احتمالا منظور شما اینه:
while(true)
{
    fish[1].move();
    fish[2].move();
    fish[3].move();
}
خوب اگه تعداد ماهی ها بالا بره اونوقت چی؟
منظور من برای استفاده از حلقه این بود:
while(true)
    for (unsigned int j=0;j<N;i++)
        fish[j].move();




> حرکت دسته جمعی ماهی ها نیازی به Thread نداره


کسی نگفت نیاز به ترید داره! دقت نکردین گفتم میتونین از ترید استفاده کنید. گفتم ترید به خاطر اینکه میتونم هر کدم از Fish[i]lها رو بدم به یه ترید تا توی یه حلقه ی بینهایت اونو حرکت بده.(خواهشا این رو با دقت بخوننین تا دچار اشتباه نشین.)




> این تعریفتون هم از لحاظ فنی سر تا پا مشکل هست ، Thread ، Thread هست نه  بیشتر و نه کمتر و به پروسه هم ربطی نداره !


از تذکری که دادین ممنون.

----------

