بازی بولینگ و چالش های برنامه نویسی

بازی بولینگ و نحوه امتیاز دهی در این بازی میتواند برای یک برنامه نویس بسیار جالب باشد چراکه برای تبدیل قوانین بازی به کد تقریبا اکثر پارادایم های برنامه نویسی را لازم خواهید داشت.بولینگ همان بازی پرتاب یک توپ گرد از مسیری باریک به سمت ۱۰ پین کاشته شده است که هدف انداختن بیشترین پین در هر پرتاب است. این بازی در ۱۰ فریم انجام میشود. به طوری که در ابتدای هر فریم هر ۱۰ توپ کاشته میشود و در هر فریم به بازی کننده اجازه داده میشود تا ۲ بار توپ را به سمت پین ها پرتاب کند.اگر در همان پرتاب اول همه ی پین ها انداخته شود به این حالت ( strike ) گفته میشود و این فریم در همینجا تمام میشود ولی اگر این اتفاق نیفتاد و در پرتاب دوم موفق به انداختن همه پین ها شدیم به این حالت ( spare ) گفته میشود.بعد از پرتاب دوم حتی اگر همه ی پین ها نیفتاده باشد، فریم بسته میشود و به فریم بعدی خواهیم رفت.فریمی که درآن استرایک ( افتادن همه پین ها در پرتاب اول ) اتفاق افتاده به این صورت محاسبه میشود:تعداد پین های انداخته شده این فریم (که ۱۰ تا است) به اضافه ی تعداد پین های انداخته شده در دو پرتاب بعدی به اضافه ی امتیاز فریم قبلی خواهد بود.در صورتیکه در قاب یا فریم دهم strike اتفاق بیفتد ‌به بازی کننده اجازه داده میشود که دو پرتاب دیگر برای اتمام بازی انجام دهد و سپس امتیاز فریم آخر محاسبه خواهد شد.فریمی که درآن اسپیر ( افتادن همه پین ها در پرتاب دوم ) اتفاق افتاده به این صورت محاسبه میشود:تعداد پین های انداخته شده این فریم (که ۱۰ تا است) به اضافه ی تعداد پین های انداخته شده در یک پرتاب بعدی به اضافه ی امتیاز فریم قبلی خواهد بود.باز هم در صورتیکه در قاب یا فریم دهم spare اتفاق بیفتد ‌به بازی کننده اجازه داده میشود که یک پرتاب دیگر برای اتمام بازی انجام دهد.در واقع فریم آخر میتواند به جای دو پرتاب، سه پرتاب داشته باشد. در غیراینصورت از جمع امیتاز فریم قبلی با تعداد پین های انداخته شده در این فریم امیتاز فریم حاضر بدست خواهد آمد.حالا یک مثال:در فریم اول با پرتاب اول فقط ۱ پین را انداخته و در پرتاب دوم ۴ پین را. پس امتیاز فریم از جمع تعداد پین های انداخته شد عدد ۵ میشود.در فریم دوم با پرتاب اول ۴ پین و در پرتاب دوم ۵ پین انداخته شده. پس جمع امیتاز فریم قبلی (۵) با تعداد پین های انداخته شده (۹) امتیاز این فریم را به ۱۴ می رساند.در فریم سوم با پرتاب اول ۶ پین و در پرتاب دوم همه ی پین های باقی مانده(۴) انداخته میشود. در اینجا حالت spare رخ داده است. پس یک پرتاب دیگر برای محاسبه امتیاز این فریم نیاز داریم.در فریم چهارم با پرتاب اول ۵ پین را انداخته ایم. اجازه دهید ابتدا امتیاز فریم قبل را محاسبه کنیم.۱۰ عدد پین اندخته شده در فریم سوم با ۵ پین انداخته شده در فریم (چهارم) بعلاوه ی امتیاز فریم قبلی ( فریم دوم - ۱۴) جمع امتیاز فریم سوم را به ۲۹ میرساند. در پرتاب دوم از فریم ۴ همه پین ها انداخته میشود. پس برای محسابه امتیاز این فریم باز هم منتظر یک پرتاب دیگر خواهیم بود.در فریم پنجم حالت strike رخ داده است. ابتدا محاسبه فریم چهارم:۱۰ پین انداخته شده در پرتاب اضافه + ۱۰ پین انداخته شده در فریم چهارم + امتیاز فریم سوم = ۴۹و برای محاسبه امتیاز فریم پنجم به دو پرتاب دیگر لازم داریمدر مجموع دو پرتاب فریم ششم کلا ۱ پین انداخته میشود و بعلاوه پین های انداخته شده در فریم پینج و امتیاز فریم چهارم، جمع امتیاز چهارم به ۶۰ میرسد.حالا باید بتونید بقیه فریم ها رو خودتون محاسبه کنید. من هم تصمیم دارم توی چند پست به روش test-frist این مثال رو به زبان های php یا پایتون کد بزنم...- این مثال خوب و پر چالش در کتاب Agile Software Development آورده شده و در صورتیکه میخواهید خودتون رو محک بزنید میتونه واستون بسیار مفید باشه.