দাবা টাইল রং করার জন্য মার্জিত সমাধান


19

আমি জাভাতে লিখেছিলাম একটি দাবা খেলা পুনরায় বিকাশ করছি এবং আমি ভাবছিলাম যে একটি সংখ্যাযুক্ত দাবা বোর্ডে দাবা টাইলগুলি রঙ করার জন্য একটি মার্জিত অ্যালগরিদম আছে কিনা।

এই মুহুর্তে আমার সমাধানটি টাইলটি সমান বা বিজোড় সারিতে রয়েছে কিনা তা নির্ধারণ করতে এবং যদি এটি হালকা বা গা dark় বর্গক্ষেত্র হওয়া উচিত তবে তার উপর ভিত্তি করে অন্য বিবৃতি ব্যবহার করে।


এত মৌলিক কিছু করার জন্য আপনার কেন আরও মার্জিত আলগোরিদিম দরকার? শুধু কৌতূহল নাকি ...?
এসএসবি

5
সত্যি সত্যি আমি কৌতূহলী।
আমির আফগানি

উত্তর:


40

আপনি যে সূচকগুলি rowcolumnসূচকগুলি পেয়েছেন তা প্রদত্ত আমি সবচেয়ে মার্জিত উপায়টি নিম্নলিখিত:

bool isLight = (row % 2) == (column % 2);

বা, বিপরীতে:

bool isDark = (row % 2) != (column % 2);

মূলত, দাবাবোর্ডে একটি টাইল হালকা যেখানেই কলাম এবং সারি উভয়ই একে অপরের সাথে বিজোড় এবং এমনকি অন্যদিকে অন্ধকার।


4
খুব সুন্দর সমাধান। যদিও আপনার মন্তব্য বিভ্রান্ত করছে: "কলাম এবং সারি উভয়ই সমান যেখানেই দাবাবোর্ডের টাইল হালকা"। এটি সত্য নয় .. ধরে নিন সারিটি 3 এবং কলামটি 5 (উভয়ই অসম ) 3 % 2 == 1এবং 5 % 2 == 1.. সুতরাং উভয়ই অসম তবে রঙিন "হালকা" হবে। আপনার সমাধানটি ভুল বলে বলছেন না (এটি ভাল, কারণ এটি প্যাটার্নটির বিকল্প হবে) তবে আপনার মন্তব্য / ব্যাখ্যাটি ভুল বলে মনে হচ্ছে।
bummzack

ওফস, @ এমবিজ্যাকটি সন্ধান করার জন্য ধন্যবাদ। উত্তর আপডেট করেছেন।
কেভিনটোডিসকো

এটি লাগানোর একটি দুর্দান্ত উপায় সম্ভবত এটি একটি টাইল বলা হালকা যতক্ষণ তার সমন্বয়কারীদের সমতুল্যতা থাকে।
ver

34
bool isLight = ((row ^ column) & 1) == 0;

XOR একসাথে সারি এবং কলাম সূচকগুলি এবং কমপক্ষে-তাত্পর্যপূর্ণ বিটটি দেখুন। সারি বা কলাম সূচক এক দ্বারা পরিবর্তন করলে ফলাফলটি উল্টে যাবে, তাই এটি একটি পরীক্ষক বিন্যাস উত্পন্ন করে।


5
^ভাল, কিন্তু +সমানভাবে ভাল কাজ করে। :)
ক্রিস বার্ট-ব্রাউন

2
যে বিষয়টি জন্য, -কাজ করে। :)
ট্রেভর পাওয়েল

2
বিট অপারেশন ftw :)
মাইক ক্লক

3
অন্যদের পছন্দ করুন, কারণ এটি "অপঠনযোগ্য" (আমি বিট অপারেশন জানি, এর অর্থ এটি রক্ষণাবেক্ষণযোগ্য নয়)
ম্যাটসেম্যান

22

অন্য একটি পরামর্শ, খুব সোজা:

isLight = (row + column) % 2 == 0;

সারি এবং কলাম যুক্ত করা উপরের-বাম টাইল থেকে অনুভূমিক এবং উল্লম্ব পদক্ষেপের সংখ্যা দেয়।

এমনকি পদক্ষেপের সংখ্যা হালকা রঙ দেয়।
বিজোড় সংখ্যাগুলির ধাপগুলি গা dark় রঙ দেয়।


মূলত নাথনের উত্তর ঠিক একইভাবে লেখা।
এপিআই-বিস্ট

@ মিঃ বিস্ট: যদি এর পরে বিশেষত অনুকূলিত না হয় তবে তার & 1চেয়ে অনেক বেশি দক্ষ হতে চলেছে % 2। তবে সাধারণভাবে আমি একমত।
LarsH

1
@ লার্শ সংকলক এই ধরণের জিনিসগুলির যত্ন নেয় (বা কমপক্ষে এটি হওয়া উচিত)
neeKo

@ লার্শ আমি পাঠের জন্য লক্ষ্য করছিলাম, গতি নয়। তবে এতে তেমন কিছু নেই। আমি নিশ্চিত নই যে দুজনের মধ্যে গতির পার্থক্যটি "প্রচুর" হিসাবে বিবেচিত হতে পারে যখন আমরা জানি এটি কেবলমাত্র 64৪ বার বলা হবে এবং আমি ভাবতে চাই যে আধুনিক সংকলক যেভাবেই অভিন্ন বাইনারি তৈরি করবে।
ক্রিস বার্ট-ব্রাউন

@ ক্রিস: আমি% অপারেশন এর দক্ষতার কথা বলছিলাম, যে বার এটি বলা হয় তার দ্বারা প্রভাবিত হয় না। তবে আমি একমত, প্রোগ্রামের গতিতে ব্যবহারিক পার্থক্যের সম্ভাবনা নেই, এবং সম্ভাব্য গতির উন্নতির তুলনায় পাঠযোগ্যতার গুরুত্ব সম্পর্কে আমিও একমত।
LarsH

4

এটি অনুমান করে যে আমাদের স্কোয়ারগুলি [0..63] পরিসরে সংখ্যাযুক্ত।

bool IsLight(int i)
{
    return 0!=(i>>3^i)&1;
}

এটি কেন কাজ করে তা নির্ধারণ করা অর্ধেক মজা। :)


আকর্ষণীয় পদ্ধতির। তবে এটি আপনাকে একটি বুলিতে নামার জন্য কী কী রিটার্ন ভ্যালুতে কিছু করতে হবে না return (i>>3 ^ i) & 1 != 0? জাভা কি পূর্ণসংখ্যার অন্তর্নিহিত রূপান্তরকে বুলিয়ানের অনুমতি দেয়?
LarsH

আহ, আপনি ঠিক বলেছেন; আমি সরাসরি "জাভা" বিট পড়েছি এবং উত্তরটি সি ++ সম্পর্কে ভেবে লিখেছিলাম। আমার উত্তর সম্পাদনা করা হচ্ছে।
ট্রেভর পাওয়েল

এটি স্পষ্টতই সেরা বোর্ড।
টমাস

1
এই পদ্ধতিটি আমার কাছে পার্লকে যেভাবে আবেদন করে me এই ধরণের সংক্ষিপ্ত অজান্তীয়তা লিখতে সবসময় মজাদার। ডিবাগ করতে কম মজা।
ট্রেভর পাওয়েল

2
  1. টাইলস সংখ্যা। সারি * 8 + কলাম বা অনুরূপ কিছু গণনা করে আপনি এই তথ্যটি অর্জন করতে পারেন।

  2. গ্রিড সংখ্যার মডুলাস 16 নিন। (টাইলগুলির পুনরাবৃত্তি হওয়ার আগে 16 টি অবস্থান রয়েছে))

  3. টাইলটির যদি একটি বা একটি বিজোড় সংখ্যা থাকে তার ভিত্তিতে রঙ করুন। ফলাফলটি 7 এর বেশি হলে টাইলের রঙ ফ্লিপ করুন।

শূন্য-ভিত্তিক সূচকগুলির জন্য কোড:

int cellNum = (row*8+column) % 16;
bool isSecondRow = cellNum > 7;
if(cellNum % 2 == 0 ^ isSecondRow){ //XOR operator
    setColor(Color.White);
}else{
    setColor(Color.Charcoal);
}

কেন আপনি দ্বিতীয় সারিতে একক হন? এটি 8 টি সারির জন্য কাজ করা উচিত
আমির আফগানি

1
আমি আপনার প্রশ্ন বুঝতে পারি না। modulus 16অপারেশন দুই সারি সমস্যা হ্রাস করা হয়। দ্বিতীয় সারিতে প্রথমটির চেয়ে আলাদা প্যাটার্ন অনুসরণ করা হয়। ifবিবৃতি একমাত্র সত্য মূল্যায়ণ, তবে হয় এটিকে দ্বিতীয় সারির কোনো এমনকি-সংখ্যাযুক্ত টালি XOR হয়। যদি উভয়ই সত্য হয় তবে এটি মিথ্যাতে মূল্যায়ন করে। এক্সওআর
জিম

1
IsSecondRowসত্যিই নামকরণ করা উচিত ছিল IsEvenRow। সারিটির স্বল্প বিট পাওয়ার এটি একটি বিভ্রান্তিকর উপায়: প্রথমে সারি 3 পজিশনের বিটগুলি ডানে সরিয়ে দিন, তারপরে সারির এলএসবি বাদে সমস্ত ফেলে দিন, তারপরে চতুর্থ বিট সেলেনাম সেট করা আছে কিনা তা পরীক্ষা করে দেখুন।
এমএসএলটাররা

আমি দেখি. উত্তরের জন্য +1।
আমির আফগানি

কেন কমনীয়তা সর্বদা সর্বোত্তম সমাধান হয় না তার একটি ভাল উদাহরণ। ;)
জিম

0

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

যদি আমি এটির সাথে যতদূর যেতে পারি এবং দাবা বোর্ডে যতটা সম্ভব প্যাটার্নটি পুনরায় ডিজাইন করা সহজ করে তুলি তবে আমি এখানে যা করব:

1) আমি এমন একটি ফাইল তৈরি করব যা দাবা বোর্ডের প্রতিটি স্কোয়ারের রঙটি নির্দেশ করে।

উদাহরণস্বরূপ, আমি এমন একটি ফাইল তৈরি করতে পারলাম chess_board_pattern.configযা দেখে মনে হচ্ছে:

bwbwbwbw
wbwbwbwb
bwbwbwbw
wbwbwbwb
bwbwbwbw
wbwbwbwb
bwbwbwbw
wbwbwbwb

2) আমি একটি ক্লাস / উপাদান / যা এই ফাইলটি পড়তে পারে এবং বোর্ডের প্যাটার্নকে উপস্থাপন করে এমন কোনও ধরণের অবজেক্ট তৈরি করতে পারে তা লিখব:

public class BoardPattern {
    private Color[][] pattern;

    public BoardPattern(File patternFile)
    {
        pattern = new Color[8][8];
        //Parse the file and fill in the values of pattern
    }

    public Color[][] getPattern {
        return pattern;
    }
}

3) আমি তখন সেই ক্লাসটি ফাংশনে ব্যবহার করব যা বোর্ডটি অঙ্কন করে।

File patternFile = new File("chess_board_pattern.ini");
Color[][] pattern = new BoardPattern(patternFile).getPattern();
ChessBoardDrawable chessBoard = new ChessBoardDrawable();

for(int row = 0; row < 8; row++) {
    for(int column; column < 8; column++) {
        chessBoard.drawSquare(row, column, Color[row][column]);
    }
}

আবার এটি একটি দাবা বোর্ডের জন্য প্রয়োজনীয়ের চেয়ে অনেক বেশি শক্ত। আমি সাধারণভাবে মনে করি, যদিও আরও জটিল প্রকল্পগুলিতে কাজ করার সময়, কোডটি লেখার পরিবর্তে এর পরে সাধারণ সমাধান করা ভাল যা পরে পরিবর্তন করা শক্ত।


8
আপনার এটিকে .dailywtf.com এ পোস্ট করা উচিত । :)
অবাকর

11
পর্যাপ্ত উদ্যোগ নয়, আরও এক্সএমএল প্রয়োজন।
ম্যাক্সিমাস মিনিমাস

3
হ্যালো, কেভিন আপনি লিখেছেন The one-liners used in answers so far would have to be re-written.তবে এটিও it's best to come up with generalized solutions like this instead of writing code that's difficult to change later.আপনার অবশ্যই বুঝতে হবে যে এই কোডটি একক লাইনের চেয়ে ছিঁড়ে ফেলা এবং পুনর্লিখন করা অনেক বেশি শক্ত। সুতরাং আমি আপনাকে হ্রাস করেছি কারণ এটি মার্জিত বা এটি করার পরামর্শ দেওয়া হয়নি।
ক্রিস বার্ট-ব্রাউন

1
+1 - কমনীয়তা কেবল বংশবৃদ্ধিতে নয়। বোর্ডের কনফিগারেশনগুলি পরিবর্তন করতে সক্ষম হওয়া যদি একটি প্রয়োজনীয়তা হয় তবে এটি যাওয়ার ভাল উপায়। আমি কিছু ধাঁধা প্রোগ্রামে একই জিনিস করেছি। আমি যদিও দাবা প্রোগ্রামের এই প্রয়োজনীয়তাটি আশা করি না। এবং আমি সম্মত হব না যে সাধারণীকৃত সমাধানগুলি সর্বদা সর্বোত্তম। সাধারণীকরণের কোনও শেষ নেই, যেমন এলএলআর পার্সার এবং ওপেনজিএল অনুবাদককে প্রয়োগ না করে আপনি হ্যালো ওয়ার্ল্ড লিখতে পারবেন না। কীটি ইয়াজিএনআই কবে তা জানাচ্ছে।
লার্শ

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