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

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

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

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

 

 

در قسمت زیر فایل های کتابخانه را فراخوانی می کنیم.

#include <iostream>

#include <stdio.h>

#include <windows.h>

#include <string>

#include <vector>

 

خط زیر تعریف متغیر ها و فراخوانی کتابخانه ها را به صورت استاندارد تبدیل می کند.

using namespace std;

 

در خط پایین یک آرایه دو بعدی برای نقشه تعریف می کنیم.

char tmp_map[18][32];

 

در قطع زیر مقدار آرایه را مقدار دهی می کنیم و نقشه اصلی برنامه را داخلش قرار میدیم.

Char map[18][32] = {

                “+#############################+”,

                “|                             |”,

                “|                             |”,

                “|## ########### ##   #########|”,

                “|   |                         |”,

                “| | |### | |          |     |”,

                “| |     | | |### |   | | |”,

                “| | #####| | |     ## |     |”,

                “| |           |### |     | |”,

                “| |##### ###         ##       |”,

                “|         ###### ####### ###|”,

                “|                             |”,

                “|# ### ####     ###   #######|”,

                “|                             |”,

                “|                             |”,

                “|                             |”,

                “|                             |”,

                “+#############################+”

                };

 

تابع زیر جهت نمایش نقشه هست و سطر ها را چاپ می کند.

Void ShowMap()

{

                for(int I = 0; I< 18; i++) {

                                printf(“%s\n”,map[i] );

                }

}

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

Void gotoxy( short x, short y )

{

   HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE) ;

   COORD position = { x, y } ;

   SetConsoleCursorPosition( hStdout, position ) ;

}

 

تابع زیر هم حهت به دست آوردن موقعیت فعلی X و Y در نقشه کاربرد دارد.

Class entity {

public:

                entity( int x, int y ){

                                this ->x = x;

                                this ->y = y;

                }

 

تابع زیر جهت انتقال در موقعیت افقی و در راستای X هست.

void move_x( int p ){

                                if( map[y][x+p] == ' ' ) x += p;

                }

 

تابع زیر جهت انتقال در موقعیت عمودی و در راستای Y هست.

 void move_y( int p ){

                                if( map[y+p][x] == ' ' ) y += p;

                }

 

تابع زیر هم جهت انجام جابجایی درنقشه طبق X وY دریافتی جابجا می شود.

Void move( int p, int q ){

                                x += p;

                                y += q;

                }

 

تابع زیر موقعیت فعلی X را بر میگرداند

 

 int get_x(){ return x; }

تابع زیر موقعیت فعلی Y را بر میگرداند

                int get_y(){ return y; }

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

                Void draw( char p ){

                                map[x][y] = p;

                                gotoxy( x, y ); printf( “%c”, p );

                }

private:

                int x;

                int y;

};

 

یک ساختار با نام Walk جهت دریافت اطلاعات تعداد میوه های خورده شده می باشد.

Struct walk {

                short walk_count;

                short x;

                short y;

                short back;

};

 

 

ساختاری جهت مشخص نمودن مکان میوه در نقشه که موقعیت میوه را نگه می دارد.

struct target {

                short x;

                short y;

};

vector<target> walk_queue;

vector<walk> BFSArray;

 

تابع زیر هم جهت جایگزین کردن و نمایش آرایه ی نقشه در محیط برنامه می باشد که با استفاده از جایزینی نقطه به نقطه این کار را انجام می دهد.

void AddArray( int x, int y, int wc , int back ){

                if( tmp_map[y][x] == ' ' || tmp_map[y][x] == '.' ){

                                tmp_map[y][x] = '#';

                                walk tmp;

                                tmp.x = x;

                                tmp.y = y;

                                tmp.walk_count = wc;

                                tmp.back = back;

                                BFSArray.push_back( tmp );

                }

}

 

تابع زیر نیز جهت پیدا کردن موقعیت فعلی کاربر در نقشه می باشد تا دشمن را به سمتش بفرستد.

Void FindPath( int sx, int sy, int x, int y ){

                memcpy( tmp_map, map, sizeof(map) );

                BFSArray.clear();

                walk tmp;

                tmp.x = sx;

                tmp.y = sy;

                tmp.walk_count = 0;

                tmp.back = -1;

                BFSArray.push_back( tmp );

                int I = 0;

                while( I< BFSArray.size() ){

                                if( BFSArray[i].x == x && BFSArray[i].y == y ){

                                                walk_queue.clear();

                                                target tmp2;

                                                while( BFSArray[i].walk_count != 0 ){

                                                                tmp2.x = BFSArray[i].x;

                                                                tmp2.y = BFSArray[i].y;

                                                                walk_queue.push_back( tmp2 );

                                                                I = BFSArray[i].back;

                                                }

                                                break;

                                }

 

خطوط زیر نیز برای جابجایی بین خانه ها می باشند که بر اساس کلید های جهت نما مقداری را داخل آرایه اضافه و یا کم می کنند.

AddArray( BFSArray[i].x+1, BFSArray[i].y, BFSArray[i].walk_count+1, I );

                                AddArray( BFSArray[i].x-1, BFSArray[i].y, BFSArray[i].walk_count+1, I );

                                AddArray( BFSArray[i].x, BFSArray[i].y+1, BFSArray[i].walk_count+1, I );

                                AddArray( BFSArray[i].x, BFSArray[i].y-1, BFSArray[i].walk_count+1, I );

                                /*

                                                AddArray( BFSArray[i].x+1, BFSArray[i].y+1, BFSArray[i].walk_count+1, I );

                                                AddArray( BFSArray[i].x-1, BFSArray[i].y+1, BFSArray[i].walk_count+1, I );

                                                AddArray( BFSArray[i].x+1, BFSArray[i].y+1, BFSArray[i].walk_count+1, I );

                                                AddArray( BFSArray[i].x+1, BFSArray[i].y-1, BFSArray[i].walk_count+1, I );

                                                AddArray( BFSArray[i].x+1, BFSArray[i].y-1, BFSArray[i].walk_count+1, I );

                                                AddArray( BFSArray[i].x-1, BFSArray[i].y-1, BFSArray[i].walk_count+1, I );

                                                AddArray( BFSArray[i].x-1, BFSArray[i].y+1, BFSArray[i].walk_count+1, I );

                                                AddArray( BFSArray[i].x-1, BFSArray[i].y-1, BFSArray[i].walk_count+1, I );

                                */

                                i++;

                }

                BFSArray.clear();

}

 

تابع اصلی برنامه که به شرح کامل آن می پردازیم.

 

int main()

{

 

متغیر زیر اجازه جابجایی بازیکن یا دشمن را می دهد.

   bool running = true;

 

دو متغیر زیر موقعیت بازیکن در ابتدا بازی رو نمایش می دهد.

     int x = 15; // hero x

                int y = 16; // hero y

 

دو متغیر برای نگهداری موقعیت قبلی

int old_x;

                int old_y;

 

دو متغیر زیر نیز برای ذخیره موقعیت دشمن می باشد.

int ex = 1;

                int ey = 1;

 

در خط زیر سه خط خروجی برای نمایش در صفحه برنامه داریم که راهنمایی برای کاربر نمایش میدهد.

                printf("Instruction:\n1. Arrow Keys to move your hero\n2. Eat the dots produced by the Eater to gain poins\n3. Don't get caught by the Eater\n\n");

 

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

                Printf(“H -> Hard\nN -> Normal\nE -> Easy\n\nInput : “);

 

متغیر متنی برای ذخیره سطح بازی تعریف می کنیم

                char diffi;

 

یک متغیر هم برای ذخیره سرعت بازی هر سطح دارای یک سرعت خاص می باشد.

                Int speedmod = 3;

 

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

                Cin >> diffi;

 

حال در دستور شرطی زیر به بررسی سطح ورودی می پردازد و بر اساس سطح مقداری برای متغیر سرعت می دهد.

در صورتی که N وارد شده باشد حالت بازی Normal در نظر گرفته می شود و سرعت بازی برابر با 2 می شود.

در صورتی که H وارد شده باشد حالت بازی Normal در نظر گرفته می شود و سرعت بازی برابر با 1 می شود.

در صورتی هم که هیچ کدام از مقدار های بالا نباشد از دستور شرطی می گذرد و سرعت بازی برابر 3 برای سطح Easy در نظر گرفته می شود.

If( diffi == ‘N’ ){

                                speedmod = 2;

                }else if( diffi == ‘H’ ){

                                speedmod = 1;

                }

 

در خط زیر نیز صفحه نمایش پاک می شود.

                system("cls");

 

در خط زیر تابع نمایش نقشه فراخوانی می شود و نقشه بازی نمایش داده می شود.

   ShowMap();

 

در خط زیر به موقعیت X و Y مشخص شده برای بازیکن می رود و حرف H را به عنوان نماید کاربر چاپ می کند منظور از H کلمه Human می باشد.

                Gotoxy( x, y ); cout <<“H”;

 

یک متغیر از نوع عدد صحیح تعریف می شود و مقدار آن برابر 0 می شود.

                Int frame = 0;

 

در خط زیر یک متغیر تعریف می شد تا امتیاز دریافتی توسط کاربر در آن ذخیره شود.

Int pts=0;

 

تابع FindPath که عملکرد پیدا کردن کاربر توسط دشمن را انجام میداد فراخوانی می شود و موقعیت کاربر و دشمن به آن داده می شود.

                FindPath( ex,ey,x,y );

 

در خط زیر یک حلقه بی تهایت اجرا می شود و در صورتی از کار می افتد که متغیر Running برابر False شود.

                while( running ){

 

به مختصات کاربر که همان X و Y کاربر می شود می رود و یک جای خالی چاپ می کند.

                                Gotoxy( x, y ); cout <<““;

 

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

Old_x = x;

                                old_y = y;

 

در دستور شرطی زیر به بررسی فشرده شدن کلید جهت نمای بالا می پردازد در صورتی که برابر با True باشد به مقدار Y یکی اضافه می کند

if ( GetAsyncKeyState( VK_UP ) ){

                                                if( map[y-1][x] == '.' ){ y--; pts++; } else

                                                if( map[y-1][x] == ' ' ) y--;

                                }

 

در دستور شرطی زیر به بررسی فشرده شدن کلید جهت نمای پایین می پردازد در صورتی که برابر با True باشداز مقدار Y یکی کم می کند

if ( GetAsyncKeyState( VK_DOWN ) ){

                                                if( map[y+1][x] == '.' ){ y++; pts++; } else

                                                if( map[y+1][x] == ' ' ) y++;

                                }

 

در دستور شرطی زیر به بررسی فشرده شدن کلید جهت نمای چپ می پردازد در صورتی که برابر با True باشد به مقدار X یکی اضافه می کند

if ( GetAsyncKeyState( VK_LEFT ) ){

                                                if( map[y][x-1] == '.' ){ x--; pts++; } else

                                                if( map[y][x-1] == ' ' ) x--;

                                }

 

در دستور شرطی زیر به بررسی فشرده شدن کلید جهت نمای راست می پردازد در صورتی که برابر با True باشد از مقدار X یکی کم می کند

if ( GetAsyncKeyState( VK_RIGHT ) ){

                                                if( map[y][x+1] == ‘.’ ){ x++; pts++; } else

                                                if( map[y][x+1] == ‘‘ ) x++;

                                }

 

در شرط زیر هم به بررسی برابر بودن مقدار X و Y جدید با مقادیر قدیمی می پردازد و در صورتی که برابر نباشند دشمن را به خانه قبلی کاربر هدایت می کند.

If( old_x != x || old_y != y ){

                                                FindPath( ex,ey,x,y );

                                }

 

کاربر را به خانه جدید منتقل می کند.

                                Gotoxy( x,y ); cout <<“H”;

 

در جایی که دشمن قرار دارد یک نقطه می گذارد که خوردن آن برای کاربر امتیاز دارد.

map[ey][ex] = '.';

                                gotoxy( ex, ey ); cout << ".";

 

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

if( frame%speedmod == 0 && walk_queue.size() != 0 ){

                                                ex = walk_queue.back().x;

                                                ey = walk_queue.back().y;

                                                walk_queue.pop_back();

 

}

 

در نقطه ای که دشمن قرار دارد یک حرف E به نماد Enemy قرار می دهد.

Gotoxy( ex, ey ); cout <<“E”;

 

در شرط زیر هم بررسی می کند که آیا موقعیت دشمن برابر با موقعیت کاربر هست یا نه؟در صورتی که برابر باشد از دستور حلقه خارج می شود.

If( ex == x && ey == y ){

                                                break;

                                }

 

 

در خطوط زیر نیز به موقعیت 32و18 در صفحه نمایش رفته و امتیاز کاربر را که تعداد دانه های خورده شده است قار می دهد.

 

     Gotoxy( 32, 18 );

                                gotoxy( 32, 1 ); cout << pts;

                                Sleep( 100 );

                                frame++;

                }

 

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

                system("cls");

 

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

 printf("You Lose and your score is : %i", pts );

                cin.get();

                cin.get();

                cin.get();

                cin.get();

                cin.get();

                cin.get();

                cin.get();

                cin.get();

                return 0;

}

 

به این مطلب امتیاز دهید post

راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.

بزرگترین پک آموزشی طراحی وب و تمام زبان های برنامه نویسی
دانلود با لینک مستقیم

دسته بندی موضوعات

آخرین محصولات فروشگاه

مشاهده همه

نظرات

  1. سلام
    این با ی سری تغییرات جزعی توی c هم کار میکنه؟ یا اگر کدشو توی سی دارید مبشه بفرستید برام؟ ممنون

    • صابر بوستانی
      26 دی 1398

      سلام.بله

بازخوردهای خود را برای ما ارسال کنید

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