সবচেয়ে ছোট দাবা প্রোগ্রাম


19

সাম্প্রতিক এই নিবন্ধটি দ্বারা অনুপ্রাণিত হয়ে একজন ফরাসী প্রোগ্রামারকে বলেছিলেন যিনি বিধানসভায় একটি 487 বাইট 2 খেলোয়াড় (মানব বনাম মানব) দাবা প্রোগ্রাম লিখেছিলেন, আমি ভাবলাম যে ছোট দাবা প্রোগ্রামগুলি অন্যান্য ভাষায় কীভাবে হতে পারে।

বিস্তারিত

  • প্রোগ্রামটি অবশ্যই আইনী দাবা চালগুলি গ্রহণ করতে হবে।
  • চেক / চেকমেট ঘোষণার প্রয়োজন হয় না (কেবল আকাঙ্ক্ষিত), যদিও চেকের ক্ষেত্রে প্রথম বিধি প্রযোজ্য।
  • নিবন্ধ অনুসারে, কাস্টিং কোনও প্রয়োজনীয় বাস্তবায়ন নয়।
  • এছাড়াও, আপনাকে এন পাসেন্ট প্রয়োগ করতে হবে না।
  • যাইহোক, অষ্টম পদমর্যাদায় পৌঁছানোর পরে আপনাকে মহোদয় প্রচারের অনুমতি দিতে হবে (আপনি কেবল রানিকে রূপান্তর করতে বাধ্য করতে পারেন)।
  • বোর্ডটি কীভাবে প্রদর্শিত হবে তা আপনার উপর নির্ভর করে - টার্মিনাল এএসসিআইআই, জিইউআই ইত্যাদি
  • কার পালা তা আপনি অবশ্যই প্রদর্শন করবেন।

দাবা সংক্রান্ত নিয়মগুলি এখানে পাওয়া যাবে - নির্দিষ্ট টুর্নামেন্টের নিয়মগুলিকে উপেক্ষা করুন (উদাহরণস্বরূপ সময়, স্পর্শ) এবং ক্যাসলিংয়ের কথা মনে করুন এবং উত্তীর্ণ পাসের প্রয়োজনীয় বাস্তবায়ন নয়।


আপনি যখন "২ জন খেলোয়াড়" বলছেন আমি 2 মানব খেলোয়াড়ের জন্য এটির চলন্ত টুকরো বুঝতে পারি, এটির মতো বোট নয়: কোডগলফ.স্ট্যাকেক্সেঞ্জিং / কিউ / 12397/15599 । প্রোগ্রামটি শুধুমাত্র আইনী পদক্ষেপ গ্রহণ করতে হবে? যদি তাই হয় কোডগল্ফ.স্ট্যাকেক্সেঞ্জাও.ইউ / 10 / 10843/15599 প্রাসঙ্গিক। পরিশেষে কোডগলফ.স্ট্যাকেক্সেঞ্জারওয়েজ / কিউ / 8911/15599 চেক / সাথী সনাক্তকরণ সম্পর্কে। প্রোগ্রামটি কী করবে তা আপনাকে আরও দৃ tight়তার সাথে উল্লেখ করতে হবে, অন্যথায় এটি এমন কোনও প্রোগ্রামের পক্ষে গ্রহণযোগ্য যা কেবলমাত্র শুরুর অবস্থানটি ছাপায়, তারপরে a1 h8একটি নড়বড়কে তির্যকভাবে বিপরীত কোণে নিয়ে যাওয়ার মতো , প্যাঁচাগুলির উপর দিয়ে লাফিয়ে লাফানোর মতো প্রথম পদক্ষেপ গ্রহণ করে
লেভেল রিভার সেন্ট

10
আমি মনে করি আপনার ক্যাসলিং এবং পাস পাস দরকার! দাবাড়ির কিছু নিয়ম কেন মিস করবেন?

3
কিয়ারান, আপনি আপনার পরবর্তী চ্যালেঞ্জের জন্য স্যান্ডবক্সটিও দেখতে চান ("মেটাতে বৈশিষ্ট্যযুক্ত" দেখুন)।
লেভেল নদী সেন্ট

1
আমি আপনাকে পরামর্শ দিচ্ছি যে আপনার পালাটি কখন প্রদর্শিত হবে সে সম্পর্কে আপনার একটি ইঙ্গিত দরকার (যেটি এখনও স্পষ্ট করা হয়নি)) এছাড়াও, মানুষ কীভাবে ইনপুটটির জন্য "কোনও দ্ব্যর্থহীন রূপ" ব্যাখ্যা করতে চলেছে সে সম্পর্কে আমি কিছুটা উদ্বিগ্ন তবে আমি এটি সম্পর্কে বেশ কৌতূহলী।
স্তর নদী সেন্ট

1
আপনি সম্ভবত এই চ্যালেঞ্জের জন্য প্রয়োজনীয় সমস্ত নিয়মের একটি সম্পূর্ণ তালিকা তৈরি বা লিঙ্ক করতে পারেন, যেমন দাবারের পূর্ব অভিজ্ঞতা নেই এমন লোকেরাও এতে অংশ নিতে পারে?
flawr

উত্তর:


21

সি, 650 600

n=8,t=65,s,f,x,y,p,e,u=10,w=32,z=95;char a[95],b[95]="RNBKQBNR";v(){p=a[s]&z;y=f/u-s/u;x=f-s-y*u;e=x*x+y*y;n=s%u/8|f%u/8|a[s]/w-t/w|a[f]/w==t/w|!(p==75&e<3|p>80&x*y==0|p%5==1&x*x==y*y|p==78&e==5|p==80&x*(z-t)>0&(a[f]-w?e==2:e==1|e==4&s%5==1));if(!n&&p-78)for(e=(f-s)/abs(x*x>y*y?x:y),x=s;(x+=e)-f;)n|=a[x]-w;}main(){for(a[93]=40;n--;a[92]=47)sprintf(a,"%s%cP    p%c \n",a,b[n],b[n]+w);for(;1;){puts(a);for(n=1;n;){putchar(t);scanf("%d%d",&s,&f);v();memcpy(b,a,z);if(!n){a[f]=p-80|f%u%7?a[s]:t+16;a[s]=w;a[f]&z^75||(a[z-t/w]=f);f=a[z-t/w];t^=w;for(n=1,s=80;n&&s--;)v();if(n=!n)memcpy(a,b,z),t^=32;}}}}

বোর্ডটি সূচনা করার জন্য কোড হ্রাস করতে, প্রদর্শনটিতে সাদা (বড় হাতের) বাম থেকে ডানে এবং কালো (ছোট হাতের) ডান থেকে বামে খেলছে। ইনপুটটি দুটি 2-সংখ্যার দশমিক সংখ্যার (শুরু অবস্থান এবং সমাপ্ত অবস্থান) আকারে ফাইল দেয় (0-7) এবং র‌্যাঙ্ক (0-7)। কিছুটা অতিরিক্ত কোডের জন্য (প্রতিটি ইনপুট থেকে ১১ টি বিয়োগ), ইনপুটটি http://en.wikedia.org/wiki/ICCF_numeric_notation (অঙ্ক 1-8) মেনে চলতে পারে

এখানে একটি নমুনার স্ক্রিনশট রয়েছে যেখানে ব্ল্যাক তার রুকের জঞ্জালটিকে কেবল এগিয়ে নিয়েছে। হোয়াইট তার রানির সাথে বিভিন্ন অবৈধ পদক্ষেপের চেষ্টা করে, অবশেষে তন্দ্রাটি ধরার আগে। টার্ন সূচকগুলি aকালো এবং Aহোয়াইটের জন্য।

এখানে চিত্র বর্ণনা লিখুন

আমার বৈধতার একটি আকর্ষণীয় বৈশিষ্ট্য হল ইউক্লিডিয়ান দূরত্বের বর্গক্ষেত্রের ব্যবহার। নাইটের জন্য এটি সর্বদা 1 ^ 2 + 2 ^ 2 = 5 হয় তবে আমি এটি রাজা এবং মহিমা জন্যও ব্যবহার করি।

টেস্ট ফর চেক বোর্ডের ব্যাক আপ করে, খেলোয়াড়দের সরানো চালিয়ে যাওয়া এবং সমস্ত সম্ভাব্য 64৪ টি সম্ভাব্য প্রতিরোধের স্ক্যান করে পরীক্ষা করা হয়।

প্রোগ্রামটি Ctrl-C দিয়ে শেষ করতে হবে। আমি প্রোগ্রামটি শেষ করার জন্য একটি বিশেষ পদক্ষেপ না রেখে, এটি করার আরও অনুগ্রহজনক উপায় সম্পর্কে ভাবতে পারি না। দাবা খেলাটি আসলে শেষ হয় যখন কোনও প্লেয়ার তার পালা (চেকমেট বা অচলাবস্থা) নিয়ে যেতে অক্ষম হয় এবং এর জন্য প্রচুর পরীক্ষার প্রয়োজন হয় যা অনুমানের দ্বারা প্রয়োজন হয় না।

মন্তব্য করা কোড

n=8,t=65,s,f,x,y,p,e,u=10,w=32,z=95;                 // 8,10 height and width of board. w=ASCII space, also difference between ucase and lcase
                                                     // 95 is bitmask for conversion lowercase to uppercase, but also used as length of array, etc.
char a[95],b[95]="RNBKQBNR";                         // a is main board, b is backup board (but used at start to hold 1st row data.)

v(){                                                 // validate move in all aspects except check
  p=a[s]&z;                                          // p=uppercase(character on start square)
  y=f/u-s/u;                                         // signed distance in y direction
  x=f-s-y*u;                                         // and x direction
  e=x*x+y*y;                                         // square of Euclidean distance
  n=s%u/8|f%u/8|                                     // n=true if 2nd digit of input out of bounds OR
  a[s]/w-t/w|a[f]/w==t/w|                            // start sq not friendly piece OR finish sq is friendly piece (also eliminates case where start=finish)
  !(                                                 // OR NOT geometry valid
    p==75&e<3|                                       // 'K'(ASCII75) AND euclidean distance squared =1 or 2 OR
    p>80&x*y==0|                                     // 'Q'or'R' AND x or y = 0 OR
    p%5==1&x*x==y*y|                                 // 'Q'or'B' AND abs(x)=abs(y)
    p==78&e==5|                                      // 'N' AND euclidean distance squared = 5
    p==80&x*(z-t)>0&(a[f]-w?e==2:e==1|e==4&s%5==1)   // 'P'(ASCII80):x direction must correspond with case of player (z-t)
  );                                                 // if capturing e=2. Otherwise e=1 (except on start rows 1 and 6, e can be 4)
  if(!n&&p-78)                                       // if not yet invalid and piece not 'N'(ASCII78) 
    for(e=(f-s)/abs(x*x>y*y?x:y),x=s;(x+=e)-f;)      // Set e to the numeric difference to travel 1 square in right direction. Set x to start square
       n|=a[x]-w;                                    // and iterate x through all intervening squares, checking they are blank
}



main(){

  for(a[93]=40;n--;a[92]=47)                         // iterate n through 8 rows of board. vacant spaces in bracket are use to assign start positions of kings to a[92&93] 
    sprintf(a,"%s%cP    p%c \n",a,b[n],b[n]+w);      // build up start position, each row 10 squares wide, including filler space the end and newline

  for(;1;){                                          // loop forever   
    puts(a);                                         // display board
    for(n=1;n;){                                     // loop while move invalid
      putchar(t);                                    // display prompt 'A' for white 'a' for black
      scanf("%d%d",&s,&f);                           // get input
      v();                                           // validate move
      memcpy(b,a,z);                                 // backup board (and king position metadata)  
      if(!n){                                        // if move not yet invalid
        a[f]=p-80|f%u%7?a[s]:t+16;                   // if not a pawn on last row, content of finish square = start square, ELSE queen of correct case (t+16) 
        a[s]=w;                                      // start square becomes blank (ASCII32)
        a[f]&z^75||(a[z-t/w]=f);                     // if finish square king, update king position metadata
        f=a[z-t/w];                                  // to begin scanning to see if king in check, set f to current king position
        t^=w;                                        // and change colour
        for(n=1,s=80;n&&s--;)v();                    // for s=79..0 search for valid opponent move to capture king (stops with n=0)
        if(n=!n)memcpy(a,b,z),t^=32;                 // valid opponent threat on king means invalid player move. Invert n, recover board from backup and change colour back.
      }
    }    
  }
}

দুর্দান্ত কোড! দুটি ধারণা: 32 ধ্রুবক (আপনি এটি প্রচুর ব্যবহার করেন), s,fকী আরম্ভ করা দরকার? খালি স্কোয়ারে স্থানগুলি দুর্দান্ত ইমো।
এলোমেলো

@ রন্দোমর ধন্যবাদ! আমি এখনই চেকের জন্য পরীক্ষা যোগ করেছি, সুতরাং গল্ফিং পরবর্তী কাজ। আমি দুটি পৃথক জিনিসের জন্য 32 ব্যবহার করি: স্থানের জন্য ASCII কোড এবং 32 এর ASCII ব্লকের (নিয়ন্ত্রণ / প্রতীক / বড় হাতের অক্ষর / ছোট হাতের মধ্যে পৃথকীকরণের জন্য) আমি এটিকে একটি ধ্রুবক হিসাবে তৈরি করব। এছাড়াও, আমি বড়সড়কে ছোট হাতের অক্ষরে রূপান্তর করার জন্য বিটমাস্ক হিসাবে 95 ব্যবহার করি (তবে আমি একই সংখ্যাকে অন্য অনেক কিছুর জন্য ব্যবহার করতে সম্মত করেছি।) এর সূচনাটি sপ্রথম পর্যায়ে থেকে ক্যারিওভার ছিল। আমি এখন এটি সরিয়েছি।
স্তর নদী সেন্ট

1
আপনি বরাদ্দকরণ কনক্যাটেনেট করতে পারেন: e=y*y+x*x=f-s-u*y=f/u-s/u;
এলোমেলো

@ আরন্দোমরা ধন্যবাদ, আমি ভেবেছিলাম যে "এল-মান প্রয়োজনীয়" সংকলন ত্রুটি দেবে তবে এটি সংকলন করে এবং ঠিকঠাক বলে মনে হচ্ছে। একচেখি =ব্যাখ্যার আগে এল-ভ্যালুটি হ'ল শেষ পরিবর্তনশীল । সম্পর্কিত বিষয়ে e=y*y+x*(x=..আমি মৃত্যুদণ্ডের আদেশ থেকে কিছুটা সতর্ক, যেহেতু একটি printfবিবৃতিতে পরিবর্তিত যুক্তির পক্ষ থেকে আমি ভুল উত্তর পেয়েছি , তবে এই ক্ষেত্রে এটি জিসিসি / সাইগউইনের ক্ষেত্রে ঠিক কাজ করবে বলে মনে হচ্ছে। আমি কোডটিতে অন্তর্ভুক্ত করার আগে আরও পরিবর্তনগুলির জন্য অপেক্ষা করব। একটি জিনিস এখনও নিখোঁজ হ'ল 0..77 এর বাইরে নম্বরের জন্য একটি চেক (যা আমি অনুমানের দ্বারা প্রয়োজনীয় হিসাবে দেখতে পাচ্ছি না, তবে যাইহোক ..)
লেভেল রিভার সেন্ট

1
দুটি সুস্পষ্ট পরিবর্তন: t^=32করতে t^=wএবং a[95],b[95]করতে a[z],b[z]। কোডটি আশ্চর্যরূপে পঠনযোগ্য। সম্ভবত ভার্জোজ মন্তব্যের কারণে!
এলোমেলো

13

পাইথন 3, 1166 1071 993 বাইট

আমি কেবল বুঝতে পেরেছিলাম যে আমি অন্যথায় কাজ শেষ করার পরে রাজাদের তদন্ত করতে যাওয়া বন্ধ করতে হবে, তবে যাইহোক এখানে আমার জমা দেওয়া আছে

h=abs
m=range
l=print
o=" "
a=o*8
j=[list(s)for s in["RNBKQBNR","P"*8,a,a,a,a,"p"*8,"rnbkqbnr"]]
u=False
v=lambda c:(c.lower()==c)==u
while 1:
 l("b"if u else"w")
 for b in j:l(*b)
 q,r,s,t=[int(i)for i in input().split()];P=j[r][q];g=j[t][s];p=P.lower()
 def w():
  if g==o or not v(g):j[t][s]=P;j[r][q]=o;global u;u=not u
 if not v(P):break
 if p=="r"or p=="q":
  for a,b,c,d in[(q,r,s,t),(r,q,t,s)]:
   if a==c:
    x=h(d-b)//(d-b)
    for n in m(b+x,d,x):
     if j[n if b else r][q if b else n]!=o:break
    else:w()
 if p=="b"or p=="q":
  if h(q-s)==h(r-t):
   for n in m(1, h(q-s)):
    if j[r+(n if t>r else-n)][q+(n if s>q else-n)]!=o:break
   else:w()
 if p=="k"and h(q-s)<2 and h(r-t)<2 or(p=="n"and(h(q-s)==2 and h(r-t)==1 or h(r-t)==2 and h(q-s)==1)):w()
 if p=="p":
  f=t-r==(-1 if u else 1)
  if(g!=o and not v(g)and h(q-s)==1 and f)or(g==o and q==s and f)or(g==o and q==s and t-r==(-2 if u else 2)and r==(6 if u else 1)):
   w()
   if t==(0 if u else 7):j[t][s]="q"if u else"Q"

খেলতে, চারটি স্থান-বিস্মৃত সংখ্যা লিখুন, প্রথম 2 আপনি যে টুকরোটি স্থানান্তর করতে চান তার স্থানাঙ্ক এবং দ্বিতীয় 2 যেখানে আপনি এটিতে যেতে চান being


1
আপনার বোর্ড শুরু করার জন্য, আপনি এটি বড় সঞ্চয় হিসাবে পরিবর্তে ব্যবহার করতে পারেন:a=o*8;j=[list(s) for s in ["RNBKQBNR","P"*8,a,a,a,a,"p"*8,"rnbkqbnr"]]
ছদ্মনাম

এছাড়াও .spilt()হোয়াইটস্পেস এ বিভাজন ডিফল্ট, সুতরাং আপনি ব্যবহার করতে পারেন input().split()পরিবর্তেinput().split(" ")
pseudonym117

আক্ষরিক এবং কীওয়ার্ডগুলির মধ্যে আপনার প্রয়োজন নেই [সেই ক্রমে]। (যেমন 2and, 1orইত্যাদি)
জাকারি

Falseহতে পারে 0!=0
জাচারা

পরীক্ষিত হয়নি তবে আমার অনুমান Falseঠিক হতে পারে 0- ভাল not 0কাজ করা উচিত ...
আর্টেমিস মনিকাটিকে

6

দেরি করার জন্য দুঃখিত.

প্রোগ্রামটির নাম চেসস্কলেট। বর্তমানে এটি কোড এবং ডেটা উভয়ের জন্য 352 বাইট ব্যবহার করে। এটি জেড 80 এসেম্বলিতে এবং বিশেষত জেডএক্স এক্সপেক্ট্রামের জন্য লেখা হয়েছে।

যদি আপনি এটি সংকলন করে এবং এমুলেটরটিতে লোড করার মতো মনে করেন না তবে আপনি চেসস্কলেট সাইটে অনলাইনে খেলতে পারেন ( http://chesskelet.x10host.com )।

প্রোগ্রামটি বেশ সরল, একটি বড় লুপ যেখানে: - বিকল্পভাবে (1) সাদা ইনপুট দেয় বা (2) কালো চালায় এটি মাইক্রো এআই। - বোর্ড পর্দায় আপডেট করা হয়। আবার, ওয়েবসাইটটিতে প্রোগ্রাম এবং কৌশলগুলি বর্ণনা করার জন্য একটি বিশাল গাইড রয়েছে।

; ----------------------------------------------------------------------------- ; CHESSKELET /tseske'let/ ; Alex Garcia (reeagbo), Boria Labs 2018-2019 ; Thanks, @MstrBlinky and @johan_koelman, for your contribution ; Developed with ZXSpin, Notepad++ ; ----------------------------------------------------------------------------- ; Compilation with ZXSpin (all versions) and SpectNetIde (not all versions) ; Run with RANDOMIZE USR 30000 ; ----------------------------------------------------------------------------- ; debug mode: 0 = no, 1 = yes debmod equ 0 ; gramod: 0 = minimal interface, 1 = basic interface, 2 = full interface gramod equ 0 ; feamod: 0 = no features (if fails at legadd 'ret'), 1 = all features feamod equ 0 ; ROM memory addresses clescr equ 3503 laskey equ 23560 ; memory micro-pages (256B, typically H register) used for simple memory access auxsth equ $7D piearh equ $7E movlih equ $7F boasth equ $80 boaath equ $81 boaoph equ $82 canlih equ $83 org 30000 ; code is not directly portable ;------------------------------------------------------------------------------ ; Common code before turns ;------------------------------------------------------------------------------ ; legal moves generation (3B) ----------------------------------------- befmov call genlis ; candidate move list, used for both sides ; switch sides on every loop (6B+1B) ---------------------------------- whomov ld l, h ; (H)L: $7F7F = movlih + gamsta, ++ ld a, (hl) ; load state xor h ; (@johan_koelman) switch turn: bla=0, whi=1 ld (hl), a ; save state back in memory if feamod>0 jp z, blamov else jr z, blamov ; if 0, jump to black moves, jp maybe endif ; clear screen (3B) whimov call clescr ; ROM routine set screen mode ; print board ----------------------------------------------------------------- priboa ; A, B = 0 at this point ; initialization (4B) ld h, boasth ; H(L)= $80, L always 0, load board ++ ld d, piearh ; D(E): piece array pointer, E o/w later priloo ; print colored squares (8B) if gramod>0 ; opt: print colored squares ld a, 19 ; set bright ASCII code rst 16 ; print value ld a, c ; (@MstrBlinky) C is always $21 inc c ; change C parity and %00000001 ; keep Ab0, alternatively 0/1 rst 16 ; print value endif ; print piece (10B) ld a, (hl) ; load piece and %00100000 ; keep color, pih ld b, a ; Bb5: isolate piece color ld e, (hl) ; load piece res 5, e ; uncolor, pih ld a, (de) ; load piece character sub b ; capitalize (-32) only for white pieces rst 16 ; print piece ; next square, end of rank/board detection (15B+1B) inc l ; next square jp m, pricoo ; (@johan_koelman) end of 16x8 board, A=128? ld a, l ; (@MstrBlinky) and $08 ; 8 if end of rank, 0 other cases jr z, priski ; skip if not end of the rank add a, l ; ld l, a ; return result to L ld a, 13 ; A=
    rst 16          ; print char

if gramod>0         ; opt: print colored squares, end of the rank
    inc c           ; change C parity
endif

priski  jr priloo       ; loop through all squares

; print coords (28B+6B)--------------------------------------------------------
pricoo              ; (@MstrBlinky simplified it)
if gramod>0         ; opt: print board coords
    ld bc, $0709        ; B: loop count, C: fixed rank/col

nextce  ld a, $16           ; ASCII control code for AT         
    rst 16              ; print it
        ld a, b         ; set rank
        rst 16              ; print it
        ld a, c         ; set column
        rst 16              ; print it
    ld a, '8'       ; base rank
    sub b           ; decrease rank character (8..1)
    rst 16          ; print rank value

    ld a, $16           ; ASCII control code for AT
        rst 16              ; print it
        ld a, c         ; set rank
        rst 16              ; print it
        ld a, b         ; sets column
        rst 16              ; print it
    ld a, 'a'       ; base column character
    add a, b        ; increase rank character (a..h)
    rst 16          ; print rank value

    dec b           ; loop 8 times
    jp p, nextce        ;
endif

if gramod>0         ; opt:  + "?" for input prompt
    ld a, 13        ; A: set  ASCII code
    rst 16          ; prints it to go to the next line for input
    ld a, '?'       ; set "?" ASCII code
    rst 16          ; print it
endif
; -----------------------------------------------------------------------------
; -----------------------------------------------------------------------------
;               WHITE MOVES 
; -----------------------------------------------------------------------------
; -----------------------------------------------------------------------------
; read chars from keyboard and stores them (16B(+4B+4B))-----------------------
    ; 4 times loop for coord input (3B)
    ld b, 4         ; loop count
    dec d           ; D(E)= $7D =auxsth, E always 0 ++

    ; read key from keyboard loop (8B)
realoo  ld hl, laskey           ; LASTKEY system variable ++
    xor a           ; A=0
    ld (hl), a      ; reset LASTKEY, two birds with 1 stone
wailoo  add a, (hl)             ; load latest value of LASTKEY.
    jr z, wailoo            ; loop until a key is pressed.

    ; skip move/switch sides (4B)
if feamod>0         ; opt: special move, switch sides to play black
    cp 's'          ; if "s" pressed at any time
    jp z, aftmov        ; skip white's move, ### jr maybe
endif
    ; save pressed key and print it (5B)
    inc de          ; (@MstrBlinky) next char, E = 1 to 5
    ld (de), a      ; save char in string
    rst 16          ; print it

    djnz realoo     ; loop for 4 input chars

    ; border reset (4B)
if gramod>1         ; opt: border reset after first white move
    ld a, 7         ; set back to white
    out (254), a        ; set border back to white
endif

; translate coords to square (17B) --------------------------------------------
movchk  ex de, hl       ; (@MstrBlinky routine) DE=end of input string

movloo  ld a, 56        ; rank calc = 8-(rank input-48) = 56-(HL)
    sub (hl)        ; A= 56 - (HL)
    rla         ; move it to high nibble (x16)
    rla         ;
    rla         ;
    rla         ;

    dec hl          ; (@MstrBlinky) run backwards through string
    add a, (hl)     ; rank + column (not 0-7 column)
    sub 'a'         ; make it a 0-7 column

    ld c, b         ; slide results through B and C
    ld b, a         ; at end of 2nd loop everything is in place

    dec l           ; (@MstrBlinky) beginning of input string?
    jr nz, movloo       ; if not, loop again

; search white move in legal move list (24B) ----------------------------------
if feamod>0         ; opt: validate white move
seamov  ld hl, canlis       ; canli pointer ++
    ld a, (hl)      ; number of candidates
    ;inc hl         ; skip to first candidate (+2 bytes)
    ;inc hl         ; removed v0.808, no move in those two bytes

sealoo  ld d, (hl)      ; origin candidate move
    inc hl          ; next byte
    ld e, (hl)      ; target candidate move
    inc hl          ; next byte, for next loop

    ex de, hl       ; candidate pair, DE: HL-canli pointer
    or a            ; reset carry
    sbc hl, bc      ; compare input move with cand. move (Z)
    ex de, hl       ; revert back, canli pointer
    jr z, aftsid        ; move match: jump out. ready to move
                ; B (origin sq), C (target sq) ready here
    dec a           ; count down
    jr nz, sealoo       ; loop until canli covered

    jp whimov       ; if not found, back to move input, jp maybe
else                ; opt: skip validate white move
    jr aftsid       ; Outputs: B: origin square, C: target square
endif
; -----------------------------------------------------------------------------
; -----------------------------------------------------------------------------
;               BLACK MOVES
; -----------------------------------------------------------------------------
; -----------------------------------------------------------------------------
blamov
chomov  ; preparations (7B)----------------------------------------------------
    ld hl, canlis       ; candidate list. No H reuse ++
    ld b, (hl)      ; number of candidates at position 0
    ld c, l         ; C=0, maximum valuation reset
    inc hl          ; skip 2 bytes to first candidate in list
    inc hl          ;
choloo  ; loop through candidates (6B) ----------------------------------------
    ld d, (hl)      ; D: origin candidate square
    inc hl          ; next candidate byte
    ld e, (hl)      ; E: target candidate square
    inc hl          ; next candidate byte
    push bc         ; BC released
    push hl         ; HL is different from here
    ; pieces valuation ----------------------------------------------------
    ; pieces collection (8B)
evatap  ld h, boasth        ; board base ++
    ld l, e         ; target square
    ld b, (hl)      ; black piece value
    ld l, d         ; origin square
    ld c, (hl)      ; white piece value
    res 5, c        ; uncolor white piece; pih

    ; origin attacked square (7B)
evaato  ld a, b         ; target piece always counts
    ld h, boaoph        ; H(L): attacked board base, L: unchanged ++
    bit 7, (hl)     ; target square attacked?
    jr z, evaatt        ; not attacked, skip counting origin piece

if feamod=1         ; opt: rows 2 do not move even if attacked  
    ld a, d         ; 0rrr0ccc, add origin square     
    and $70         ; filter ranks
    cp $60          ; is rank 6?
    ld a, b         ; target piece always counts
    jr z, evaexi        ; skip this move
endif

    ; count origin piece (1B) if attacked, general case
evaatc  add a, c        ; A: 00pppppp, count white

    ; target attacked square (6B)
evaatt  ld l, e         ; H(L): point at target square
    bit 7, (hl)     ; target square attacked?
    jr z, skiato        ; if target not attacked, skip
    sub c           ; if target attacked, count white out  

    ; compensate + prioritize piece valuation(6B)
skiato  ld h, $20       ; prepare H for later rotation and use for A
    add a, h        ; A: 00pppppp, compensate=K+1, pih                                             
    rlca            ; leave space for square weight
    rlca            ; A: pppppp00, piece addition is 5 bits
    ld b, a         ; B: piece addition value
evacol  ld a, e         ; A: 0rrr0ccc
    ; these two values below can be tuned for different opening schemes
    if feamod>0
        add a, 2        ; A: 0rrr0ccc
        and 5           ; A: 00000ccc
    else
        inc a           ; A: 0rrr0ccc
        and 4           ; A: 00000cc0 (weight: 0,0,0,4,4,4,4,0)
    endif

    ; ranks weight (ranks weight is 8..1, aiming for board's end)
evarnk  add hl, hl      ; HL: 00100000 0rrr0ccc (before)
    add hl, hl      ; 
    add hl, hl      ; HL: 000000rr r0ccc000 (after)
    sub h           ; A:  00000cww (w=r+c)
    add a, b        ; total value: pieces + weight

    ; maximum value comparison (12B)
evaexi  pop hl          ; recover canli
    pop bc          ; recover previous maximum value
    cp c            ; compare with current maximum
    jr c, chonoc        ; if current eval (A) <= max eval (C), skip

    ld c, a         ; update best evaluation
    pop af          ; remove old maximum to avoid cascades in stack
                ; ### initial push to compensate?
    push de         ; push best candidates so far

chonoc  dec b           ; decrease loop counter 2 by 2.
    djnz choloo     ; loop through all candidates (canto)

    pop bc          ; recover saved values (B: origin, C: target)

; -----------------------------------------------------------------------------
; -----------------------------------------------------------------------------
;               AFTER SIDES
; -----------------------------------------------------------------------------
; -----------------------------------------------------------------------------
; move piece (8B) -------------------------------------------------------------
    ; inputs here: B: origin square, C: target square
    ; write origin square and read piece in it (4B)
aftsid  ld h, boasth        ; point at board (canlih=$83 before) ++
    ld l, b         ; point at origin square

    ; castling, rook moves, v0.800 (26B)
    ; very innacurate as it may cause false moves
if feamod>0         ; opt: castling, rook move
casroo  ld a, (hl)      ; origin piece
    add a, b        ; + origin square
    sub c           ; - target square
caslon  cp $38          ; $36(king) + $74(ori) - $72(tar)= $38, pih
    jr nz, cassho       ; no long castling
    ld l, $70       ; long castling rook square (a1)
    ld (hl), d      ; erase rook (D=0 here)
    ld l, $73       ; rook destination (d1)
    ld (hl), $25        ; move rook, pih
cassho  cp $34          ; $36(king) + $74(ori) - $76(tar)= $34, pih
    jr nz, casend       ; no short castling
    ld l, $77       ; short castling rook square (h1)
    ld (hl), d      ; erase rook (D=0 here)
    ld l, $75       ; rook destination (f1)
    ld (hl), $25        ; move rook, pih
casend
endif

if feamod>0         ; opt: special move: prom, no under-prom (12B)
    ld a, c         ; A: 0rrr0ccc
    and %01110000       ; A: 0rrr0000
    add a, (hl)     ; A: 0rrxpppp
    cp $22          ; white pawn ($22) on rank 8 ($00), pih
    ld l, b         ; restore origin square
    ld d, (hl)      ; original piece
    ld (hl), 0      ; write origin piece
    jr nz, aftdes       ; if not a pawn, skip
    ld d, $27       ; make piece a queen, pih
else                ; opt: write origin piece, no promotion (3B)
    ld d, (hl)      ; D: get origin piece
    ld (hl), 0      ; write origin piece    
endif

    ; write target square with origin piece (5B)
aftdes  ld l, c         ; (H)L: target square

    ; checkmate with exit (3B), board is not updated in screen
chkmat  bit 4, (hl)     ; captured piece is king ($16)?, pih 
    ret nz          ; (@johan_koelman) return prompt at check mate

aftnok  ld (hl), d      ; write target square
    call genlis     ; update attacked matrix after move
aftmov
; reverse board (22B)----------------------------------------------------------
revboa  ; push full board to stack (7B)
    inc h           ; H = $80 = boasth ++
    ld l, h         ; (H)L: end of board. trick: start from $8080
revlo1  dec l           ; countdown squares
    ld a, (hl)      ; read piece
    push af         ; copy piece to to stack
    jr nz, revlo1       ; loop down to beginning of the board

    ; collect board back ir reverse order + switch color (15B)
    ld l, $78       ; (H)L: end of board again
revlo2  pop af          ; collect piece from stack
    or a            ; is it an empty square?
    jr z, revski        ; if yes, skip
    xor %00100000       ; otherwise, reverse color (b5), pih
revski  dec l           ; countdown squares
    ld (hl), a      ; piece back into board
    jr nz, revlo2       ; loop until beginning of board

    jp befmov       ; back to white move, too far for jr

; -----------------------------------------------------------------------------
; -----------------------------------------------------------------------------
;               AUXILIARY ROUTINES
; -----------------------------------------------------------------------------
; -----------------------------------------------------------------------------

; genlis: generates list of legal moves (92B + 9B) ----------------------------
; it was not possible to use it in two different places, only procedure in code
genlis
bacata  ; backup attack board in reverse order, used in evaluation (13B)
    ld l, $FF       ; (H)L = $80FF (boaata-1), H always $80 
    ld de, boaopo + $78 ; DE: same thing, 1B passed end of board
bacloo  inc hl          ; HL: increase 16b counter to hop to next page
    dec e           ; E:  decrease 8b counter to hit Z flag
    ld a, (hl)      ; load attack status
    ld (hl), 0      ; clear attack status, no alternative!
    ld (de), a      ; backup attack status
    jr nz, bacloo       ; loop down to square $00
                ; exit values: DE=$8200, HL=$8177

    ; prepare environment (4B)
    inc d           ; D= $83= canlih
    xor a           ; reset
    ld (de), a      ; cantot= 0
    ld b, l         ; B= L = 77, SQUARE COUNT

    ; read piece from board (4B)
squloo  ld h, boasth        ; H: board base ++
    ld l, b         ; point at current loop square
    ld a, (hl)      ; read piece from board

    ; king castling, v0.800 (15B)
    ; only basic rule: no unmoved pieces or attacked squares check
    if feamod>0
    kincas  ld l, a     ; save A (can't use push AF, flags lost)
        add a, b    ; A: 0rrr0xxx + 000ppppp (uncolored white p.)
        cp $AA      ; king($36) at E1($74)= $AA, pih
        ld a, l     ; recover A
        jr nz, kinend   ; if no match, skip adding legal move

        ld c, $72   ; E1-C1 move, rook's move missing
        call legadd ; add king's move
        ld c, $76   ; E1-G1 move, rook's move missing
        call legadd ; add king's move and go on with king's moves
    kinend
    endif

    ; get move type and pointer to move list (6B)
squgon  dec h           ; H(L)= movlih, moves vector base ++
    add a, a        ; x4, each piece vector is 4B long
    add a, a        ;   
    ld l, a         ; (H)L points at the move vector now

    ld d, 2         ; 2 submoves per piece
subloo      ; byte 1 - move type (5B)
        ld a, (hl)      ; move type loaded
        or a            ; =cp 0, 2nd move type not used case
                    ; black/empty: move type=0 leads here
        jr z, squexi        ; ---v exit: square is done
        ld e, a         ; E: MOVE TYPE (B,C,D used here)

        ; pawn 2 squares forward - move type modified (8B)
        if feamod>0     ; opt: special move, pawn 2 sq. forward
        genpw2  add a, b    ; piece square + move type
            and %11111000   ; masked with relevant bits
            cp $88      ; $28(str.pawn)+$60(rnk 6) ### univocal
            jr nz, skppw2   ; if not, skip
            inc e       ; increase radius: 1 -> 2
        skppw2
        endif

        ; byte 2 - movlis delta (3B)
        inc hl          ; next piece sub-entry
        push hl         ; Save HL for 2nd loop  
        ld l, (hl)      ; pointer to move delta

vecloo          ; vector read (8B)
            ld c, b     ; TARGET SQUARE init
            ld a, (hl)  ; vector delta
            or a        ; =cp 0
            jr z, vecexi    ; ---v exit: vectors end with 0, next sq.
            push hl     ; save current delta
            push de     ; save move type + radius
                    ; E: variable radius within loop
            ld d, a     ; D: store delta within loop

celloo              ; prepare x88 check (7B)
                ld a, d     ; delta loaded
                add a, c    ; current target (sq. + delta)
                ld c, a     ; current target
                and $88     ; 0x88, famous OOB trick
                jr nz, vecnex   ; ---v exit: OOB, next vector

                ; read target square (3B)
                inc h       ; H(L)= $80 = boasth ++
                ld l, c     ; point at target square            
                ld a, (hl)  ; read target square content

                ; mark attacked ### str. pawn marked attacked
                    inc h       ; H(L)= $81 = boaath ++
                    ld (hl), h  ; mark attacked ($81)
                    dec h       ; H(L)= $80 = boasth ++

                dec h       ; H(L)= $79= movlih ++
                ; target is white (4B)
                bit 5, a    ; is it white?, pih
                jr nz, vecnex   ; ---v exit: WHITE b4=1, next vector

                ; target not white (3B)
                or a        ; =cp 0, is it empty?, pih
                jr z, taremp    ; if not 0, it's black: legal, no go on

tarbla              ; target is black (7B)
                bit 5, e    ; special move: pawn straight check
                jr nz, vecnex   ; ---v exit: no straight capture, next vector
                ld e, a     ; make radius=0 (=<8 in code, canonical: ld e, 0)
                jr legadj   ;

taremp              ; target is empty (14B)
                bit 4, e    ; special move: pawn on capture check
                jr nz, vecnex   ; ---v exit: no diagonal without capture, next vector     
                dec e       ; decrease radius
legadj
                if feamod=0 ; opt: legadd for basic model
                ; add candidate (B: current square, C: target square) (9B)
                    push hl
                    ld hl, canlis   ; HL: start of candidate list. No H reuse ++
                    inc (hl)    ; +2 to candidate counter to move to next
                    inc (hl)    ; first free position in list
                    ld l, (hl)  ; point at free position

                    ld (hl), b  ; 1) save origin square
                    inc hl      ; move to next byte
                    ld (hl), c  ; 2) save dest square                   
legend                  pop hl      ; recover HL=pointer to vector list
                else        ; opt: legadd call for full model
                    call legadd
                endif

                bit 3, e    ; if radius < 8 (Cb3=0), radius limit
                jr nz, celloo   ; ---^ cell loop

vecnex          ; next vector preparation (5B)
            pop de      ; DE: recover move type + radius
            pop hl      ; HL: recover current vector
            inc hl      ; HL: next vector
            jr vecloo   ; ---^ vector loop

vecexi  ; next square preparation (5B)
    pop hl          ; HL: recover pointer to sub-move list
    inc hl          ; HL: next byte, point at 2nd sub-move
    dec d           ; 2 sub-move iterations loop control
    jr nz, subloo       ; if not 2nd iteration, repeat loop
    ; end of loop (2B)      
squexi  djnz squloo     ; ---^ squares loop
    ret

; legadd: add legal move -------------------------------------------------------
if feamod>0         ; legadd for king castling
legadd              ; (B: current square, C: target square)
    push hl
    ld hl, canlis       ; HL: start of candidate list. No H reuse ++
    inc (hl)        ; +2 to candidate counter to move to next
    inc (hl)        ; first free position in list
    ld l, (hl)      ; point at free position

    ld (hl), b      ; 1) save origin square
    inc hl          ; move to next byte
    ld (hl), c      ; 2) save dest square                   
    pop hl          ; recover HL=pointer to vector list
    ;ret            ; <===== not removed with feamod=0
endif

; -----------------------------------------------------------------------------
; DATA ------------------------------------------------------------------------
; -----------------------------------------------------------------------------

; Memory page: 7700h ----------------------------------------------------------
org $7700
auxstr              ; input string stored here

; Memory page: 7E00h ----------------------------------------------------------
; used to convert values to pieces
org $7E00
if gramod=0         ; opt: space or dot depending on the size
piearr  defb '.'        ; $2B
else
piearr  defb ' '
endif
org $7E02
    defm "pnbr"     ; change this array to any language, pih
org $7E07
    defb 'q'        ; change this array to any language, pih
org $7E16
    defb 'k'        ; change this array to any language, pih

; Memory page: 7F00h ----------------------------------------------------------
; sub-moves and vectors 
org $7F00
; leave empty $00-$04-...-$24 for black pieces/empty square pointers
org $7F88           ; pawn: $22x4=$84
; piece, move type, vector list delta address (18B)
; move type / 0 / 0 / pawn straight / pawn diagonal / DDDD (real radius + 7)
movlis
pawgen  defb    $28, $E3    ; pawn straight
    defb    $18, $E7    ; pawn capture
org $7F8C
knigen  defb    $08, $EA    ;
org $7F90
bisgen  defb    $0E, $E5    ; bishop
org $7F94
roogen  defb    $0E, $E0    ; rook
org $7F9C
quegen  defb    $0E, $E0    ; queen
    defb    $0E, $E5    ;
org $7FD8
kingen  defb    $08, $E0    ; king: $($16+$20)x4=$D8
    defb    $08, $E5    ;

org $7FE0           ; vectors start at: $7FE0 (arbitrary)
; (y, x) move delta pairs (16B)
veclis
strvec  defb    $FF, $01    ; +0, straight vectors
    defb    $10, $F0    ; +3, straight pawn, last half line
org $7FE5
diavec  defb    $0F, $11    ; +5, diagonal vectors
    defb    $EF, $F1    ; +7, diagonal pawn
org $7FEA
knivec  defb    $E1, $F2    ; +10, knight vectors
    defb    $12, $21    ; knight moves listed clockwise
    defb    $1F, $0E    ;
    defb    $EE, $DF    ;
; board status: 0000000 / turn (B=0, W=1)
org $7F7F
gamsta

; Memory page: 8000h ----------------------------------------------------------
    ; board squares format: 00cppppp
    ; pppp (value) : pawn=2, knight=3, bishop=4, rook=5, queen=7, king=$16
    ; c (color): white=1, black=0
    ; initial board setup
if debmod=1         ;opt: fill board for debugging
    org $8000
    boasta  defb $00, $00, $00, $00, $00, $00, $00, $00 ; <--8
        defb $00, $00, $00, $00, $00, $00, $00, $00
        defb $00, $00, $00, $00, $02, $00, $00, $00 ; <--7
        defb $00, $00, $00, $00, $00, $00, $00, $00
        defb $00, $00, $00, $23, $00, $00, $00, $00 ; <--6
        defb $00, $00, $00, $00, $00, $00, $00, $00
        defb $00, $00, $00, $00, $00, $00, $00, $00 ; <--5
        defb $00, $00, $00, $00, $00, $00, $00, $00
        defb $00, $00, $00, $00, $00, $00, $00, $00 ; <--4
        defb $00, $00, $00, $00, $00, $00, $00, $00
        defb $00, $00, $00, $00, $00, $00, $00, $00 ; <--3
        defb $00, $00, $00, $00, $00, $00, $00, $00
        defb $00, $00, $00, $00, $00, $00, $00, $00 ; <--2
        defb $00, $00, $00, $00, $00, $00, $00, $00 
        defb $00, $00, $00, $00, $00, $00, $00, $00 ; <--1
else                ; opt: reduces board size for gameplay
    org $8000
    boasta  defb $05, $03, $04, $07, $16, $04, $03, $05 
    org $8010
        defb $02, $02, $02, $02, $02, $02, $02, $02
    org $8060           
        defb $22, $22, $22, $22, $22, $22, $22, $22
    org $8070
        defb $25, $23, $24, $27, $36, $24, $23, $25
endif

; Memory page: 8100h ----------------------------------------------------------
org $8100
boaata              ; attacked squares board

; Memory page: 8200h ----------------------------------------------------------
org $8200
boaopo              ; reversed attacked squares board

; Memory page: 8300h ----------------------------------------------------------
; candidate move list at the very end of the program 
org $8300 
canlis  equ $
````

3

> <> , 1467 বাইট

ঠিক আছে, এটি 487-বাইট রেকর্ডটি বেশ ভেঙে দেয় না ...

>   "  :W"av
"RNBQKBNR"a/
"PPPPPPPP"a/
"        "a/
"        "a/
"        "a/
"        "a/
"pppppppp"a/
"rnbqkbnr"a/
   l?!vo29.>
v?)b:i<~
\:8c*-:i:}4c*-:@g:o" "o{{oo" "o}i:o8c*-i:o4c*-
\{:"^")80g"^")-?X
\:"^")48**-
\&3[:}]$:@=3[:}]{:}=*?X&
\:"Q"=?v:"R"=?v
v      >      >&r:4[:}]$-r:4[:}]-{:?!v$:?!v~~&
 ["+-+10"]?$~137*.*731$~$?]"10+-+"[1)<    >)1
\:"Q"=?v:"B"=?v
v      >      >&$:@$:@-r$:@$:@$-{-r4[r$:@$:@+r$:@$:@+{-}]{:?!v$:?!v~~&
 )1["+-11"]?$137*.                     .*733]~~r?{"--11++"[1)<    >
 \>42b*p72b*p32b*p62b*p{{$:@$:@}}4[r
 >$zz$zz$:@{:}=$:@5[:}]=*?v$:@$:@g" "-?X
               .+9*a29$]~~<
\&$:@{:}-:*$:@5[:}]-:*+&
\:"N"=?v
  X?-5&<v
\:"K"=?v
  X?)3&<v
  )-?vX >$:@$:@g:" "=?v"^")80g"^"
     >049*.*942      ~<
\:"P"=?v
 )?X:1=\&~$:@{:}-:*$:@5[:}]80g"^")?$-:2
X      \?v2-?X?X$:@$:@80g"^"(2*1--g" "-?Xv
         >~:?v?X                         >$:@$:@g" "-?Xv
  @@?$~&049*.>1-?X$:@$:@g:" "=?X"^"(80g"^"(=?X         >:880g"^")7*-=&"Q"
\>&80g"^"):&48**+@p" "@p0
>:8%1+$:8,:1%-1+$}$:@$:@g"Kk"&:&?$~=?v~~1+:88*=?X
v                {{1030014103431434~{<
>l2=?v$:@$:@}}$@+2-a%@+2-a%$g"nN"&:&?$~=?X{{
\    >0010200121021222{{
>l2=?v$:@$:@}}$@+1-@+1-$g"kK"&:&?$~=?X{{
v    >$:@1+$:@&:&2*1--g"pP"&:&?$~=?X$:@1-$:@&:&2*1--g"pP"&:&?$~=?X
\"10++r10-+r01++r01+-r11++b11+-b11-+b11--b"
>l2=?v48*4a*6+p44*4a*6+p74a*6+\
   /} }@:$@:${{p+6*a46p+6*a4fp/
 -?\$ zz:9%?!v$zz:9%?!v$:@$:@g:"y"&:&48**-=?X:"q"&:&48**-=?X" "
^~~<         <        <
v    >~~"bW"&?$~80paaoo

এটি মাছের খেলার মাঠে চেষ্টা করে দেখুন ! (এটি সেই দোভাষীটিতে কয়েকটি বাগ ব্যবহার করেছে, সুতরাং আমি এটি প্রতিশ্রুতি দিতে পারি না যে এটি অন্য কোথাও কাজ করবে You আপনি সম্ভবত এটি সর্বোচ্চ গতিতে চালাতে চাইবেন - একটি চালনা করতে এক মিনিট সময় লাগতে পারে))

আপনি কোডটি চালানোর সময় এটি মুদ্রণ করা হবে

rnbqkbnr
pppppppp




PPPPPPPP
RNBQKBNR

W:  

বড় বড় অক্ষরগুলি সাদাকে উপস্থাপন করে, ছোট হাতকে কালো উপস্থাপন করে। এর পরে আপনি আকারে ইনপুট হিসাবে আপনার পদক্ষেপ দিতে পারেন [a-h][1-8][a-h][1-8], যেমন e2e4অর্থ "এ টুকরা সরানো, e2থেকে e4"। প্রোগ্রামটি মুদ্রণ করবে, উদাহরণস্বরূপ,

W:  P e2 e4

rnbqkbnr
pppppppp


    P   

PPPP PPP
RNBQKBNR

b:  

> <> মেমরির মূল ফর্মটি স্ট্যাক; তবে, দাবা বোর্ড সংরক্ষণের জন্য এটি খুব ব্যবহারিক নয়। পরিবর্তে, আমি সোর্স কোডের অংশ হিসাবে দাবা বোর্ডটি সংরক্ষণ করার জন্য gএবং এর সাথে অ্যাক্সেস করার জন্য> <> এর স্ব-পরিবর্তনকারী ক্ষমতা ব্যবহার করেছি p

কোডের বেশিরভাগ অংশটি আপনার পদক্ষেপ বৈধ কিনা তা পরীক্ষা করা। এখানে চেক করার জন্য বেশ কয়েকটি জিনিস রয়েছে:

  • আপনি কি এমন কোনও টুকরো সরানোর চেষ্টা করছেন যা সত্যই বিদ্যমান, এবং এটি কি আপনার (লাইন 12, 0-সূচিযুক্ত)?
  • শুরু এবং শেষের স্কোয়ারগুলি কি আলাদা (লাইন 14)?
  • প্রকারের টুকরোটির জন্য কি সঠিক পদক্ষেপে পদক্ষেপ নেওয়া হয়েছে (রোক এবং রানির জন্য অরথগোনাল, লাইন 15-17; বিশপ এবং রানির জন্য ত্রিভুজ, লাইন 18-22; নাইটের জন্য এল-আকারের, লাইন 24-26; রাজার জন্য 1 বর্গক্ষেত্র) , লাইন 27-28; বা একটি গিরিচাটি সরানো, লাইনগুলি 31–35)?
  • শুরু এবং শেষের মধ্যবর্তী বর্গগুলি কি সমস্ত খালি আছে (রোক, বিশপ, রানী - 21-23 লাইনগুলির জন্য)?
  • লক্ষ্য স্কোয়ারটি খালি বা শত্রু দ্বারা দখল করা হয়েছে (লাইন 29-30)?
  • আপনি কি সরানোর পরে পরীক্ষা করছেন (লাইন 36–47)?

যদি এই প্রশ্নের কোনওটিরও উত্তর থাকে তবে প্রোগ্রামটি একটি ত্রুটি ফেলে এবং থামিয়ে দেয়; অন্যথায়, এটি তার উত্স কোডে দাবাবোর্ড সম্পাদনা করে, এটি আবার মুদ্রণ করে এবং পরবর্তী পদক্ষেপের জন্য অপেক্ষা করে।

রাজা এবং নাইট পদক্ষেপের জন্য, আমি লেভেল রিভার সেন্টের স্কোয়ারড ইউক্লিডিয়ান দূরত্ব পরীক্ষা করার কৌশলটি ধার করেছিলাম: একজন রাজার জন্য এটি 3 এরও কম, এবং একটি নাইটের জন্য, এটি ঠিক 5।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.