शतरंज की टाइलों के रंग के लिए सुरुचिपूर्ण समाधान


19

मैं एक शतरंज खेल को फिर से विकसित कर रहा हूं जो मैंने जावा में लिखा था, और सोच रहा था कि क्या एक गिने हुए शतरंज बोर्ड पर शतरंज की टाइलें लगाने के लिए एक सुरुचिपूर्ण एल्गोरिदम है।

अभी मेरा समाधान उपयोग करता है यदि यह निर्धारित करने के लिए कि टाइल एक समान या विषम पंक्ति पर है, और उसके आधार पर, यदि यह एक प्रकाश या अंधेरा वर्ग होना चाहिए, तो यह निर्धारित करने के लिए अन्य कथन का उपयोग करता है।


आपको कुछ मूल करने के लिए अधिक सुरुचिपूर्ण एल्गोरिथ्म की आवश्यकता क्यों है? बस जिज्ञासा या ...?
एसएसबी

5
ईमानदारी से मैं सिर्फ उत्सुक हूं।
अमीर अफगानी

जवाबों:


40

सबसे अच्छा तरीका मैं सोच सकता हूँ, यह देखते हुए कि आपके पास rowऔर columnसूचकांक हैं, निम्नलिखित है:

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

या, इसके विपरीत:

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

असल में, एक शतरंज की बिसात पर एक टाइल हल्की होती है, जहाँ स्तंभ और पंक्ति दोनों ही परस्पर विषम या समान होते हैं, और अन्यथा अंधेरा होता है।


4
बहुत अच्छा उपाय है। हालांकि आपकी टिप्पणी भ्रामक है: "जहां भी कॉलम और पंक्ति दोनों हैं, वहां शतरंज की बिसात पर एक टाइल हल्की है।" यह सच नहीं है। मान लें कि पंक्ति 3 है और स्तंभ 5 है (दोनों असमान हैं ) 3 % 2 == 1और 5 % 2 == 1.. इसलिए दोनों असमान हैं लेकिन रंगीन "प्रकाश" होगा। यह नहीं कहना कि आपका समाधान गलत है (यह अच्छा है, क्योंकि यह पैटर्न को वैकल्पिक कर देगा) लेकिन आपकी टिप्पणी / स्पष्टीकरण गलत है।
बुमज़ैक

वूप्स, उस @bummzack को स्पॉट करने के लिए धन्यवाद। उत्तर अपडेट किया गया।
kevintodisco

इसे लगाने का एक अच्छा तरीका यह हो सकता है कि एक टाइल हल्की हो, जब तक कि उसके निर्देशांक समान समानता रखते हैं।
ver

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

XOR पंक्ति और स्तंभ सूचकांकों के साथ और कम से कम महत्वपूर्ण बिट को देखें। पंक्ति या कॉलम इंडेक्स को एक में बदलने से परिणाम उल्टा होगा, इसलिए यह एक चेकर पैटर्न उत्पन्न करता है।


5
^ठीक है, लेकिन +समान रूप से अच्छी तरह से काम करता है। :)
क्रिस बर्ट-ब्राउन

2
उस मामले के लिए, -काम करता है, भी। :)
ट्रेवर पॉवेल

2
बिट संचालन ftw :)
माइक क्लच

3
दूसरों को पसंद करें, क्योंकि यह "अपठनीय" है (मुझे पता है कि बिट संचालन, इसका मतलब यह नहीं है कि यह बनाए रखने योग्य है)
Matsemann

22

एक और सुझाव, बहुत सीधा:

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

पंक्ति और स्तंभ को जोड़ने से शीर्ष-बाईं टाइल से दूर क्षैतिज और ऊर्ध्वाधर चरणों की संख्या मिलती है।

यहां तक ​​कि कई कदम हल्के रंग देते हैं।
चरणों की विषम संख्या गहरे रंग देती है।


मूल रूप से नाथन के उत्तर के समान ही अलग-अलग लिखे गए हैं।
एपीआई-बीस्ट

@ मिस्टरबीस्ट: तब तक & 1और अधिक कुशल होने जा रहा है % 2, जब तक कि बाद वाले को विशेष रूप से अनुकूलित न किया जाए। लेकिन सामान्य तौर पर मैं सहमत हूं।
लारश

1
@ लार्स संकलक उन चीजों का ध्यान रखता है (या कम से कम, यह होना चाहिए)
neeKo

@ लार्स I पठनीयता के लिए लक्ष्य था, गति नहीं। लेकिन इसमें बहुत कुछ नहीं है। मुझे यकीन नहीं है कि दोनों के बीच की गति के अंतर को "बहुत" माना जा सकता है जब हम जानते हैं कि इसे केवल 64 बार कहा जाएगा, और मैं यह सोचना चाहूंगा कि एक आधुनिक संकलक वैसे भी समान बायनेरी उत्पन्न करेगा।
क्रिस बर्ट-ब्राउन

@ क्रिस: मैं% ऑपरेशन की दक्षता के बारे में बात कर रहा था, जो इसे कहा जाता है की संख्या से प्रभावित नहीं है। लेकिन मैं सहमत हूं, यह कार्यक्रम की गति में एक व्यावहारिक अंतर बनाने की संभावना नहीं है, और मैं संभावित संभावित सुधारों के सापेक्ष पठनीयता के महत्व के बारे में भी सहमत हूं।
लारश

4

यह मानता है कि हमारे वर्ग [0..63] श्रेणी में गिने जाते हैं।

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

यह पता लगाना कि यह क्यों काम करता है, आधा मज़ेदार है। :)


दिलचस्प दृष्टिकोण। लेकिन क्या आपको इसे बूल में लाने के लिए रिटर्न वैल्यू के लिए कुछ नहीं करना है, जैसे return (i>>3 ^ i) & 1 != 0? क्या जावा पूर्णांक के अंतर्निहित रूपांतरण को बूलियन की अनुमति देता है?
लारश

आह, तुम सही हो; मैंने सीधे "जावा" बिट पर पढ़ा, और C ++ के बारे में सोचकर उत्तर लिखा। मेरे उत्तर का संपादन।
ट्रेवर पॉवेल

यह स्पष्ट रूप से सबसे अच्छा बोर्ड है।
थॉमस डेस

1
यह दृष्टिकोण मुझे उसी तरह अपील करता है जिस तरह पर्ल मुझसे अपील करता है। इस तरह की सक्सेजफुल डिसेन्सिबिलिटी हमेशा लिखने में मजेदार होती है। डिबग करने का मज़ा कम।
ट्रेवर पॉवेल

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 है जो दूसरी पंक्ति में नहीं है। यदि दोनों सत्य हैं, तो यह असत्य का मूल्यांकन करता है। XOR ऑपरेटर की समीक्षा करें: msdn.microsoft.com/en-us/library/zkacc7k1.aspx
जिम

1
IsSecondRow really should have been named IsEvenRow. It's a rather convoluted way to get the low bit of row: first shift the bits of row 3 positions to the right, then discard all but the LSB of row, then check if the 4th bit of cellnum is set.
MSalters

समझा। उत्तर के लिए +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
You should post this to thedailywtf.com. :)
avakar

11
Not enterprisey enough, needs more XML.
Maximus Minimus

3
Hello, Kevin. You wrote The one-liners used in answers so far would have to be re-written. but also it's best to come up with generalized solutions like this instead of writing code that's difficult to change later. But you must understand that this code is much harder to tear down and rewrite than a single line. So I downvoted you because it isn't elegant or advisable to do this.
Chris Burt-Brown

1
+1 - लालित्य सिर्फ संक्षिप्तता में नहीं है। यदि बोर्ड कॉन्फ़िगरेशन को बदलने में सक्षम होना आवश्यकताओं में से एक है, तो यह जाने का एक अच्छा तरीका है। मैंने कुछ पहेली कार्यक्रमों में इसी तरह की चीजें की हैं। मैं हालांकि इस आवश्यकता के लिए एक शतरंज कार्यक्रम की उम्मीद नहीं करेगा। और मैं इस बात से सहमत नहीं हूँ कि सामान्यीकृत समाधान हमेशा सर्वोत्तम होते हैं। सामान्यीकरण के लिए NO END है जिसे बनाया जा सकता है, जैसे कि आप बिना LALR पार्सर और ओपनजीएल दुभाषिया को लागू किए बिना हैलो वर्ल्ड नहीं लिख सकते। कुंजी पता है जब YAGNI।
21

2
मुझे यह उत्तर पसंद है। यदि आप घंटे के हिसाब से बिल भेज रहे हैं तो यह आपके मुनाफे को अधिकतम करने का सबसे सुंदर तरीका है!
पांडा पाजामा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.