آموزش برنامه نویسی به زبان ++C

این وبلاگ جهت آموزش برنامه نویسی به زبان ++C برای دانش آموزان دبیرستان فرزانگان ایجاد شده است.
سه شنبه, ۱۲ ارديبهشت ۱۳۹۱، ۰۹:۳۸ ق.ظ

آموزش حرکت در محیط گرافیکی

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

 

برای رسم انیمیشن باید یک شکل را کشید و آن را پاک کرد و همان شکل را با تغییر در مختصات دوباره رسم کرد.

این مراحل به صورت زیر می باشند:

 

مرحله ی اول رسم شکل اولیه است

مرحله ی بعدی پاک کردن شکل اولیه است.

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

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

پس از این مرحله مختصات شکل که حتما باید به صورت پارامتری بیان شود را تغییر خواهیم داد.

 

پس مراحل حرکت به صورت کلی زیر خواهد بود:

 

1- رسم شکل اولیه

2- تاخیر

3- پاک کردن شکل اولیه

4- تغییر مختصات

 

چند نکته را نباید فراموش کرد!

× دستوری برای پاک کردن شکل در محیط گرافیکی زبان ++c وجود ندارد که تنها شکل ما را پاک کند. برای همین با تغییر رنگ قلم به رنگ سیاه که همان رنگ شماره ی صفر میباشد میتوانیم روی شکل اولیه،‌همان شکل را با رنگ سیاه رسم کنیم. در واقع با تغییر رنگ قلم به رنگ پشت زمینه میتوان شکل مذکور را حذف کرد.

 

×× مراحل فوق را اگر درون یک حلقه ی while قرار دهیم شکل تا برقراری شرط حلقه حرکت خواهد کرد.

 

برای یک تمرین ساده می توان از حرکت یک شکل ساده مثل دایره به سمت راست شروع کرد:

 

سوال 1- برنامه ی زیر یک دایره را به سمت راست حرکت میدهد:


main()
{
    int x = 50, y = 400, r = 50;
    initwindow(600, 600);
    
    while(1)
    {
        setcolor(14);
        circle(x, y, r);
        delay(10);
        setcolor(0);
        circle(x, y, r);
        x++;
    }
    getch();
}

 

سوال 2- برنامه ی زیر یک دایره را به سمت راست حرکت میدهد و در انتها می ایستد:


main()
{
    int x = 50, y = 400, r = 50;
    initwindow(600, 600);
    
    while(x<550)
    {
        setcolor(14);
        circle(x, y, r);
        delay(10);
        setcolor(0);
        circle(x, y, r);
        x++;
    }
    
    setcolor(14);
    circle(x, y, r);
    
    getch();
}

 

سوال 3- برنامه ی زیر یک مستطیل را به سمت راست حرکت میدهد:


main()
{
    int x1 = 50, y1 = 400, x2 = 100, y2 = 480;
    initwindow(600, 600);
    
    while(1)
    {
        setcolor(14);
        rectangle(x1, y1, x2, y2);
        delay(10);
        setcolor(0);
        rectangle(x1, y1, x2, y2);
        x1++;      
        x2++;
    }
    getch();
}

 

سوال 4- برنامه ی زیر یک مستطیل را به سمت راست حرکت میدهد و در انتها می ایستد:


main()
{
    int x1 = 50, y1 = 400, x2 = 100, y2 = 480;
    initwindow(600, 600);
    
    while(x2<599)
    {
        setcolor(14);
        rectangle(x1, y1, x2, y2);
        delay(10);
        setcolor(0);
        rectangle(x1, y1, x2, y2);
        x1++;      
        x2++;
    }
    
    setcolor(14);
    rectangle(x1, y1, x2, y2);
    
    getch();
}

 

سوال 5- برنامه ی زیر یک دایره را دائم به سمت راست و چپ حرکت میدهد:


main()
{
    int x = 50, y = 400, r = 50, d = 1;
    initwindow(600, 600);
    
    while(1)
    {
        setcolor(14);
        circle(x, y, r);
        delay(10);
        setcolor(0);
        circle(x, y, r);
        if(x == 49 || x == 550)
            d = d * -1;
        x = x + d;
    }
    getch();
}


 دقت کنید چرا در برنامه ی بالا در شرط درون حلقه گفته شده( if(x == 49 برای دریافت جواب، برنامه را امتحان کنید و سپس مقدار درون این شرط را به 50 تغییر دهید. 


سوال 6 - برنامه ی زیر یک دایره را در مرکز صفحه بزرگ خواهد کرد: 


main()
{
    int x = 300, y = 300, r = 50;
    initwindow(600, 600);
    
    while(1)
    {
        setcolor(14);
        circle(x, y, r);
        delay(10);
        setcolor(0);
        circle(x, y, r);
        r++;
    }
    getch();
}

 

سوال 7 - برنامه ی زیر یک دایره را در مرکز صفحه بزرگ خواهد کرد و در انتها می ایستد: 


main()
{
    int x = 300, y = 300, r = 50;
    initwindow(600, 600);
    
    while(r<300)
    {
        setcolor(14);
        circle(x, y, r);
        delay(10);
        setcolor(0);
        circle(x, y, r);
        r++;
    }
    
    setcolor(14);
    circle(x, y, r);
    
    getch();
}

 

سوال 8- برنامه ی زیر یک دایره را دائم بزرگ و کوچک خواهد کرد: 

main()
{
    int x = 300, y = 300, r = 50, d = 1;
    initwindow(600, 600);
    
    while(1)
    {
        setcolor(14);
        circle(x, y, r);
        delay(10);
        setcolor(0);
        circle(x, y, r);
        if(r == 0 || r == 300)
            d = d * -1;
        r = r + d;
    }
    getch();
}

 

سوال 9- در برنامه ی زیر یک دایره دائم در صفحه به اطراف صفحه برخورد می کند: 

main()
{
    int x = 300, y = 300, r = 50, dx = 5, dy = 3;
    initwindow(600, 600);
    
    while(1)
    {
        setcolor(14);
        circle(x, y, r);
        delay(5);
        setcolor(0);
        circle(x, y, r);
        
        if(x < 49 || x > 550)
            dx = dx * -1;
            
        if(y < 49 || y > 550)
            dy = dy * -1;
             
        x = x + dx;
        y = y + dy;
    }
    getch();
}
 
و در انتها ... 

برنامه ی زیر برنامه ی ریزش برف را شبیه سازی کرده است. برنامه زیر صرفا جهت لذت برنامه نویسی است و لزومی به یادگیری آن نمی باشد: 
#include <conio.h>
#include <iostream>
#include <graphics.h>
#include <time.h>

using namespace std;

#define MAX_BARF 300
#define DELAY_MS 1

main()
{
    initwindow(640, 480);
    
    int barfx[MAX_BARF];
    int barfy[MAX_BARF];

    srand(time(NULL));

    for (int i = 0; i < MAX_BARF; i++)
    {
        barfx[i] = rand() % 640;
        barfy[i] = 0 - (rand() % 600);
    }

    while (true)
    {
        for (int i = 0; i < MAX_BARF; i++)
        {
            if (getpixel(barfx[i], barfy[i] + 1) != 0 || barfy[i] > 620)
            {
                barfx[i] = rand() % 640;
                barfy[i] = 0 - rand() % 600;
                continue;
            }
            
            putpixel(barfx[i], barfy[i], 0);
        }
        for (int i = 0; i < MAX_BARF; i++)
        {
            barfy[i]++;
            putpixel(barfx[i], barfy[i], 15);
        }
        delay(DELAY_MS);
    }
    
    getch();
}

 

 

 

 

 



نوشته شده توسط سارا نازاری
ساخت وبلاگ در بلاگ بیان، رسانه متخصصان و اهل قلم

آموزش برنامه نویسی به زبان ++C

این وبلاگ جهت آموزش برنامه نویسی به زبان ++C برای دانش آموزان دبیرستان فرزانگان ایجاد شده است.

آموزش حرکت در محیط گرافیکی

سه شنبه, ۱۲ ارديبهشت ۱۳۹۱، ۰۹:۳۸ ق.ظ

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

 

برای رسم انیمیشن باید یک شکل را کشید و آن را پاک کرد و همان شکل را با تغییر در مختصات دوباره رسم کرد.

این مراحل به صورت زیر می باشند:

 

مرحله ی اول رسم شکل اولیه است

مرحله ی بعدی پاک کردن شکل اولیه است.

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

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

پس از این مرحله مختصات شکل که حتما باید به صورت پارامتری بیان شود را تغییر خواهیم داد.

 

پس مراحل حرکت به صورت کلی زیر خواهد بود:

 

1- رسم شکل اولیه

2- تاخیر

3- پاک کردن شکل اولیه

4- تغییر مختصات

 

چند نکته را نباید فراموش کرد!

× دستوری برای پاک کردن شکل در محیط گرافیکی زبان ++c وجود ندارد که تنها شکل ما را پاک کند. برای همین با تغییر رنگ قلم به رنگ سیاه که همان رنگ شماره ی صفر میباشد میتوانیم روی شکل اولیه،‌همان شکل را با رنگ سیاه رسم کنیم. در واقع با تغییر رنگ قلم به رنگ پشت زمینه میتوان شکل مذکور را حذف کرد.

 

×× مراحل فوق را اگر درون یک حلقه ی while قرار دهیم شکل تا برقراری شرط حلقه حرکت خواهد کرد.

 

برای یک تمرین ساده می توان از حرکت یک شکل ساده مثل دایره به سمت راست شروع کرد:

 

سوال 1- برنامه ی زیر یک دایره را به سمت راست حرکت میدهد:


main()
{
    int x = 50, y = 400, r = 50;
    initwindow(600, 600);
    
    while(1)
    {
        setcolor(14);
        circle(x, y, r);
        delay(10);
        setcolor(0);
        circle(x, y, r);
        x++;
    }
    getch();
}

 

سوال 2- برنامه ی زیر یک دایره را به سمت راست حرکت میدهد و در انتها می ایستد:


main()
{
    int x = 50, y = 400, r = 50;
    initwindow(600, 600);
    
    while(x<550)
    {
        setcolor(14);
        circle(x, y, r);
        delay(10);
        setcolor(0);
        circle(x, y, r);
        x++;
    }
    
    setcolor(14);
    circle(x, y, r);
    
    getch();
}

 

سوال 3- برنامه ی زیر یک مستطیل را به سمت راست حرکت میدهد:


main()
{
    int x1 = 50, y1 = 400, x2 = 100, y2 = 480;
    initwindow(600, 600);
    
    while(1)
    {
        setcolor(14);
        rectangle(x1, y1, x2, y2);
        delay(10);
        setcolor(0);
        rectangle(x1, y1, x2, y2);
        x1++;      
        x2++;
    }
    getch();
}

 

سوال 4- برنامه ی زیر یک مستطیل را به سمت راست حرکت میدهد و در انتها می ایستد:


main()
{
    int x1 = 50, y1 = 400, x2 = 100, y2 = 480;
    initwindow(600, 600);
    
    while(x2<599)
    {
        setcolor(14);
        rectangle(x1, y1, x2, y2);
        delay(10);
        setcolor(0);
        rectangle(x1, y1, x2, y2);
        x1++;      
        x2++;
    }
    
    setcolor(14);
    rectangle(x1, y1, x2, y2);
    
    getch();
}

 

سوال 5- برنامه ی زیر یک دایره را دائم به سمت راست و چپ حرکت میدهد:


main()
{
    int x = 50, y = 400, r = 50, d = 1;
    initwindow(600, 600);
    
    while(1)
    {
        setcolor(14);
        circle(x, y, r);
        delay(10);
        setcolor(0);
        circle(x, y, r);
        if(x == 49 || x == 550)
            d = d * -1;
        x = x + d;
    }
    getch();
}


 دقت کنید چرا در برنامه ی بالا در شرط درون حلقه گفته شده( if(x == 49 برای دریافت جواب، برنامه را امتحان کنید و سپس مقدار درون این شرط را به 50 تغییر دهید. 


سوال 6 - برنامه ی زیر یک دایره را در مرکز صفحه بزرگ خواهد کرد: 


main()
{
    int x = 300, y = 300, r = 50;
    initwindow(600, 600);
    
    while(1)
    {
        setcolor(14);
        circle(x, y, r);
        delay(10);
        setcolor(0);
        circle(x, y, r);
        r++;
    }
    getch();
}

 

سوال 7 - برنامه ی زیر یک دایره را در مرکز صفحه بزرگ خواهد کرد و در انتها می ایستد: 


main()
{
    int x = 300, y = 300, r = 50;
    initwindow(600, 600);
    
    while(r<300)
    {
        setcolor(14);
        circle(x, y, r);
        delay(10);
        setcolor(0);
        circle(x, y, r);
        r++;
    }
    
    setcolor(14);
    circle(x, y, r);
    
    getch();
}

 

سوال 8- برنامه ی زیر یک دایره را دائم بزرگ و کوچک خواهد کرد: 

main()
{
    int x = 300, y = 300, r = 50, d = 1;
    initwindow(600, 600);
    
    while(1)
    {
        setcolor(14);
        circle(x, y, r);
        delay(10);
        setcolor(0);
        circle(x, y, r);
        if(r == 0 || r == 300)
            d = d * -1;
        r = r + d;
    }
    getch();
}

 

سوال 9- در برنامه ی زیر یک دایره دائم در صفحه به اطراف صفحه برخورد می کند: 

main()
{
    int x = 300, y = 300, r = 50, dx = 5, dy = 3;
    initwindow(600, 600);
    
    while(1)
    {
        setcolor(14);
        circle(x, y, r);
        delay(5);
        setcolor(0);
        circle(x, y, r);
        
        if(x < 49 || x > 550)
            dx = dx * -1;
            
        if(y < 49 || y > 550)
            dy = dy * -1;
             
        x = x + dx;
        y = y + dy;
    }
    getch();
}
 
و در انتها ... 

برنامه ی زیر برنامه ی ریزش برف را شبیه سازی کرده است. برنامه زیر صرفا جهت لذت برنامه نویسی است و لزومی به یادگیری آن نمی باشد: 
#include <conio.h>
#include <iostream>
#include <graphics.h>
#include <time.h>

using namespace std;

#define MAX_BARF 300
#define DELAY_MS 1

main()
{
    initwindow(640, 480);
    
    int barfx[MAX_BARF];
    int barfy[MAX_BARF];

    srand(time(NULL));

    for (int i = 0; i < MAX_BARF; i++)
    {
        barfx[i] = rand() % 640;
        barfy[i] = 0 - (rand() % 600);
    }

    while (true)
    {
        for (int i = 0; i < MAX_BARF; i++)
        {
            if (getpixel(barfx[i], barfy[i] + 1) != 0 || barfy[i] > 620)
            {
                barfx[i] = rand() % 640;
                barfy[i] = 0 - rand() % 600;
                continue;
            }
            
            putpixel(barfx[i], barfy[i], 0);
        }
        for (int i = 0; i < MAX_BARF; i++)
        {
            barfy[i]++;
            putpixel(barfx[i], barfy[i], 15);
        }
        delay(DELAY_MS);
    }
    
    getch();
}

 

 

 

 

 

موافقین ۰ مخالفین ۰ ۹۱/۰۲/۱۲
سارا نازاری

نظرات  (۱۸)

و در انتها رو خودت نوشتی ؟
چند سال برنامه نویسی می کنی
پاسخ:
همه ی برنامه های اینجا کد خودمه، چطور؟!
خیلی آموزش جمع و جور و خوبی بود. ممنون از حوصلتون برای مرحله به مرحله قرار دادن مطالب :)
ممنون
سلام ممنون بابت مطالب مفیدتون
ببخشید شما تکنیکی رو می شناسین که بشه با اون اشکال سه بعدی توی داس باکس رسم کرد ؟؟؟
مثلن یه کره
ممنون میشم کمکم کنید
a.qaffari72@gmail.com
ممنون. خیلی به دردم خورد
عالی
سلام ممنون وقعا بهم کمک کرد مطالبتون

میشه راهنمایی کنین  اون دستوری که دایره به اطراف صفحه میخوره رو  اگه بخوام با For  بنویسم باید چطور بنویسم ؟
سلام میشه سوالات گرافیکی رسم کمان بذارید من پایه ضعیفه اگه کتاب معرفی کنی ممنون میشم

سلام ببخشید اگ بخوام یه مسطتیلو توی صفحه حرکت بدم ینی اول به راست  بعد بایین بعدم جب تغییر مختصات باید جحوری باشه اگه میشه کمکم کنید

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

سلام موقع اجرای برنامه شما این پیغام را میزنه چکار کنم با تشکر
 graphics.h(20.52): error directive BGI graphics not supported under Windows      

سلام ممنون میشم رسم ماشینو برنامه شو بزارین

سلام، بسیار متشکرم. شاد و موفق باشی

سلام چرا من وقتی سوال اول رو مینویسم init window با همه ی کد ها خطا میاره

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

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

اگر کسی چیزی بلده بگه من واقعا نیاز دارم به این کد

 

سلام 

اگر بخوام دو تا کد رو ترکیب کنم 

مثلا اون دایره بیاد روی اون برفه و کوچیک و بزرگ بشه میتونم توی فور همون برفه جاش بدم یا باید حتما واسش یه وایل جداگونه گذاشت 

میشه نمونه کدش رو بگید

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی