# برنامه نویسی سطح پایین > برنامه نویسی اسمبلی خانواده x86 >  بازی شطرنج در اسمبلی

## merelin

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

----------


## someCoder

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

----------


## merelin

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

----------


## someCoder

> اینکه مهررو بدون رنگ کنم ودوباره رنگ کنم(منظورم همون حرکتش)کار سختی و اصلا نمی دونم باید از کجا شروع کنم


چرا اینقدر مساله رو برای خودت پیچیده میکنی؟ خوب کل صفحه جدید رو یک بار روی قبلی بکش! اینجوری قبلی هم پاک میشه. یه کمی کند تر هست ولی خیلی راحت تره.




> میدونید اینکه چطوری میشه یک شکل خمیده کشید و داخل اون رو رنگ کرد برام شده یه سئوال


 اگر قضیه کشیدن شکل منحنیه که باید با استفاده از توابع ریاضی این کار رو خودت انجام بدی. مثلا فرض کن یه منحنی میخوای که از 3 تا نقطه بگذره؛ این میشه دقیقا یکی از مسایلی که تو محاسبات عددی با فرمول بهت یاد میدن یا همون کشیدن دایره که باید از روی فرمولهی مربوط به دایره مختصات نقاتش رو حساب کرد. البته فرمولهای سریعتر و بهتر هم هست که من بلد نیستم.
اگرم مشکلت رنگ کردن یه شکل بسته است (مثل اون آیکون سطل رنگ توی برنامه paint) که با یه تابع بازگشتی کارت راه میافته. کافیه برای یه نقطه توی منحنی فراخونی بشه و به ازای هر خونه ای که فراخونی شده، خودش رو رنگ کنه و اگر همسایه هاش همرنگ خودش(قبل از رنگ جدید) هستند، برای اونها هم فراخونی بشه. البته بجای تابع بازگشتی با یه حلقه معمولی و استفاده از یک صف یا پشته هم کار راه میافته.

----------


## merelin

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

----------


## merelin

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

----------


## someCoder

سلام،
اگر به نتیجه نرسیدی اینو یه نگاهی بکن. یه چیزی تو این مایه ها میشه:
paint(x, y, newColor)
{
	oldColor = Image[x][y].color;
	Image[x][y].color = newColor;
	if(Image[x][y+1].color == oldColor){
		paint(x, y+1, newColor);
	}
	if(Image[x][y-1].color == oldColor){
		paint(x, y-1, newColor);
	}
	if(Image[x+1][y].color == oldColor){
		paint(x+1, y, newColor);
	}
	if(Image[x-1][y].color == oldColor){
		paint(x-1, y, newColor);
	}
}

----------


## simonet

برای اینکه یک ماتریس تعریف کنیم از دستور زیر استفاده می کنیم :
 mat db 8 dup(8 dup(?))
ولی من نمی دونم وقتی بخواهیم مقدار دهی کنیم چه طور باید ماتریس رو تعریف کنیم.
مثلا" ماتریس زیر:
 2 3 4 5 6 4 3 2
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 
7 7 7 7 7 7 7 7
8 9 10 11 12 10 9 8
هر شماره مربوط به یک مهره است.دو ردیف بالا مربوط به مهره های سفید و دو ردیف پایین مربوط به مهره های سیاه است و صفر نشان دهنده ی این است که خانه خالی است و مهره ای در آن قرار نگرفته.
لطفا" من رو راهنمایی کنید. من هنوز در حرکت دادن مهره ها مشکل دارم :ناراحت:

----------


## someCoder

mat db 2,3,4,5,6,4,3,2,1,1,1,1,1,1,1,1,0,0,...
بقیه اش رو جای ... بنویس

----------


## aidinwashere

سلام
میشه استاد و دانشگاهتون رو معرفی کنید؟ 
علاقه مند شدم با استادتون آشنا بشم. (اگه مایل بودید پیغام خصوصی بدید)
مرسی.

----------


## merelin

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

----------


## someCoder

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

حالا بگو دقیقا کجاشو مشکل داری؟

----------


## Emir New

سلام من می خوام یک برنامه ای بازه بین 100 تا 999 رو بگیره و به توان 2 برساند مثلا
اگر 100 را داشته باشیم 1رو به توان 2 برساند و 0اول رو به توان 2 برساند و 0دوم رو به توان 2 برساند و اگر جواب ان دویاره برابر 100 بود ان را در خروجی چاپ کند اگر همچین برنامه ای رو داشته باشید و د راختیار من بگذارید از شما ممنون می شوم
با تشکر
7/11/85

----------


## Emir New

ممنون می شوم اگر جواب را به ایمیل من هم ارسال کنید چون به دلیل گرفتاری زیاد به سایت برنامه نویس نمایم
amir_changizi2003@yahoo.com

----------


## someCoder

> ممنون می شوم اگر جواب را به ایمیل من هم ارسال کنید چون به دلیل گرفتاری زیاد به سایت برنامه نویس نمایم
> amir_changizi2003@yahoo.com


هر دم از این باغ، بری می رسد!  :متعجب:

----------


## mortez maya

> هر دم از این باغ، بری می رسد!


حافظاااااااااااااا.........!!!!  ؟؟

----------


## simonet

سلام
مثلا" کاربر با موس رو نقطه ای به مختصات(40و50)کلیک می کنه برای جابه جا یی مهره .
خوب ما نمی دونیم که رو کدوم مهره کلیک کرده ماتریس رو هم به همین دلیل ایجاد کردیم  .حالا نمی دونیم ماتریس رو چه طور به مهره ها ربط بدیم.

----------


## someCoder

> سلام
> مثلا" کاربر با موس رو نقطه ای به مختصات(40و50)کلیک می کنه برای جابه جا یی مهره .
> خوب ما نمی دونیم که رو کدوم مهره کلیک کرده ماتریس رو هم به همین دلیل ایجاد کردیم  .حالا نمی دونیم ماتریس رو چه طور به مهره ها ربط بدیم.


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

----------


## aidinwashere

عمل Drag & Drop رو چطوری میشه انجام داد؟

----------


## simonet

> مختصاتی که کاربر کلیک کرده که معلومه کجای صغحه شطرنج میشه. از روی آرایه ببین تو اون خونه چی داری


همین دیگه نمی دونیم چه طور مهره ها رو به ماتریس ربط بدیم. :ناراحت:

----------


## someCoder

کجاشو نمیدونی؟



> مختصاتی که کاربر کلیک کرده که معلومه کجای صغحه شطرنج میشه


یا



> از روی آرایه ببین تو اون خونه چی داری

----------


## Emir New

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

*دیشب با دنیا حرفم شد.پشتم را به آسمان کردم، شانه هایم از سنگینی نگاه ماه وستاره که از* *.**پشت ابرها نگاه می کردند بی طاقت شدند* *نمی دانستم که حرفم را باید به که بگویم ، یا اصلا" از چه بگویم .

**و ایــــن  حقــــــــیقتی ســـــت مـــــــاندنی .............*

----------


## someCoder

آقای امیر چنگیزی(Emir New)، حالا که صحبت از قوانین کردی، فکر میکنم لازمه یک سری از قوانین رو بهتون یادآوری کنم. هرچند موقع ثبت نام همه اینها رو خوندین و طبق همین قوانین من حق ندارم بهتون تذکر بدم! اما چون صحبت رو به اینجا کشوندین، لازم شد:

_قانون شماره 27
درخواست و حل تمرین پروژه های دانشجویی اکیداً ممنوع بوده و تنها استفاده از مباحث و درخواست راهنمایی در این راستا مجاز می باشد._

*قانون شماره 9*
از ایجاد گفتگوهای یکسان در بخش های مختلف پرهیز کنید. 
ضمنا یاد آوری میکنم شما همین سوال رو در ۲ جای دیگه هم (بجز اینجا) عینا تکرار کرده اید:
https://barnamenevis.org/showth...597#post302596
https://barnamenevis.org/showth...601#post302601

*قانون شماره 8*
لطفاً در هنگام طرح سوالات خود آن ها را به صورت جداگانه مطرح فرمایید.

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


ضمنا من اول به این دلیل تذکر ندادم:
*قانون شماره 24*
کاربران عادی سایت حق دخالت در مسائل مدیریتی سایت را ندارند

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

فکر میکنم شکستن این همه قانون فقط با ارسال ۷ پست کار ساده ای نباشه! ماجرای ؛هر دم از این باغ بری میرسد هم این بود که ما همیشه مینالیدیم که قوانین رو رعایت نمیکنند و شما یک دفعه کولاک کردین در مورد قانون شکنی!

----------


## simonet

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

----------


## someCoder

> ما یک ماتریس برای حرکت مهره ها ساختیم حالا من نمی تونم چه طوری اون ماتریس رو به مهره ها ربط بدم. مثلا" وقتی موس رو یک نقطه کلیک می شه  برنامه از کجا بفهمه اونجا کدوم مهره وجود داره که دوباره همون مهره رو جایی که موس برای دومین بار کلیک می شه بکشه. حالا شما فرمودید از رو آرایه می بینیم تو اون خونه چه مهره ای وجود داره.
> درسته.
> ولی من نمی تونم این  رو در برنامه ایجاد کنم.


یا من بد توضیح میدم، یا شما منظورمو نمیگیرین و یا هردوش!  :لبخند:  

جایی که کلیک شده، از روی مختصاتش، مختصات خونه شطرنج رو بدست بیارید. (کجای صفحه 8*8) Ok؟

از تو آرایه ببینید اونجا چه مهره ای هست. ok؟

والسلام!

----------


## simonet

شما به نظرتون دارید توضیح می دید یا همون حرف های قبلی تون رو تکرار می کنید؟
در هر حال احتمال رو به این بدید که من منظورتون رو  نمی گیرم .
از اینکه تا الآن پیگیر این تاپیک بودید ممنون.

----------


## someCoder

> شما به نظرتون دارید توضیح می دید یا همون حرف های قبلی تون رو تکرار می کنید؟
> در هر حال احتمال رو به این بدید که من منظورتون رو  نمی گیرم .
> از اینکه تا الآن پیگیر این تاپیک بودید ممنون.


منم میدونم که منظورم رو نمیتونم برسونم. فقط نمیدونم کجاشو نمیتونم. به هر حال موفق باشی

----------


## Younes

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

----------


## someCoder

یونس جان! اصلا بقیه اش با تو! والله simonet عزیز که حتما خوشحال میشه کس دیگه ای هم بهش کمک کنه. چون من منظورم رو نمیتونم برسونم.

----------


## simonet

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

----------


## merelin

سلام somecoder عزیز من می دونم که شما از لحاظ اطلاعاتی خیلی بالا هستید به همین دلیل خواهش می کنم صحبتهای simonet را به  دل نگیرید .
خوب پس سئوال رو اینطور مطرح می کنم که من رایطه ی بین ماتریس و صفحه کلید رو پیدا کردم و تمامی توابع حرکت مهر ها رو نوشتم ولی مشکل اینجاست که نمی دونم چطور با ماوس کار کنم البته می دونم که ماوس چطور فعال میشه و مختصات x,y را در cx,dx ذخیره میکنه ولی هر کاری که می کنم تا ماوس یکی از مهرها رو برداره و به جای دیگه ی حرکت بده نمیشه واقعا دیگه نمی دونم چی کار کنم هر الگوریتمی که به ذهنم رسید رو امتحان کردم ولی نشد خواهش می کنم زودتر جواب من رو بدید.....
البته خوشحال میشم اگر به جز somecoder هر کس دیگه ی به من کمک کنه و پیشاپیش ازش تشکر می کنم

----------


## someCoder

> سلام somecoder عزیز من می دونم که شما از لحاظ اطلاعاتی خیلی بالا هستید به همین دلیل خواهش می کنم صحبتهای simonet را به  دل نگیرید .
> خوب پس سئوال رو اینطور مطرح می کنم که من رایطه ی بین ماتریس و صفحه کلید رو پیدا کردم و تمامی توابع حرکت مهر ها رو نوشتم ولی مشکل اینجاست که نمی دونم چطور با ماوس کار کنم البته می دونم که ماوس چطور فعال میشه و مختصات x,y را در cx,dx ذخیره میکنه ولی هر کاری که می کنم تا ماوس یکی از مهرها رو برداره و به جای دیگه ی حرکت بده نمیشه واقعا دیگه نمی دونم چی کار کنم هر الگوریتمی که به ذهنم رسید رو امتحان کردم ولی نشد خواهش می کنم زودتر جواب من رو بدید.....
> البته خوشحال میشم اگر به جز somecoder هر کس دیگه ی به من کمک کنه و پیشاپیش ازش تشکر می کنم


اولا که خواهش میکنم، بالا کجا بود؟ من کجا بودم؟ اینجا کجاست؟ ... 
ثانیا دلگیر چیه؟ دلگیر کیه؟ اینجا کجاست؟ ...  :لبخند گشاده!:  
اما از شوخی گذشته، اصلا از این فکرا نکن!  :چشمک:  و همچنین از این حرفا نزن  :متفکر:  

بذار برات با شکل توضیح بدم:
فرض کن تو صفحه شطرنج رو با فاصله a از پایین صفحه رسم کردی و همینطور هر خونه ای هم از صفحه شطرنج ارتفاعش b باشه. حالا موس در نقطه x و y کلیک کرده. ما الان فقط با ارتفاعش (y) کار داریم. 
حالا میخوایم ببینیم کجای صفحه شطرنج شده. دیگه ساده است. از y مقدار a رو کم میکنیم تا فاصله از گوشه صفحه شطرنج باشه (بجای گوشه مانیتور) بعد بر b تقسیم میکنیم تا ببینیم چند خونه از پایین صفحه جلوتر بوده. میشه [y-a)/b)] همینطوری مختصات افقی رو هم حساب میکنی تا ببینی کدوم خونه شطرنج بوده. بعد این خونه select میشه و یه بار دیگه کاریر رو خونه مقصد هم کلیک میکنه.

----------


## merelin

سلام
ببخشید من قبلا به این روابط رسیدم ولی مشکل سر به دست آوردن مختصات نیست مشکل اینجاست که من دستور cmp bx,01h رو برای کلیک چپ نوشتم ولی اجرا نمیشه حتی با emu این رو debug کردم ولی وقتی کلیک چپ می کنم به فرمان مربوطه پرش نمی کنه و از همه بدتر اینکه من یه تابع update برای اینکه بعد از هر تغییری که در ماتریس داده شد صفحه را با مهرهایش رسم کند نوشتم ولی بی نهایت بار مهرها رو می کشه وخطای unmatched macro nesting  می ده در حالی که debug ش کردم مشکلی نداشت واقعا نمی دونم دیگه باید چی کار کنم!!!!!!!؟؟؟؟؟.........

----------


## simonet

use this interupt:
mov ax,5h
int 33h
cmp bx,0

----------


## merelin

سلام simonet عزیز دستت درست مرسی .....

----------

