کامپیوتر دونی
مخصوص بچه های پیام نور لواسون(کامپیوتری آ)
 
سه شنبه 19 تير 1391برچسب:, :: 23:58 ::  نويسنده : مافی

 اول از همه  ما به یک آرایه احتیاج داریم ( البته اون رو مقدار دهی اولیه کردم. محل اولیه مار. که لازم هم نبود. چون تو یه تابع مقداردهی میشه.)

int snake[500][2]={{6,2},{5,2},{4,2},{3,2},{2,2}}; // 0 for x 1 for y

 و اینکه بدونیم زمین بازی چقدریه. یعنی چند در چنده؟

#define W 25

#define H 25

همچنین باید هر بار که بازی شروع میشه و هربار که مار غذا رو میخوره مختصات غذای بعدی رو داشته باشیم. (نمیدونم چرا اسم این غذا سیب هست؟ پس اگه توی برنامه به کلمه apple برخوردید زیاد تعجب نکنید!)

int appx,appy; // apple position

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

یه متغییر هم داریم برای کنترل سرعت مار (SPEED).

کل متغییرهایی که قبل از تعریف توابع لازمه اینا هستن:

#include

#include

#include

#include

 

#define W 25

#define H 25

 

int snake[500][2]={{6,2},{5,2},{4,2},{3,2},{2,2}}; // 0 for x 1 for y

int snlen=5;

int x=6,y=2;

int dir=1; // right=1 up=2 left=3 down=4

int appx,appy; // apple position

int eata;

int SPEED=70;

اولین تابعی که معرفی می کنم تابع printwall() هست که از اسمش معلومه که دیواره های کنار صفحه رو رسم می کنه:

void printwall()

{

 int i,j;

 textcolor(1);

 for (i=1 ; i<=W+1 ; i++)

 for (j=1 ; j<=H+1 ; j++)

 {

 if ((i==1 || i==W+1) || (j==1 || j==H+1))

 {

 gotoxy(i,j);

 cprintf("*");

 }

 }

}

 

تابع بعدی تابعیه که مار رو رسم می کنه:

void printsnake()

{ 

 int i;

 textcolor(11);

 for (i=1 ; i< snlen ; i++ )

 {

 gotoxy(snake[i][0],snake[i][1]);                                                                               

 cprintf("X");

 }

 textcolor(12);

 gotoxy(snake[0][0],snake[0][1]);

 cprintf("O");

}

تابع بعدی تابعیه که سیب (غذا) رو در محلی به صورت رندوم قرار میده. ولی دقت داشته باشید که این محل رندوم روی بدن مار نباشه، که توی تابع این موضوع هم بررسی میشه:

void insertapple()

{

 int ax,ay,t,i;

 do{

 ax=random(W-2)+2;

 ay=random(H-2)+2;

 t=0;

 for (i=0 ; i

 if (ax==snake[i][0] && ay==snake[i][1])

 {

 t=1;

 break;

 }

 } while (t);

 appx=ax;

 appy=ay;

 gotoxy(ax,ay);

 textcolor(11);

 cprintf("0");

}

خوب حالا احتیاج به یه تابع داریم تا هر دفعه که فراخوانی میشه بازی جدیدی شروع بشه. یعنی تنظیمات اولیه بازی برگرده:

void newgame()

{

 clrscr();

 snake[0][0]=6; snake[0][1]=2;

 snake[1][0]=5; snake[1][1]=2;

 snake[2][0]=4; snake[2][1]=2;

 snake[3][0]=3; snake[3][1]=2;

 snake[4][0]=2; snake[4][1]=2;

 x=6;y=2;

 snlen=5;

 dir=1;

 printwall();

 insertapple();

 printsnake();

}

یکی از مهمترین موضوعاتی که توی بازی اسنیک وجود داره اینه که با حرکت مار به جلو تمام مختصاتهای قبلی مار باید به جلو حرکت داده شوند یا به عبارت دیگه باید شیفت داده شوند:

void shiftsnake()

{

 int i;

 for (i=snlen-2 ; i>=0 ; i--)

 {

 snake[i+1][0]=snake[i][0];

 snake[i+1][1]=snake[i][1];

 }

 snake[0][0]=x;

 snake[0][1]=y;

}

تابع زیر مشخص میکنه که مار به سیب رسیده و اون رو خورده یا نه:

int eatapple()

{

 if (x==appx && y==appy)

 {

 if (snlen<499) snlen++;

 return 1;

 }

 return 0;

}

تابع زیر هم مشخص میکنه که مار با خودش برخورد کرده یا نه:

int catchitself()

{

 int i;

 for (i=1 ; i

 if (x==snake[i][0] && y==snake[i][1])

 return 1;

 return 0;

}

این هم بزگترین تابع بازی که کل بازی توی اون جریان داره.

درمورد اینکه مار به کدوم طرف حرکت میکنه باید یه متغییر تعریف کرد و هر دفعه بررسی کرد که کدوم جهت رو نشون میده و بسته به اون جهت مختصات سر مار رو تغییر داد. در این تابع این متغییر dir هست که عددهای 1 و 2 و 3 و 4 بترتیب نشان دهنده راست، بالا، چپ و پایین هستند.

با زدن کلیدهای جهت دار صفحه کلید باید عددی که در dir ذخیره شده تغییر داد. مثلا اگه مار به سمت بالا حرکت میکنه (مقدار dir عدد 4 هست) دیگه نمیتونه به پایین برگرده (یعنی dir نمیتونه 1 بشه). و همینطور در مورد بقیه جهتها.

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

void play()

{

 delay(3000);

 char ch=1;

 int i;

 do{

  while (!kbhit()){

 switch (dir){


نظرات شما عزیزان:

نام :
آدرس ایمیل:
وب سایت/بلاگ :
متن پیام:
:) :( ;) :D
;)) :X :? :P
:* =(( :O };-
:B /:) =DD :S
-) :-(( :-| :-))
نظر خصوصی

 کد را وارد نمایید:

 

 

 

عکس شما

آپلود عکس دلخواه:





درباره وبلاگ

خوش اومدید
آخرین مطالب
آرشيو وبلاگ
پيوندها

تبادل لینک هوشمند
برای تبادل لینک  ابتدا ما را با عنوان کامپیوتر دونی و آدرس computerdooni.LXB.ir لینک نمایید سپس مشخصات لینک خود را در زیر نوشته . در صورت وجود لینک ما در سایت شما لینکتان به طور خودکار در سایت ما قرار میگیرد.





نويسندگان


ورود اعضا:

نام :
وب :
پیام :
2+2=:
(Refresh)

خبرنامه وب سایت:





آمار وب سایت:  

بازدید امروز : 21
بازدید دیروز : 0
بازدید هفته : 21
بازدید ماه : 41
بازدید کل : 3247
تعداد مطالب : 11
تعداد نظرات : 0
تعداد آنلاین : 1