যখন FEN পদটি আইনী হয় তখন কীভাবে জানবেন?


19

আমি একটি ব্যক্তিগত প্রকল্প করছি, যেখানে এক পর্যায়ে আমাকে FEN অবস্থানটি যাচাই করতে হবে, আমি কিছু বেসিক চেকগুলি দিয়ে শুরু করেছি যেমন রাজা আছে কিনা তা পরীক্ষা করে দেখুন এবং কোনও অতিরিক্ত সারি বা কলাম নেই কিনা তা নিশ্চিত করা এবং সেই ধরণের জিনিস।

তবে FEN আইনী হওয়ার বিষয়টি নিশ্চিত করার জন্য আমার অন্যান্য চেকগুলি কী করা উচিত?

উত্তর:


18

এখানে একটি সুসংগঠিত তালিকা যা সাধারণ অবস্থানগুলির 99.99% + কে বৈধতা দেবে:

বোর্ড:

  • ঠিক 8 টি কলস আছে
  • খালি স্কোয়ার এবং টুকরাগুলির যোগফল প্রতিটি র‌্যাঙ্কের জন্য 8 টি যোগ করে (সারি)
  • খালি স্কোয়ারের জন্য পরপর কোনও সংখ্যা নেই

কিংস:

  • দেখুন ঠিক এক w_king এবং একটি b_king আছে কিনা
  • নিশ্চিত হন যে রাজারা 1 বর্গক্ষেত্র পৃথক করে রেখেছেন

চেক:

  • নিষ্ক্রিয় রঙ না চেক
  • সক্রিয় রঙ 3 বারেরও কম চেক করা হয় (ট্রিপল চেক অসম্ভব); ২ এর ক্ষেত্রে এটি কখনই প্যাড + নয় (প্যাড, বিশপ, নাইট), বিশপ + বিশপ, নাইট + নাইট

pawns:

  • প্রতিটি রঙ থেকে 8 টিরও বেশি प्याদ নেই
  • প্রথম বা শেষ র‌্যাঙ্কে (সারি) কোনও পাউন্ড নেই যেহেতু তারা হয় কোনও ভুল শুরুর অবস্থানে রয়েছে বা তাদের প্রচার করা উচিত ছিল।
  • এন পাসেন্ট বর্গক্ষেত্রের ক্ষেত্রে; এটি আইনানুগভাবে তৈরি করা হয়েছে কিনা তা দেখুন (উদাহরণস্বরূপ এটি অবশ্যই x3বা x6র‌্যাঙ্কের উপরে থাকতে হবে, অবশ্যই এর সামনে অবশ্যই একটি প্যাড থাকতে হবে (অবশ্যই সঠিক রঙ থেকে), এবং পাশের চৌকোটি এবং এর পিছনের অংশটি খালি)
  • নিখোঁজ পাঁজা (যেমন extra_pieces = Math.max(0, num_queens-1) + Math.max(0, num_rooks-2)...এবং তারপরে extra_pieces <= (8-num_pawns)) এর চেয়ে বেশি প্রচারিত টুকরো থাকা রোধ করুন , বিশপদের জন্য আপনার বিশেষ গণনা করা উচিত, যদি আপনার একই বর্গাকার রঙের দুটি (বা আরও) বিশপ থাকে তবে এগুলি কেবল পদ্ম প্রচারের মাধ্যমে তৈরি করা যেতে পারে এবং আপনার অন্তর্ভুক্ত করা উচিত একরকম উপরে সূত্র এই তথ্য
  • পদ্মার গঠনটি পৌঁছানো সম্ভব (উদাহরণস্বরূপ, একক কোলে একাধিক পাউন্ডের ক্ষেত্রে, সেই গঠনটি তৈরি করতে যথেষ্ট শত্রু টুকরা থাকতে হবে), এখানে কয়েকটি দরকারী নিয়ম রয়েছে:
    1. একটি একক ফাইলে (কলাম) than টিরও বেশি জলদস্যু হওয়া অসম্ভব (কারণ प्या এবং প্রথম এবং শেষ র‌্যাঙ্কে অস্তিত্ব থাকতে পারে না)
    2. একক কর্নে একাধিক পয়সা পৌঁছানোর জন্য সর্বনিম্ন শত্রু নিখোঁজ টুকরো B to G 2=1, 3=2, 4=4, 5=6, 6=9 ___ A and H 2=1, 3=3, 4=6, 5=10, 6=15, উদাহরণস্বরূপ, আপনি যদি এ বা এইচ-তে 5 টি পয়সা দেখেন তবে অন্য খেলোয়াড়কে তার 15 টি ধারণযোগ্য টুকরো থেকে কমপক্ষে 10 টুকরা মিস করতে হবে
    3. যদি এ 2 এবং এ 3-তে সাদা পাউন্ড থাকে, তবে আইনসম্মতভাবে বি 2-তে কোনওটি থাকতে পারে না, এবং আরও সম্ভাবনা coverাকতে এই ধারণাটি আরও বাড়ানো যেতে পারে

Castling:

  • যদি রাজা বা কুরুচি তাদের প্রথম অবস্থানে না থাকে; পাশের theালাইয়ের ক্ষমতাটি নষ্ট হয়ে গেছে (রাজার ক্ষেত্রে, উভয়ই হারিয়েছে)

বিশপ:

  • প্রথম এবং শেষ র‌্যাঙ্কগুলিতে বিশপদের সন্ধান করুন (সারিগুলি) জঞ্জালগুলির দ্বারা আটকে থাকা উদাহরণস্বরূপ:
    1. একটি বিশপ (যে কোনও রঙ) 3 জনের পিছনে আটকে আছে
    2. একটি বিশপ ২ টি শত্রুবিহীন পাউডারদের পেছনে আটকা পড়েছে ( শত্রু পাউন্ড দ্বারা নয়, কারণ আমরা পাতালের সংখ্যাটি পরীক্ষা করে যদি এই অবস্থানে পৌঁছতে পারি এবং extra_piecesআমরা নির্ধারণ করতে পারি যে এই মামলা সম্ভব কিনা)

অ মাথা গলান জামাবিশেষ:

  • (আপনি যদি ফিশারের দাবা বৈধতা পেতে চান তবে এটি এড়ান) যদি রাজা এবং নড়বড়েদের মধ্যে নন-জাম্পার শত্রু টুকরা থাকে এবং সরানো ছাড়া কিছু পশম এখনও রয়েছে; এই শত্রু টুকরা আইনত সেখানে পেতে পারে কিনা তা পরীক্ষা করুন। এছাড়াও, নিজেকে জিজ্ঞাসা করুন: রাজা বা পলাতক কি সেই অবস্থান তৈরি করতে যাওয়ার দরকার ছিল? (যদি হ্যাঁ, কাস্টিংয়ের ক্ষমতাগুলি এটি প্রতিফলিত করে তা আমাদের নিশ্চিত করা দরকার)
  • যদি সমস্ত 8 পাউন এখনও শুরুর অবস্থানে থাকে, সমস্ত নন-জাম্পাররা অবশ্যই তাদের প্রাথমিক পদ ছাড়তে হবে না (এছাড়াও নন-জাম্পার শত্রু টুকরা সম্ভবত আইনত প্রবেশ করতে পারে না), অন্যান্য অনুরূপ ধারণা রয়েছে যেমন হোয়াইট এইচ -পাহা একবার সরানো হয়েছে, ছদ্মবেশগুলি এখনও পদ্মার গঠনের অভ্যন্তরে আটকা উচিত etc.

অর্ধ / সম্পূর্ণ পদক্ষেপের ঘড়ি:

  • কোনও উত্তীর্ণ বর্গক্ষেত্রের ক্ষেত্রে, অর্ধ সরানো ঘড়িটি অবশ্যই 0 এর সমান হবে
  • HalfMoves <= ((FullMoves-1)*2)+(if BlackToMove 1 else 0), +1 বা + 0 সরানোর জন্য পাশের উপর নির্ভর করে
  • হাফমোভগুলি অবশ্যই হবে x >= 0এবং ফুলমোভগুলিx >= 1

অন্য:

  • নিশ্চিত করুন যে FEN- এ প্রয়োজনীয় সমস্ত অংশ রয়েছে (যেমন সক্রিয় রঙ, কাস্টলিং ক্ষমতা, উত্তীর্ণ চৌকো ইত্যাদি)

নোট: করতে কোন প্রয়োজন নেই 'খেলোয়াড়দের চেয়ে বেশি 16 টুকরা থাকা উচিত নয়' চেক কারণ পয়েন্ট 'চেয়ে বেশি কোন 8 দাবার গুটির' + + 'অতিরিক্ত উন্নীত টুকরা প্রতিরোধ' + + 'ঠিক এক রাজা' ইতিমধ্যেই এই বিন্দু আবরণ উচিত

Note2: এই নিয়ম স্বাভাবিক দাবা শুরু অবস্থানে থেকে উদ্ভূত বৈধকরণ অবস্থানের উদ্দেশ্য, বিধি কয়েকটি থেকে কিছু পদ বাতিল হবে Chess960 (ব্যতিক্রম যদি ব্যবস্থা Nº518 থেকে শুরু) এবং উত্পন্ন পাজল তাই তাদের এড়ানোর একটি কার্মিক যাচাইকারী জন্য।


1
আপনি পদ্ম কাঠামোটিও পরীক্ষা করে দেখতে পারেন, উদাহরণস্বরূপ সাদা प्यादे কখনও এ 2, এ 3 এবং বি 2 তে থাকতে পারে না; A3 এবং b2 উভয় দিকেই মহিমা থাকতে পারে এমন কোনও উপায় নেই।
আকাওয়াল

তার মানে কি বলা যায় যে প্রাথমিক স্তরের অবস্থান থেকে কেবল FEN পদগুলি অর্জনযোগ্য হবে? যদি আমি কোনও এফএন দ্বারা প্রতিনিধিত্ব করা ধাঁধা অবস্থানগুলি পেতে চাই? কখনও কখনও
এগুলিকে এমনভাবে তৈরি করা

@tbischel আমি এই নিয়মগুলি সাধারণ দাবা দৃষ্টিকোণ থেকে তৈরি করছি (দাবা 960 বা অন্যান্য উত্পন্ন পজিশনের উদ্দেশ্যে নয়), ধন্যবাদ আমি এটিকে আরও পরিষ্কার করার জন্য কোথাও এটি উল্লেখ করতে পারি
এজাক্স 333221

এমনকি সাধারণ দাবাতেও আপনি এই সমস্ত চেক করতে না চাইতে পারেন। আপনি এমন একটি প্রোগ্রাম শেষ করেছেন যা FEN হিসাবে অবৈধ অবস্থানের প্রতিনিধিত্ব করতে পারে না। তবে সেগুলি বাস্তবে ঘটে - অবৈধ পদক্ষেপগুলি কখনও কখনও কেবল খেলার পরে লক্ষ্য করা যায়। এই জাতীয় গেমগুলি থেকে ডায়াগ্রামগুলি দেখানো কি অসম্ভব?
রিমকো জারলিচ

1
@ ajax333221: এই পৃষ্ঠাটি যা হোয়াইট নেভিগেশন 5 জনের বেশী দাবার গুটির পায় আইনি গেম দেয় aফাইল।

10
\s*([rnbqkpRNBQKP1-8]+\/){7}([rnbqkpRNBQKP1-8]+)\s[bw-]\s(([a-hkqA-HKQ]{1,4})|(-))\s(([a-h][36])|(-))\s\d+\s\d+\s*

এখানে একটি নিয়মিত প্রকাশ যা আমি FEN স্ট্রিংটি আসলে বৈধ কিনা তা নিশ্চিত করতে ব্যবহার করি। এটি আইনী / অবৈধ অবস্থানের জন্য কোনও পরীক্ষা করে না, তবে এটি একটি ভাল সূচনার পয়েন্ট।


আমি মনে করি যে সক্রিয় রঙটি একটি আবশ্যক (আপনি অনুমতি দিচ্ছেন -) এবং অর্ধ / পূর্ণ ঘড়ি কখনও কখনও alচ্ছিক বলে মনে করি। a-h/^\s*([rnbqkpRNBQKP1-8]+\/){7}([rnbqkpRNBQKP1-8]+)\s[bw]\s(-|K?Q?k?q?)\s(-|[a-h][36])/
কাস্টিংয়ের

আমি কেবল লক্ষ করেছি যে আমরা "প্রমোশন র্যাঙ্কে কোনও ([rnbqkRNBQK1-8]+\/)([rnbqkpRNBQKP1-8]+\/){6}([rnbqkRNBQK1-8]+) ....
পাউন্ডস

এছাড়াও ঘড়ির জন্য এটি ভাল হতে পারে (0|[1-9][0-9]*)\s([1-9][0-9]*)কারণ
চালগুলি

5

অন্যদের জন্য স্টকফিশ ইঞ্জিনে একটি সাধারণ ফাংশন রয়েছে যা একটি FEN স্ট্রিংকে বৈধতা দেয়।

bool Position::is_valid_fen(const std::string &fen) {
   std::istringstream iss(fen);
   std::string board, side, castleRights, ep;

   if (!iss) return false;

   iss >> board;

   if (!iss) return false;

   iss >> side;

   if (!iss) {
      castleRights = "-";
      ep = "-";
   } else {
      iss >> castleRights;
      if (iss)
         iss >> ep;
      else
         ep = "-";
   }

   // Let's check that all components of the supposed FEN are OK.
   if (side != "w" && side != "b") return false;
   if (castleRights != "-" && castleRights != "K" && castleRights != "Kk"
       && castleRights != "Kkq" && castleRights != "Kq" && castleRights !="KQ"
       && castleRights != "KQk" && castleRights != "KQq" && castleRights != "KQkq"
       && castleRights != "k" && castleRights != "q" && castleRights != "kq"
       && castleRights != "Q" && castleRights != "Qk" && castleRights != "Qq"
       && castleRights != "Qkq")
      return false;
   if (ep != "-") {
      if (ep.length() != 2) return false;
      if (!(ep[0] >= 'a' && ep[0] <= 'h')) return false;
      if (!((side == "w" && ep[1] == '6') || (side == "b" && ep[1] == '3')))
         return false;
   }

   // The tricky part: The board.
   // Seven slashes?
   if (std::count(board.begin(), board.end(), '/') != 7) return false;
   // Only legal characters?
   for (int i = 0; i < board.length(); i++)
      if (!(board[i] == '/' || (board[i] >= '1' && board[i] <= '8')
            || piece_type_is_ok(piece_type_from_char(board[i]))))
         return false;
   // Exactly one king per side?
   if (std::count(board.begin(), board.end(), 'K') != 1) return false;
   if (std::count(board.begin(), board.end(), 'k') != 1) return false;
   // Other piece counts reasonable?
   size_t wp = std::count(board.begin(), board.end(), 'P'),
      bp = std::count(board.begin(), board.end(), 'p'),
      wn = std::count(board.begin(), board.end(), 'N'),
      bn = std::count(board.begin(), board.end(), 'n'),
      wb = std::count(board.begin(), board.end(), 'B'),
      bb = std::count(board.begin(), board.end(), 'b'),
      wr = std::count(board.begin(), board.end(), 'R'),
      br = std::count(board.begin(), board.end(), 'r'),
      wq = std::count(board.begin(), board.end(), 'Q'),
      bq = std::count(board.begin(), board.end(), 'q');
   if (wp > 8 || bp > 8 || wn > 10 || bn > 10 || wb > 10 || bb > 10
       || wr > 10 || br > 10 || wq > 9 || bq > 10
       || wp + wn + wb + wr + wq > 15 || bp + bn + bb + br + bq > 15)
      return false;

   // OK, looks close enough to a legal position. Let's try to parse
   // the FEN and see!
   Position p;
   p.from_fen(board + " " + side + " " + castleRights + " " + ep);
   return p.is_ok(true);
}

1
দেখে মনে হচ্ছে সমস্ত আসল বৈধতা এখানে সম্পন্ন হয়েছে position.is_okay()। এটি কোডটি সঠিকভাবে ফর্ম্যাট হয়েছে এবং এটি সত্যিকারের বৈধতা (যেমন স্পষ্টত অবৈধ নয়) তা নিশ্চিত করার জন্য কেবল কোডটি বেশ কয়েকটি বেসিক চেক করে ।
আন্ডারগ্রাউন্ডোমোনাইল

4

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

function is_legal_state(state,move)

   //Terminate if a starting state was found. This immediately implies there
   //was a legal game that generated this state, in fact the backtracking
   //can tell you precisely such a game       
   if (state in starting board state)
     return true

   //Apply some move to get to a new state, state is a persistent object
   apply_reverse_move(state,move)

   //Generate all legal "reverse" moves, that is, moves that could have
   //been performed to get to the current state from another position,
   //provided the previous position was valid. You do not have to check the
   //validness of the previous state, you just have to make sure the
   //transitioning move was valid
   legalmoves = enumerate_all_reverse_moves( state )

   for local_move in legalmoves:
     return is_legal_state(state,local_move)

   //Reverse the move that was previously applied so backtracking can
   //work properly 
   reverse_reverse_move(state,move)

   return false

1

এফএন স্পেসিফিকেশনে এমন কিছু নেই যা বলছে যে উপস্থাপিত অবস্থানটি প্রাথমিক অ্যারে থেকে পৌঁছতে হবে। প্রারম্ভিক অ্যারে থেকে প্রদত্ত অবস্থানটি পৌঁছনীয় তা প্রমাণ করা একটি অমীমাংসিত সমস্যা।

একটি বৈধ FEN স্ট্রিংয়ে, অর্ধিক সরানো গণনাটি অবশ্যই এন পাসেন্ট টার্গেট স্কোয়ারের সাথে একমত হতে হবে; যদি একটি লক্ষ্য বর্গ উপস্থিত থাকে, তবে অর্ধে সরানো গণনাটি অবশ্যই শূন্য হতে হবে। অর্ধ সরানো গণনাও অবশ্যই পূর্ণ পদক্ষেপের সাথে একমত হতে হবে; উদাহরণস্বরূপ, দশটির অর্ধেক সরানো গণনা তিনটির সম্পূর্ণ চলন সংখ্যার সাথে সঙ্গতিপূর্ণ নয়।


1

দেরিতে পার্টিতে আসছি।

কোনও অবস্থান আইনী কিনা 100% যাচাই করা সম্ভব নয়, তবে কেন বৈধতার বিষয়টি বিবেচনা করা উচিত? শুরুর অবস্থানটি (তথাকথিত "গেম অ্যারে") থেকে উদ্ভূত হয় কিনা তা আমরা দাবা খেলতে পারি। বিশ্লেষণের জন্য খুব আকর্ষণীয় অবস্থান থাকতে পারে তবে এটি কেবল অবৈধভাবেই ঘটে।

সুতরাং আমি ঠিক পরীক্ষা করতে হবে:

  • প্রতিটি পক্ষ থেকে ঠিক 1 জন রাজা আছে?
  • প্রথম বা অষ্টম র‌্যাঙ্কে কোনও পাউন্ড নেই?
  • পার্শ্বটি কি চেক দিচ্ছে না ইতিমধ্যে?

যদি এটি তিনটি হ্যাঁ হয় তবে আমরা এই চিত্রটি থেকে দাবা ফরোয়ার্ড খেলতে পারি। এমনকি শর্তগুলির এই সংক্ষিপ্ত তালিকাটি আমরা ooিলা করতে সক্ষম হতে পারি।

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