کمک فوری برای الگوریتم tv game

naseri

New Member
دو سوال کوچک در مورد الگوریتم tv game

این بازی شبیه بازی فوتبال است
تابعی برای حرکت توپ از وسط زمین نیاز است که جهت ان رندم است.در صورت برخورد توپ به دیواره ها با زاویه 45 درجه برمیگرددودر صورت برخورد با بازیکنان به سمت دروازه حریف شوت میشود
تابعی برای حرکت بازیکنان دو تیم که از صفحه کلید استفاده میشود.یک زوج کلید برای حرکت عمودی تیم 1و یک زوج کلید برای حرکت عمودی تیم 2 همینطور برای حرکت افقی.
1.توپ هرگز ساکن نمیشود
2.هر تیم شامل یک دروازه بان و دو بازیکن است
3. دو بازیکن هر تیم همزمان بالاو پایین و یا چپ و راست میروند.
4.هیچ بازیکنی از دیگری عبور نکرده و از محدوده زمین خارج نمی شود.
5.بازی دقیقه ای است.
6.ابعاد زمین - توپ-دروازه و بازیکنان اختیاری است




با تشکر فراوان
[email protected]
 
آخرین ویرایش:

saalek110

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

ولی منظور از الگوریتم را نمی دانم. من فقط بازی های ساده را با حلقه می ساختم .

می آمدم با زدن هر کلید y راکت را 5 تا کم و زیاد می کردم.

a5.gif


توپ هم وقتی به دیوار یا راکت ها می خورد افزایش و کاهش x و y اش وارونه می شد.


شبیه کد من اینجا هست:
http://www.devx.com/webdev/10MinuteSolution/27134/0/page/4

البته این به زبان جاوا اسکریپت است و جاوا اسکریپت هم سینتکس سی است نه سینتکس بیسیک.

کد:
function detectCollisions(){
   //just reflect the ball on a collision
   //a more robust engine could change trajectory of 
   //the ball based on where the ball hits the paddle
   if(collisionX())
      dx = dx * -1;
// dar in jaa haman varonegi sorat migirad******
   if(collisionY())
      dy = dy * -1;
//coliison be manie barkhord ast********
}
        
function collisionX(){
   //check left and right boundaries
   if(ballLeft < 4 || ballLeft > 480)
      return true;
   return false;
}
        
function collisionY(){
   //check if at top of playing area
   if(ballTop < 4)
// in jaa be ehtemale zeyad check mikonad taa toop biron naravad ********
//va hamchenin 2 khat bad yani ballTop>450*******
      return true;
   //check to see if ball collided with paddle
   if(ballTop > 450){
      if(ballLeft > paddleLeft && ballLeft < 
         paddleLeft + 64)
        return true;
   }
   return false;
}
        
function render(){
   moveBall();
   updateScore();
}
        
function moveBall(){
   ballLeft += dx;
   ballTop += dy;
   ball.style.left = ballLeft;
   ball.style.top = ballTop;
}
        
function updateScore(){
   currentScore += 5;
   score.innerHTML = 'Score: ' + currentScore;
}
        
function difficulty(){
   //as the game progresses, increase magnitude of the 
   //vertical speed
   if(currentScore % 1000 == 0){
      if(dy > 0)
         dy += 1;
      else
         dy -= 1;
   }
}
        
function gameOver(){
   //end the game by clearing the timer and modifying 
   //the score label
   clearTimeout(timer);
   score.innerHTML += "   Game Over";
   score.style.backgroundColor = 'rgb(128,0,0)';
}
 
آخرین ویرایش:

naseri

New Member
با عرض سلام و تشکر از اینکه وقتتون رو در اختیار من گذاشتید.
من هم فکر کنم همین کار را کرده ام! با این تفاوت که در یک حلقه هر بار یک دایره میکشم یک سطر و یک ستون
اضافه میکنم ودوباره یک دایره با تابع () circle با رنگ زمینه در مختصات قبلی میکشم.یک تابع (10)delay هم استفاده کرده ام یعنی مدام دایره میکشم و پاک میکنم و برای ممانعت از برخورد توپ با دیواره ها هم مانند حالت پیشنهادی شما عمل کرده ام.این میشود حرکت توپ.
و اما برای حرکت بازیکنان با استفاده از ساختار ( () while( kbhit و switch یک کلید میخوانم و مانند حرکت توپ منتهی این بار مستطیل با تابع () rectangle میکشم.
اما مشکل من در برخورد توپ با بازیکن است چون در حرکت توپ مختصات طول وعرض زمین بازی برای من مشخص است( منظورم سطر وستون ان است)و با یک شرط if ساده x y توپ را وارونه می کنم.اما در برخورد توپ با بازیکن من نمیدانم که الان بازیکن چه مختصاتی دارد و چه شرطی باید برای if توپ در نظر بگیرم؟

اما مشکل دوم در مورد زمان بازی است.من می خواهم از تابع gettime در++Cاستفاده کنم.یعنی دو بار زمان از سیستم بگیرم وقتی اختلاف انها فرضا 1دقیقه شد از بازی خارج شود اما نمیتوانم ان را پیاده سازی کنم.لطفا
مرا راهنمایی کنید.

با تشکر [email protected]
 

saalek110

Well-Known Member
سلام

راجع به مشکل اول:
همه بازیکنان باید در متغیرهایی مختصاتشان موجود باشد. مثلا player1_x و player1_y و باید مختصات توپ با این دو متغیر مقایسه شود.

مشکل دوم:
باز دو متغیر بگیر به نام time1 و time2 .تایم را بریز داخلشون مقایسه کن محتوا ها را. آنها را با هم مقایسه کن.

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

==========================
در مورد مقایسه موقعیت توپ و بازیکن چیزی شبیه این باید داشته باشیم:
کد:
 if(ball_x-player1_x < 5 && ball_y-player1_y < 5)
 {
 }

البته فکر کنم باید قدر مطلق بگیری تا این طرف و آن طرف یکی باشه.
 
آخرین ویرایش:

saalek110

Well-Known Member
من 5 شش تا سورس دانلود کردم ولی هیچ کدوم اجرا نشد تا بگذارم.

این برنامه هم از مثالهای خود توربوسی 3 است. فکر کنم به کارت بیاد.
کد:
#include <time.h>
#include <stdio.h>
#include <dos.h>
#include <conio.h>
int main(void)
{
clrscr();
   time_t t;

   t = time(NULL);
   printf("The number of seconds since January 1, 1970 is %ld",t);
   getch();
   return 0;
}

این تابع فکر کنم تعداد ثانیه های گذشته از اون تاریخ داخل برنامه را می شمارد.
شما دو تا متغیر از آن نوع که در برنامه تعریف شده بساز و محتویات دو متغیر را بعد ریختن زمان درش با تفریق مقایسه کن.
البته شاید تابع های بهتری باشه که دوستان اگر بگویند خیلی خوبه. فعلا من همین را می دانستم.
 
آخرین ویرایش:

naseri

New Member
سلام



اخه این تابع بالایی زمان رو از سال 1970میشماره!!!

اشکال gettimeاینه که فرض کنید دفعه اول که زمان رو میگیریم باشه 19:22:50

دفعه دوم که زمان رو میگیریم باشه 19:23:10

اگه من شرط را (1==if(t2.ti_min - t1.ti_min بگذارم شرط حلقه درست است در حالیکه 1دقیقه نگذشته بلکه

20 ثانیه گذشته!

اخرش از هیچ تابع زمانی نتونستم استفاده کنم مجبور شدم با یه حلقه for زمان رو ساختم!!!
 
آخرین ویرایش:

saalek110

Well-Known Member
مهم اینه که ساختید. اگر خواستید بگید من برم تلاش کنم تا تابعش را راه بندازم.


در مورد تابع اولی:
مهم نیست از کی بشمارد . در تفاضل اختلاف مهم است نه بزرگی اعداد. در پست بعدی کدش را نوشتم.

در مورد تابع دومی:
دیگه خودت فهمیدی مشکل چیه و راه حلش هم واضحه.
 
آخرین ویرایش:

naseri

New Member
جسارتا ما اخرش نفهمیدیم که شما کی offline هستید کی online؟

الان من برنامه رو ساخت یافته نوشتم در حالیکه باید شی گرا باشه لطفا بگید چند تا کلاس و objectباید تعریف
بکنم
من شرط kbhitرا در for (;;) توپ تعریف کردم حالا در کلاس حرکت بازیکن چه کنم؟
 

saalek110

Well-Known Member
من همیشه آنلاینم. داشتم زمان را درست می کردم.
ببین اول یک برنامه نوشتم که حلقه بی نهایته .
کد:
#include <time.h>
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <iostream.h>
int main(void)
{
clrscr();
 //  time_t t;

  // t = time(NULL);
 //  printf("The number of seconds since January 1, 1970 is %ld",t);
 //  getch();
 

my_lable:

cout<<"aaa";

goto my_lable;
   return 0;
}
یعنی تا کنترل بریک را نزنی در توربو سی 3 بیرون نمی آید . البته کلیدهای دیگری برای استپ ممکنه باشه.

بعد در برنامه بعدی چک زمان را داخل حلقه گذاشتم. کار می کنه.
کد:
#include <time.h>
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <iostream.h>
int main(void)
{
clrscr();
   time_t t1;
   time_t t2;
   t1 = time(NULL);
 //  printf("The number of seconds since January 1, 1970 is %ld",t);
 //  getch();
 

my_lable:
t2 = time(NULL);
if (t2-t1>4) goto my_lable2;
cout<<"t2="<<t2<<endl;

goto my_lable;


my_lable2:
   return 0;
}
البته چاپش با این خط قشنگ تره:
کد:
cout<<"t2-t1="<<t2-t1<<endl;

البته من از goto استفاده کردم چون عجله ای بود . شما while می توانید استفاده کنید. که اگر کلیدی زده شود خارج شود. معمولا در بازیها q می گیرند. kbhit به نظرم خوب نیست. چون ممکنه اتفاقی دست کسی به کیبورد بخوره. از کیبورد ورودی بگیرید و با q از حلقه خارج شوید.
اگر وقت داشتید هم ماوس را فعال کنید و کمی دکمه وار کنید. دکمه استارت و نمایش امتیاز و یکسری ثبت و اینها. البته بسته به خودتونه. آیا این را می خواهید تحویل بدهید یا برای خودتان می سازید؟
===============
اما راجع به تعداد اشیا باید به تعداد جانداران صحنه شما باشه. یک کلاس پلیر با هر هر تعداد بازیکن که دارید به همان تعداد شی می سازید.
یک کلاس ball هم شاید لازم باشه.
البته تا آنجا که من شی گرا کار کردن بلدم. با شی ساختن زیاد برنامه شما متحول نمی شود. به نظرم در بازیهایی که مثلا مدام دشمن تولید میشه و ما نابودش می کنیم. مثل رامبوی میکرو در آنجا تولید و نابودی شی به درد خور تره ولی در برنامه شما که شی ها بعد خلق همیشه هستند زیاد با نوع غیرشی گرایش فرق نمی کند. البته گفتم من زیاد تجربه ندارم.
 
آخرین ویرایش:

saalek110

Well-Known Member
راجع به حلقه های برنامه من طرح زیر را پیشنهاد می کنم:
کد:
#include <conio.h>		
#include <iostream.h>				
				
void main()						
{		
clrscr();char c ;


  menu:
  // --------- halghye 1 ---
while(!kbhit())
{
cout<<c;
}
 // ------------
// --------- halghye 2 ---
c=getch();

goto menu;
// -----------------------	
}

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

saalek110

Well-Known Member
پست قبلی حلقه خارجی اش با goto بود که زیاد جالب نیست. و از سویی در برنامه زیر برای خروج هم تدابیری اندیشیده شده.
با تشکر از mohammad_110 که این نوع حلقه را به من یاد داد.

کد:
#include <conio.h>
#include <iostream.h>

void main()
{
  clrscr();char c ;

            do {
    // ----------- shoroe ghaaleb -------------
   
 
    cout<<"ghaaleb"<<endl; 


    // ----------- entehaye ghaaleb -----------
    cout<<"----------------------new run"<<endl;
              }while((c=getch()) != 'q');

}

پس در برنامه پست قبلی می توانید به جای حلقه خارجی از حلقه این پست استفاده کنید.
که q برای خروج از هر دو حلقه است و کلیدهای دیگری را شما تعریف می کنید برای جابجا کردن بازیکنان.
برنامه زمان را هم در قسمتی جا بدهید تا مثلا بعد 2 دقیقه حلقه ها خاتمه یابد و به قسمت اعلام نتایج بازی یا آپشن های برنامه برود.
.
-----------------
برای اینکه حلقه خارجی هم با زمان و هم با q خارج بشه t2 را داخل حلقه مقدار دهی کنید و شرط برنامه بالا را چنین تغییر دهید:

کد:
while((c=getch()) != 'q'  && t2-t1<4)

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

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

naseri

New Member
سلام

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

یک تابع از یک کلاس باید به متغیر های public از کلاس دیگه دسترسی داشته باشه اما errorمیگیره

((تابع ball hit player1 از کلاس ballکه برخورد توپ به بازیکن تیم1 رو بررسی میکنه باید به مختصات player از کلاس team1دسترسی داشته باشه))

تابع رو با کلاس friendکردم نشد .دو کلاس رو friend کردم نشد .چی کار کنم؟

اگه میخواهید mail تان را بدهید اگه شد برنامه را برایتان بفرستم
 
آخرین ویرایش:

saalek110

Well-Known Member
به متغیر پابلیک همه جا میشه دسترسی داشت. ئی میل می فرستم با پیام خصوصی برنامه را بفرست.
 

naseri

New Member
استاد غوغا کردید راضی به زحمت نبودم همون تابع کوچولوی برخورد رو می فرستادید کفایت میکرد

حالا اگر اجازه میدید برم مفقود شم و برنامه رو از اول بنویسم!
 

saalek110

Well-Known Member
سلام
خیلی اوقات بهتره که برنامه را از اول بنویسیم.
البته برنامه شما خیلی منظم و تمیز کار شده بود. من کاری نکردم فقط از قطعات برنامه شما استفاده کردم.
یعنی فقط کمی ساختار کلی برنامه را تغییر دادم. چون کامپوننت های شما همه منطقی و بی خطا و سلیس بود.
البته انتظار ندارم که ساختار من را قبول کنید. شاید باز بخواهید با ساختار کلی خود کار کنید.
تفاوتی که ساختار کلی برنامه من دارد و برنامه شما دارد در این است که کارهای مهم را شما در روم ها(متدهای کلاس) انجام داده اید ولی من عادتمه کارهای مهم جلوی چشمم و در برنامه اصلی main باشه. البته دلیلی برای درستی آن ندارم. و برنامه نویسی مدرن شاید مخالف آن دارد می رود ولی چون من عادت دارم مدام برنامه را تغییر می دهم فقط قطعات کوچک را از برنامه دور می کنم. به نوعی سطح پایین کار می کنم.
یعنی کد بیشتر و قدرت تغییر و مانور بیشتر.

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

saalek110

Well-Known Member
یک چیزی الان به ذهنم رسید که شاید باعث راحتی بیشتر شود.
شما در کلاس تیم 1 آمده اید 3 بازیکن تعریف کرده اید.
پس میشه 7 تا هم تعریف کرد.
یعنی 6 بازیکن و توپ.
مزیت این کار صرفه جویی در کد نویسی است. دیگه مدام لازم نیست برای مقادیر مختصات نام شی ذکر شود. و تابع برخورد هم متدی از کلاس خواهد شد.
این طوری میشه مختصات اشیا را
private
تعریف کرد که باعث امنیت می شود.
حتی می توانید ترسیم زمین را هم داخل همین کلاس بگنجانید. یعنی همه کارها در یک کلاس انجام می شود.
البته ممکنه روشهای پیشرفته باید اینجا استفاده شود مثل انواع وراثت و
friend
و غیره.
که من بلد نیستم.
مهم اینجا کارکرد برنامه است ولی اگر فکر می کنید با این روش صرفه جویی زیادی می شود می توان به سرعت برنامه را به این شکل درآورد. فقط جابجایی قطعات لازمه و کدنویسی اصلا نمی خواهد.
 

naseri

New Member
سلام. امیدوارم دوباره نگید رفتی 10ساعت بعد اومدی!

شاید این روش باعث امنیت بشه اما فرقی با ساخت یافته نمی کنه حالا چه همه توابع توی یک کلاس باشند چه توی یک تابع main
فکر میکنم استادم بیشتر می خواسته ما رو درگیر این کلاس ها کنه تا توی همین دسترسی ها اشکالاتمون
معلوم بشه
البته شاید این اظهار نظر برای من زوده چون این اولین برنامه شیگرایی که من نوشتم ولی اصلا این نوع برنامه
نوشتن به چه دردی میخوره؟
 

saalek110

Well-Known Member
کلا شی گرایی برای راحتی و قدرت مند تر کردن کارهست. تابع برخورد نشان داد که کلاسهای برنامه ما درست ساخته نشده. پیشنهاد من برای جمع کردن همه در کلاس برای کم کردن تایپ بود وگرنه شاید منطقی نبود.
مسلما روشهای علمی برای حل این مشکلات وجود دارد.
می دانید که در کلاسها می شود تابعی ساخت که متغیری را ست کند یا اعلام کند. شاید تابع برخورد با این گونه تابع ها باید به مختصات اشیا دسترسی پیدا کند.
من دیشب داشتم به این فکر می کردم که چگونه با وراثت میشه این برنامه را حل کرد. همه چیز برام گنگ بود.
به نظر من شما فعلا این را تحویل بدهید. بعدا وقت تحقیق در سایتها برای دیدن نمونه برنامه ها و روش ها هست.
نظر خود من را اگر بخواهید متدهای کلاس هیچ فرقی با تابع های ساخته شده ما ندارند. فقط فرق کلاس اینه که متغیرهایی(یا تابع هایی) را مخفی می کند. البته این نظرم می دونم کاملا غلطه. مثل اینه که بگیم چون لگاریتم یعنی فقط چند تا توان دور بیاندازیمش.ولی مسائلی با لگاریتم حل شد که قبلا حل نمیشد.
باید دید چه استفاده هایی میشه کرد از کلاس.
-----------------------------
اما بعد مدتی فکر کردن دیدم کلاس خیلی باعث راحتی میشه.
فرض کنید بخواهید ارنج تیم را با یک دکمه مثلا دکمه آر تغییر دهید. به راحتی با افزودن یک متد به کلاس تیم می شود مختصات فعلی را به تدریج به آن شکل درآورد. یعنی در آن متد پارامتری(متغیری) مثلا به دفاعی تغییر می یابد و بعد متدهای دیگر به تدریج در طول بازی ارنج را تغییر می دهند.
یا مثلا پاس به نزدیک ترین یار: چون کلاس تیم همه مختصات بازیکن ها را دارد به سادگی با محاسباتی تارگت توپ را می تواند محاسبه کند و با زدن یک دکمه خود کامپیوتر ((پاس به نزدیک ترین یار)) را انجام می دهد. مثل بازی فیفا.
کلا وجود کلاس باعث میشه که توسعه برنامه خیلی سریع تر و قوی تر انجام بشه بدون تغییرات مخرب بر برنامه. شاید حالا اصلا فواید کلاس در برنامه شما محسوس نباشد و وجودش بیشتر مزاحم به نظر برسد تا مفید ولی با گسترش برنامه کلاس به شکل یک حامی و پایگاه درمی آید.
پایگاهی که کل اطلاعات یک شی را در خود نگه داشته(مثل اطلاعات یک تیم را ) و براحتی باافزودن متدهایی به این کلاس به تیم خود هر لحظه قدرت مانور بیشتر و هوشمندی بیشتر می دهیم.
 
آخرین ویرایش:

saalek110

Well-Known Member
من سعی کردم متغیرهای کلاس را خصوصی کنم و در تابع برخورد با متدهای کلاس به این متغیرها دسترسی پیدا کنم. ولی درون تابع شی شناخته نمیشد. گویی فقط داخل برنامه اصلی شی شناخته شده است.
برنامه ساخته شده را برای شما می فرستم.
 

saalek110

Well-Known Member
من سعی کردم متغیرهای کلاس را خصوصی کنم و در تابع برخورد با متدهای کلاس به این متغیرها دسترسی پیدا کنم. ولی درون تابع شی شناخته نمیشد. گویی فقط داخل برنامه اصلی شی شناخته شده است.
فکر کنم اگر شی را عمومی تعریف کنیم حل بشه. . یعنی بیرون main تعریف کرد تا در همه توابع قابل دسترس باشد.
البته فعلا امتحان نکردم.
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا