سلام آقا میلاد
متاسفانه فرصت نکردم کدی که نوشتی رو خوب بخونم اما یه دست اساسی روی کدی که خودم نوشته بودم کشیدم. از اونجا که دیگه بعیده بتونم زیاد وقت بذارم و تو هم نزدیک ارائه پروژت هستی اینه که من تا جایی که شد برنامه رو کامل شده تحویلت میدم. البته این کار، کار درستی نیست اما چون میدونم خودت تمام تلاشت رو کردی و از طرفی من یه چند باری فرصت نکردم بهت کمک کنم اینه که اینبار این کارو انجام دادم..
در ضمن کدی که بهت میدم خیلی تابلوه که کار دانشجوی ترم اول نیست. در حقیقت من طوری نوشتم که فقط جنبه آموزشی داشته باشه و بقیه دوستان تازه وارد هم بتونن استفاده کنن. سعی کردم بیشتر قسمت هاش رو داکیومنت کنم و از متغیرهای با معنی استفاده کنم. این کار کاریه که خیلی عالیه از الان بهش عادت کنی.
فکر کنم تمام کارایی که استادتون میخواد رو انجام میده فقط یه مورد هست که انجامش دست خودت رو میبوسه و اونم ایجاد مانع های به هم پیوستس که کار چندان پیچیده ای هم نیست.
شما تمام کد رو خط به خط بخون و سعی کن بفهمی چیکار کردم و هر جا که فهمیدی رو به زبان خودت ترجمه کن و هرجا رم مشکل داشتی بپرس. البته همونطور که گفتم دیگه بعیده زیاد بتونم سر بزنم چون با اجازت یکی دو ماهی باید تمام وقت برم آشخوری اما تو باز بنویس شاید فرصت کردم. امیدوارم موفق باشی و شیرینی نمره هم فراموشت نشه. :46:
---------- Post added at 11:41 PM ---------- Previous post was at 11:39 PM ----------
[PHP]
#include<cstdlib>
#include<iostream>
using namespace std;
#include <ctime>
const unsigned int numOfRows = 15;// number of numOfRows
const unsigned int numOfColumns = 10;// number of columns
const unsigned int numOfBarriers = 6;
const unsigned int numOfFoods = 4;
const unsigned int LengthOfSnake = 4;
// نشانه های اجزا بازی
const char block = 'b';
const char food = '*';
const char empty = '-';
const char start = 'S';
const char end = 'E';
const char snakeHead = 'O';
const char snakeBody = 'M';
const char nil = ' ';
// جدول اصلی بازی
// بعلاوه دو ها برای کنترل کردن خارج شدن مار از صفحه و دسترسی صحیح به حافظه قرار داده شده اند
// بنابر این سطر و ستون اول و سطر و ستون آخر ماتریس زیر داخل بازی قرار ندارد و فقط برای کنترل
// خروج مار از صفحه در نظر گرفته شده اند
char gameTable[numOfRows + 2][numOfColumns + 2];
void play();
// ساختاری که مختصات یک نقطه از از جدول را نگهداری میکند
struct Position{
// سربارگذاری عملگر مقایسه برای مقایسه دو موقعیت
bool operator==(const Position& right)const
{
if(row == right.row && col == right.col)
return true;
else
return false;
}
int row;
int col;
}
foodsPos[numOfFoods], // مختصات نقاطی که در آن مختصات ها غذا درون جدول بازی قرار میگیرند
barriersPos[numOfBarriers], // مختصات نقاطی که در آن مختصات ها مانع در جدول قرار میگیرند
startPos,// مختصات نقطه شروع بازی
endPos,// مختصات نقطه پایان بازی
snakePos[LengthOfSnake];// مختصات اعضا بدن مار
// جهت های حرکت مار
enum MoveSide{
UP, DOWN, LEFT, RIGHT
};
// متغیری که امتیاز را نگهداری میکند
int score = 0;
// مقدار دهی اولیه به محل اعضا بدن مار
// نقطه شروع حرکت مار نقطه شروع بازیست و تمام
// اعضا بدن مار ابتدا با این نقطه مقدار دهی میشنود
void initSnake(){
for(int i = 0 ; i < LengthOfSnake ; i++)
{
snakePos[i].row = startPos.row;
snakePos[i].col = startPos.col;
}
gameTable[ snakePos[0].row ][ snakePos[0].col ] = snakeHead;
}
// حرکت مار بر اساس فرمان کاربر
void move(MoveSide side)
{
// قرار دادن مقدار خالی به جای خانه آخری که مار اشغال کرده بود
gameTable[ snakePos[LengthOfSnake-1].row ][ snakePos[LengthOfSnake-1].col ] = empty;
// حرکت تمام اعضا بدن مار به غیر از سر به سمت جلو
for( int i = LengthOfSnake - 2 ; i >= 0 ; i-- )
{
snakePos[i+1] = snakePos[i];
}
// تنظیم محل جدید سر مار با توجه به ورودی کاربر
if(side == UP){
snakePos[0].row--;
}
else if(side == DOWN){
snakePos[0].row++;
}
else if(side == LEFT){
snakePos[0].col--;
}
else if(side == RIGHT){
snakePos[0].col++;
}
// توجه
// حرکت مار از انتها به ابتدا صورت میگیرد
// در صورتی که حرکت از سر مار شروع میشد
// نیاز به استفاده از یک متغیر کمکی داشتیم
}
// انتخاب خانه هایی که موانع را نگهداری میکنند
void setBarriersPositions()
{
for( int i = 0 ; i < numOfBarriers ; i++ )
{
while(true)
{
// انتخاب سطر و ستون برای طعمه ها
barriersPos[i].row = 1 + rand() % numOfRows;
barriersPos[i].col = 1 + rand() % numOfColumns;
if( gameTable [ barriersPos[i].row ]
[ barriersPos[i].col ] != empty )
continue;
else
break;
}
gameTable[ barriersPos[i].row ][ barriersPos[i].col ] = block;
}
}
// انتخاب خانه هایی که درون آنها غذا است
void setFoods()
{
for( int i = 0 ; i < numOfFoods ; i++ )
{
while(true)
{
// انتخاب سطر و ستون برای طعمه ها
foodsPos[i].row = 1 + rand() % (numOfRows);
foodsPos[i].col = 1 + rand() % (numOfColumns);
if( gameTable[ foodsPos[i].row ][ foodsPos[i].col ] != empty )
continue;
else
break;
}
gameTable[ foodsPos[i].row ][ foodsPos[i].col ] = food;
}
}
void setWall()
{
for( int i = 0 ; i <= numOfRows+1 ; i++ )
{
gameTable[i][0] = nil;
gameTable[i][numOfColumns] = nil;
}
for( int i = 0 ; i <= numOfColumns+1 ; i++ )
{
gameTable[0][i]= nil;
gameTable[numOfRows][i] = nil;
}
}
// انتخاب خانه های شروع و پایان بازی
void setStartAndEndPoint()
{
startPos.row = numOfRows;
startPos.col = 1 + rand() % ( numOfColumns);
gameTable[ startPos.row ][ startPos.col ] = start;
endPos.row = 1;
endPos.col = 1 + rand() % ( numOfColumns);
gameTable[ endPos.row ][ endPos.col ] = end;
}
// قرار دادن تمام خانه های جدول با مقدار خالی
// به جز سطر و ستون اول و آخر که بعدا با مقدار اسپیس پر میشوند
void firstInit(){
for( int i = 1 ; i <= numOfRows ; i++ )
{
for( int j = 1 ; j <= numOfColumns ; j++ )
{
gameTable[i][j] = empty;
}
}
}
void reset()
{
firstInit();
setFoods();
setBarriersPositions();
setStartAndEndPoint();
initSnake();
}
void applyChanges()
{
// تنظیم اولیه
firstInit();
// قرار دادن نقاط ابتدا و انتها در جدول
gameTable[ startPos.row ][ startPos.col ] = start;
gameTable[ endPos.row ][ endPos.col ] = end;
// قرار دادن خانه هایی که در آنها غذا است درون جدول
for( int i = 0 ; i < numOfFoods ; i++ )
gameTable[ foodsPos[i].row ][ foodsPos[i].col ] = food;
// اعمال موانع بر روی جدول
for( int i = 0 ; i < numOfBarriers ; i++ )
gameTable[ barriersPos[i].row ][ barriersPos[i].col ] = block;
// اعمال تغییرات موقعیت بدن مار بر روی جدول بازی
for( int i = 1 ; i < LengthOfSnake ; i++ )
{
gameTable[ snakePos[i].row ][ snakePos[i].col ] = snakeBody;
}
// قرار دادن سر مار در محل صحیح بر روی جدول بازی
gameTable[ snakePos[0].row ][ snakePos[0].col ] = snakeHead;
}
// نمایش جدول و امتیازات
void show()
{
cout << "\n" << "\t";
for( int l =1 ; l <= numOfRows ; l++ )
{
for( int k = 1 ; k <= numOfColumns ; k++ )
cout<<gameTable[l][k]<<" ";
cout<<"\n" << "\t";
}
cout << "\n" << "Score:" << score << "\n";
}
// اگر برخوردی بین سر مار با موانع رخ داده باشد ترو و اگر
// برخوردی صورت نگرفته باشد جواب فالس بازگردانده میشود
bool collission(){
// اگر سر مار با مانع برخورد کرد
for( int i = 0 ; i < numOfBarriers ; i++ )
if(snakePos[0] == barriersPos[i])
return true;
// اگر سر مار از حد مجاز خارج شده
if(snakePos[0].row > numOfRows || snakePos[0].row < 1 || snakePos[0].col > numOfColumns || snakePos[0].col < 1)
return true;
// اگر سر مار با خودش برخورد کرد
for( int i = 1 ; i < LengthOfSnake ; i++ )
if(snakePos[0] == snakePos[i])
return true;
return false;
}
void setScores(){
if(collission())
score -= 30;
// اگر مار به غذا رسیده ده امتیاز اضافه کن
for( int i = 0 ; i < numOfFoods ; i++ )
if(snakePos[0] == foodsPos[i]){
// غذا توسط مار خورد شد
foodsPos[i].row = 0;
foodsPos[i].col = 0;
score +=10;
}
}
bool checkEndGame(){
// اگر سر مار به نقطه پایان رسیده پیروزی را اعلام کن
if(snakePos[0] == endPos){
cout << "\n\t" << "you win! " << "\n\n" << "reset game? (y/n)";
// پرسیدن از کاربر برای انجام دوباره بازی
char c;
cin >> c;
if(c =='y')
play();
return true;
}
else
return false;
}
void play(){
// بازی جدید
reset();
// اعمال تمام تغییرات بر روی جدول
applyChanges();
// نمایش جدول
show();
while(!checkEndGame())
{
int input;
cout << "\n" << "enter side of move ( 1:Up, 2:Down, 3:Left, 4:Right ):" ;
// تعریف آرایه ای هم اندازه با مار
Position tempSnakePos[LengthOfSnake];
// ذخیره مختصات مار تا اگر برخوردی صورت گرفت و مختصات مار تغییر کرد
// مختصات مار بعد از کم شدن امتیاز به نقطه فعلی بازگردانده شود
for(int i = 0 ; i < LengthOfSnake ; i++)
tempSnakePos[i] = snakePos[i];
cin >> input;
if (input == 0)
reset();
else if(input == 1)
move(UP);
else if(input == 2)
move(DOWN);
else if(input == 3)
move(LEFT);
else if(input == 4)
move(RIGHT);
// تنظیم امتیازات بعد از انجام حرکت
setScores();
// اگر برخورد صورت گرفته باشید همه مختصات بدن و سر مار را به حالت قبل بازگردان
if(collission())
for(int i = 0 ; i < LengthOfSnake ; i++)
snakePos[i] = tempSnakePos[i];
// اعمال تمام تغییرات بر روی جدول
applyChanges();
// پاک کردن صفحه نمایش
system("CLS");
// نمایش جدول
show();
}
}
int main()
{
// جلوگیری از تکرار نتایج تابع رندم با اجرای مجدد بازی
srand(time(0));
play();
return 0;
}
[/PHP]