PDA

View Full Version : سوال: راهنمایی پروژه snake به زبان c



mitra_one
جمعه 09 بهمن 1388, 13:59 عصر
سلام
دوستان من پروژه آماده snake رو دارم
ولی خب مشکلی که پیش اومده تو تحلیلش موندم و خیلی سخته !

با قوانین اینجا آشنا نیستم ، باید پروژه رو بزارم اینجا؟

ممنون میشم کمکم کنید

تاکید میکنم ترم یکی هستم :ناراحت:

Salar Ashgi
جمعه 09 بهمن 1388, 15:25 عصر
تا زمانیکه پروژه را خودتان ننوشته باشید ، 100 نفر هم اگر آنرا توضیح دهد ؛ برایتان قابل درک نخواهد بود !

mitra_one
جمعه 09 بهمن 1388, 15:30 عصر
تا زمانیکه پروژه را خودتان ننوشته باشید ، 100 نفر هم اگر آنرا توضیح دهد ؛ برایتان قابل درک نخواهد بود !

مرسی از راهنمایی مفیدتون

mortezamsp
جمعه 09 بهمن 1388, 16:09 عصر
حالا شما بدل نگیر ، بذار شاید تونستیم یه چیزایی ازش یاد بگیریم .

regnom
جمعه 09 بهمن 1388, 19:34 عصر
با سلام
شما کد رو بزار تا منو بچه ها بررسی کنیم

mitra_one
جمعه 09 بهمن 1388, 19:51 عصر
#include<stdlib.h>
#include<ctype.h>
#include<conio.h>
#include<stdio.h>
#include<time.h>
#include<dos.h>


#define ESC 27
#define UPARR 72
#define LEFTARR 75
#define DOWNARR 80
#define RIGHTARR 77
#define SAVE 60
#define LOAD 61


main()
{
void starting(void);
void make_xy(char **,char **);
void getrand(char *,char *,char *,char *,char *,int,char);
char getkey(char,char);
void savegame(char *,char *,int,char);
int loadgame(char *,char *,char *);
void win_message(void);


char *x,*y,pos_x,pos_y,num,out=0,old_ch=0,ch=0,new_ch,n ew_x,new_y,old_num=0;
int i,length=6;


starting();
make_xy(&x,&y);
getrand(&pos_x,&pos_y,&num,x,y,length,ch);


while(!out){
if((new_ch=getkey(old_ch,ch))==ESC)
out=2;
if(out)
break;
if(new_ch==SAVE)
savegame(x,y,length,old_ch);
else if(new_ch==LOAD){
length=loadgame(x,y,&ch);
getrand(&pos_x,&pos_y,&num,x,y,length,ch);
}
else
ch=new_ch;
new_x=x[0];
new_y=y[0];
if(ch==UPARR)
new_y=y[0]-1;
else if(ch==LEFTARR)
new_x=x[0]-1;
else if(ch==DOWNARR)
new_y=y[0]+1;
else if(ch==RIGHTARR)
new_x=x[0]+1;
old_ch=ch;
if((new_x<2)|(new_y<2)|(new_x>79)|(new_y>22))
out=1; /* HIGHEST POSSIBLE SCORE ÷ (78*21-6)*5 = 8160 ÷ 10,000 */
for(i=1;i<length-!old_num;i++) /* NOT "length": TAIL-END MAY MOVE AWAY! */
if((new_x==x[i])&(new_y==y[i])){
out=1;
break;
}
if((pos_x==new_x)&(pos_y==new_y)){
old_num+=num;
/* x=(char *)realloc(x,(score+6)*sizeof(char));
y=(char *)realloc(y,(score+6)*sizeof(char)); */
/* if((x==0)|(y==0)) */ /* PROBLEM IS NOT HERE */
/* x=x;*//* SOMEHOW realloc ISN'T COPYING PROPERLY */
getrand(&pos_x,&pos_y,&num,x,y,length,ch);
}
if(!old_num){
gotoxy(x[length-1],y[length-1]);
putchar(' ');
}
else{
length++;
if(length==1638){
win_message();
return 0;
}
gotoxy(67,25);
printf("Score = %5d",length-6);
old_num--;
x[i+1]=x[i];
y[i+1]=y[i];
}
for(i=length-1;i>0;i--){
x[i]=x[i-1];
y[i]=y[i-1];
if(i==1){
gotoxy(x[i],y[i]);
putchar('غ');
}
}
x[0]=new_x;
y[0]=new_y;
gotoxy(x[0],y[0]);
printf("\b"); /* USE THE FUNCTION _setcursortype() */
if(out)
break;
delay(99);
}
if(out==1){
gotoxy(1,24);
printf("The snake collided with the wall or with itself!\n"
"GAME OVER!!\t\t(Press 'q' to terminate...)");
gotoxy(x[0],y[0]);
while(toupper(getch())!='Q');
}
clrscr();
printf("Hope you enjoyed the game\n\n\t\tBye!\n");
return 0;
}


/*-------------------------------------------------------------------------*/


void starting()
{
char i;


clrscr(); /* FIRST TO DRAW A BOUNDARY for THE GAME */
putchar('ة');
for(i=0;i<78;i++)
putchar('ح');
putchar('»');
gotoxy(1,23);
putchar('ب');
for(i=0;i<78;i++)
putchar('ح');
putchar('¼');
window(1,2,1,23);
for(i=0;i<21;i++)
cprintf("؛");
window(80,2,80,23);
for(i=0;i<21;i++)
cprintf("؛"); /* THE BOUNDARY IS DRAWN */
window(1,1,80,25);
gotoxy(38,12);
printf("غغغغغ"); /* THE "SNAKE" IS PUT for THE FIRST TIME */
gotoxy(1,24);
printf("Welcome to the game of SNAKE!\n(Press any arrow key to start now,"
" Escape to leave at any time...)"); /* WELCOME MESSAGE */
gotoxy(43,12);
while(!kbhit());
gotoxy(30,24);
delline();delline(); /* REMOVING MESSAGE */
cprintf("\n( EAT THE NUMBER !! ) Score = 0");
gotoxy(43,12); /* GO TO THE HEAD OF THE SNAKE */
}


void make_xy(char **px,char **py)
{
char i;


*px=(char *)malloc(1638*sizeof(char)); /*EARLIER IT WAS 6, NOT 1638; BUT*/
*py=(char *)malloc(1638*sizeof(char)); /*realloc IS NOT COPYING PROPERLY*/
for(i=0;i<6;i++){
(*px)[i]=43-i;
(*py)[i]=12;
} /* THE TWO ARRAYS for COORDINATES OF THE SNAKE ARE SIMULATED */
}


void getrand(char *px,char *py,char *pn,char *x,char *y,int length,char ch)
{
int allowed=0,i; /* i AND length MUST BE int */


while(!allowed){
allowed=1;
srand((unsigned)time(0));
*px=rand()%78+2; /* GENERATING RANDOM POSITIONAL COORDINATES for */
srand((unsigned)time(0));
*py=rand()%21+2; /* PUTTING A RANDOM NUMBER */
if(ch==UPARR){
if((*px==x[0])&(*py==y[0]-1))
allowed=0;
}
else if(ch==DOWNARR){
if((*px==x[0])&(*py==y[0]+1))
allowed=0;
}
else if(ch==LEFTARR){
if((*px==x[0]-1)&(*py==y[0]))
allowed=0;
}
else if((ch==RIGHTARR)&(*px==x[0]+1)&(*py==y[0]))
allowed=0;
for(i=0;(i<length)&&allowed;i++)
if((*px==x[i])&(*py==y[i]))
allowed=0;
} /* THE RANDOM NUMBER GENERATED SHOULD NOT BE PUT ON SNAKE'S BODY */
srand((unsigned)time(0));
*pn=rand()%9+1; /* THE NUMBER */
gotoxy(*px,*py);
putchar(*pn+48);
gotoxy(x[0],y[0]);
}


char getkey(char old_ch,char ch)
{
char i;


if(kbhit())
for(i=0;i<5;i++){ /* if i too low, takes too many keystrokes */
while((ch=getch())==0);
if(ch==27){
/* out=2;
i=5;
break;*/return ch;
}
if((ch!=LOAD)&(ch!=SAVE)&(ch!=UPARR)&(ch!=DOWNARR)&
(ch!=LEFTARR)&(ch!=RIGHTARR))
continue;
if((ch!=old_ch)|(!kbhit()))
break;
}
else
for(i=0;(i<12)&(!kbhit());i++)
delay(2);
return ch;
}


void savegame(char *px,char *py,int length,char ch)
{
FILE *fp;
int i;


rename("snake.sav","snake.bak");
fp=fopen("snake.sav","wb");
fprintf(fp,"%d %c",length,ch);
for(i=0;i<length;i++)
fprintf(fp,"%c%c",px[i],py[i]);
fclose(fp);
}


int loadgame(char *px,char *py,char *pch)
{
FILE *fp;
int length,i;


fp=fopen("snake.sav","rb");
if(!fp){
clrscr();
puts("ERROR: no saved game found in current directory!!!\n\n\t\t"
"Exiting...\n");
sleep(3);
exit(1);
}
window(2,2,79,22);
clrscr();
/* fscanf(fp,"%d %c ",&length,pch);*/
fscanf(fp,"%d %c",&length,pch);
for(i=0;i<length;i++){
/* fscanf(fp,"%d %d ",&px[length],&py[length]);*/
fscanf(fp,"%c%c",&px[i],&py[i]);
gotoxy(px[i]-1,py[i]-1);
putchar('غ');
}
window(1,1,80,25);
gotoxy(30,24);
delline();delline(); /* REMOVING MESSAGE */
cprintf("\n( EAT THE NUMBER !! ) Score = %5d",length-6);
gotoxy(px[0],py[0]);
printf("\b");
fclose(fp);
return length;
}


void win_message()
{
window(1,1,80,25);
gotoxy(1,24);
delline();delline();
textcolor(14);
cprintf("YOU HAVE COMPLETED THE GAME!!\r\n"
"(Press any key to terminate...)");
clrscr();
textcolor(7);
}
//cscanf: WHEN YOU PRESS ENTER, CURSOR MOVES TO BEGINNING OF current LINE!!

Salar Ashgi
جمعه 09 بهمن 1388, 20:16 عصر
مرسی از راهنمایی مفیدتون


من حقیقت رو گفتم ، هر چند اگه شما اونو جور دیگری برداشت کرده باشید !

تا زمانی که خود فرد برنامه ای ننویسه ، برنامه نویس نخواهد شد !

فکر نمی کنم هیچ کاربری اون قدر بیکار باشه که کدی با این تعداد خط رو ، برای شما خط به خط تفسیر کنه .

شما باید هر کجاشو که متوجه نمیشین رو بپرسین نه اینکه کل کد رو ؟

اگه هم تو الگوریتمش مشکل دارین ، خوب باید تالار الگوریتم مطرح کنین !

حرف های ما رو به دل نگیرید ، ما میخوایم راه رو از چاه تمییز بدیم و بس !

موفق و پیروز باشید .

qanewaisi
جمعه 09 بهمن 1388, 20:23 عصر
سلام
دوست عزیز معلوم نیست منظور شما از تحلیل چیه؟ کمی واضح تر بگین،آیا می خواین از نظر زمانی تحلیل بشه؟(یعنی پیچیدگی زمانی این برنامه رو می خواین بدست بیارین؟)

mitra_one
جمعه 09 بهمن 1388, 23:45 عصر
سلام
دوست عزیز معلوم نیست منظور شما از تحلیل چیه؟ کمی واضح تر بگین،آیا می خواین از نظر زمانی تحلیل بشه؟(یعنی پیچیدگی زمانی این برنامه رو می خواین بدست بیارین؟)

سلام
بله

و درمورد فایلها هم سوالی داشتم !
نمی دونم فایل ctype چی هست ؟ کجای برنامه توش قرار گرفته ؟

mitra_one
جمعه 09 بهمن 1388, 23:49 عصر
من حقیقت رو گفتم ، هر چند اگه شما اونو جور دیگری برداشت کرده باشید !

تا زمانی که خود فرد برنامه ای ننویسه ، برنامه نویس نخواهد شد !

فکر نمی کنم هیچ کاربری اون قدر بیکار باشه که کدی با این تعداد خط رو ، برای شما خط به خط تفسیر کنه .

شما باید هر کجاشو که متوجه نمیشین رو بپرسین نه اینکه کل کد رو ؟

اگه هم تو الگوریتمش مشکل دارین ، خوب باید تالار الگوریتم مطرح کنین !

حرف های ما رو به دل نگیرید ، ما میخوایم راه رو از چاه تمییز بدیم و بس !

موفق و پیروز باشید .

دوست عزیز برای دانشجو ترم یکی که قبلا scanf و printf به گوشش نریسده بود ! یکم بی انصافی هس که بخواد در عرض یک هفته همچین پروژه ایی بنویسه ! :لبخندساده:

منم قصد جسارت نداشتم ؛ خواستم اگه دوستان حاضر به کمک بودن سوالاتم رو بگم !

ممنون

qanewaisi
شنبه 10 بهمن 1388, 00:01 صبح
سلام
بله

و درمورد فایلها هم سوالی داشتم !
نمی دونم فایل ctype چی هست ؟ کجای برنامه توش قرار گرفته ؟
دوست عزیز اگه درس طراحی الگوریتم رو پاس کرده باشی خودت جواب سوال اولت رو می گیری!
و اما سوال دومت،ctype یه هدره تو ++C که فکر کنم برای کار با کاراکترها از اوون استفاده می کنن.

mitra_one
شنبه 10 بهمن 1388, 00:11 صبح
دوست عزیز اگه درس طراحی الگوریتم رو پاس کرده باشی خودت جواب سوال اولت رو می گیری!

و اما سوال دومت،ctype یه هدره تو ++C که فکر کنم برای کار با کاراکترها از اوون استفاده می کنن.

من ترم یکی هستم طراحی الگوریتم پاس نکردم ! :ناراحت:

qwerty11
شنبه 10 بهمن 1388, 01:19 صبح
من ترم یکی هستم طراحی الگوریتم پاس نکردم
جناب qanewaisi (http://barnamenevis.org/forum/member.php?u=34156) ایشون منظورشون تحلیل زمانی نیست ! آخه مگه این بازی تحلیل زمانی هم داره !؟:افسرده:
به نظر من نمیتونن منظورشونو واضح بگن. منظورشون اینه که برنامه رو تحلیل کنین بگین چجوری کار میکنه !

mitra_one
شنبه 10 بهمن 1388, 09:07 صبح
ایهاالناس قرار نیست کمکی بشه ؟؟؟!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
فور فوری فوری ی ی ی ی ی ی ی ی ی ی ی ی ی ی ی ی ی ی ی ی ی ی ی ی یــــــــــــــــــــــــ ی:افسرده:

amin1softco
شنبه 10 بهمن 1388, 09:52 صبح
سلام
منطق این بازی اینجوری هست که باید تا زمانی که این مار به بزرگترین x, y صفحه برسه باید بازی ادامه پیدا کنه (حلقه اصلی) و وقتی کاربر یکی از کلید های بالا 72 و پایین 80 و چپ 75 و راست 77 فشرده بشه ( که با تابع getch() از سر فایل conio.h دریافت میشه و در قطعه کد با تابع getkey این کار صورت می گیره) مار تغییر جهت میده در غیر اینصورت در جهت قبلی حرکت می کنه مار بوسیله کارکتر 219 ( █ ) ساخته شده حالا یک کار دیگه وجود داره که باید انجام بشه تا الان میشه فرض کرد یک نقطه در صفحه حرکت می کنه حالا باید کاری کرد که وقتی به نقطه ایی که عدد وجود داره برسه یک خونه اضافه بشه و همیشه x,y قبلی را دنبال کنه که در این کد توابع getrand و make_xy این وظایف را دنبال می کنند اون دوتا تابع هم یکی برای ذخیره بازی یکی هم برای لود هست یکمی هم طرف می خواسته کد رو بپیچونه سر از کارش در نیارن همیشه مقدار صفر برابر false هست و غیر از صفر برابر 1 و می دونید که حلقه while و شرط کاملا بر عکس همدیگه عمل می کنند یک نکته دیگه این هست که کاملا معلومه این کد از پلانت سورس کد یا از منابع دیگر (http://www.indiastudychannel.com/projects/3923-Snake-Game-Using-C-language.aspx) گرفته شده من جای استاد باشم یکم اذیتت می کنم............
امید وارم مفید باشه:لبخندساده:

در ضمن سر فایل ctype.h دارای توابع زیره:

_ftolower _ftoupper isalnum isalpha isascii
iscntrl isdigit isgraph islower isprint
ispunct isspace isupper isxdigit toascii
tolower toupper

qanewaisi
شنبه 10 بهمن 1388, 11:19 صبح
جناب qanewaisi (http://barnamenevis.org/forum/member.php?u=34156) ایشون منظورشون تحلیل زمانی نیست ! آخه مگه این بازی تحلیل زمانی هم داره !؟:افسرده:
به نظر من نمیتونن منظورشونو واضح بگن. منظورشون اینه که برنامه رو تحلیل کنین بگین چجوری کار میکنه !
دوست من هر برنامه ای که از حلقه های تکرار استفاده کنه رو میشه مورد تحلیل قرار داد و پیچیدگی زمانی اوون رو حساب کرد! حالا می خواد بازی باشه یا می خواد مسئله فروشنده دوره گرد باشه!!!!! :لبخند:

mortezamsp
شنبه 10 بهمن 1388, 21:55 عصر
باسلام.

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

ولی میخواستم یه توضیحی اظافه کنم اونم در مورد حرکت ماره . مار رو با یه آرایه پیاده سازی میکنی ، و هروقت هم به طول مار اظافه شد با دستور realloc طولشو بیشتر میکنی . برای حرکت دادن مار هم ، باید مختصات از ابتدای مار بصورت موج وار برسه به انتهای مار یعنی در هر حرکت ،(مثلا) آرایه مار اینطوری بشه : [ltr_inline]aray[i] = aray[i+1] [/LTR_INLINE تا حرکت مار شبیه سازی بشه .